clang - 如何在 Clang AST 中获取 OpaqueValueExpr 的子级

标签 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

最佳答案

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

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

例如,如果表达式 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/

相关文章:

clang - 使用 clang 为文件创建调用图

c++ - ld 警告 : stack subl instruction is too different from dwarf stack size on OS X

c - 为什么这个输出来自 perror?

haskell - 了解 Haskell LLVM 绑定(bind)中的 CodeGen*

clang - 如何让 clang 转储没有颜色的 AST?

java - 如何在 Antlr 中使用访问者创建自定义 AST

c++ - 返回元素是否比通过引用发送它们并在那里修改慢?

c++ - 如何使用 libtooling (clang C++ API) 将 cpp 文件的源代码转换为 IR?

ios - 是否有人能够在 iOS 上使用 Address-Sanitizer(称为 asan 或 -fsanitize=address)?

parsing - 现代编译器使用哪些解析器?