Using tree-sitter-javascript library, I'm trying to fetch all function names from a Javascript code (in string format) and storing it in a functionNames array.
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 []
However, the callback to tree.walk() is not executing at all. Nothing gets printed in the log. just an empty array []
What is wrong with this code ? I couldn't find much documentation on this in the official docs (https://github.com/tree-sitter/tree-sitter-javascript)
Is there an alternate way to do this ? Thanks in advance
That's because parser.parse
already gives you the parsed result. There is no .walk()
function on that object. To get all the function names you can traverse the rootNode
recursively:
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' ]