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