diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/modules/CliJavaModuleFinder.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/modules/CliJavaModuleFinder.kt index c6f47c1423e..367e07511c8 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/modules/CliJavaModuleFinder.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/modules/CliJavaModuleFinder.kt @@ -127,7 +127,7 @@ class CliJavaModuleFinder( useSig -> createModuleFromSignature(moduleInfo) else -> error("Can't find ${moduleRoot.path} module") }, - file, true + file, !useLastJdkApi && useSig ) } diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/modules/JavaModuleGraph.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/modules/JavaModuleGraph.kt index 351f03a29be..13f96347516 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/modules/JavaModuleGraph.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/modules/JavaModuleGraph.kt @@ -30,14 +30,15 @@ class JavaModuleGraph(finder: JavaModuleFinder) { // Every module implicitly depends on java.base visited += "java.base" - fun dfs(moduleName: String) { + fun dfs(moduleName: String): Boolean { // Automatic modules have no transitive exports, so we only consider explicit modules here - val moduleInfo = (module(moduleName) as? JavaModule.Explicit)?.moduleInfo ?: return + val moduleInfo = (module(moduleName) as? JavaModule.Explicit)?.moduleInfo ?: return false for ((dependencyModuleName, isTransitive) in moduleInfo.requires) { if (isTransitive && visited.add(dependencyModuleName)) { dfs(dependencyModuleName) } } + return true } for (moduleName in moduleNames) { @@ -47,14 +48,11 @@ class JavaModuleGraph(finder: JavaModuleFinder) { // Do nothing; all automatic modules should be added to compilation roots at call site as per java.lang.module javadoc } is JavaModule.Explicit -> { - if (module.isJdkModule) { - //ct.sym can miss some internal modules from non-transitive dependencies - dfs(moduleName) - } else { - for ((dependencyModuleName) in module.moduleInfo.requires) { - if (visited.add(dependencyModuleName)) { - dfs(dependencyModuleName) - } + for ((dependencyModuleName, isTransitive) in module.moduleInfo.requires) { + if (visited.add(dependencyModuleName)) { + val moduleExists = dfs(dependencyModuleName) + //ct.sym can miss some internal modules from non-transitive dependencies + if (!moduleExists && !isTransitive && module.isJdkModuleFromCtSym) visited.remove(dependencyModuleName) } } } diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/modules/JavaModule.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/modules/JavaModule.kt index a959d5627ad..29d4c19a0e6 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/modules/JavaModule.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/modules/JavaModule.kt @@ -81,10 +81,10 @@ interface JavaModule { } class Explicit( - val moduleInfo: JavaModuleInfo, - override val moduleRoots: List, - override val moduleInfoFile: VirtualFile, - val isJdkModule: Boolean = false + val moduleInfo: JavaModuleInfo, + override val moduleRoots: List, + override val moduleInfoFile: VirtualFile, + val isJdkModuleFromCtSym: Boolean = false ) : JavaModule { override val name: String get() = moduleInfo.moduleName diff --git a/compiler/testData/javaModules/automaticModuleInternalJdkPackageUsage/jvmStatUsage.txt b/compiler/testData/javaModules/automaticModuleInternalJdkPackageUsage/jvmStatUsage.txt new file mode 100644 index 00000000000..812dcd5eba8 --- /dev/null +++ b/compiler/testData/javaModules/automaticModuleInternalJdkPackageUsage/jvmStatUsage.txt @@ -0,0 +1,4 @@ +compiler/testData/javaModules/automaticModuleInternalJdkPackageUsage/jvmStatUsage/Test.kt:1:28: error: symbol is declared in module 'jdk.internal.jvmstat' which does not export package 'sun.jvmstat.monitor' +val z: sun.jvmstat.monitor.Monitor? = null + ^ +COMPILATION_ERROR diff --git a/compiler/testData/javaModules/automaticModuleInternalJdkPackageUsage/jvmStatUsage/Test.kt b/compiler/testData/javaModules/automaticModuleInternalJdkPackageUsage/jvmStatUsage/Test.kt new file mode 100644 index 00000000000..a68e0657e0f --- /dev/null +++ b/compiler/testData/javaModules/automaticModuleInternalJdkPackageUsage/jvmStatUsage/Test.kt @@ -0,0 +1 @@ +val z: sun.jvmstat.monitor.Monitor? = null \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/JavaModulesIntegrationTest.kt b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/JavaModulesIntegrationTest.kt index fa1b4a6e303..52a982a908e 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/JavaModulesIntegrationTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/JavaModulesIntegrationTest.kt @@ -160,6 +160,10 @@ abstract class JavaModulesIntegrationTest(private val jdkVersion: Int, private v } } + fun testAutomaticModuleInternalJdkPackageUsage() { + module("jvmStatUsage") + } + fun testReleaseFlag() { module("module") module("module9", additionalKotlinArguments = listOf("-Xjdk-release=9"))