【问题标题】:How to get DeclRefExpr from the block in Clang AST?如何从 Clang AST 的块中获取 DeclRefExpr?
【发布时间】:2017-08-28 16:32:00
【问题描述】:

我需要检查块(在 Objective C 中)是否在其主体中没有自引用。我尝试过的方法如下。

首先我尝试使用VisitBlockDecl,获取BlockDecl主体并通过以下方式对其进行迭代以从中获取DeclRefExpr

bool VisitBlockDecl (BlockDecl *block) {

    CompoundStmt *blockBody = block->getCompoundBody();

    for (CompoundStmt::body_iterator i = blockBody->body_begin(), e = blockBody->body_end(); i != e; ++i) {

        if (Expr *expr = dyn_cast<Expr>(*i)) {

            Expr *ref = expr->IgnoreImpCasts();

            if (DeclRefExpr *dre = dyn_cast<DeclRefExpr>(ref)) {
                printf("DeclRefExpr from CompoundStmt\n");

            }

        }

    }

    return true;
}

在这种情况下,我希望为位于 BlockDecl 内的 DeclRefExpr 输出 DeclRefExpr from CompoundStmt。但它不起作用。

然后我尝试其他方式并访问DeclRefExpr并使用ASTContext。但在这种情况下,我不知道如何获得DeclRefExpr父母。

有没有人知道如何解决这个任务?

这里是 AST 部分的例子:

【问题讨论】:

    标签: clang llvm abstract-syntax-tree


    【解决方案1】:

    我建议您可以查看 ASTMatcher 并使用 DSL 来获取该节点。有用的链接ASTMatcherReferencetutorial。希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      你可以检查一下吗?

         bool checkBlockContainStrongSelf(BlockDecl *node)
      {
          bool result = false;
          for (BlockDecl::capture_const_iterator iterator = node->capture_begin() ; iterator != node->capture_end(); iterator ++)
          {
              ImplicitParamDecl *implicitParamDecl = dyn_cast_or_null<ImplicitParamDecl>(iterator->getVariable());
              if (implicitParamDecl && implicitParamDecl->getName() == "self") {
                  if (implicitParamDecl->isARCPseudoStrong()) {
                      result = true;
                  }
              }
          }
      
      
          return result;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-21
        • 1970-01-01
        • 1970-01-01
        • 2015-01-18
        • 2020-03-22
        • 1970-01-01
        • 1970-01-01
        • 2011-08-04
        相关资源
        最近更新 更多