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

Method extract_call

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

Source from the content-addressed store, hash-verified

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

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
getMethod · 0.65
top_rowMethod · 0.45
textMethod · 0.45
push_ref_atMethod · 0.45

Tested by

no test coverage detected