Report warning for several modules with same name on module path

This commit is contained in:
Alexander Udalov
2017-06-30 21:00:52 +03:00
parent e8a8bdc58e
commit 51fb02b2d5
10 changed files with 52 additions and 9 deletions
@@ -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
@@ -26,13 +26,8 @@ import org.jetbrains.kotlin.resolve.jvm.modules.JavaModuleInfo
internal class CliJavaModuleFinder(private val jrtFileSystem: VirtualFileSystem?) : JavaModuleFinder {
private val userModules = linkedMapOf<String, JavaModule>()
/**
* @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<JavaModule>
@@ -0,0 +1,3 @@
package foo;
public class Foo {}
@@ -0,0 +1,3 @@
module dependency {
exports foo;
}
@@ -0,0 +1,3 @@
package bar;
public class Bar {}
@@ -0,0 +1,3 @@
module dependency {
exports bar;
}
@@ -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
@@ -0,0 +1,3 @@
module main {
requires dependency;
}
@@ -0,0 +1,8 @@
import foo.Foo
import bar.Bar
fun usage(): String {
val f: Foo = Foo()
val b: Bar = Bar()
return "$f$b"
}
@@ -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))
}
}