From 41bb4a91c7e9db24ca2435c5bc8c77e3bf1df20a Mon Sep 17 00:00:00 2001 From: marcelhillesheim Date: Wed, 20 Oct 2021 16:05:59 +0200 Subject: [PATCH] Added inspection and quickfix for keys with lowercase chars GitOrigin-RevId: 5813c4fed8adb6fff41b25506bd1fef5bcda7727 --- .../inspections/LowercaseKeyInspection.java | 76 +++++++++++++++++++ .../src/main/resources/META-INF/plugin.xml | 8 ++ .../DotEnvLowercaseKeyInspection.html | 5 ++ .../dotenv/tests/dotenv/InspectionsTest.java | 6 ++ .../tests/dotenv/fixtures/inspections.env | 4 +- .../dotenv/tests/dotenv/fixtures/quickFix.env | 4 +- 6 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/inspections/LowercaseKeyInspection.java create mode 100644 plugins/env-files-support/src/main/resources/inspectionDescriptions/DotEnvLowercaseKeyInspection.html diff --git a/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/inspections/LowercaseKeyInspection.java b/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/inspections/LowercaseKeyInspection.java new file mode 100644 index 000000000000..02a582a6e1f1 --- /dev/null +++ b/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/inspections/LowercaseKeyInspection.java @@ -0,0 +1,76 @@ +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.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.*; + +public class LowercaseKeyInspection 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 "Key uses lowercase chars"; + } + + @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, DotEnvKey.class).forEach(dotEnvKey -> { + if (dotEnvKey.getText().matches(".*[a-z].*")) { + problemsHolder.registerProblem(dotEnvKey, + "Key uses lowercase chars. Only keys with uppercase chars are allowed.", + new ForceUppercaseQuickFix() + ); + } + }); + + return problemsHolder; + } + + private static class ForceUppercaseQuickFix implements LocalQuickFix { + + @NotNull + @Override + public String getName() { + return "Change to uppercase"; + } + + public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { + try { + PsiElement psiElement = descriptor.getPsiElement(); + + PsiElement newPsiElement = DotEnvFactory.createFromText(project, DotEnvTypes.KEY, + psiElement.getText().toUpperCase() +"=dummy"); + + 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 e718839d3aa3..167e97f946ac 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 @@ -126,6 +126,14 @@ level="WARNING" implementationClass="ru.adelf.idea.dotenv.inspections.LeadingCharacterInspection"/> + + diff --git a/plugins/env-files-support/src/main/resources/inspectionDescriptions/DotEnvLowercaseKeyInspection.html b/plugins/env-files-support/src/main/resources/inspectionDescriptions/DotEnvLowercaseKeyInspection.html new file mode 100644 index 000000000000..0e4b952d5abe --- /dev/null +++ b/plugins/env-files-support/src/main/resources/inspectionDescriptions/DotEnvLowercaseKeyInspection.html @@ -0,0 +1,5 @@ + + +Reports keys, which use lowercase chars. Keys should be written in uppercase. + + \ 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 f13880f2e284..cb7de4d08799 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 @@ -54,12 +54,18 @@ public class InspectionsTest extends DotEnvLightCodeInsightFixtureTestCase { doInspectionTest(new LeadingCharacterInspection(), Collections.singletonList("*LEADING_CHARACTER")); } + @Test + public void testLowercaseKeyInspection() { + doInspectionTest(new LowercaseKeyInspection(), Collections.singletonList("lower_case_KEY")); + } + // Every available quickfix from every inspection is getting applied @Test public void testQuickFixes() { myFixture.enableInspections(new SpaceInsideNonQuotedInspection()); myFixture.enableInspections(new ExtraBlankLineInspection()); myFixture.enableInspections(new IncorrectDelimiterInspection()); + myFixture.enableInspections(new LowercaseKeyInspection()); 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 73bc8688847e..766f462e1d27 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 @@ -10,4 +10,6 @@ SPACE_INSIDE_NON_QUOTED=spaces without quotes INCORRECT-DELIMITER=test-test -*LEADING_CHARACTER=test \ No newline at end of file +*LEADING_CHARACTER=test + +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 a25044ee5f6a..f807701b8ad4 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 @@ -9,4 +9,6 @@ SPACE_INSIDE_NON_QUOTED="spaces without quotes" INCORRECT_DELIMITER=test-test -*LEADING_CHARACTER=test \ No newline at end of file +*LEADING_CHARACTER=test + +LOWER_CASE_KEY=test \ No newline at end of file