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+ // Search upwards for the end condition, and restrict some properties of the end node
38+ fn callerLimit(c: Callable) -> bool {
39+ return false
40+ }
41+ fn getAncestorCallerEndWithLimit(c: Callable) -> *Callable {
42+ // If the current function has been limited
43+ if (callerLimit(c)) {
44+ yield c
45+ }
46+ if (!callerLimit(c)) {
47+ // Get the calling function of the current functio
48+ yield c.getCaller()
49+ // The current node is multiple layers above, and recursive calls are required to obtain all calling functions
50+ for (tmp in c.getCaller()) {
51+ yield getAncestorCallerEndWithLimit(tmp)
52+ }
53+ }
54+ }
55+
56+ fn getAllLimitedCallable(c:Callable)->*Callable{
57+ yield c
58+ yield getAncestorCallerEndWithLimit(c)
59+ }
60+
61+ // At the same time, output the class corresponding to callable
62+ fn getCallGraph(callMethodName:string, callClassName: string,
63+ calleeMethodName:string, calleeClassName: string) -> bool {
64+ let (db = default_java_db()){
65+ for (callable in Callable(db)){
66+ if (checkCallable(callable)) {
67+ for (call in getAllLimitedCallable(callable), callee in getAllLimitedCallable(callable)){
68+ if (call != callee && callee in call.getCallee()) {
69+ for (callMethod in Method(db), calleeMethod in Method(db)) {
70+ if (callMethod.key_eq(call) && calleeMethod.key_eq(callee)) {
71+ if (callMethodName = callMethod.getName() && callClassName = callMethod.getBelongedClass().getQualifiedName() &&
72+ calleeMethodName = callee.getName() && calleeClassName = calleeMethod.getBelongedClass().getQualifiedName()) {
73+ return true
74+ }
75+ }
76+ }
77+ }
78+ }
79+ }
80+
81+ }
82+ }
83+ }
84+
85+ fn main() {
86+ output(getCallGraph())
87+ // If you want to see the signature in the output add the following line back
88+ // output(signature_name())
89+ }
0 commit comments