2015-11-24 32 views
3

在寫一個聲納規則(爪哇),我無法找到一種方法來檢測類成員的訪問。 實施例:如何檢測類的成員(場)ACCES在聲納規則

class SomeClass { 
    Object field; 
} 

class SomeOtherClass { 
    SomeClass instance = new SomeClass(); 

    void method(){ 
     Objects.requireNonNull(instance.field); 
    } 

} 

在本實施例SomeOtherClass.method()訪問SomeClass的的包保護構件。
我找不到合適的方法org.sonar.plugins.java.api.tree.TreeVisitor來檢測這個。
我的第一個猜測是使用

BaseTreeVisitor.visitMemberSelectExpression(MemberSelectExpressionTree)) 

但正如我預料它並沒有奏效。

我將代碼提交到https://github.com/arxes-tolina/sonar-plugins/ 並且僅實現了帶調試輸出的UnexpectedAccessCheck.visitMemberSelectExpression(MemberSelectExpressionTree)。運行測試利茲的一些線路在控制檯上:

[main] DEBUG d.t.s.p.v.c.UnexpectedAccessCheck - visitMemberSelectExpression invoked. Name of the symbol of identifier: !unknownSymbol! 

可能是,這個問題是有關 Proper way for getting annotations of Java-Methods in custom Sonar rules

我使用聲納-java的插件的3.7.1和聲納插件-API的5.1。

你對我有什麼暗示?

回答

1

您應該使用語義API這一點。在標識要檢查(在這裏,你的情況field,你應該通過memberSelectExpression訪問)獲得使用IdentifierTreesymbol()方法相關的符號。

在返回的符號上,您可以使用isPackageVisibility()方法來確定此字段的可見性(您還有許多其他方法可用於處理符號)。

+0

不幸的是,這個提示並沒有幫助解決問題。 來自https://github.com/arxes-tolina/sonar-plugins/的'UnexpectedAccessCheckTest'因爲這種失敗的情況而失敗:'UnexpectedAccessCheckTestClassCaller.defaultAccesMember()'加入了一些字段(callee.visibleForAll)和(callee.visibleForTesting) 。在調試輸出中仍然會有一些'!unknownSymbol!'來查看。 – wojtus