如何通过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
相关产品推荐
相关产品推荐

