diff --git a/src/main/java/fr/adrienbrault/idea/symfony2plugin/config/yaml/inspection/YamlDuplicateParameterKeyInspection.java b/src/main/java/fr/adrienbrault/idea/symfony2plugin/config/yaml/inspection/YamlDuplicateParameterKeyInspection.java index b569de038..88e2936d0 100644 --- a/src/main/java/fr/adrienbrault/idea/symfony2plugin/config/yaml/inspection/YamlDuplicateParameterKeyInspection.java +++ b/src/main/java/fr/adrienbrault/idea/symfony2plugin/config/yaml/inspection/YamlDuplicateParameterKeyInspection.java @@ -1,10 +1,12 @@ package fr.adrienbrault.idea.symfony2plugin.config.yaml.inspection; import com.intellij.codeInspection.ProblemsHolder; +import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElementVisitor; import com.intellij.psi.PsiFile; import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent; import org.jetbrains.annotations.NotNull; +import org.jetbrains.yaml.psi.YAMLKeyValue; /** * @author Daniel Espendiller @@ -14,7 +16,6 @@ public class YamlDuplicateParameterKeyInspection extends YamlDuplicateServiceKey @NotNull @Override public PsiElementVisitor buildVisitor(final @NotNull ProblemsHolder holder, boolean isOnTheFly) { - PsiFile psiFile = holder.getFile(); if(!Symfony2ProjectComponent.isEnabled(psiFile.getProject())) { return super.buildVisitor(holder, isOnTheFly); @@ -22,8 +23,12 @@ public PsiElementVisitor buildVisitor(final @NotNull ProblemsHolder holder, bool return new PsiElementVisitor() { @Override - public void visitFile(PsiFile file) { - visitRoot(file, "parameters", holder); + public void visitElement(@NotNull PsiElement element) { + if (element instanceof YAMLKeyValue yamlKeyValue) { + visitRoot(yamlKeyValue, "parameters", holder); + } + + super.visitElement(element); } }; } diff --git a/src/main/java/fr/adrienbrault/idea/symfony2plugin/config/yaml/inspection/YamlDuplicateServiceKeyInspection.java b/src/main/java/fr/adrienbrault/idea/symfony2plugin/config/yaml/inspection/YamlDuplicateServiceKeyInspection.java index 5a69d7029..7ff60bbd2 100644 --- a/src/main/java/fr/adrienbrault/idea/symfony2plugin/config/yaml/inspection/YamlDuplicateServiceKeyInspection.java +++ b/src/main/java/fr/adrienbrault/idea/symfony2plugin/config/yaml/inspection/YamlDuplicateServiceKeyInspection.java @@ -1,16 +1,13 @@ package fr.adrienbrault.idea.symfony2plugin.config.yaml.inspection; import com.intellij.codeInspection.LocalInspectionTool; +import com.intellij.codeInspection.ProblemHighlightType; import com.intellij.codeInspection.ProblemsHolder; +import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElementVisitor; import com.intellij.psi.PsiFile; -import com.intellij.psi.util.PsiTreeUtil; import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent; -import fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlHelper; import org.jetbrains.annotations.NotNull; -import org.jetbrains.yaml.YAMLUtil; -import org.jetbrains.yaml.psi.YAMLCompoundValue; -import org.jetbrains.yaml.psi.YAMLFile; import org.jetbrains.yaml.psi.YAMLKeyValue; import org.jetbrains.yaml.psi.YAMLMapping; @@ -30,25 +27,41 @@ public PsiElementVisitor buildVisitor(final @NotNull ProblemsHolder holder, bool return new PsiElementVisitor() { @Override - public void visitFile(PsiFile file) { - visitRoot(file, "services", holder); + public void visitElement(@NotNull PsiElement element) { + if (element instanceof YAMLKeyValue yamlKeyValue) { + visitRoot(yamlKeyValue, "services", holder); + } + + super.visitElement(element); } }; } - protected void visitRoot(PsiFile psiFile, String rootName, @NotNull ProblemsHolder holder) { - if(!(psiFile instanceof YAMLFile)) { - return; - } + protected void visitRoot(@NotNull YAMLKeyValue yamlKeyValue, String rootName, @NotNull ProblemsHolder holder) { + if (yamlKeyValue.getParent() instanceof YAMLMapping yamlMapping) { + String keyText1 = yamlKeyValue.getKeyText(); + if (!keyText1.startsWith("_")) { + if (yamlMapping.getParent() instanceof YAMLKeyValue yamlKeyValue1) { + if (rootName.equals(yamlKeyValue1.getKeyText())) { + int found = 0; + for (YAMLKeyValue keyValue : yamlMapping.getKeyValues()) { + String keyText = keyValue.getKeyText(); - YAMLKeyValue yamlKeyValue = YAMLUtil.getQualifiedKeyInFile((YAMLFile) psiFile, rootName); - if(yamlKeyValue == null) { - return; - } + if (keyText1.equals(keyText)) { + found++; + } - YAMLCompoundValue yaml = PsiTreeUtil.findChildOfType(yamlKeyValue, YAMLMapping.class); - if(yaml != null) { - YamlHelper.attachDuplicateKeyInspection(yaml, holder); + if (found == 2) { + final PsiElement keyElement = yamlKeyValue.getKey(); + assert keyElement != null; + holder.registerProblem(keyElement, "Symfony: Duplicate key", ProblemHighlightType.GENERIC_ERROR_OR_WARNING); + + break; + } + } + } + } + } } } } diff --git a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/config/yaml/inspection/YamlDuplicateParameterKeyInspectionTest.java b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/config/yaml/inspection/YamlDuplicateParameterKeyInspectionTest.java new file mode 100644 index 000000000..24f8aaabe --- /dev/null +++ b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/config/yaml/inspection/YamlDuplicateParameterKeyInspectionTest.java @@ -0,0 +1,34 @@ +package fr.adrienbrault.idea.symfony2plugin.tests.config.yaml.inspection; + +import fr.adrienbrault.idea.symfony2plugin.tests.SymfonyLightCodeInsightFixtureTestCase; + +/** + * @author Daniel Espendiller + * + * @see fr.adrienbrault.idea.symfony2plugin.config.yaml.inspection.YamlDuplicateServiceKeyInspection + */ +public class YamlDuplicateParameterKeyInspectionTest extends SymfonyLightCodeInsightFixtureTestCase { + + public void testDuplicateServiceKeyProvidesWarning() { + assertLocalInspectionContains("services.yml", "" + + "parameters:\n" + + " foo: \n" + + " foo: ~\n", + "Symfony: Duplicate key" + ); + + assertLocalInspectionContains("services.yml", "" + + "parameters:\n" + + " foo: \n" + + " foo: ~\n", + "Symfony: Duplicate key" + ); + + assertLocalInspectionNotContains("services.yml", "" + + "parameters:\n" + + " foo1: ~" + + " foo: ~\n", + "Symfony: Duplicate key" + ); + } +} diff --git a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/config/yaml/inspection/YamlDuplicateServiceKeyInspectionTest.java b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/config/yaml/inspection/YamlDuplicateServiceKeyInspectionTest.java index c2103bf06..e9494df15 100644 --- a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/config/yaml/inspection/YamlDuplicateServiceKeyInspectionTest.java +++ b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/config/yaml/inspection/YamlDuplicateServiceKeyInspectionTest.java @@ -16,7 +16,7 @@ public void testDuplicateServiceKeyProvidesWarning() { " car: car\n" + " foo: \n" + " car: car \n", - "Duplicate key" + "Symfony: Duplicate key" ); assertLocalInspectionContains("routing.yml", "" + @@ -25,7 +25,16 @@ public void testDuplicateServiceKeyProvidesWarning() { " car: car \n" + " foo: \n" + " car: car", - "Duplicate key" + "Symfony: Duplicate key" + ); + + assertLocalInspectionNotContains("routing.yml", "" + + "services:\n" + + " foo1: \n" + + " car: car \n" + + " foo: \n" + + " car: car", + "Symfony: Duplicate key" ); }