(&mut self, node: Node<'t>)
| 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 | } |
no test coverage detected