如何使用AST Matcher在Clang AST中找到BlockDecl节点?

时间:2017-08-31 13:55:19

标签: clang abstract-syntax-tree clang-ast-matchers

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

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

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

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

1 个答案:

答案 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:)