From 09056a0fe6c3f97f931f51994dc68fc1a11c8c05 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Wed, 13 Jul 2016 18:04:56 +0200 Subject: [PATCH] [java] duplicate module name highlighting --- .../impl/analysis/HighlightVisitorImpl.java | 1 + .../impl/analysis/ModuleHighlightUtil.java | 16 +++++++++ .../src/messages/JavaErrorMessages.properties | 2 +- .../daemon/ModuleHighlightingTest.kt | 33 ++++++++++++------- 4 files changed, 39 insertions(+), 13 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java index c214f2fa2ae8..6093e21abb82 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java @@ -1613,6 +1613,7 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh super.visitModule(module); if (!myHolder.hasErrorResults()) myHolder.add(checkFeature(module, Feature.MODULES)); if (!myHolder.hasErrorResults()) myHolder.add(ModuleHighlightUtil.checkFileName(module, myFile)); + if (!myHolder.hasErrorResults()) myHolder.add(ModuleHighlightUtil.checkModuleDuplicates(module, myFile)); if (!myHolder.hasErrorResults()) myHolder.add(ModuleHighlightUtil.checkFileDuplicates(module, myFile)); if (!myHolder.hasErrorResults()) myHolder.add(ModuleHighlightUtil.checkFileLocation(module, myFile)); } diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/ModuleHighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/ModuleHighlightUtil.java index 2fe03f348210..8a371b299ce3 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/ModuleHighlightUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/ModuleHighlightUtil.java @@ -30,7 +30,9 @@ import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiJavaModule; +import com.intellij.psi.impl.java.stubs.index.JavaModuleNameIndex; import com.intellij.psi.search.FilenameIndex; +import com.intellij.psi.search.ProjectScope; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -52,6 +54,20 @@ public class ModuleHighlightUtil { return null; } + @Nullable + static HighlightInfo checkModuleDuplicates(@NotNull PsiJavaModule element, @NotNull PsiFile file) { + String name = element.getModuleName(); + Project project = file.getProject(); + Collection others = JavaModuleNameIndex.getInstance().get(name, project, ProjectScope.getAllScope(project)); + if (others.size() > 1) { + String message = JavaErrorMessages.message("module.name.duplicate", name); + return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(element.getNameElement()).description(message).create(); + //todo show duplicates quick fix + } + + return null; + } + @Nullable static HighlightInfo checkFileDuplicates(@NotNull PsiJavaModule element, @NotNull PsiFile file) { VirtualFile vFile = file.getVirtualFile(); diff --git a/java/java-psi-impl/src/messages/JavaErrorMessages.properties b/java/java-psi-impl/src/messages/JavaErrorMessages.properties index 4ed5a48d9392..c39ba507421d 100644 --- a/java/java-psi-impl/src/messages/JavaErrorMessages.properties +++ b/java/java-psi-impl/src/messages/JavaErrorMessages.properties @@ -392,7 +392,7 @@ underscore.identifier.error=As of Java 9, '_' is a keyword, and may not be used underscore.lambda.identifier=Use of '_' as a lambda parameter name is not allowed module.file.wrong.name=Module declaration should be in a file named 'module-info.java' -module.illegal.name=Illegal module name +module.name.duplicate=Module ''{0}'' already exists in the project module.file.duplicate=Multiple module declarations module.file.wrong.location=Module declaration should be located in a module's source root diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/ModuleHighlightingTest.kt b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/ModuleHighlightingTest.kt index 9f7135e892d5..b07f9f2ad3e2 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/ModuleHighlightingTest.kt +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/ModuleHighlightingTest.kt @@ -29,22 +29,31 @@ class ModuleHighlightingTest : LightCodeInsightFixtureTestCase() { myFixture.checkHighlighting() } + fun testModuleDuplicate() { + additionalFile("""module M { }""") + doTest("""module M { }""") + } + fun testFileDuplicate() { - myFixture.configureFromExistingVirtualFile(runWriteAction { - val file = LightPlatformTestCase.getSourceRoot().createChildDirectory(this, "pkg").createChildData(this, "module-info.java") - VfsUtil.saveText(file, "module M { }") - file - }) - myFixture.configureByText("module-info.java", """module M { }""") - myFixture.checkHighlighting() + additionalFile("""module M.bis { }""") + doTest("""module M { }""") } fun testWrongFileLocation() { - myFixture.configureFromExistingVirtualFile(runWriteAction { - val file = LightPlatformTestCase.getSourceRoot().createChildDirectory(this, "pkg").createChildData(this, "module-info.java") - VfsUtil.saveText(file, """module M { }""") - file - }) + additionalFile("""module M { }""") myFixture.checkHighlighting() } + + // + private fun additionalFile(text: String) = myFixture.configureFromExistingVirtualFile(runWriteAction { + val file = LightPlatformTestCase.getSourceRoot().createChildDirectory(this, "pkg").createChildData(this, "module-info.java") + VfsUtil.saveText(file, text) + file + }) + + private fun doTest(text: String) { + myFixture.configureByText("module-info.java", text) + myFixture.checkHighlighting() + } + // } \ No newline at end of file