我需要检查块(在目标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
父母。
有没有人有任何想法如何解决这个问题?
答案 0 :(得分:0)
我建议您可以研究ASTMatcher并使用DSL来获取该节点。有用的链接ASTMatcherReference和tutorial。希望对您有所帮助。
答案 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;
}