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

时间:2016-07-13 13:26:51

标签: llvm-clang

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

1 个答案:

答案 0 :(得分:0)

有可能递归到达父语句,直到你到达TranslationUnitDecl,但是,我建议实际上迭代在TranslationUnitDecl中的声明,然后转向FunctionDecl。

您可以创建一个递归函数,它在翻译单元中查找所有TagDecl,在该类中搜索您指定的FunctionDecl的所有方法,并且还递归地使用该TagDecl中的TagDecl,直到您没有任何东西可以消耗。

这将使您能够更轻松地保留所需特定AST节点的完整记录,并且可能不会让您感到困惑。

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

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

    PC = PC->getParent();
}

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

相关问题