编写 Clang AST 匹配器
Writing Clang AST Matchers
是否可以像下面的代码一样在一个表达式中使用绑定字符串:
expr(declRefExpr().bind("id"), hasDesendent(declRefExpr(has("id")));
基本上是使用一个节点的绑定 ID 字符串来查找另一个节点。
比较2个节点最好的方法是在不同的id string
中绑定,然后在回调方法中进行比较。
这在tutorial中有解释。
在上面的link中可以找到如下代码:
const VarDecl *IncVar = Result.Nodes.getNodeAs<VarDecl>("incVarName");
const VarDecl *CondVar = Result.Nodes.getNodeAs<VarDecl>("condVarName");
if (!areSameVariable(IncVar, CondVar))
return;
此代码旨在比较回调函数中绑定在变量incVarName
和condVarName
中的节点。
是的,可以使用 equalsBoundNode
用法:
expr(declRefExpr().bind("id"), hasDesendent(declRefExpr(equalsBoundNode("id")));
是否可以像下面的代码一样在一个表达式中使用绑定字符串:
expr(declRefExpr().bind("id"), hasDesendent(declRefExpr(has("id")));
基本上是使用一个节点的绑定 ID 字符串来查找另一个节点。
比较2个节点最好的方法是在不同的id string
中绑定,然后在回调方法中进行比较。
这在tutorial中有解释。
在上面的link中可以找到如下代码:
const VarDecl *IncVar = Result.Nodes.getNodeAs<VarDecl>("incVarName");
const VarDecl *CondVar = Result.Nodes.getNodeAs<VarDecl>("condVarName");
if (!areSameVariable(IncVar, CondVar))
return;
此代码旨在比较回调函数中绑定在变量incVarName
和condVarName
中的节点。
是的,可以使用 equalsBoundNode
用法:
expr(declRefExpr().bind("id"), hasDesendent(declRefExpr(equalsBoundNode("id")));