java - 限制 SonarQube 中每行相同检查的问题

标签 java plugins sonarqube

我正在使用 Java 插件 API 为 SonarQube 5.6.6 开发一个插件。我创建了一些自定义规则(检查),其中一个在同一行多次报告相同的问题。这是有道理的,因为该行多次出现相同的错误,但是有什么方法可以限制这一点,以便 SonarQube 仅显示该行中的问题?

图像(和代码)胜于 Eloquent ,所以我将展示一个示例:每次检测到新类时都会报告问题的检查。

@Rule(key = "foo_key", name = "Foo issue", description = "Foo issue", priority = Priority.INFO)
public class FooCheck extends IssuableSubscriptionVisitor {

    @Override
    public List<Kind> nodesToVisit() {
        return ImmutableList.of(Kind.NEW_CLASS);
    }

    @Override
    public void visitNode(Tree tree) {
        reportIssue(tree, "New class!");
    }

}

因此,我们将在一行中遇到两个问题,如 Foo foo = new Foo(new Bar());:

The same issue in the same line

我知道我可以更改此特定检查以实现我想要的。例如,如果它的任何参数是另一个 NEW_CLASS,我可以避免在分析 NEW_CLASS 节点时报告问题;这样,我们会在节点 new Bar() 上报告问题,但在节点 new Foo(new Bar()) 上不会报告问题,因此我们只会得到一个问题:

@Override
public void visitNode(Tree tree) {
    final NewClassTree newClassTree = (NewClassTree) tree;

    if (newClassTree.arguments().stream().noneMatch(arg -> arg.is(Kind.NEW_CLASS))) {
        reportIssue(tree, "New class!");
    }
}

但是,这只是此检查的解决方案。我想知道是否有一种通用方法可以告诉 SonarQube 不要在每行中显示多个相同检查的问题。

谢谢。

最佳答案

您可以在报告问题之前获取 节点的行号,将其保存到全局变量lastLineReported 或报告行列表中。然后,您可以通过两种方式使用简单的 if 语句进行检查:

1 - 使用 lastLineReported 变量:

if(lastLineReported != currentLine) {
        lastLineReported = currentLine;
        reportIssue(tree, "New class!");
    }

2 - 使用报告的行列表:

if(!reportedLines.contains(currentLine)) {
        reportedLines.add(currentLine);
        reportIssue(tree, "New class!");
    }

关于java - 限制 SonarQube 中每行相同检查的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47939687/

相关文章:

java - 在 SonarQube 中使用枚举错误计算开关条件

javascript - 访问潜在 null/ undefined variable 的属性 - javascript

java - 在 Java 中使用反射 API

php - WordPress 表创建抛出错误(而不是创建表)

java - OSGI、Servlet 和 JPA hello world/教程/示例

ruby-on-rails - 在有限的环境中执行 ruby​​ 代码

java - 简化条件运算符

java - 在java中,为什么Object类在成为一个类之后仍如此命名?

java - 如何取消注册按钮点击?

java - Sonar 似乎忽略了 catch block 中设置的变量