java - Sonar 的 TryStatementTree#resourceList 什么时候返回不是 VariableTree 的 Tree?

标签 java sonarqube

我遇到了org.sonar.plugins.java.api.tree.TryStatementTree界面,同时查看 SonarQube 插件的一些代码。实现的规则之一会检查 try-with-resources block 中定义的变量。

查看 TryStatementTree#resourceList ,我可以看到它返回 ListTree<Tree> 。这可以通过多种方式进行迭代。在一种情况下,插件检查声明的变量的名称。发生这种情况时,Tree被转换为 VariableTree因为Tree是一个更通用的接口(interface),不提供通过 IdentifierTree 对变量名称的访问.

这是我正在查看的代码中的强制转换的位置,一个扩展 BaseTreeVisitor 的类并实现JavaFileScanner .

@Override
public void visitTryStatement(TryStatementTree tree) {
  // ...
  tree.resourceList().stream()
     .filter(resource -> resource instanceof VariableTree) // Is it possible for this condition to evaluate to false? 
     .map(VariableTree.class::cast)
     .map(resource -> resource.simpleName().name())
     .forEach(SomeClass::handleThisCase);
  // ...
}

查看Java Language Standard ,我无法想到 try 时的情况。语句将用一些不是标识符列表的东西来代替资源声明。

我认为这与表示不存在的资源定义或类似的东西的需要有关,所以我向它扔了一些单元测试用例。

try { // No resource declaration here
  // ...
} catch (SomeException ex) {
  // ...
}

但在这种情况下根本没有调用该方法,我猜这是由 BaseTreeVisitor 处理的.

我一直在尝试想出一些示例来使转换变得不可能,但我想出的所有内容要么无法编译,要么从不遵循此执行路径。

我是否缺少编写 try 的方法?使更通用的声明 Tree更好的选择?或者这种选择是否源于库中接口(interface)的构造方式?它似乎没有由任何 super 接口(interface)强制执行( TryStatementTree -> StatementTree -> Tree )。 resourceListTryStatementTree 定义本身。

最佳答案

讽刺的是,我在 SonarQube documentation 中偶然发现了答案。发布问题后几分钟。

事实证明,有一种方法的工作原理完全符合我的预期,即 TryStatementTree#resource,该方法已被弃用,然后被删除,取而代之的是 TryStatementTree# resourceList,这正是我的代码所使用的。

Deprecated method org.sonar.plugins.java.api.tree.TryStatementTree.resources() has been removed, in favor of org.sonar.plugins.java.api.tree.TryStatementTree.resourceList(), as Java 9 allows other trees than VariableTree to be placed as resources in try-with-resources statements.

这是一个例子:

SomeAutoCloseableClass myResource = obtainOneSomehow();
try (myResurce) { // No resource declaration here, just an identifier
  // ...
} catch (SomeException ex) {
  // ...
}

我的项目是在源代码级别设置为 Java 8 兼容性的情况下编译的,应该对其进行修改,并添加新的单元测试用例,以确保编写 try-with-resources block 已处理。

关于java - Sonar 的 TryStatementTree#resourceList 什么时候返回不是 VariableTree 的 Tree?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61124346/

相关文章:

java - 无法使用 ENTER 键调用函数

java - 在Java中创建数组的数组

java - 使用 for 循环查找大量按钮 (Android Studio)

Java 代码质量趋势和统计数据(LOC、方法等)趋势

java - 在最新的 Android Studio 中启动 AVD 时出错

java - 同步方法还是整个队列?

java - 带有可序列化列表的 SonarQube catch 22

Java-17 - 切换案例 - 应删除未使用的方法参数

sonarqube - 如何从 Sonar 中提取正确的定位信息?

linux - Sonarqube 6.7 从 JVM 获得 ping 响应并突然在 AWS 上停止