diff options
author | Dejan Milisavljevic <130993898+dejan-milisavljevic-sonarsource@users.noreply.github.com> | 2024-02-15 16:46:48 +0100 |
---|---|---|
committer | sonartech <sonartech@sonarsource.com> | 2024-02-15 20:02:34 +0000 |
commit | 354bbb2091038a18d621799bc70b06f6376e63ea (patch) | |
tree | 46d6fb4164affab487afed40d487b9dd3ae0e815 /sonar-scanner-engine/src | |
parent | afa1e65cfbe2f17f39ba73e1fe2dd2a543c5bf9a (diff) | |
download | sonarqube-354bbb2091038a18d621799bc70b06f6376e63ea.tar.gz sonarqube-354bbb2091038a18d621799bc70b06f6376e63ea.zip |
SONAR-20958 Improve error message for startColumn on empty line (#10628)
Diffstat (limited to 'sonar-scanner-engine/src')
2 files changed, 35 insertions, 1 deletions
diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/externalissue/ExternalIssueImporter.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/externalissue/ExternalIssueImporter.java index e76122628b4..848a54c1278 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/externalissue/ExternalIssueImporter.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/externalissue/ExternalIssueImporter.java @@ -44,6 +44,8 @@ import org.sonar.scanner.externalissue.ExternalIssueReport.Issue; import org.sonar.scanner.externalissue.ExternalIssueReport.Location; import org.sonar.scanner.externalissue.ExternalIssueReport.Rule; +import static java.lang.String.format; + public class ExternalIssueImporter { private static final Logger LOG = LoggerFactory.getLogger(ExternalIssueImporter.class); private static final int MAX_UNKNOWN_FILE_PATHS_TO_PRINT = 5; @@ -197,6 +199,7 @@ public class ExternalIssueImporter { if (location.textRange != null) { if (location.textRange.startColumn != null) { TextPointer start = file.newPointer(location.textRange.startLine, location.textRange.startColumn); + checkStartColumnOnEmptyLine(file, start); int endLine = (location.textRange.endLine != null) ? location.textRange.endLine : location.textRange.startLine; int endColumn; @@ -211,6 +214,12 @@ public class ExternalIssueImporter { return newLocation; } + private static void checkStartColumnOnEmptyLine(InputFile file, TextPointer startPointer) { + if (file.selectLine(startPointer.line()).end().lineOffset() == 0) { + throw new IllegalArgumentException(format("A 'startColumn' %s cannot be provided when the line is empty", startPointer)); + } + } + @CheckForNull private static InputFile findFile(SensorContext context, String filePath) { return context.fileSystem().inputFile(context.fileSystem().predicates().hasPath(filePath)); diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/externalissue/ExternalIssueImporterTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/externalissue/ExternalIssueImporterTest.java index be0d139b4cd..549a8517a16 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/externalissue/ExternalIssueImporterTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/externalissue/ExternalIssueImporterTest.java @@ -71,7 +71,7 @@ public class ExternalIssueImporterTest { context = SensorContextTester.create(baseDir); sourceFile = new TestInputFileBuilder("foo", "src/Foo.java") .setModuleBaseDir(baseDir.toPath()) - .initMetadata("the first line\nthe second line") + .initMetadata("the first line\nthe second line\n\n") .setCharset(UTF_8) .setLanguage("java") .build(); @@ -174,6 +174,18 @@ public class ExternalIssueImporterTest { } @Test + public void execute_whenNewFormatWithStartColumnOnEmptyLine_shouldThrowException() { + ExternalIssueReport.TextRange input = new ExternalIssueReport.TextRange(); + input.startLine = 3; + input.startColumn = 0; + + ExternalIssueReport.Issue issue = newIssue(input); + assertThatThrownBy(() -> runOn(issue)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("A 'startColumn' [line=3, lineOffset=0] cannot be provided when the line is empty"); + } + + @Test public void execute_whenNewFormatContainsNonExistentCleanCodeAttribute_shouldThrowException() { ExternalIssueReport report = new ExternalIssueReport(); ExternalIssueReport.Rule rule = createRule("not_existent_attribute", MAINTAINABILITY.name(), HIGH.name()); @@ -304,6 +316,19 @@ public class ExternalIssueImporterTest { assertThat(got.end().lineOffset()).isEqualTo(sourceFile.selectLine(input.endLine).end().lineOffset()); } + @Test + public void execute_whenDeprecatedFormatWithStartColumnOnEmptyLine_shouldThrowException() { + ExternalIssueReport.TextRange input = new ExternalIssueReport.TextRange(); + input.startLine = 3; + input.startColumn = 0; + + ExternalIssueReport.Issue issue = newIssue(input); + assertThatThrownBy(() -> runOnDeprecatedFormat(issue)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("A 'startColumn' [line=3, lineOffset=0] cannot be provided when the line is empty"); + } + + private static ExternalIssueReport.Rule createRule() { return createRule(RULE_ATTRIBUTE.name(), SECURITY.name(), HIGH.name()); } |