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

Method extract_call

codegraph-kernel/src/scala.rs:857–933  ·  view source on GitHub ↗
(&mut self, node: Node<'t>)

Source from the content-addressed store, hash-verified

855 // --- extractCall (:3684) ----------------------------------------------
856
857 fn extract_call(&mut self, node: Node<'t>) {
858 if self.stack.is_empty() {
859 return;
860 }
861 let caller_row = self.top_row();
862 let func = node
863 .child_by_field_name("function")
864 .or_else(|| node.named_child(0));
865 let Some(func) = func else { return };
866
867 let mut callee: Option<String> = None;
868 if func.kind() == "field_expression" {
869 // Member branch (:4364): property = `field` field for scala.
870 let property = func
871 .child_by_field_name("property")
872 .or_else(|| func.child_by_field_name("field"))
873 .or_else(|| func.named_child(1));
874 if let Some(property) = property {
875 let method_name = self.text(property);
876 let receiver = func
877 .child_by_field_name("object")
878 .or_else(|| func.child_by_field_name("operand"))
879 .or_else(|| func.child_by_field_name("argument"))
880 .or_else(|| func.named_child(0));
881 if let Some(receiver) = receiver {
882 if is_literal_receiver(receiver.kind()) {
883 return; // literal receivers emit NOTHING (#1230)
884 }
885 if matches!(receiver.kind(), "identifier" | "simple_identifier" | "field_identifier") {
886 let recv_name = self.text(receiver);
887 if matches!(recv_name, "self" | "this" | "cls" | "super") {
888 callee = Some(method_name.to_string());
889 } else {
890 callee = Some(format!("{recv_name}.{method_name}"));
891 }
892 } else if receiver.kind() == "call_expression" {
893 // The #750 re-encode, scala arm (:4443-4464): inner
894 // callee via the REAL `function` field; re-encode only
895 // capitalized (companion-factory / apply) chains.
896 let inner_fn = receiver.child_by_field_name("function");
897 let inner_callee = inner_fn
898 .map(|f| {
899 let t = self.text(f).replace("->", ".");
900 ws_re().replace_all(&t, "").into_owned()
901 })
902 .unwrap_or_default();
903 let reencode = starts_upper_re().is_match(&inner_callee);
904 callee = Some(if reencode {
905 format!("{inner_callee}().{method_name}")
906 } else {
907 method_name.to_string()
908 });
909 } else {
910 callee = Some(method_name.to_string());
911 }
912 } else {
913 callee = Some(method_name.to_string());
914 }

Callers 2

visitMethod · 0.45
visit_bodyMethod · 0.45

Calls 7

ws_reFunction · 0.85
is_literal_receiverFunction · 0.70
starts_upper_reFunction · 0.70
textMethod · 0.65
getMethod · 0.65
top_rowMethod · 0.45
push_ref_atMethod · 0.45

Tested by

no test coverage detected