2017-08-31 109 views
0

我需要在塊中找到自引用(目標C)。我正在使用Clang AST Matchers。如何在使用AST匹配器的Clang AST中找到BlockDecl節點?

找到我創建的所有自引用的匹配是如下:

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

現在我需要應用此匹配的僅幾個街區。但我找不到如何去做。有沒有人有任何想法?

+0

我沒有料想到會寫類似'declRefExpr(hasAncestor(blockDecl()),等等)',但似乎沒有blockDecl匹配器。也許提交功能請求?我看不到還有什麼其他的檢查塊節點。 –

+0

我還沒有找到'BlockDecl'的匹配器,因此我創建了'BlockExpr'匹配器。但是我發現了一些情況,當self在block中有效時,我似乎需要'BlockDecl'匹配器(請參閱下面的答案)。 – Yulia

回答

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