【发布时间】:2016-12-22 05:16:06
【问题描述】:
我们正在寻求实现一个自定义规则,该规则将涉及必须在不同文件之间导航语法树。比如:
ClassA --> 私有 ClassB 字段 --> ClassB --> 私有 ClassC 字段 --> ClassC ...
但是,我不确定是否有可能这样做。我查看了示例存储库以及编写的现有声纳检查,但大多数(如果不是全部)似乎仅限于文件范围。我想知道是否有办法解决这个问题?
我目前尝试从类的符号类型中获取声明变量,如下所示:
public void visitNode(final Tree tree) {
final ClassTree clazz = (ClassTree) tree;
final VariableTree memberField = tree.members().get(0);
final JavaSymbol memberClassSymbol = (JavaSymbol) memberField.symbol().type().symbol();
final ClassTree memberClass = memberClassSymbol.declaration();
}
但是,此字段为空。似乎在我尝试过的每种情况下都是如此。是否有其他方法可以使用自定义声纳扩展来处理此任务?
谢谢。
【问题讨论】:
-
您可能想要准确地确定您想要检测的内容,因为语义 API 可以在这里为您提供帮助。
-
@benzonico 感谢您的回复。在我们的例子中,我们试图实现一个规则来帮助序列化——在可序列化的类中标记为序列化的类(因此不会在 IDE 中显示为警告或现有规则),而这些类由于其他原因实际上不能序列化.例如,在 ClassA 中,我们有两个字段:ClassB 和 MyBean。 MyBean 包含 ClassD。在我们的例子中,我们希望能够使用此规则扫描 classA 和标记 classB,然后继续扫描其他字段 (MyBean) 以查找违反它的其他字段。在这种情况下,ClassD 将被标记。
-
这条规则不满足你的需要吗? sonarqube.com/coding_rules#rule_key=squid%3AS1948
-
不完全是——这个想法是存在的,但不幸的是,我们遇到了在我们的代码(和第三方库)中标记为可序列化的类(因此不会触发该规则)的情况实际上并非如此 - 我们在尝试序列化会话时遇到错误。我们试图实现的更多的是对该规则的扩展,以标记我们知道的违规类。