这个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
。
答案 0 :(得分:3)
OpaqueValueExpr
包含另一个表达式,您可以使用方法getSourceExpr()
访问它。
在你的AST中,源表达式将是一个隐式转换,这不是目标。为此,Clang的Expr
班级有一系列“忽略”方法,例如IgnoreImpCasts
或IgnoreParens
。这些方法用于访问底层表达式,就像您的情况一样。
例如,如果表达式a
的类型为ImplicitCastExpr
,并且它包含b
类DeclRefExpr
,那么a->IgnoreImpCasts()
将返回指向{{}的指针1}}。但是,如果我们在b
上调用该方法,那么它将返回b
本身。
以下是回答您问题的代码:
b