You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过node-tree-sitter获取所有JavaScript类名称?

如何通过Tree-sitter获取JavaScript所有类名称?

你当前的代码已经正确匹配到了命名类的标识符节点,但没有提取节点的文本内容。另外,你的Query只匹配了class_declaration(命名类),没有覆盖class_expression(赋值给变量的匿名类)的情况。以下是修正后的方案:

1. 提取已匹配节点的文本内容

当前输出的是IdentifierNode对象,要获取类名字符串,只需访问节点的text属性。修改遍历代码:

matches.forEach(item => {
  console.log(item.captures[0].node.text)
})

执行后就能得到Person和Person2。

2. 匹配所有类定义(含匿名类的变量名)

如果需要同时获取赋值给变量的匿名类的引用名(比如TestPerson、TestPerson2),需要扩展Query规则,匹配variable_declarator中的class_expression:

const query = new Query(
  JavaScript,
  `
    ; 匹配命名类的类名
    (class_declaration name: (identifier) @class-name)
    ; 匹配赋值给变量的匿名类,捕获变量名作为类的引用名
    (variable_declarator value: (class_expression) name: (identifier) @class-name)
  `
);

修改后重新执行代码,就能得到完整的类名列表:Person、TestPerson、Person2、TestPerson2。

完整修正代码

const Parser = require("tree-sitter")
const JavaScript = require("tree-sitter-javascript")
const { Query } = Parser 

const parser = new Parser()
parser.setLanguage(JavaScript)

const query = new Query(
  JavaScript,
  `
    (class_declaration name: (identifier) @class-name)
    (variable_declarator value: (class_expression) name: (identifier) @class-name)
  `
);

const tree = parser.parse(`
class Person {}
 
const TestPerson = class {}

class Person2 {}
 
const TestPerson2 = class {}
`);
const matches = query.matches(tree.rootNode);

matches.forEach(item => {
  console.log(item.captures.find(cap => cap.name === 'class-name').node.text)
})

内容的提问来源于stack exchange,提问作者qg_java_17137

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 17:42:33