获取匹配节点的所有祖先或后代
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 的类型并进行迭代。
我需要遍历匹配的 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 的类型并进行迭代。