]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-10201 Expose issue precise location in the FilterableIssue API
authorDuarte Meneses <duarte.meneses@sonarsource.com>
Wed, 6 Jun 2018 13:36:48 +0000 (15:36 +0200)
committerSonarTech <sonartech@sonarsource.com>
Mon, 11 Jun 2018 18:20:48 +0000 (20:20 +0200)
sonar-plugin-api/src/main/java/org/sonar/api/scan/issue/filter/FilterableIssue.java
sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/DefaultFilterableIssue.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/DefaultFilterableIssueTest.java

index 5192d27352e996b9892c0e055fdcd5d667411265..c5bc91d58150471977e23d037070de98c06e6a71 100644 (file)
@@ -22,6 +22,7 @@ package org.sonar.api.scan.issue.filter;
 import java.util.Date;
 import javax.annotation.CheckForNull;
 import javax.annotation.concurrent.ThreadSafe;
+import org.sonar.api.batch.fs.TextRange;
 import org.sonar.api.rule.RuleKey;
 
 /**
@@ -38,9 +39,20 @@ public interface FilterableIssue {
 
   String message();
 
+  /**
+   * @deprecated since 7.2. Use {@link #textRange() instead}.
+   */
+  
+  @Deprecated
   @CheckForNull
   Integer line();
 
+  /**
+   * @since 7.2 
+   */
+  @CheckForNull
+  TextRange textRange();
+
   /**
    * @deprecated since 5.5 use {@link #gap()}
    */
index 58ca9cfb48849c978514955aada7a046a84e57ff..b1b9cbc04772b7fb2079ca57bfa9a235993ebd30 100644 (file)
@@ -26,7 +26,10 @@ import javax.annotation.concurrent.ThreadSafe;
 import org.apache.commons.lang.builder.ToStringBuilder;
 import org.apache.commons.lang.builder.ToStringStyle;
 import org.sonar.api.batch.fs.InputModule;
+import org.sonar.api.batch.fs.TextRange;
 import org.sonar.api.batch.fs.internal.DefaultInputModule;
+import org.sonar.api.batch.fs.internal.DefaultTextPointer;
+import org.sonar.api.batch.fs.internal.DefaultTextRange;
 import org.sonar.api.rule.RuleKey;
 import org.sonar.api.scan.issue.filter.FilterableIssue;
 import org.sonar.scanner.ProjectAnalysisInfo;
@@ -66,11 +69,23 @@ public class DefaultFilterableIssue implements FilterableIssue {
     return rawIssue.getMsg();
   }
 
+  @Deprecated
   @Override
   public Integer line() {
     return rawIssue.hasTextRange() ? rawIssue.getTextRange().getStartLine() : null;
   }
 
+  @Override
+  public TextRange textRange() {
+    if (!rawIssue.hasTextRange()) {
+      return null;
+    }
+
+    return new DefaultTextRange(
+      new DefaultTextPointer(rawIssue.getTextRange().getStartLine(), rawIssue.getTextRange().getStartOffset()),
+      new DefaultTextPointer(rawIssue.getTextRange().getEndLine(), rawIssue.getTextRange().getEndOffset()));
+  }
+
   @Override
   public Double gap() {
     return rawIssue.getGap() != 0 ? rawIssue.getGap() : null;
index 15758ce58254893b38f22e3be8081e94ecd0543f..b7cba5eb5505e52338b44c0022c74b42ac8685fa 100644 (file)
@@ -50,7 +50,11 @@ public class DefaultFilterableIssueTest {
     Issue.Builder builder = Issue.newBuilder();
 
     builder.setGap(3.0);
-    builder.setTextRange(TextRange.newBuilder().setStartLine(30));
+    builder.setTextRange(TextRange.newBuilder()
+      .setStartLine(30)
+      .setStartOffset(10)
+      .setEndLine(31)
+      .setEndOffset(3));
     builder.setSeverity(Severity.MAJOR);
     return builder.build();
   }
@@ -72,6 +76,10 @@ public class DefaultFilterableIssueTest {
     assertThat(issue.componentKey()).isEqualTo(componentKey);
     assertThat(issue.creationDate()).isEqualTo(new Date(10_000));
     assertThat(issue.line()).isEqualTo(30);
+    assertThat(issue.textRange().start().line()).isEqualTo(30);
+    assertThat(issue.textRange().start().lineOffset()).isEqualTo(10);
+    assertThat(issue.textRange().end().line()).isEqualTo(31);
+    assertThat(issue.textRange().end().lineOffset()).isEqualTo(3);
     assertThat(issue.projectKey()).isEqualTo("projectKey");
     assertThat(issue.effortToFix()).isEqualTo(3.0);
     assertThat(issue.severity()).isEqualTo("MAJOR");