Add Java17ModulesIntegrationTest tests, fix problem with wrong diagnostic

This commit is contained in:
Mikhael Bogdanov
2021-12-07 15:53:41 +01:00
committed by Space
parent 78597912c0
commit faa2a67180
12 changed files with 92 additions and 26 deletions
@@ -129,7 +129,7 @@ class ClasspathRootsResolver(
addModularRoots(modules, result) addModularRoots(modules, result)
} else { } else {
//TODO: see also `addJvmSdkRoots` usages, some refactoring is required with moving such logic into one place //TODO: see also `addJvmSdkRoots` usages, some refactoring is required with moving such logic into one place
val listFoldersForRelease = javaModuleFinder.listFoldersForRelease() val listFoldersForRelease = javaModuleFinder.listFoldersForRelease
listFoldersForRelease.forEach { listFoldersForRelease.forEach {
result += JavaRoot(it, JavaRoot.RootType.BINARY_SIG) result += JavaRoot(it, JavaRoot.RootType.BINARY_SIG)
} }
@@ -102,6 +102,9 @@ class CliJavaModuleFinder(
val allObservableModules: Sequence<JavaModule> val allObservableModules: Sequence<JavaModule>
get() = systemModules + userModules.values get() = systemModules + userModules.values
//Cache system modules for JDK 9-11 to preserve virtual files as one folder could be mapped to several modules
private val systemModulesCache = mutableMapOf<String, JavaModule.Explicit>()
val systemModules: Sequence<JavaModule.Explicit> val systemModules: Sequence<JavaModule.Explicit>
get() = if (useLastJdkApi) modulesRoot?.children.orEmpty().asSequence().mapNotNull(this::findSystemModule) else get() = if (useLastJdkApi) modulesRoot?.children.orEmpty().asSequence().mapNotNull(this::findSystemModule) else
ctSymModules.values.asSequence().mapNotNull { findSystemModule(it, true) } ctSymModules.values.asSequence().mapNotNull { findSystemModule(it, true) }
@@ -116,15 +119,18 @@ class CliJavaModuleFinder(
val file = moduleRoot.findChild(if (useSig) PsiJavaModule.MODULE_INFO_CLASS + ".sig" else PsiJavaModule.MODULE_INFO_CLS_FILE) val file = moduleRoot.findChild(if (useSig) PsiJavaModule.MODULE_INFO_CLASS + ".sig" else PsiJavaModule.MODULE_INFO_CLS_FILE)
?: return null ?: return null
val moduleInfo = JavaModuleInfo.read(file, javaFileManager, allScope) ?: return null val moduleInfo = JavaModuleInfo.read(file, javaFileManager, allScope) ?: return null
return JavaModule.Explicit( return systemModulesCache.getOrPut(moduleInfo.moduleName) {
moduleInfo, JavaModule.Explicit(
when { moduleInfo,
useLastJdkApi -> listOf(JavaModule.Root(moduleRoot, isBinary = true, isBinarySignature = useSig)) when {
useSig -> createModuleFromSignature(moduleInfo) useLastJdkApi -> listOf(JavaModule.Root(moduleRoot, isBinary = true, isBinarySignature = useSig))
else -> error("Can't find ${moduleRoot.path} module") useSig -> createModuleFromSignature(moduleInfo)
}, else -> error("Can't find ${moduleRoot.path} module")
file, true },
) file, true
)
}
} }
private fun createModuleFromSignature(moduleInfo: JavaModuleInfo): List<JavaModule.Root> { private fun createModuleFromSignature(moduleInfo: JavaModuleInfo): List<JavaModule.Root> {
@@ -143,10 +149,16 @@ class CliJavaModuleFinder(
} }
return listFoldersForRelease().map { virtualFile -> return listFoldersForRelease.mapNotNull { virtualFile ->
val rootFolder = when {
isCompilationJDK12OrLater -> if (virtualFile.name == moduleInfo.moduleName) virtualFile else return@mapNotNull null
else -> {
if (virtualFile.children.none { it.name in packageParts }) return@mapNotNull null
ModuleVirtualFileForRootPart(virtualFile.parent, virtualFile, packageParts, "")
}
}
JavaModule.Root( JavaModule.Root(
if (isCompilationJDK12OrLater) virtualFile rootFolder,
else ModuleVirtualFileForRootPart(virtualFile.parent, virtualFile, packageParts, ""),
isBinary = true, isBinary = true,
isBinarySignature = true isBinarySignature = true
) )
@@ -158,9 +170,9 @@ class CliJavaModuleFinder(
private fun matchesRelease(fileName: String, release: Int) = private fun matchesRelease(fileName: String, release: Int) =
!fileName.contains("-") && fileName.contains(codeFor(release)) // skip `*-modules` !fileName.contains("-") && fileName.contains(codeFor(release)) // skip `*-modules`
fun listFoldersForRelease(): List<VirtualFile> { val listFoldersForRelease: List<VirtualFile> by lazy {
if (ctSymRootFolder == null) return emptyList() if (ctSymRootFolder == null) emptyList()
return ctSymRootFolder!!.children.filter { matchesRelease(it.name, jdkRelease!!) }.flatMap { else ctSymRootFolder!!.children.filter { matchesRelease(it.name, jdkRelease!!) }.flatMap {
if (isCompilationJDK12OrLater) if (isCompilationJDK12OrLater)
it.children.toList() it.children.toList()
else { else {
@@ -174,7 +186,7 @@ class CliJavaModuleFinder(
private fun collectModuleRoots(): Map<String, VirtualFile> { private fun collectModuleRoots(): Map<String, VirtualFile> {
val result = mutableMapOf<String, VirtualFile>() val result = mutableMapOf<String, VirtualFile>()
if (isCompilationJDK12OrLater) { if (isCompilationJDK12OrLater) {
listFoldersForRelease().forEach { modulesRoot -> listFoldersForRelease.forEach { modulesRoot ->
modulesRoot.findChild("module-info.sig")?.let { modulesRoot.findChild("module-info.sig")?.let {
result[modulesRoot.name] = modulesRoot result[modulesRoot.name] = modulesRoot
} }
@@ -54,7 +54,7 @@ class CliJavaModuleResolver(
private val sourceModule: JavaModule? = userModules.firstOrNull(JavaModule::isSourceModule) private val sourceModule: JavaModule? = userModules.firstOrNull(JavaModule::isSourceModule)
private fun findJavaModule(file: VirtualFile): JavaModule? { private fun findJavaModule(file: VirtualFile): JavaModule? {
if (file.fileSystem.protocol == StandardFileSystems.JRT_PROTOCOL) { if (file.fileSystem.protocol == StandardFileSystems.JRT_PROTOCOL || file.extension == "sig") {
return systemModules.firstOrNull { module -> file in module } return systemModules.firstOrNull { module -> file in module }
} }
@@ -0,0 +1 @@
OK
@@ -0,0 +1,5 @@
package foo;
public class Foo {
val z: java.nio.ByteBuffer? = null
}
@@ -0,0 +1,5 @@
module module17 {
exports foo;
requires kotlin.stdlib;
}
+1
View File
@@ -0,0 +1 @@
OK
@@ -0,0 +1,5 @@
package foo;
public class Foo {
val z: java.nio.ByteBuffer? = null
}
@@ -0,0 +1,5 @@
module module9 {
exports foo;
requires kotlin.stdlib;
}
@@ -0,0 +1,10 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.jvm.compiler
import org.jetbrains.kotlin.test.util.KtTestUtil
class Java11ModulesIntegrationTest : JavaModulesIntegrationTest(11, KtTestUtil.getJdk11Home())
@@ -0,0 +1,10 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.jvm.compiler
import org.jetbrains.kotlin.test.util.KtTestUtil
class Java17ModulesIntegrationTest : JavaModulesIntegrationTest(17, KtTestUtil.getJdk17Home())
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.jvm.compiler
import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.util.io.FileUtil
import org.jetbrains.kotlin.cli.AbstractCliTest import org.jetbrains.kotlin.cli.AbstractCliTest
import org.jetbrains.kotlin.cli.AbstractCliTest.getNormalizedCompilerOutput import org.jetbrains.kotlin.cli.AbstractCliTest.getNormalizedCompilerOutput
import org.jetbrains.kotlin.cli.common.ExitCode
import org.jetbrains.kotlin.codegen.forTestCompile.ForTestCompileRuntime import org.jetbrains.kotlin.codegen.forTestCompile.ForTestCompileRuntime
import org.jetbrains.kotlin.test.KotlinTestUtils import org.jetbrains.kotlin.test.KotlinTestUtils
import org.jetbrains.kotlin.test.util.KtTestUtil import org.jetbrains.kotlin.test.util.KtTestUtil
@@ -17,7 +16,8 @@ import java.util.concurrent.TimeUnit
import java.util.jar.Manifest import java.util.jar.Manifest
import kotlin.test.fail import kotlin.test.fail
abstract class JavaModulesIntegrationTest(private val jdkHome: File) : AbstractKotlinCompilerIntegrationTest() { abstract class JavaModulesIntegrationTest(private val jdkVersion: Int, private val jdkHome: File) :
AbstractKotlinCompilerIntegrationTest() {
override val testDataPath: String override val testDataPath: String
get() = "compiler/testData/javaModules/" get() = "compiler/testData/javaModules/"
@@ -59,11 +59,17 @@ abstract class JavaModulesIntegrationTest(private val jdkHome: File) : AbstractK
) )
} }
private fun checkKotlinOutput(moduleName: String): (String) -> Unit = { actual ->
KotlinTestUtils.assertEqualsToFile( private fun checkKotlinOutput(moduleName: String): (String) -> Unit {
File(testDataDirectory, "$moduleName.txt"), val expectedFile =
getNormalizedCompilerOutput(actual, null, testDataPath).replace(System.getenv("JDK_11"), "\$JDK11") File(testDataDirectory, "$moduleName.$jdkVersion.txt").takeIf { it.exists() } ?: File(testDataDirectory, "$moduleName.txt")
) return { actual ->
KotlinTestUtils.assertEqualsToFile(
expectedFile,
getNormalizedCompilerOutput(actual, null, testDataPath).replace(System.getenv("JDK_11").replace("\\", "/"), "\$JDK11")
.replace(System.getenv("JDK_17").replace("\\", "/"), "\$JDK17")
)
}
} }
private data class ModuleRunResult(val stdout: String, val stderr: String) private data class ModuleRunResult(val stdout: String, val stderr: String)
@@ -150,12 +156,18 @@ abstract class JavaModulesIntegrationTest(private val jdkHome: File) : AbstractK
fun testReleaseFlagWrongValue() { fun testReleaseFlagWrongValue() {
module("module5", additionalKotlinArguments = listOf("-Xjdk-release=5")) module("module5", additionalKotlinArguments = listOf("-Xjdk-release=5"))
module("module12", additionalKotlinArguments = listOf("-Xjdk-release=12")) if (jdkVersion == 11) {
module("module12", additionalKotlinArguments = listOf("-Xjdk-release=12"))
}
} }
fun testReleaseFlag() { fun testReleaseFlag() {
module("module") module("module")
module("module9", additionalKotlinArguments = listOf("-Xjdk-release=9"))
module("module11", additionalKotlinArguments = listOf("-Xjdk-release=11")) module("module11", additionalKotlinArguments = listOf("-Xjdk-release=11"))
if (jdkVersion == 17) {
module("module17", additionalKotlinArguments = listOf("-Xjdk-release=17"))
}
module("moduleSwing", additionalKotlinArguments = listOf("-Xjdk-release=9")) module("moduleSwing", additionalKotlinArguments = listOf("-Xjdk-release=9"))
} }