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

Method extract_call

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

Source from the content-addressed store, hash-verified

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

Tested by

no test coverage detected