diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/ClasspathRootsResolver.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/ClasspathRootsResolver.kt index a0755c72d36..fd4de77bda5 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/ClasspathRootsResolver.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/ClasspathRootsResolver.kt @@ -154,8 +154,16 @@ internal class ClasspathRootsResolver( } for (module in modules) { - // TODO: report a diagnostic if a module with this name was already added - javaModuleFinder.addUserModule(module) + val existing = javaModuleFinder.findModule(module.name) + if (existing == null) { + javaModuleFinder.addUserModule(module) + } + else if (module.moduleRoot != existing.moduleRoot) { + val jar = VfsUtilCore.getVirtualFileForJar(module.moduleRoot) ?: module.moduleRoot + val existingPath = (VfsUtilCore.getVirtualFileForJar(existing.moduleRoot) ?: existing.moduleRoot).path + report(STRONG_WARNING, "The root is ignored because a module with the same name '${module.name}' " + + "has been found earlier on the module path at: $existingPath", jar) + } } if (javaModuleFinder.allObservableModules.none()) return 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 3691ce83b70..88348732f6f 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 @@ -26,13 +26,8 @@ import org.jetbrains.kotlin.resolve.jvm.modules.JavaModuleInfo internal class CliJavaModuleFinder(private val jrtFileSystem: VirtualFileSystem?) : JavaModuleFinder { private val userModules = linkedMapOf() - /** - * @return true if the module was added successfully, false otherwise - */ - fun addUserModule(module: JavaModule): Boolean { - if (module.name in userModules) return false - userModules[module.name] = module - return true + fun addUserModule(module: JavaModule) { + userModules.putIfAbsent(module.name, module) } val allObservableModules: Sequence diff --git a/compiler/testData/javaModules/severalModulesWithTheSameName/dependency1/foo/Foo.java b/compiler/testData/javaModules/severalModulesWithTheSameName/dependency1/foo/Foo.java new file mode 100644 index 00000000000..7f566bafd45 --- /dev/null +++ b/compiler/testData/javaModules/severalModulesWithTheSameName/dependency1/foo/Foo.java @@ -0,0 +1,3 @@ +package foo; + +public class Foo {} diff --git a/compiler/testData/javaModules/severalModulesWithTheSameName/dependency1/module-info.java b/compiler/testData/javaModules/severalModulesWithTheSameName/dependency1/module-info.java new file mode 100644 index 00000000000..4bee00f338a --- /dev/null +++ b/compiler/testData/javaModules/severalModulesWithTheSameName/dependency1/module-info.java @@ -0,0 +1,3 @@ +module dependency { + exports foo; +} diff --git a/compiler/testData/javaModules/severalModulesWithTheSameName/dependency2/bar/Bar.java b/compiler/testData/javaModules/severalModulesWithTheSameName/dependency2/bar/Bar.java new file mode 100644 index 00000000000..e94fe68bd76 --- /dev/null +++ b/compiler/testData/javaModules/severalModulesWithTheSameName/dependency2/bar/Bar.java @@ -0,0 +1,3 @@ +package bar; + +public class Bar {} diff --git a/compiler/testData/javaModules/severalModulesWithTheSameName/dependency2/module-info.java b/compiler/testData/javaModules/severalModulesWithTheSameName/dependency2/module-info.java new file mode 100644 index 00000000000..4855b3fec87 --- /dev/null +++ b/compiler/testData/javaModules/severalModulesWithTheSameName/dependency2/module-info.java @@ -0,0 +1,3 @@ +module dependency { + exports bar; +} diff --git a/compiler/testData/javaModules/severalModulesWithTheSameName/main.txt b/compiler/testData/javaModules/severalModulesWithTheSameName/main.txt new file mode 100644 index 00000000000..b948780538f --- /dev/null +++ b/compiler/testData/javaModules/severalModulesWithTheSameName/main.txt @@ -0,0 +1,11 @@ +compiler/testData/javaModules/severalModulesWithTheSameName/main/usage.kt:2:8: error: unresolved reference: bar +import bar.Bar + ^ +compiler/testData/javaModules/severalModulesWithTheSameName/main/usage.kt:6:12: error: unresolved reference: Bar + val b: Bar = Bar() + ^ +compiler/testData/javaModules/severalModulesWithTheSameName/main/usage.kt:6:18: error: unresolved reference: Bar + val b: Bar = Bar() + ^ +$TMP_DIR$/dependency2.jar: warning: the root is ignored because a module with the same name 'dependency' has been found earlier on the module path at: $TMP_DIR$/dependency1.jar +COMPILATION_ERROR diff --git a/compiler/testData/javaModules/severalModulesWithTheSameName/main/module-info.java b/compiler/testData/javaModules/severalModulesWithTheSameName/main/module-info.java new file mode 100644 index 00000000000..d069dfb8d7a --- /dev/null +++ b/compiler/testData/javaModules/severalModulesWithTheSameName/main/module-info.java @@ -0,0 +1,3 @@ +module main { + requires dependency; +} diff --git a/compiler/testData/javaModules/severalModulesWithTheSameName/main/usage.kt b/compiler/testData/javaModules/severalModulesWithTheSameName/main/usage.kt new file mode 100644 index 00000000000..bbdccd519ca --- /dev/null +++ b/compiler/testData/javaModules/severalModulesWithTheSameName/main/usage.kt @@ -0,0 +1,8 @@ +import foo.Foo +import bar.Bar + +fun usage(): String { + val f: Foo = Foo() + val b: Bar = Bar() + return "$f$b" +} diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/Java9ModulesIntegrationTest.kt b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/Java9ModulesIntegrationTest.kt index b61ec2493fd..c2c88c2ce43 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/Java9ModulesIntegrationTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/Java9ModulesIntegrationTest.kt @@ -213,4 +213,10 @@ class Java9ModulesIntegrationTest : AbstractKotlinCompilerIntegrationTest() { val b = module("autoB") module("main", listOf(a, b)) } + + fun testSeveralModulesWithTheSameName() { + val d1 = module("dependency1") + val d2 = module("dependency2") + module("main", listOf(d1, d2)) + } }