From 7ba6c5dab14ccdaf3a41e0164d7d79fff585fe9f Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Thu, 9 Mar 2017 11:49:13 +0100 Subject: [PATCH] [java] highlights external implementations in 'provides' (IDEA-169193) --- .../daemon/impl/analysis/ModuleHighlightUtil.java | 5 +++++ java/java-psi-impl/src/messages/JavaErrorMessages.properties | 1 + .../intellij/codeInsight/daemon/ModuleHighlightingTest.kt | 5 +++++ 3 files changed, 11 insertions(+) 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 1a88b089b664..fd15a87163ef 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 @@ -359,6 +359,11 @@ public class ModuleHighlightUtil { PsiClass implClass = (PsiClass)implTarget; PsiMethod provider; + if (findModule(statement) != findModule(implClass)) { + String message = JavaErrorMessages.message("module.service.alien"); + results.add(HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(range(implRef)).descriptionAndTooltip(message).create()); + } + if (InheritanceUtil.isInheritorOrSelf(implClass, (PsiClass)intTarget, true)) { if (implClass.hasModifierProperty(PsiModifier.ABSTRACT)) { String message = JavaErrorMessages.message("module.service.abstract", implClass.getName()); diff --git a/java/java-psi-impl/src/messages/JavaErrorMessages.properties b/java/java-psi-impl/src/messages/JavaErrorMessages.properties index d7b2f6cbe5e5..da06fa4af591 100644 --- a/java/java-psi-impl/src/messages/JavaErrorMessages.properties +++ b/java/java-psi-impl/src/messages/JavaErrorMessages.properties @@ -410,6 +410,7 @@ module.opens.in.weak.module='opens' is not allowed in an open module package.not.found=Package not found: {0} package.is.empty=Package is empty: {0} module.service.enum=The service definition is an enum: {0} +module.service.alien=The service implementation must be defined in the same module as the provides directive module.service.impl=The service implementation type must be a subtype of the service interface type, or have a public static no-args 'provider' method module.service.abstract=The service implementation is an abstract class: {0} module.service.inner=The service implementation is an inner class: {0} 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 ce7ffce24ba0..c9de28eda2fe 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/ModuleHighlightingTest.kt +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/ModuleHighlightingTest.kt @@ -151,8 +151,12 @@ class ModuleHighlightingTest : LightJava9ModulesCodeInsightFixtureTestCase() { addFile("pkg/main/Impl7.java", "package pkg.main;\npublic class Impl7 {\n public static void provider();\n}") addFile("pkg/main/Impl8.java", "package pkg.main;\npublic class Impl8 {\n public static C provider();\n}") addFile("pkg/main/Impl9.java", "package pkg.main;\npublic class Impl9 {\n public class Inner implements C { }\n}") + addFile("module-info.java", "module M2 {\n exports pkg.m2;\n}", M2) + addFile("pkg/m2/C.java", "package pkg.m2;\npublic class C { }", M2) + addFile("pkg/m2/Impl.java", "package pkg.m2;\npublic class Impl extends C { }", M2) highlight(""" module M { + requires M2; provides pkg.main.C with pkg.main.NoImpl; provides pkg.main.C with pkg.main.Impl1; provides pkg.main.C with pkg.main.Impl2; @@ -163,6 +167,7 @@ class ModuleHighlightingTest : LightJava9ModulesCodeInsightFixtureTestCase() { provides pkg.main.C with pkg.main.Impl7; provides pkg.main.C with pkg.main.Impl8; provides pkg.main.C with pkg.main.Impl9.Inner; + provides pkg.m2.C with pkg.m2.Impl; }""".trimIndent()) }