1

我需要在块中找到自我引用(目标 C)。我正在为此使用 Clang AST Matchers。

查找我创建的所有自我引用的匹配器如下:

declRefExpr(to(varDecl(hasName("self")))

现在我只需要将此匹配器应用于块。但我找不到该怎么做。有没有人有任何想法?

4

1 回答 1

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再次找到:)

于 2017-09-04T09:21:39.750 回答