如何在Clang AST中获得OpaqueValueExpr的孩子们

时间:2016-06-02 08:37:34

标签: clang llvm abstract-syntax-tree

我有AST的一部分,如下图所示。 enter image description here

这个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

1 个答案:

答案 0 :(得分:3)

OpaqueValueExpr包含另一个表达式,您可以使用方法getSourceExpr()访问它。

在你的AST中,源表达式将是一个隐式转换,这不是目标。为此,Clang的Expr班级有一系列“忽略”方法,例如IgnoreImpCastsIgnoreParens。这些方法用于访问底层表达式,就像您的情况一样。

例如,如果表达式a的类型为ImplicitCastExpr,并且它包含bDeclRefExpr,那么a->IgnoreImpCasts()将返回指向{{}的指针1}}。但是,如果我们在b上调用该方法,那么它将返回b本身。

以下是回答您问题的代码:

b