Fix false positive on Java/Kotlin JVM target validation.

Fix false positive case when java toolchain was set to <JDK1.8. In such
case Java tasks return '8' (or less) for target instead of '1.8'.

^KT-47520 Fixed
This commit is contained in:
Yahor Berdnikau
2021-07-19 11:37:15 +02:00
committed by Space
parent f76864260a
commit 304d01127f
2 changed files with 40 additions and 2 deletions
@@ -590,6 +590,37 @@ class KotlinJavaToolchainTest : KGPBaseTest() {
}
}
@DisplayName("Should correctly validate JVM targets in mixed Kotlin/Java projects that are using <JDK1.8")
@GradleTestVersions(minVersion = "6.7.1")
@GradleTest
internal fun oldJdkMixedJavaKotlinTargetVerification(gradleVersion: GradleVersion) {
project(
projectName = "kotlinJavaProject".fullProjectName,
gradleVersion = gradleVersion
) {
//language=groovy
rootBuildGradle.append(
"""
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(8))
}
}
""".trimIndent()
)
//language=properties
gradleProperties.append(
"""
kotlin.jvm.target.validation.mode = error
""".trimIndent()
)
build("build")
}
}
private fun BuildResult.assertJdkHomeIsUsingJdk(
javaexecPath: String
) = assertOutputContains("[KOTLIN] Kotlin compilation 'jdkHome' argument: $javaexecPath")
@@ -670,8 +670,15 @@ abstract class KotlinCompile @Inject constructor(
private fun validateKotlinAndJavaHasSameTargetCompatibility(args: K2JVMCompilerArguments) {
associatedJavaCompileTaskTargetCompatibility.orNull?.let { targetCompatibility ->
val normalizedJavaVersion = if (targetCompatibility == "1.9") "9" else targetCompatibility
if (normalizedJavaVersion != args.jvmTarget) {
val normalizedJavaTarget = when (targetCompatibility) {
"6" -> "1.6"
"7" -> "1.7"
"8" -> "1.8"
"1.9" -> "9"
else -> targetCompatibility
}
if (normalizedJavaTarget != args.jvmTarget) {
val javaTaskName = associatedJavaCompileTaskName.get()
val errorMessage = "'$javaTaskName' task (current target is $targetCompatibility) and " +
"'$name' task (current target is ${args.jvmTarget}) " +