修复: 变量定义判定误伤函数调用值

子树包含判定改直取 value 节点 kind
const x = arr.map(...) 不再误判为符号定义
subtree_contains_kind 无其他使用方一并删除
This commit is contained in:
lxy
2026-10-01 08:27:49 +08:00
parent 7c62d8dbe7
commit bacec20c3c
+4 -17
View File
@@ -131,8 +131,9 @@ const FUNCTION_VALUE_KINDS: &[&str] = &["arrow_function", "function", "generator
/// ///
/// variable_declarator 单看 kind 过宽:`let msg = "fn main() {}"` 这类普通声明也命中, /// variable_declarator 单看 kind 过宽:`let msg = "fn main() {}"` 这类普通声明也命中,
/// contains_definition 会对几乎任何 JS/TS 文件误报提示。收窄为 `const fn = () => {}` /// contains_definition 会对几乎任何 JS/TS 文件误报提示。收窄为 `const fn = () => {}`
/// 形态(初始化值是函数/类表达式)才算定义,contains_definition / read_symbol / /// 形态(初始化值本身是函数/类表达式)才算定义,contains_definition / read_symbol /
/// outline 三处共用同一判定。 /// outline 三处共用同一判定。判定看 value 节点自身 kind 而非子树包含——
/// `const x = arr.map(n => ...)` 子树含 arrow_function,但 x 不是函数定义。
fn is_definition_node(node: &Node<'_>) -> bool { fn is_definition_node(node: &Node<'_>) -> bool {
if !DEFINITION_KINDS.contains(&node.kind()) { if !DEFINITION_KINDS.contains(&node.kind()) {
return false; return false;
@@ -141,25 +142,11 @@ fn is_definition_node(node: &Node<'_>) -> bool {
return true; return true;
} }
match node.child_by_field_name("value") { match node.child_by_field_name("value") {
Some(v) => subtree_contains_kind(v, FUNCTION_VALUE_KINDS), Some(v) => FUNCTION_VALUE_KINDS.contains(&v.kind()),
None => false, None => false,
} }
} }
/// 子树内是否含任一目标 kind 节点
fn subtree_contains_kind(node: Node<'_>, kinds: &[&str]) -> bool {
if kinds.contains(&node.kind()) {
return true;
}
let mut cursor = node.walk();
for child in node.children(&mut cursor) {
if subtree_contains_kind(child, kinds) {
return true;
}
}
false
}
/// 递归遍历语法树,判断是否含任一定义节点(contains_definition 的遍历内核)。 /// 递归遍历语法树,判断是否含任一定义节点(contains_definition 的遍历内核)。
fn tree_has_definition(node: &Node<'_>) -> bool { fn tree_has_definition(node: &Node<'_>) -> bool {
if is_definition_node(node) { if is_definition_node(node) {