如何检测Sonar规则中的类成员(字段)访问

在编写声纳规则( Java)时,我找不到一种方法来检测对类成员的访问.

例:

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?

我使用3.7.1的sonar-java-plugin和5.1的sonar-plugin-api.

你有什么暗示吗?

最佳答案 您应该为此使用语义API.在您要检查的标识符上(在您的案例字段中,您应该通过memberSelectExpression访问)使用IdentifierTree的symbol()方法获取关联的符号.

在返回的符号上,您可以使用isPackageVisibility()方法来确定此字段的可见性(您还有许多其他方法来处理符号).

点赞