(&mut self, node: Node<'t>)
| 530 | // --- the dispatcher (visitNode, PHP-relevant branches) ------------------------ |
| 531 | |
| 532 | fn visit_node(&mut self, node: Node<'t>) { |
| 533 | stack_guard!(); |
| 534 | if self.try_visit_hook(node) { |
| 535 | self.scan_fn_ref_subtree(node, 0); |
| 536 | return; |
| 537 | } |
| 538 | |
| 539 | let kind = node.kind(); |
| 540 | let mut skip_children = false; |
| 541 | |
| 542 | self.maybe_capture_fn_refs(node); |
| 543 | |
| 544 | if kind == "function_definition" { |
| 545 | // functionTypes; method_declaration is not in it, so this is |
| 546 | // always extractFunction (php functions can't be class members). |
| 547 | self.extract_function(node); |
| 548 | skip_children = true; |
| 549 | } else if kind == "class_declaration" { |
| 550 | self.extract_class(node, "class"); |
| 551 | skip_children = true; |
| 552 | } else if kind == "trait_declaration" { |
| 553 | // classifyClassNode → 'trait'. |
| 554 | self.extract_class(node, "trait"); |
| 555 | skip_children = true; |
| 556 | } else if kind == "method_declaration" { |
| 557 | // Inside a class-like → method; outside (an anonymous class's |
| 558 | // members at TOP level — grammar-bump delta #1) the 1747 gate |
| 559 | // bounces to extractFunction: a file-level `function` node. |
| 560 | if self.inside_class_like() { |
| 561 | self.extract_method(node); |
| 562 | } else { |
| 563 | self.extract_function(node); |
| 564 | } |
| 565 | skip_children = true; |
| 566 | } else if kind == "interface_declaration" { |
| 567 | self.extract_interface(node); |
| 568 | skip_children = true; |
| 569 | } else if kind == "enum_declaration" { |
| 570 | self.extract_enum(node); |
| 571 | skip_children = true; |
| 572 | } else if kind == "property_declaration" && self.inside_class_like() { |
| 573 | self.extract_field(node); |
| 574 | self.scan_fn_ref_subtree(node, 0); |
| 575 | skip_children = true; |
| 576 | } else if matches!( |
| 577 | kind, |
| 578 | "namespace_use_declaration" | "include_expression" | "include_once_expression" |
| 579 | | "require_expression" | "require_once_expression" |
| 580 | ) { |
| 581 | self.extract_import(node); |
| 582 | // children still visited (importTypes sets no skipChildren) |
| 583 | } else if matches!( |
| 584 | kind, |
| 585 | "function_call_expression" | "member_call_expression" | "scoped_call_expression" |
| 586 | ) { |
| 587 | self.extract_call(node); |
| 588 | } else if kind == "object_creation_expression" { |
| 589 | self.extract_instantiation(node); |
no test coverage detected