(&mut self, node: Node<'t>)
| 814 | } |
| 815 | |
| 816 | fn extract_method(&mut self, node: Node<'t>) { |
| 817 | stack_guard!(); |
| 818 | let receiver = self.receiver_type_of(node); |
| 819 | let name = self.extract_name(node); |
| 820 | let qualified_override = receiver.as_ref().map(|r| format!("{r}::{name}")); |
| 821 | let extra = Extra { |
| 822 | docstring: preceding_docstring(node, self.src), |
| 823 | signature: None, |
| 824 | visibility: Some(self.visibility_of(node)), |
| 825 | is_async: Some(self.is_async(node)), |
| 826 | is_static: Some(false), |
| 827 | return_type: self.return_type_of(node), |
| 828 | qualified_override, |
| 829 | }; |
| 830 | let Some(row) = self.create_node("method", &name, node, extra) else { return }; |
| 831 | // Owner-contains fallback (1799): receiver present, not class-like → |
| 832 | // the FIRST same-file node named like the receiver with kind ∈ |
| 833 | // {struct, class, enum, trait} (interface EXCLUDED; source-order |
| 834 | // dependent — both quirks preserved). Additive to the normal edge. |
| 835 | if let Some(recv) = &receiver { |
| 836 | if !self.inside_class_like() { |
| 837 | let owner = self |
| 838 | .nodes_meta |
| 839 | .iter() |
| 840 | .position(|m| { |
| 841 | m.name == *recv && matches!(m.kind, "struct" | "class" | "enum" | "trait") |
| 842 | }) |
| 843 | .map(|i| i as u32); |
| 844 | if let Some(owner_row) = owner { |
| 845 | self.tables.push_edge(&EdgeRow { |
| 846 | source_idx: owner_row, |
| 847 | target_idx: row, |
| 848 | kind: edge_kind_index("contains").unwrap(), |
| 849 | provenance: 0, |
| 850 | line: NONE, |
| 851 | column: NONE, |
| 852 | metadata_json: NONE_STR, |
| 853 | source_id_str: NONE_STR, |
| 854 | target_id_str: NONE_STR, |
| 855 | }); |
| 856 | } |
| 857 | } |
| 858 | } |
| 859 | // Type annotations: dead. Decorators: live. |
| 860 | self.extract_decorators_for(node, row); |
| 861 | self.stack.push(Scope { row, kind: "method", name }); |
| 862 | if let Some(body) = self.resolve_body(node) { |
| 863 | self.visit_function_body(body); |
| 864 | } |
| 865 | self.stack.pop(); |
| 866 | } |
| 867 | |
| 868 | fn extract_class(&mut self, node: Node<'t>) { |
| 869 | stack_guard!(); |
no test coverage detected