Skip to content

Commit 86df6ab

Browse files
authored
Merge pull request #59 from codefuse-ai/cxy_dev
for issue: given a method signature a, we want to find out which m…
2 parents ba21ad9 + f935ce5 commit 86df6ab

File tree

1 file changed

+79
-0
lines changed

1 file changed

+79
-0
lines changed
+79
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
// script
2+
use coref::java::*
3+
4+
fn default_java_db() -> JavaDB {
5+
return JavaDB::load("coref_java_src.db")
6+
}
7+
8+
// Given one or more function signatures, only one is given in the current example, which can be modified
9+
// signature
10+
fn isChecked(signature: string) -> bool {
11+
[
12+
{"HelloWorld.test2:void()"},
13+
]
14+
}
15+
16+
// You can view the signature, line number, and file location of each callable by outputting the following function:
17+
fn signature_name(signature: string, line: int, fileName: string) -> bool {
18+
let (db = default_java_db()){
19+
for (callable in Callable(db)){
20+
if (signature = callable.getSignature() && fileName = callable.getLocation().getFile().getName()
21+
&& line = callable.getLocation().getStartLineNumber()) {
22+
return true
23+
}
24+
}
25+
}
26+
}
27+
28+
// Determine whether it is a callable corresponding to the function signature
29+
fn checkCallable(c: Callable)-> bool {
30+
if (isChecked(c.getSignature())) {
31+
return true
32+
}
33+
}
34+
35+
36+
// Do an upward search
37+
fn getAncestorCallerEndWithLimit(c: Callable) -> *Callable {
38+
// Get the calling function of the current functio
39+
yield c.getCaller()
40+
// The current node is multiple layers above, and recursive calls are required to obtain all calling functions
41+
for (tmp in c.getCaller()) {
42+
yield getAncestorCallerEndWithLimit(tmp)
43+
}
44+
}
45+
46+
fn getAllLimitedCallable(c:Callable)->*Callable{
47+
yield c
48+
yield getAncestorCallerEndWithLimit(c)
49+
}
50+
51+
// At the same time, output the class corresponding to callable
52+
fn getCallGraph(callMethodName:string, callClassName: string,
53+
calleeMethodName:string, calleeClassName: string) -> bool {
54+
let (db = default_java_db()){
55+
for (callable in Callable(db)){
56+
if (checkCallable(callable)) {
57+
for (call in getAllLimitedCallable(callable), callee in getAllLimitedCallable(callable)){
58+
if (call != callee && callee in call.getCallee()) {
59+
for (callMethod in Method(db), calleeMethod in Method(db)) {
60+
if (callMethod.key_eq(call) && calleeMethod.key_eq(callee)) {
61+
if (callMethodName = callMethod.getName() && callClassName = callMethod.getBelongedClass().getQualifiedName() &&
62+
calleeMethodName = callee.getName() && calleeClassName = calleeMethod.getBelongedClass().getQualifiedName()) {
63+
return true
64+
}
65+
}
66+
}
67+
}
68+
}
69+
}
70+
71+
}
72+
}
73+
}
74+
75+
fn main() {
76+
output(getCallGraph())
77+
// If you want to see the signature in the output add the following line back
78+
// output(signature_name())
79+
}

0 commit comments

Comments
 (0)