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

如何在Tree-sitter中获取类/属性/方法的AST树形结构数据

Tree-sitter 获取指定层级的AST树形结构问题

你目前用来匹配类名称的代码如下:

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)
  `
);

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[0])
})

你需要解决两个问题:

  1. 如何匹配完整的AST树形结构数据?
  2. 如何控制匹配得到的树形数据的层级深度(如截图中的3层深度)?

问题1:获取完整AST树形结构数据

Tree-sitter 解析后得到的 tree.rootNode 就是完整的AST根节点,不需要通过Query匹配,直接遍历节点结构即可。可以写一个递归函数,提取每个节点的类型、文本、子节点等核心信息:

// 递归遍历节点,生成完整AST结构对象
function traverseNode(node, depth = 0) {
  const nodeData = {
    type: node.type,
    text: node.text,
    depth: depth,
    children: []
  };

  // 遍历所有子节点并递归处理
  for (let i = 0; i < node.childCount; i++) {
    const child = node.child(i);
    nodeData.children.push(traverseNode(child, depth + 1));
  }

  return nodeData;
}

// 生成并打印完整AST
const fullAST = traverseNode(tree.rootNode);
console.log(JSON.stringify(fullAST, null, 2));

问题2:控制AST树形数据的层级深度

在递归遍历函数中加入最大深度参数,当当前节点深度达到阈值时,停止递归遍历子节点,只保留当前节点的基础信息:

// 带深度限制的节点遍历函数
function traverseNodeWithDepth(node, maxDepth, currentDepth = 0) {
  const nodeData = {
    type: node.type,
    text: node.text,
    depth: currentDepth,
    children: []
  };

  // 仅当当前深度小于最大深度时,才继续遍历子节点
  if (currentDepth < maxDepth) {
    for (let i = 0; i < node.childCount; i++) {
      const child = node.child(i);
      nodeData.children.push(traverseNodeWithDepth(child, maxDepth, currentDepth + 1));
    }
  }

  return nodeData;
}

// 获取3层深度的AST(根节点为第0层,子节点第1层,以此类推)
const depthLimitedAST = traverseNodeWithDepth(tree.rootNode, 3);
console.log(JSON.stringify(depthLimitedAST, null, 2));

如果截图中的3层是将根节点算第1层,只需调整参数为 maxDepth=2,即可得到根节点+两层子节点的结构。


内容的提问来源于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 18:32:09