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)
| 86 | |
| 87 | |
| 88 | def 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 |
no test coverage detected