我需要在块中找到自我引用(目标 C)。我正在为此使用 Clang AST Matchers。
查找我创建的所有自我引用的匹配器如下:
declRefExpr(to(varDecl(hasName("self")))
现在我只需要将此匹配器应用于块。但我找不到该怎么做。有没有人有任何想法?
我需要在块中找到自我引用(目标 C)。我正在为此使用 Clang AST Matchers。
查找我创建的所有自我引用的匹配器如下:
declRefExpr(to(varDecl(hasName("self")))
现在我只需要将此匹配器应用于块。但我找不到该怎么做。有没有人有任何想法?
我已经通过以下匹配器(在 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
再次找到:)