]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-9929 Filter secondary locations that are in a different file than primary location
authorJulien HENRY <julien.henry@sonarsource.com>
Tue, 10 Oct 2017 07:54:29 +0000 (09:54 +0200)
committerJulien HENRY <julien.henry@sonarsource.com>
Tue, 10 Oct 2017 12:51:58 +0000 (14:51 +0200)
sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/ModuleIssues.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/ModuleIssuesTest.java

index 279b003d93300cbdba6a5302cdcd805e8e5f9d89..6b386d9691f841fb25b66f9ce30b9090497983a6 100644 (file)
@@ -19,8 +19,8 @@
  */
 package org.sonar.scanner.issue;
 
+import com.google.common.base.Strings;
 import javax.annotation.concurrent.ThreadSafe;
-
 import org.sonar.api.batch.fs.TextRange;
 import org.sonar.api.batch.fs.internal.DefaultInputComponent;
 import org.sonar.api.batch.rule.ActiveRule;
@@ -36,8 +36,6 @@ import org.sonar.scanner.protocol.output.ScannerReport;
 import org.sonar.scanner.protocol.output.ScannerReport.IssueLocation;
 import org.sonar.scanner.report.ReportPublisher;
 
-import com.google.common.base.Strings;
-
 /**
  * Initialize the issues raised during scan.
  */
@@ -75,7 +73,7 @@ public class ModuleIssues {
     return false;
   }
 
-  private static ScannerReport.Issue createReportIssue(Issue issue, int batchId, String ruleName, String activeRuleSeverity) {
+  private static ScannerReport.Issue createReportIssue(Issue issue, int componentRef, String ruleName, String activeRuleSeverity) {
     String primaryMessage = Strings.isNullOrEmpty(issue.primaryLocation().message()) ? ruleName : issue.primaryLocation().message();
     org.sonar.api.batch.rule.Severity overriddenSeverity = issue.overriddenSeverity();
     Severity severity = overriddenSeverity != null ? Severity.valueOf(overriddenSeverity.name()) : Severity.valueOf(activeRuleSeverity);
@@ -90,7 +88,7 @@ public class ModuleIssues {
     builder.setMsg(primaryMessage);
     locationBuilder.setMsg(primaryMessage);
 
-    locationBuilder.setComponentRef(batchId);
+    locationBuilder.setComponentRef(componentRef);
     TextRange primaryTextRange = issue.primaryLocation().textRange();
     if (primaryTextRange != null) {
       builder.setTextRange(toProtobufTextRange(textRangeBuilder, primaryTextRange));
@@ -99,11 +97,11 @@ public class ModuleIssues {
     if (gap != null) {
       builder.setGap(gap);
     }
-    applyFlows(builder, locationBuilder, textRangeBuilder, issue);
+    applyFlows(componentRef, builder, locationBuilder, textRangeBuilder, issue);
     return builder.build();
   }
 
-  private static void applyFlows(ScannerReport.Issue.Builder builder, ScannerReport.IssueLocation.Builder locationBuilder,
+  private static void applyFlows(int componentRef, ScannerReport.Issue.Builder builder, ScannerReport.IssueLocation.Builder locationBuilder,
     ScannerReport.TextRange.Builder textRangeBuilder, Issue issue) {
     ScannerReport.Flow.Builder flowBuilder = ScannerReport.Flow.newBuilder();
     for (Flow flow : issue.flows()) {
@@ -112,8 +110,15 @@ public class ModuleIssues {
       }
       flowBuilder.clear();
       for (org.sonar.api.batch.sensor.issue.IssueLocation location : flow.locations()) {
+        int locationComponentRef = ((DefaultInputComponent) location.inputComponent()).batchId();
+        if (locationComponentRef != componentRef) {
+          // Some analyzers are trying to report cross file secondary locations. The API was designed to support it, but server side is not
+          // ready to handle it (especially the UI)
+          // So let's skip them for now (SONAR-9929)
+          continue;
+        }
         locationBuilder.clear();
-        locationBuilder.setComponentRef(((DefaultInputComponent) location.inputComponent()).batchId());
+        locationBuilder.setComponentRef(locationComponentRef);
         String message = location.message();
         if (message != null) {
           locationBuilder.setMsg(message);
index 8bbdee15b5961dc3e41d0a0202915fbdbebe37bf..4ae19f7ef7bff2d918cdf05815b21ec79e58f06e 100644 (file)
@@ -19,6 +19,7 @@
  */
 package org.sonar.scanner.issue;
 
+import java.util.Arrays;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
@@ -182,6 +183,28 @@ public class ModuleIssuesTest {
     assertThat(argument.getValue().getMsg()).isEqualTo("Avoid Cycle");
   }
 
+  // SONAR-9929 Filter secondary locations that are on different files
+  @Test
+  public void skip_cross_file_secondary_locations() {
+    ruleBuilder.add(SQUID_RULE_KEY).setName(SQUID_RULE_NAME);
+    activeRulesBuilder.create(SQUID_RULE_KEY).setSeverity(Severity.INFO).setName(SQUID_RULE_NAME).activate();
+    initModuleIssues();
+
+    DefaultIssue issue = new DefaultIssue()
+      .at(new DefaultIssueLocation().on(file).at(file.selectLine(3)).message("Foo"))
+      .forRule(SQUID_RULE_KEY)
+      .addFlow(Arrays.asList(new DefaultIssueLocation().on(file).at(file.selectLine(4)).message("Location 1"),
+        new DefaultIssueLocation().on(new TestInputFileBuilder("foo", "src/Foo2.php").initMetadata("Foo\nBar\nBiz\n").build()).at(file.selectLine(3)).message("Location outside")));
+    when(filters.accept(anyString(), any(ScannerReport.Issue.class))).thenReturn(true);
+
+    boolean added = moduleIssues.initAndAddIssue(issue);
+
+    assertThat(added).isTrue();
+    ArgumentCaptor<ScannerReport.Issue> argument = ArgumentCaptor.forClass(ScannerReport.Issue.class);
+    verify(reportPublisher.getWriter()).appendComponentIssue(eq(file.batchId()), argument.capture());
+    assertThat(argument.getValue().getFlow(0).getLocationList()).hasSize(1);
+  }
+
   @Test
   public void filter_issue() {
     ruleBuilder.add(SQUID_RULE_KEY).setName(SQUID_RULE_NAME);