(&mut self, node: Node<'t>)
| 695 | // --- extractMethod → extractFunction routing (:1737 / :1517) ---------- |
| 696 | |
| 697 | fn extract_method_or_function(&mut self, node: Node<'t>) { |
| 698 | stack_guard!(); |
| 699 | // No receiver hook, no methodsAreTopLevel: inside class-like → method, |
| 700 | // else → function (the object/object_expression parent check never |
| 701 | // matches scala node kinds). |
| 702 | let is_method = self.inside_class_like(); |
| 703 | let name = self.extract_name(node); |
| 704 | if name == "<anonymous>" { |
| 705 | // Unreachable for scala defs (name field required) — preserved: |
| 706 | // walk the body with nothing pushed. |
| 707 | if let Some(body) = node.child_by_field_name("body") { |
| 708 | self.visit_body(body); |
| 709 | } |
| 710 | return; |
| 711 | } |
| 712 | let docstring = preceding_docstring(node, self.src); |
| 713 | let signature = self.signature_of(node); |
| 714 | let visibility = self.visibility_of(node); |
| 715 | let is_static = self.is_static_of(node); |
| 716 | let return_type = self.return_type_of(node); |
| 717 | let row = self.create_node( |
| 718 | if is_method { "method" } else { "function" }, |
| 719 | &name, |
| 720 | node, |
| 721 | Extra { |
| 722 | docstring, |
| 723 | signature, |
| 724 | visibility, |
| 725 | is_async: Some(false), |
| 726 | is_static: Some(is_static), |
| 727 | return_type, |
| 728 | }, |
| 729 | ); |
| 730 | let Some(row) = row else { return }; |
| 731 | self.extract_type_annotations(node, row); |
| 732 | self.extract_decorators_for(node, row); |
| 733 | self.stack.push(Scope { row, kind: if is_method { "method" } else { "function" }, name }); |
| 734 | if let Some(body) = node.child_by_field_name("body") { |
| 735 | self.visit_body(body); |
| 736 | } |
| 737 | self.stack.pop(); |
| 738 | } |
| 739 | |
| 740 | // --- extractClass (:1679) — classes, objects, traits ------------------ |
| 741 |
no test coverage detected