【问题标题】:Sonarqube: cross-file custom java rule?Sonarqube:跨文件自定义 java 规则?
【发布时间】: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
  • 不完全是——这个想法是存在的,但不幸的是,我们遇到了在我们的代码(和第三方库)中标记为可序列化的类(因此不会触发该规则)的情况实际上并非如此 - 我们在尝试序列化会话时遇到错误。我们试图实现的更多的是对该规则的扩展,以标记我们知道的违规类。

标签: java sonarqube


【解决方案1】:

这在语法级别是不可能的:分析是逐个文件完成的。

一旦分析了一个文件,就会删除语法树并分析到下一个文件。由于无法保证分析文件的顺序,因此您也无法存储某些语法节点以供以后使用。

但是,使用语义分析(分析字节码),根据您想要实现的目标,您可以依赖语义 API 并检测 B 类具有 C 类型的字段(使用符号和类型)等。

【讨论】:

  • 在重新审查这个问题后,我通过语义分析明白了你的意思——我们无法访问树,但可以使用 symbolScope() 等等“遍历”树以满足我们的需要.谢谢。
  • 已录制但未显示,因为我以前从未发布过 :( 抱歉哈哈。
猜你喜欢
  • 2014-04-22
  • 2014-07-19
  • 1970-01-01
  • 1970-01-01
  • 2015-08-28
  • 1970-01-01
  • 2016-11-28
  • 2016-02-12
  • 2016-03-15
相关资源
最近更新 更多