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()
+ }
}