如何从Clang AST的块中获取DeclRefExpr?

时间:2017-08-28 16:32:00

标签: clang llvm abstract-syntax-tree

我需要检查块(在目标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;
}

在这种情况下,我预计位于DeclRefExpr from CompoundStmt内的DeclRefExpr的输出BlockDecl。但它没有用。

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

有没有人有任何想法如何解决这个问题?

以下是AST部分的示例: AST example

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您可以检查一下吗?

   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;
}