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