Add Java17ModulesIntegrationTest tests, fix problem with wrong diagnostic
This commit is contained in:
@@ -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;
|
||||||
|
}
|
||||||
@@ -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"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user