From 8c123235baa27eaed98122658bc2512f1cbc0f6d Mon Sep 17 00:00:00 2001 From: marcelhillesheim Date: Thu, 21 Oct 2021 02:32:56 +0200 Subject: [PATCH] Added inspection and quickfix for lines with trailing whitespace (only for values without quotes) GitOrigin-RevId: 4e159cdff71a299732a3791da46695a20e062ce9 --- .../TrailingWhitespaceInspection.java | 80 +++++++++++++++++++ .../src/main/resources/META-INF/plugin.xml | 7 ++ .../DotEnvTrailingWhitespaceInspection.html | 5 ++ .../dotenv/tests/dotenv/InspectionsTest.java | 6 ++ .../tests/dotenv/fixtures/inspections.env | 3 + .../dotenv/tests/dotenv/fixtures/quickFix.env | 3 + 6 files changed, 104 insertions(+) create mode 100644 plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/inspections/TrailingWhitespaceInspection.java create mode 100644 plugins/env-files-support/src/main/resources/inspectionDescriptions/DotEnvTrailingWhitespaceInspection.html diff --git a/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/inspections/TrailingWhitespaceInspection.java b/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/inspections/TrailingWhitespaceInspection.java new file mode 100644 index 000000000000..79518f943dce --- /dev/null +++ b/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/inspections/TrailingWhitespaceInspection.java @@ -0,0 +1,80 @@ +package ru.adelf.idea.dotenv.inspections; + +import com.intellij.codeInspection.*; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.util.IncorrectOperationException; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import ru.adelf.idea.dotenv.DotEnvFactory; +import ru.adelf.idea.dotenv.psi.DotEnvFile; +import ru.adelf.idea.dotenv.psi.DotEnvTypes; +import ru.adelf.idea.dotenv.psi.DotEnvValue; + +public class TrailingWhitespaceInspection extends LocalInspectionTool { + // Change the display name within the plugin.xml + // This needs to be here as otherwise the tests will throw errors. + @NotNull + @Override + public String getDisplayName() { + return "Value has trailing whitespace"; + } + + @Nullable + @Override + public ProblemDescriptor[] checkFile(@NotNull PsiFile file, @NotNull InspectionManager manager, boolean isOnTheFly) { + if (!(file instanceof DotEnvFile)) { + return null; + } + + return analyzeFile(file, manager, isOnTheFly).getResultsArray(); + } + + @NotNull + private ProblemsHolder analyzeFile(@NotNull PsiFile file, @NotNull InspectionManager manager, boolean isOnTheFly) { + ProblemsHolder problemsHolder = new ProblemsHolder(manager, file, isOnTheFly); + + PsiTreeUtil.findChildrenOfType(file, DotEnvValue.class).forEach(dotEnvValue -> { + if (dotEnvValue.getText().matches(".*[ \\t]+")) { + problemsHolder.registerProblem(dotEnvValue, + new TextRange(dotEnvValue.getText().stripTrailing().length(), dotEnvValue.getText().length()), + "Line has trailing whitespace.", + new TrailingWhitespaceInspection.RemoveTrailingWhitespaceQuickFix() + ); + } + }); + + return problemsHolder; + } + + private static class RemoveTrailingWhitespaceQuickFix implements LocalQuickFix { + + @NotNull + @Override + public String getName() { + return "Remove trailing whitespace"; + } + + public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { + try { + PsiElement psiElement = descriptor.getPsiElement(); + + PsiElement newPsiElement = DotEnvFactory.createFromText(project, DotEnvTypes.VALUE, + "DUMMMY_KEY="+psiElement.getText().stripTrailing()); + + psiElement.replace(newPsiElement); + } catch (IncorrectOperationException e) { + Logger.getInstance(IncorrectDelimiterInspection.class).error(e); + } + } + + @NotNull + public String getFamilyName() { + return getName(); + } + } +} diff --git a/plugins/env-files-support/src/main/resources/META-INF/plugin.xml b/plugins/env-files-support/src/main/resources/META-INF/plugin.xml index 167e97f946ac..cc2c4e88152a 100644 --- a/plugins/env-files-support/src/main/resources/META-INF/plugin.xml +++ b/plugins/env-files-support/src/main/resources/META-INF/plugin.xml @@ -134,6 +134,13 @@ level="WARNING" implementationClass="ru.adelf.idea.dotenv.inspections.LowercaseKeyInspection"/> + + diff --git a/plugins/env-files-support/src/main/resources/inspectionDescriptions/DotEnvTrailingWhitespaceInspection.html b/plugins/env-files-support/src/main/resources/inspectionDescriptions/DotEnvTrailingWhitespaceInspection.html new file mode 100644 index 000000000000..2b4503ff0d9b --- /dev/null +++ b/plugins/env-files-support/src/main/resources/inspectionDescriptions/DotEnvTrailingWhitespaceInspection.html @@ -0,0 +1,5 @@ + + +Reports trailing whitespaces. + + \ No newline at end of file diff --git a/plugins/env-files-support/src/test/java/ru/adelf/idea/dotenv/tests/dotenv/InspectionsTest.java b/plugins/env-files-support/src/test/java/ru/adelf/idea/dotenv/tests/dotenv/InspectionsTest.java index cb7de4d08799..304fadbfece6 100644 --- a/plugins/env-files-support/src/test/java/ru/adelf/idea/dotenv/tests/dotenv/InspectionsTest.java +++ b/plugins/env-files-support/src/test/java/ru/adelf/idea/dotenv/tests/dotenv/InspectionsTest.java @@ -59,6 +59,11 @@ public class InspectionsTest extends DotEnvLightCodeInsightFixtureTestCase { doInspectionTest(new LowercaseKeyInspection(), Collections.singletonList("lower_case_KEY")); } + @Test + public void testTrailingWhitespace() { + doInspectionTest(new TrailingWhitespaceInspection(), Arrays.asList(" ", " ")); + } + // Every available quickfix from every inspection is getting applied @Test public void testQuickFixes() { @@ -66,6 +71,7 @@ public class InspectionsTest extends DotEnvLightCodeInsightFixtureTestCase { myFixture.enableInspections(new ExtraBlankLineInspection()); myFixture.enableInspections(new IncorrectDelimiterInspection()); myFixture.enableInspections(new LowercaseKeyInspection()); + myFixture.enableInspections(new TrailingWhitespaceInspection()); myFixture.doHighlighting(); List intentionActions = myFixture.getAllQuickFixes(); diff --git a/plugins/env-files-support/src/test/java/ru/adelf/idea/dotenv/tests/dotenv/fixtures/inspections.env b/plugins/env-files-support/src/test/java/ru/adelf/idea/dotenv/tests/dotenv/fixtures/inspections.env index 766f462e1d27..a41a917e8834 100644 --- a/plugins/env-files-support/src/test/java/ru/adelf/idea/dotenv/tests/dotenv/fixtures/inspections.env +++ b/plugins/env-files-support/src/test/java/ru/adelf/idea/dotenv/tests/dotenv/fixtures/inspections.env @@ -12,4 +12,7 @@ INCORRECT-DELIMITER=test-test *LEADING_CHARACTER=test +TRAILING_WHITESPACE_SPACE=space +TRAILING_WHITESPACE_TAB=tab + lower_case_KEY=test \ No newline at end of file diff --git a/plugins/env-files-support/src/test/java/ru/adelf/idea/dotenv/tests/dotenv/fixtures/quickFix.env b/plugins/env-files-support/src/test/java/ru/adelf/idea/dotenv/tests/dotenv/fixtures/quickFix.env index f807701b8ad4..a41f6b1e8391 100644 --- a/plugins/env-files-support/src/test/java/ru/adelf/idea/dotenv/tests/dotenv/fixtures/quickFix.env +++ b/plugins/env-files-support/src/test/java/ru/adelf/idea/dotenv/tests/dotenv/fixtures/quickFix.env @@ -11,4 +11,7 @@ INCORRECT_DELIMITER=test-test *LEADING_CHARACTER=test +TRAILING_WHITESPACE_SPACE=space +TRAILING_WHITESPACE_TAB=tab + LOWER_CASE_KEY=test \ No newline at end of file