diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmModuleAccessibilityChecker.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmModuleAccessibilityChecker.kt index 3980368680f..18db6ddec62 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmModuleAccessibilityChecker.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmModuleAccessibilityChecker.kt @@ -34,7 +34,6 @@ import org.jetbrains.kotlin.resolve.calls.checkers.CallChecker import org.jetbrains.kotlin.resolve.calls.checkers.CallCheckerContext import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.checkers.ClassifierUsageChecker -import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm import org.jetbrains.kotlin.resolve.jvm.modules.JavaModuleResolver import org.jetbrains.kotlin.resolve.source.getPsi @@ -76,21 +75,19 @@ class JvmModuleAccessibilityChecker(project: Project) : CallChecker { return null } - val containingPackage = DescriptorUtils.getParentOfType(targetClassOrPackage, PackageFragmentDescriptor::class.java, false) - val fqName = containingPackage?.fqNameUnsafe?.toSafe() ?: return null - if (theirModule.exports(fqName)) return null + if (ourModule?.name == theirModule.name) return null - if (ourModule != null) { - if (ourModule.name == theirModule.name) return null - - if (!moduleResolver.moduleGraph.reads(ourModule.name, theirModule.name)) { - return ErrorsJvm.JAVA_MODULE_DOES_NOT_DEPEND_ON_MODULE.on(reportOn, theirModule.name) - } - - if (theirModule.exportsTo(fqName, ourModule.name)) return null + if (ourModule != null && !moduleResolver.moduleGraph.reads(ourModule.name, theirModule.name)) { + return ErrorsJvm.JAVA_MODULE_DOES_NOT_DEPEND_ON_MODULE.on(reportOn, theirModule.name) } - return ErrorsJvm.JAVA_MODULE_DOES_NOT_EXPORT_PACKAGE.on(reportOn, theirModule.name, fqName.asString()) + val containingPackage = DescriptorUtils.getParentOfType(targetClassOrPackage, PackageFragmentDescriptor::class.java, false) + val fqName = containingPackage?.fqName ?: return null + if (!theirModule.exports(fqName) && (ourModule == null || !theirModule.exportsTo(fqName, ourModule.name))) { + return ErrorsJvm.JAVA_MODULE_DOES_NOT_EXPORT_PACKAGE.on(reportOn, theirModule.name, fqName.asString()) + } + + return null } private fun findVirtualFile( diff --git a/idea/testData/multiModuleHighlighting/java9/exportedPackageIsInaccessibleWithoutRequires/dependency/foo/Foo.java b/idea/testData/multiModuleHighlighting/java9/exportedPackageIsInaccessibleWithoutRequires/dependency/foo/Foo.java new file mode 100644 index 00000000000..7f566bafd45 --- /dev/null +++ b/idea/testData/multiModuleHighlighting/java9/exportedPackageIsInaccessibleWithoutRequires/dependency/foo/Foo.java @@ -0,0 +1,3 @@ +package foo; + +public class Foo {} diff --git a/idea/testData/multiModuleHighlighting/java9/exportedPackageIsInaccessibleWithoutRequires/dependency/module-info.java b/idea/testData/multiModuleHighlighting/java9/exportedPackageIsInaccessibleWithoutRequires/dependency/module-info.java new file mode 100644 index 00000000000..4bee00f338a --- /dev/null +++ b/idea/testData/multiModuleHighlighting/java9/exportedPackageIsInaccessibleWithoutRequires/dependency/module-info.java @@ -0,0 +1,3 @@ +module dependency { + exports foo; +} diff --git a/idea/testData/multiModuleHighlighting/java9/exportedPackageIsInaccessibleWithoutRequires/main/module-info.java b/idea/testData/multiModuleHighlighting/java9/exportedPackageIsInaccessibleWithoutRequires/main/module-info.java new file mode 100644 index 00000000000..654c15828f1 --- /dev/null +++ b/idea/testData/multiModuleHighlighting/java9/exportedPackageIsInaccessibleWithoutRequires/main/module-info.java @@ -0,0 +1,3 @@ +module main { + // does not require dependency +} diff --git a/idea/testData/multiModuleHighlighting/java9/exportedPackageIsInaccessibleWithoutRequires/main/usage.kt b/idea/testData/multiModuleHighlighting/java9/exportedPackageIsInaccessibleWithoutRequires/main/usage.kt new file mode 100644 index 00000000000..205498313bd --- /dev/null +++ b/idea/testData/multiModuleHighlighting/java9/exportedPackageIsInaccessibleWithoutRequires/main/usage.kt @@ -0,0 +1,5 @@ +import foo.Foo + +fun usage() { + Foo() +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/Java9MultiModuleHighlightingTest.kt b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/Java9MultiModuleHighlightingTest.kt index 5df92a15657..d1d95e50fff 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/Java9MultiModuleHighlightingTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/Java9MultiModuleHighlightingTest.kt @@ -73,4 +73,9 @@ class Java9MultiModuleHighlightingTest : AbstractMultiModuleHighlightingTest() { module("unnamed").addDependency(d) checkHighlightingInAllFiles() } + + fun testExportedPackageIsInaccessibleWithoutRequires() = doTest { + module("main").addDependency(module("dependency")) + checkHighlightingInAllFiles() + } }