MCPcopy Create free account
hub / github.com/Persper/code-analytics / handle_call_node

Function handle_call_node

persper/graphs/call_graph/java.py:88–173  ·  view source on GitHub ↗

Parse a call node and return the identifer of the function being called Type of calls we handle: Case 1: doSomething(args) doSomething is a public/private static/instance member method of cl_name Case 2: A a = new A() A is a class (env), A'

(call_node, cl_name, local_env, env)

Source from the content-addressed store, hash-verified

86
87
88def handle_call_node(call_node, cl_name, local_env, env):
89 """Parse a call node and return the identifer of the function being called
90 Type of calls we handle:
91 Case 1: doSomething(args)
92 doSomething is a public/private static/instance
93 member method of cl_name
94 Case 2: A a = new A()
95 A is a class (env), A's constructor function is called in this case
96 Case 3: a.doSomething(args)
97 a is an object, could be newly instantiated in this
98 function (local_env),
99 or could be passed as a parameter (local_env),
100 or could be this class's public/private member variable (env)
101 doSomething could be either a static method or a instance method
102 Case 4: A.doSomething(args)
103 A is a class (env)
104 doSomething is one of A's static methods
105 Case 5: A.var.doSomething(args)
106 A is a class (env)
107 var is a public static member of class A (env)
108 Case 6: a.var.doSomething(args)
109 a is an object, could be newly instantiated in this
110 function (local_env),
111 or could be passed as a parameter (local_env),
112 or could be this class' public/private member variable (env)
113 var is a public (static) member of object a (local_env & env)
114
115 Returns:
116 A String representing the signature of the function being called
117 """
118 call_name = get_name(call_node)
119
120 names_lst = [n.strip() for n in call_name.split('.')]
121 callee_func_name = names_lst[-1]
122 if len(names_lst) == 1:
123 previous_node = call_node.getprevious()
124 if previous_node is not None and previous_node.text == 'new':
125 # Case 1: calling constructor
126 callee_cl_name = callee_func_name
127 else:
128 # Case 2: calling member method
129 callee_cl_name = cl_name
130 return generate_fid(callee_cl_name, callee_func_name)
131 elif len(names_lst) == 2:
132 niq = names_lst[0] # niq => name in question
133 # check local_env first
134 if niq in local_env:
135 # Case 3 (local_env)
136 var_name = niq
137 callee_cl_name = local_env[var_name]
138 return generate_fid(callee_cl_name, callee_func_name)
139 elif niq in env[cl_name]['var']:
140 # case 3 (env)
141 var_name = niq
142 callee_cl_name = env[cl_name]['var'][var_name]['type']
143 return generate_fid(callee_cl_name, callee_func_name)
144 elif niq in env:
145 # Case 4

Callers 1

handle_func_nodeFunction · 0.70

Calls 2

get_nameFunction · 0.70
generate_fidFunction · 0.70

Tested by

no test coverage detected