(&mut self, node: Node<'t>)
| 500 | // --- the dispatcher (visitNode, C#-relevant branches) ----------------------- |
| 501 | |
| 502 | fn visit_node(&mut self, node: Node<'t>) { |
| 503 | let kind = node.kind(); |
| 504 | let mut skip_children = false; |
| 505 | |
| 506 | self.maybe_capture_fn_refs(node); |
| 507 | |
| 508 | if kind == "class_declaration" || kind == "record_declaration" { |
| 509 | // classifyClassNode: `record struct` → extractStruct, else class. |
| 510 | if kind == "record_declaration" && record_is_struct(node) { |
| 511 | self.extract_struct(node); |
| 512 | } else { |
| 513 | self.extract_class(node); |
| 514 | } |
| 515 | skip_children = true; |
| 516 | } else if kind == "method_declaration" || kind == "constructor_declaration" { |
| 517 | self.extract_method(node); |
| 518 | skip_children = true; |
| 519 | } else if kind == "interface_declaration" { |
| 520 | self.extract_interface(node); |
| 521 | skip_children = true; |
| 522 | } else if kind == "struct_declaration" || kind == "record_struct_declaration" { |
| 523 | self.extract_struct(node); |
| 524 | skip_children = true; |
| 525 | } else if kind == "enum_declaration" { |
| 526 | self.extract_enum(node); |
| 527 | skip_children = true; |
| 528 | } else if kind == "property_declaration" && self.inside_class_like() { |
| 529 | // Property accessor/expression bodies are NEVER walked (calls |
| 530 | // inside are lost by design) — candidates-only scan. |
| 531 | self.extract_property(node); |
| 532 | self.scan_fn_ref_subtree(node, 0); |
| 533 | skip_children = true; |
| 534 | } else if kind == "field_declaration" && self.inside_class_like() { |
| 535 | self.extract_field(node); |
| 536 | self.scan_fn_ref_subtree(node, 0); |
| 537 | skip_children = true; |
| 538 | } else if kind == "local_declaration_statement" && !self.inside_class_like() { |
| 539 | // Top-level statements: extractVariable's generic fallback finds no |
| 540 | // direct identifier/variable_declarator children (C# nests them in |
| 541 | // variable_declaration) → ZERO nodes, zero refs. Candidates only. |
| 542 | self.extract_variable(node); |
| 543 | self.scan_fn_ref_subtree(node, 0); |
| 544 | skip_children = true; |
| 545 | } else if kind == "using_directive" { |
| 546 | self.extract_import(node); |
| 547 | // no skipChildren (TS importTypes branch) — children visited below |
| 548 | } else if kind == "invocation_expression" { |
| 549 | self.extract_call(node); |
| 550 | } else if kind == "object_creation_expression" { |
| 551 | self.extract_instantiation(node); |
| 552 | if let Some(anon_body) = find_anonymous_class_body(node) { |
| 553 | self.extract_anonymous_class(node, anon_body); |
| 554 | skip_children = true; |
| 555 | } |
| 556 | } |
| 557 | // Everything else (namespace_declaration, global_statement, delegates, |
| 558 | // events, operators, indexers, destructors, local functions, preproc_*) |
| 559 | // falls through: no node minted, children visited — their bodies' calls |
no test coverage detected