我需要在块中找到自引用(Objective C)。我正在使用Clang AST Matchers。
找到我创建的所有自我引用的匹配器如下:
declRefExpr(to(varDecl(hasName("self")))
现在我需要仅为块应用此匹配器。但我找不到怎么做。有没有人有任何想法?
答案 0 :(得分:0)
我已经通过以下匹配器(在OCLint中)解决了这个问题:
virtual void setUpMatcher() override
{
StatementMatcher blockExpression = expr(hasType(blockPointerType()));
addMatcher(declRefExpr(to(varDecl(hasName("self"))), hasAncestor(blockExpression)).bind("selfRefInBlock"));
}
最终我决定找BlockExpr
而不是BlockDecl
。因此,上面的规则在所有块表达式中查找自引用。
但我没有意识到在某些块中self
是有效的。例如dispatch_once
中的块,它在应用程序的生命周期内执行一次块对象一次且仅执行一次。
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] init];
});
因此我想我需要再次找到BlockDecl
:)