获取匹配节点的所有祖先或后代

acquiring all the ancestors or descendants of a matched node

我需要遍历匹配的 AST 节点的所有祖先或后代,以便稍后使用该信息来修饰部分输入源代码。 我试图寻找方法来做到这一点。我查看了 ASTContext class 的 getParents 成员函数。我可以使用它在 AST 层次结构中向上访问我当前匹配节点的所有祖先节点。但问题是,当我获得父节点时,我不再有该节点尝试获取其父节点的上下文。我可以尝试为新节点重建 ASTContext,但如果可能的话,这似乎是另一项艰巨的任务。 我正在寻找的最低 NodeKind(在 C 层次结构中最低)是 callExpr,而我正在寻找的最高是 functionDecl。 在 MatchCallback 中匹配 returns 到 run 的控件后,如何获取匹配的 AST 节点的所有祖先或后代?

可能会一直递归地获取 parent 声明,直到到达 TranslationUnitDecl 为止,但是,我建议实际上迭代 TranslationUnitDecl 中的声明,然后朝着 FunctionDecl 的方向努力。

您可以创建一个递归函数,该函数在翻译单元中查找所有 TagDecl,在该 class 中的所有方法中搜索您指定的 FunctionDecl,并递归地使用该 TagDecl 中的 TagDecl,直到您一无所有消费。

这将使您能够更轻松地完整记录所需的特定 AST 节点,并且编写起来可能不会那么混乱。

但是,如果您选择向后工作,您可以尝试这样的操作(未经测试)

FunctionDecl *FD;
DeclContext *PC = FD->getParent();
while (!isa<TranslationUnitDecl>(Decl::castFromDeclContext(PC))) {
    //consume 

    PC = PC->getParent();
}

对于后代 (children),您只需转换为具有 children 的类型并进行迭代。