JVM: add tests on some JPMS-related diagnostics

Somehow we ended up in the state where we have two diagnostics which are
not covered by any tests in the project. This commit adds simple tests
for them.

 #KT-60797
This commit is contained in:
Alexander Udalov
2024-02-08 23:54:59 +01:00
committed by Space Team
parent a5bf8787a1
commit 9fcf6c5f89
10 changed files with 89 additions and 3 deletions
@@ -0,0 +1,6 @@
package foo;
public class Foo {
public int field = 42;
public void method() {}
}
@@ -0,0 +1,3 @@
module lib {
exports foo;
}
@@ -0,0 +1,13 @@
compiler/testData/javaModules/noDependencyOnNamed/main/usage.kt:3:15: error: symbol is declared in module 'lib' which current module does not depend on
fun test(foo: Foo) {
^^^
compiler/testData/javaModules/noDependencyOnNamed/main/usage.kt:4:9: error: symbol is declared in module 'lib' which current module does not depend on
foo.field
^^^^^
compiler/testData/javaModules/noDependencyOnNamed/main/usage.kt:5:9: error: symbol is declared in module 'lib' which current module does not depend on
foo.method()
^^^^^^
compiler/testData/javaModules/noDependencyOnNamed/main/usage.kt:6:5: error: symbol is declared in module 'lib' which current module does not depend on
Foo()
^^^
COMPILATION_ERROR
@@ -0,0 +1,3 @@
module main {
requires kotlin.stdlib;
}
@@ -0,0 +1,7 @@
import foo.*
fun test(foo: Foo) {
foo.field
foo.method()
Foo()
}
@@ -0,0 +1,6 @@
package foo;
public class Foo {
public int field = 42;
public void method() {}
}
@@ -0,0 +1,13 @@
compiler/testData/javaModules/noDependencyOnUnnamed/main/usage.kt:3:15: error: symbol is declared in unnamed module which is not read by current module
fun test(foo: Foo) {
^^^
compiler/testData/javaModules/noDependencyOnUnnamed/main/usage.kt:4:9: error: symbol is declared in unnamed module which is not read by current module
foo.field
^^^^^
compiler/testData/javaModules/noDependencyOnUnnamed/main/usage.kt:5:9: error: symbol is declared in unnamed module which is not read by current module
foo.method()
^^^^^^
compiler/testData/javaModules/noDependencyOnUnnamed/main/usage.kt:6:5: error: symbol is declared in unnamed module which is not read by current module
Foo()
^^^
COMPILATION_ERROR
@@ -0,0 +1,3 @@
module main {
requires kotlin.stdlib;
}
@@ -0,0 +1,7 @@
import foo.*
fun test(foo: Foo) {
foo.field
foo.method()
Foo()
}
@@ -35,6 +35,7 @@ abstract class AbstractJavaModulesIntegrationTest(
addModules: List<String> = emptyList(),
additionalKotlinArguments: List<String> = emptyList(),
manifest: Manifest? = null,
destination: File? = null,
checkKotlinOutput: (String) -> Unit = this.checkKotlinOutput(name),
): File {
val paths = (modulePath + ForTestCompileRuntime.runtimeJarForTests()).joinToString(separator = File.pathSeparator) { it.path }
@@ -51,7 +52,8 @@ abstract class AbstractJavaModulesIntegrationTest(
return compileLibrary(
name,
additionalOptions = kotlinOptions,
destination ?: File(tmpdir, "$name.jar"),
kotlinOptions,
compileJava = { _, javaFiles, outputDir ->
val javaOptions = mutableListOf(
"-d", outputDir.path,
@@ -63,8 +65,8 @@ abstract class AbstractJavaModulesIntegrationTest(
}
KotlinTestUtils.compileJavaFilesExternallyWithJava11(javaFiles, javaOptions)
},
checkKotlinOutput = checkKotlinOutput,
manifest = manifest
checkKotlinOutput,
manifest
)
}
@@ -349,4 +351,27 @@ abstract class AbstractJavaModulesIntegrationTest(
assertTrue(it, it.trimEnd().endsWith("COMPILATION_ERROR"))
})
}
// TODO (KT-60797): missing JAVA_MODULE_DOES_NOT_DEPEND_ON_MODULE.
fun testNoDependencyOnNamed() = muteForK2 {
// This is a test on the JAVA_MODULE_DOES_NOT_DEPEND_ON_MODULE diagnostic.
val lib = module("lib")
module("main", listOf(lib), listOf("lib"))
}
// TODO (KT-60797): missing JAVA_MODULE_DOES_NOT_READ_UNNAMED_MODULE.
fun testNoDependencyOnUnnamed() = muteForK2 {
// This is a test on the JAVA_MODULE_DOES_NOT_READ_UNNAMED_MODULE diagnostic.
// Most of the other tests in this class are compiling modules to jars, however here we need to compile the module to a directory.
// The reason is twofold:
// 1) Currently the compiler adds all classpath entries as module path entries as long as we're compiling a named module (i.e. have
// `module-info.java` in the sources), see `configureSourceRoots` in `KotlinToJVMBytecodeCompiler.kt`. This is most likely
// incorrect.
// 2) All jars found in the module path which are NOT named modules are loaded as automatic modules, see
// `ClasspathRootsResolver.modularBinaryRoot`. Combined with p.1, it means that _any_ jar in the dependencies will be loaded
// as either a named or an automatic module; there's no way to observe a jar that is a part of the unnamed module.
// In this test we're checking the diagnostic about using symbols from unnamed modules, so we need to compile 'lib' to a directory.
val lib = module("lib", destination = File(tmpdir, name))
module("main", additionalKotlinArguments = listOf("-classpath", lib.path))
}
}