如何使用AST匹配器在Clang AST中查找BlockDecl节点?

如何使用AST匹配器在Clang AST中查找BlockDecl节点?,clang,abstract-syntax-tree,clang-ast-matchers,Clang,Abstract Syntax Tree,Clang Ast Matchers,我需要在块中查找自引用(目标C)。我使用了叮当作响的AST匹配器 查找我创建的所有自引用的匹配器如下所示: declRefExpr(to(varDecl(hasName("self"))) 现在我只需要将此匹配器应用于块。但我不知道怎么做。有人有什么想法吗?我已经通过以下匹配者解决了这个问题(在OCLint中): 最终我决定找到BlockExpr,而不是BlockDecl。因此,上面的规则在所有块表达式中查找自引用。 但我没有意识到在某些块中,self是有效的。例如,dispatch_once

我需要在块中查找自引用(目标C)。我使用了叮当作响的AST匹配器

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

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

现在我只需要将此匹配器应用于块。但我不知道怎么做。有人有什么想法吗?

我已经通过以下匹配者解决了这个问题(在OCLint中):

最终我决定找到
BlockExpr
,而不是
BlockDecl
。因此,上面的规则在所有块表达式中查找自引用。 但我没有意识到在某些块中,
self
是有效的。例如,
dispatch_once
中的块,它在应用程序的生命周期内只执行一次块对象

dispatch_once(&onceToken, ^{
        sharedInstance = [[self alloc] init];
    });

因此,我认为我需要再次找到
BlockDecl
:)

我本来希望写一些类似
declRefExpr(hasascentor(BlockDecl())等)
,但似乎没有BlockDecl匹配程序。可能会提交功能请求?我不知道如何检查块节点。我也没有找到
BlockDecl
的匹配器,因此我创建了
BlockExpr
匹配器。但我发现有些情况下self在block中是有效的,似乎我需要再次使用
BlockDecl
matcher(参见下面我的答案)。
dispatch_once(&onceToken, ^{
        sharedInstance = [[self alloc] init];
    });