这个BinaryOperator的代码是:
self.contentMode = UIViewContentModeScaleAspectFit;
然后我使用ASTVisitor来获取这行代码的信息。
bool VisitBinaryOperator(BinaryOperator *node) {
ObjCPropertyRefExpr *lvalue = dyn_cast<ObjCPropertyRefExpr>(node->getLHS());
if (lvalue && \
lvalue->isMessagingSetter() && \
lvalue->getSetterSelector().getAsString() == "setContentMode:")
{
OpaqueValueExpr *rvalue = dyn_cast<OpaqueValueExpr>(node->getRHS());
// I want to get DeclRefExpr of UIViewContentModeScaleAspectFit here.
}
return true;
}
我可以获得正确的lvalue
,但是如何在 AST 最后一行获得 DeclRefExpr
。
最佳答案
OpaqueValueExpr
保存另一个表达式,您可以使用方法 getSourceExpr()
访问它。
在 AST 中,源表达式将是隐式转换,这不是目标。为此,Clang 的 Expr
类具有一系列“忽略”方法,例如 IgnoreImpCasts
或 IgnoreParens
。这些方法用于访问底层表达式,就像您的情况一样。
例如,如果表达式 a
具有 ImplicitCastExpr
类型,并且它包含一些 DeclRefExpr
类型的 b
,那么a->IgnoreImpCasts()
将返回指向b
的指针。但是,如果我们调用 b
上的方法,那么它将返回 b
本身。
这是回答您的问题的代码:
Expr *SE = rvalue->getSourceExpr()->IgnoreImpCasts();
if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(SE)) {
// do you magic with DeclRefExpr here
}
关于clang - 如何在 Clang AST 中获取 OpaqueValueExpr 的子级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37586677/