Clang AST节点什么时候会有多个parents?
When will a Clang AST node have multiple parents?
classclang::ASTContext有个方法:
DynTypedNodeList getParents(const NodeT &Node)
其中 return 是给定 AST 节点的 parent 节点列表。
通常AST作为树会是一个树结构,但是出于某些原因(可能是性能原因)Clang允许一个节点有多个parent。
在什么条件下(什么C++源代码模式),getParents()会return多于一个parent?
原答案(不正确)
AST是一棵树,每个节点恰好有一个parent。 getParents
,但是,returns 不仅是 parent,而且是 parent 的 parent 等等。所以,实际上,该函数应该更好地命名为 getAncestors
.
更新答案
原答案确实不正确,getParents
returns正好是绝大多数AST节点的一个节点。这是来自 clang-tidy
的评论,涵盖了该主题:
The case that a Stmt has multiple parents is rare but does actually occur in the parts of the AST that we're interested in. Specifically, InitListExpr nodes cause ASTContext::getParent() to return multiple parents for certain nodes in their subtree because RecursiveASTVisitor visits both the syntactic and semantic forms of InitListExpr, and the parent-child relationships are different between the two forms.
也许还有其他节点,但我找不到相关信息。
classclang::ASTContext有个方法:
DynTypedNodeList getParents(const NodeT &Node)
其中 return 是给定 AST 节点的 parent 节点列表。
通常AST作为树会是一个树结构,但是出于某些原因(可能是性能原因)Clang允许一个节点有多个parent。
在什么条件下(什么C++源代码模式),getParents()会return多于一个parent?
原答案(不正确)
AST是一棵树,每个节点恰好有一个parent。 getParents
,但是,returns 不仅是 parent,而且是 parent 的 parent 等等。所以,实际上,该函数应该更好地命名为 getAncestors
.
更新答案
原答案确实不正确,getParents
returns正好是绝大多数AST节点的一个节点。这是来自 clang-tidy
的评论,涵盖了该主题:
The case that a Stmt has multiple parents is rare but does actually occur in the parts of the AST that we're interested in. Specifically, InitListExpr nodes cause ASTContext::getParent() to return multiple parents for certain nodes in their subtree because RecursiveASTVisitor visits both the syntactic and semantic forms of InitListExpr, and the parent-child relationships are different between the two forms.
也许还有其他节点,但我找不到相关信息。