From 3c737eed5d5759f79e55d2263336c25b49cca739 Mon Sep 17 00:00:00 2001 From: Duarte Meneses Date: Mon, 12 Dec 2022 11:04:07 -0600 Subject: [PATCH] SONAR-17766 Ignore 'Issue.addQuickFix' instead of throwing an exception --- .../sensor/issue/internal/DefaultIssue.java | 5 +- .../issue/internal/NoOpNewQuickFix.java | 73 +++++++++++++++++++ .../issue/internal/DefaultIssueTest.java | 15 ++-- .../issue/internal/NoOpNewQuickFixTest.java | 54 ++++++++++++++ 4 files changed, 138 insertions(+), 9 deletions(-) create mode 100644 sonar-plugin-api-impl/src/main/java/org/sonar/api/batch/sensor/issue/internal/NoOpNewQuickFix.java create mode 100644 sonar-plugin-api-impl/src/test/java/org/sonar/api/batch/sensor/issue/internal/NoOpNewQuickFixTest.java diff --git a/sonar-plugin-api-impl/src/main/java/org/sonar/api/batch/sensor/issue/internal/DefaultIssue.java b/sonar-plugin-api-impl/src/main/java/org/sonar/api/batch/sensor/issue/internal/DefaultIssue.java index ed55c0d09af..b9a898e2882 100644 --- a/sonar-plugin-api-impl/src/main/java/org/sonar/api/batch/sensor/issue/internal/DefaultIssue.java +++ b/sonar-plugin-api-impl/src/main/java/org/sonar/api/batch/sensor/issue/internal/DefaultIssue.java @@ -82,12 +82,13 @@ public class DefaultIssue extends AbstractDefaultIssue implements @Override public NewQuickFix newQuickFix() { - throw new UnsupportedOperationException(); + return new NoOpNewQuickFix(); } @Override public NewIssue addQuickFix(NewQuickFix newQuickFix) { - throw new UnsupportedOperationException(); + this.quickFixAvailable = true; + return this; } @Override diff --git a/sonar-plugin-api-impl/src/main/java/org/sonar/api/batch/sensor/issue/internal/NoOpNewQuickFix.java b/sonar-plugin-api-impl/src/main/java/org/sonar/api/batch/sensor/issue/internal/NoOpNewQuickFix.java new file mode 100644 index 00000000000..20a28ab1d0a --- /dev/null +++ b/sonar-plugin-api-impl/src/main/java/org/sonar/api/batch/sensor/issue/internal/NoOpNewQuickFix.java @@ -0,0 +1,73 @@ +/* + * SonarQube + * Copyright (C) 2009-2022 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.api.batch.sensor.issue.internal; + +import org.sonar.api.batch.fs.InputFile; +import org.sonar.api.batch.fs.TextRange; +import org.sonar.api.batch.sensor.issue.fix.NewInputFileEdit; +import org.sonar.api.batch.sensor.issue.fix.NewQuickFix; +import org.sonar.api.batch.sensor.issue.fix.NewTextEdit; + +public class NoOpNewQuickFix implements NewQuickFix { + @Override + public NewQuickFix message(String message) { + return this; + } + + @Override + public NewInputFileEdit newInputFileEdit() { + return new NoOpNewInputFileEdit(); + } + + @Override + public NewQuickFix addInputFileEdit(NewInputFileEdit newInputFileEdit) { + return this; + } + + public static class NoOpNewInputFileEdit implements NewInputFileEdit { + + @Override + public NewInputFileEdit on(InputFile inputFile) { + return this; + } + + @Override + public NewTextEdit newTextEdit() { + return new NoOpNewTextEdit(); + } + + @Override + public NewInputFileEdit addTextEdit(NewTextEdit newTextEdit) { + return this; + } + } + + public static class NoOpNewTextEdit implements NewTextEdit { + @Override + public NewTextEdit at(TextRange range) { + return this; + } + + @Override + public NewTextEdit withNewText(String newText) { + return this; + } + } +} diff --git a/sonar-plugin-api-impl/src/test/java/org/sonar/api/batch/sensor/issue/internal/DefaultIssueTest.java b/sonar-plugin-api-impl/src/test/java/org/sonar/api/batch/sensor/issue/internal/DefaultIssueTest.java index 6e40c170065..e68dd1ad196 100644 --- a/sonar-plugin-api-impl/src/test/java/org/sonar/api/batch/sensor/issue/internal/DefaultIssueTest.java +++ b/sonar-plugin-api-impl/src/test/java/org/sonar/api/batch/sensor/issue/internal/DefaultIssueTest.java @@ -233,13 +233,14 @@ public class DefaultIssueTest { } @Test - public void quickfix_not_supported_for_now() { + public void quickfix_only_sets_flag_to_true() { DefaultIssue issue = new DefaultIssue(project); - assertThatThrownBy(() -> issue.addQuickFix(quickFix)) - .isInstanceOf(UnsupportedOperationException.class); - assertThatThrownBy(issue::newQuickFix) - .isInstanceOf(UnsupportedOperationException.class); - assertThatThrownBy(issue::quickFixes) - .isInstanceOf(UnsupportedOperationException.class); + + NewQuickFix newQuickFix = issue.newQuickFix(); + assertThat(newQuickFix).isInstanceOf(NoOpNewQuickFix.class); + + assertThat(issue.isQuickFixAvailable()).isFalse(); + issue.addQuickFix(newQuickFix); + assertThat(issue.isQuickFixAvailable()).isTrue(); } } diff --git a/sonar-plugin-api-impl/src/test/java/org/sonar/api/batch/sensor/issue/internal/NoOpNewQuickFixTest.java b/sonar-plugin-api-impl/src/test/java/org/sonar/api/batch/sensor/issue/internal/NoOpNewQuickFixTest.java new file mode 100644 index 00000000000..63f0730ead9 --- /dev/null +++ b/sonar-plugin-api-impl/src/test/java/org/sonar/api/batch/sensor/issue/internal/NoOpNewQuickFixTest.java @@ -0,0 +1,54 @@ +/* + * SonarQube + * Copyright (C) 2009-2022 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.api.batch.sensor.issue.internal; + +import org.junit.Test; +import org.sonar.api.batch.fs.InputFile; +import org.sonar.api.batch.fs.TextRange; +import org.sonar.api.batch.sensor.issue.fix.NewInputFileEdit; +import org.sonar.api.batch.sensor.issue.fix.NewTextEdit; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; + +public class NoOpNewQuickFixTest { + @Test + public void newInputFileEdit_creates_no_ops() { + NoOpNewQuickFix newQuickFix = new NoOpNewQuickFix(); + NewInputFileEdit newInputFileEdit = newQuickFix.newInputFileEdit(); + assertThat(newInputFileEdit).isInstanceOf(NoOpNewQuickFix.NoOpNewInputFileEdit.class); + NewTextEdit newTextEdit = newInputFileEdit.newTextEdit(); + assertThat(newTextEdit).isInstanceOf(NoOpNewQuickFix.NoOpNewTextEdit.class); + } + + @Test + public void no_method_throws_exception() { + NoOpNewQuickFix newQuickFix = new NoOpNewQuickFix(); + assertThat(newQuickFix.message("msg")).isEqualTo(newQuickFix); + NewInputFileEdit newInputFileEdit = newQuickFix.newInputFileEdit(); + + assertThat(newQuickFix.addInputFileEdit(newInputFileEdit)).isEqualTo(newQuickFix); + assertThat(newInputFileEdit.on(mock(InputFile.class))).isEqualTo(newInputFileEdit); + NewTextEdit newTextEdit = newInputFileEdit.newTextEdit(); + assertThat(newInputFileEdit.addTextEdit(newTextEdit)).isEqualTo(newInputFileEdit); + assertThat(newTextEdit.at(mock(TextRange.class))).isEqualTo(newTextEdit); + assertThat(newTextEdit.withNewText("text")).isEqualTo(newTextEdit); + } +} -- 2.39.5