NodeJS 使用tree-sitter-javascript从文件中获取函数名

kqhtkvqz  于 2023-05-28  发布在  Node.js
关注(0)|答案(1)|浏览(291)

使用tree-sitter-javascript库,我试图从JavaScript代码中获取所有函数名(字符串格式)并将其存储在functionNames数组中。

const Parser = require('tree-sitter');
const JavaScript = require('tree-sitter-javascript');

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

const sourceCode = `function foo() {
    console.log('hello world');
  }
  
  function bar() {
    console.log('bye world');
  }`;

const tree = parser.parse(sourceCode);

const functionNames = [];
tree.walk(()=>{
    console.log("Node: ", node);
    if (node.type === 'function_declaration') {
        functionNames.push(node.child(1).text);
      }
    
})

console.log(functionNames); 

// Expected output ['foo', 'bar']
// Actual output []

但是,tree.walk()的回调根本没有执行。日志中不会打印任何内容。只是一个空数组[]
这段代码有什么问题?我在官方文档(https://github.com/tree-sitter/tree-sitter-javascript)中找不到太多关于这方面的文档
是否有其他方法可以做到这一点?先谢谢你了

qzlgjiam

qzlgjiam1#

这是因为parser.parse已经给出了解析后的结果。该对象上没有.walk()函数。要获取所有函数名,可以递归遍历rootNode

const tree = parser.parse(sourceCode);
const rootNode = tree.rootNode;

const functionNames = [];
function findFunctionNames(node) {
    if (node.type === 'function_declaration') {
        for (let child of node.namedChildren) {
            if (child.type === 'identifier') {
                functionNames.push(child.text);
            }
        }
    }

    for (let child of node.namedChildren) {
        findFunctionNames(child);
    }
}

findFunctionNames(rootNode);

console.log(functionNames);
// -> [ 'foo', 'bar' ]

相关问题