0
我需要在塊中找到自引用(目標C)。我正在使用Clang AST Matchers。如何在使用AST匹配器的Clang AST中找到BlockDecl節點?
找到我創建的所有自引用的匹配是如下:
declRefExpr(to(varDecl(hasName("self")))
現在我需要應用此匹配的僅幾個街區。但我找不到如何去做。有沒有人有任何想法?
我需要在塊中找到自引用(目標C)。我正在使用Clang AST Matchers。如何在使用AST匹配器的Clang AST中找到BlockDecl節點?
找到我創建的所有自引用的匹配是如下:
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
再次:)
我沒有料想到會寫類似'declRefExpr(hasAncestor(blockDecl()),等等)',但似乎沒有blockDecl匹配器。也許提交功能請求?我看不到還有什麼其他的檢查塊節點。 –
我還沒有找到'BlockDecl'的匹配器,因此我創建了'BlockExpr'匹配器。但是我發現了一些情況,當self在block中有效時,我似乎需要'BlockDecl'匹配器(請參閱下面的答案)。 – Yulia