MCPcopy Create free account
hub / github.com/colbymchenry/codegraph / extract_call

Method extract_call

codegraph-kernel/src/tsjs/extractors.rs:1037–1096  ·  view source on GitHub ↗
(&mut self, node: Node<'t>)

Source from the content-addressed store, hash-verified

1035 // --- extractCall (TS/JS generic tail) -------------------------------------------------
1036
1037 pub(super) fn extract_call(&mut self, node: Node<'t>) {
1038 if self.stack.is_empty() {
1039 return;
1040 }
1041 let func = node
1042 .child_by_field_name("function")
1043 .or_else(|| node.named_child(0));
1044 let mut callee_name = String::new();
1045
1046 if let Some(func) = func {
1047 if func.kind() == "member_expression" {
1048 let property = func
1049 .child_by_field_name("property")
1050 .or_else(|| func.child_by_field_name("field"))
1051 .or_else(|| func.named_child(1));
1052 if let Some(property) = property {
1053 let method_name = self.text(property);
1054 let receiver = func
1055 .child_by_field_name("object")
1056 .or_else(|| func.child_by_field_name("operand"))
1057 .or_else(|| func.child_by_field_name("argument"))
1058 .or_else(|| func.named_child(0));
1059 // Literal receivers call builtins, never project symbols (#1230).
1060 if let Some(r) = receiver {
1061 if is_literal_receiver(r.kind()) {
1062 return;
1063 }
1064 }
1065 let recv_ident = receiver.filter(|r| {
1066 matches!(r.kind(), "identifier" | "simple_identifier" | "field_identifier")
1067 });
1068 if let Some(r) = recv_ident {
1069 let receiver_name = self.text(r);
1070 if !matches!(receiver_name, "self" | "this" | "cls" | "super") {
1071 callee_name = format!("{receiver_name}.{method_name}");
1072 } else {
1073 callee_name = method_name.to_string();
1074 }
1075 } else {
1076 // (the call-receiver re-encode branches are other
1077 // languages'; TS/JS keeps the bare method name)
1078 callee_name = method_name.to_string();
1079 }
1080 }
1081 } else {
1082 callee_name = self.text(func).to_string();
1083 }
1084 }
1085
1086 // Parenthesized-callee normalization (`(fn)()` → fn).
1087 if !callee_name.is_empty() {
1088 if let Some(c) = util::paren_conversion().captures(&callee_name) {
1089 callee_name = c[1].to_string();
1090 }
1091 }
1092
1093 if !callee_name.is_empty() {
1094 self.push_call_ref(&callee_name.clone(), node);

Callers 2

visit_nodeMethod · 0.45

Calls 3

push_call_refMethod · 0.80
is_literal_receiverFunction · 0.70
textMethod · 0.45

Tested by

no test coverage detected