[Gradle] Migrate warning about inconsistent JVM target

This commit is contained in:
Dmitry Savvinov
2023-04-20 12:15:21 +02:00
parent 5658991fe3
commit 76c37f359a
4 changed files with 60 additions and 83 deletions
@@ -10,6 +10,7 @@ import org.gradle.api.logging.LogLevel
import org.gradle.internal.jvm.JavaInfo
import org.gradle.internal.jvm.Jvm
import org.gradle.util.GradleVersion
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics
import org.jetbrains.kotlin.gradle.testbase.*
import org.junit.jupiter.api.DisplayName
import java.io.File
@@ -40,13 +41,7 @@ class JvmTargetValidationTest : KGPBaseTest() {
)
buildAndFail("assemble") {
assertOutputContains(
"'compileJava' task (current target is 1.8) and 'compileKotlin' task (current target is 11) jvm target compatibility " +
"should be set to the same Java version.\n" +
"By default will become an error since Gradle 8.0+! " +
"Read more: https://kotl.in/gradle/jvm/target-validation\n" +
"Consider using JVM toolchain: https://kotl.in/gradle/jvm/toolchain"
)
assertHasDiagnostic(KotlinToolingDiagnostics.InconsistentTargetCompatibilityForKotlinAndJavaTasks)
}
}
}
@@ -79,13 +74,7 @@ class JvmTargetValidationTest : KGPBaseTest() {
)
build("assemble") {
assertOutputDoesNotContain(
"'compileJava' task (current target is 1.8) and 'compileKotlin' task (current target is 11) jvm target compatibility " +
"should be set to the same Java version.\n" +
"By default will become an error since Gradle 8.0+! " +
"Read more: https://kotl.in/gradle/jvm/target-validation\n" +
"Consider using JVM toolchain: https://kotl.in/gradle/jvm/toolchain"
)
assertNoDiagnostic(KotlinToolingDiagnostics.InconsistentTargetCompatibilityForKotlinAndJavaTasks)
}
}
}
@@ -108,10 +97,7 @@ class JvmTargetValidationTest : KGPBaseTest() {
)
build("assemble") {
assertOutputContains(
"'compileJava' task (current target is 1.8) and 'compileKotlin' task (current target is 11) jvm target compatibility " +
"should be set to the same Java version.\n"
)
assertHasDiagnostic(KotlinToolingDiagnostics.InconsistentTargetCompatibilityForKotlinAndJavaTasks)
}
}
}
@@ -136,10 +122,7 @@ class JvmTargetValidationTest : KGPBaseTest() {
)
build("assemble") {
assertOutputDoesNotContain(
"'compileJava' task (current target is 1.8) and 'compileKotlin' task (current target is 11) jvm target compatibility " +
"should be set to the same Java version."
)
assertNoDiagnostic(KotlinToolingDiagnostics.InconsistentTargetCompatibilityForKotlinAndJavaTasks)
}
}
}
@@ -160,10 +143,7 @@ class JvmTargetValidationTest : KGPBaseTest() {
)
build("build") {
assertOutputDoesNotContain(
"'compileJava' task (current target is 1.8) and 'compileKotlin' task (current target is 11) jvm target compatibility " +
"should be set to the same Java version."
)
assertNoDiagnostic(KotlinToolingDiagnostics.InconsistentTargetCompatibilityForKotlinAndJavaTasks)
}
}
}
@@ -204,13 +184,13 @@ class JvmTargetValidationTest : KGPBaseTest() {
)
build("build") {
assertOutputContains(
"'compileTestJava' task (current target is 1.8) and 'compileTestKotlin' task (current target is 11) jvm target " +
"compatibility should be set to the same Java version."
assertHasDiagnostic(
KotlinToolingDiagnostics.InconsistentTargetCompatibilityForKotlinAndJavaTasks,
withSubstring = "compileTestKotlin"
)
assertOutputDoesNotContain(
"'compileJava' task (current target is 1.8) and 'compileKotlin' task (current target is 11) jvm target compatibility " +
"should be set to the same Java version."
assertNoDiagnostic(
KotlinToolingDiagnostics.InconsistentTargetCompatibilityForKotlinAndJavaTasks,
withSubstring = "compileKotlin"
)
}
}
@@ -266,10 +246,7 @@ class JvmTargetValidationTest : KGPBaseTest() {
javaSourcesDir().resolve("demo/HelloWorld.java").deleteExisting()
build("assemble") {
assertOutputDoesNotContain(
"'compileJava' task (current target is 1.8) and 'compileKotlin' task (current target is 11) jvm target compatibility " +
"should be set to the same Java version."
)
assertNoDiagnostic(KotlinToolingDiagnostics.InconsistentTargetCompatibilityForKotlinAndJavaTasks)
}
javaSourcesDir().resolve("demo/Greeter.java").modify {
@@ -277,10 +254,7 @@ class JvmTargetValidationTest : KGPBaseTest() {
}
build("assemble") {
assertOutputDoesNotContain(
"'compileJava' task (current target is 1.8) and 'compileKotlin' task (current target is 11) jvm target compatibility " +
"should be set to the same Java version."
)
assertNoDiagnostic(KotlinToolingDiagnostics.InconsistentTargetCompatibilityForKotlinAndJavaTasks)
}
}
}
@@ -302,10 +276,7 @@ class JvmTargetValidationTest : KGPBaseTest() {
)
build("assemble") {
assertOutputContains(
"'compileJava' task (current target is 11) and 'compileKotlin' task (current target is 1.8) jvm target compatibility " +
"should be set to the same Java version.\n"
)
assertHasDiagnostic(KotlinToolingDiagnostics.InconsistentTargetCompatibilityForKotlinAndJavaTasks)
}
}
}
@@ -330,9 +301,7 @@ class JvmTargetValidationTest : KGPBaseTest() {
)
build("assemble") {
assertOutputContains(
"'compileJava' task (current target is 11) and 'compileKotlin' task (current target is 1.8) jvm target compatibility should be set to the same Java version."
)
assertHasDiagnostic(KotlinToolingDiagnostics.InconsistentTargetCompatibilityForKotlinAndJavaTasks)
}
javaSourcesDir().resolve("demo").run {
@@ -352,9 +321,7 @@ class JvmTargetValidationTest : KGPBaseTest() {
}
build("assemble") {
assertOutputContains(
"'compileJava' task (current target is 11) and 'compileKotlin' task (current target is 1.8) jvm target compatibility should be set to the same Java version."
)
assertHasDiagnostic(KotlinToolingDiagnostics.InconsistentTargetCompatibilityForKotlinAndJavaTasks)
}
}
}
@@ -400,6 +367,7 @@ class JvmTargetValidationTest : KGPBaseTest() {
internal fun errorByDefaultWithGradle8(gradleVersion: GradleVersion) {
project("simple".fullProjectName, gradleVersion) {
//language=Groovy
@Suppress("UnnecessaryQualifiedReference")
buildGradle.appendText(
"""
|
@@ -411,15 +379,11 @@ class JvmTargetValidationTest : KGPBaseTest() {
if (gradleVersion.baseVersion >= GradleVersion.version("8.0")) {
buildAndFail("assemble") {
assertOutputContains(
"'compileJava' task (current target is 1.8) and 'compileKotlin' task (current target is 11) jvm target compatibility should be set to the same Java version."
)
assertHasDiagnostic(KotlinToolingDiagnostics.InconsistentTargetCompatibilityForKotlinAndJavaTasks)
}
} else {
build("assemble") {
assertOutputContains(
"'compileJava' task (current target is 1.8) and 'compileKotlin' task (current target is 11) jvm target compatibility should be set to the same Java version."
)
assertHasDiagnostic(KotlinToolingDiagnostics.InconsistentTargetCompatibilityForKotlinAndJavaTasks)
}
}
}
@@ -447,8 +411,7 @@ class JvmTargetValidationTest : KGPBaseTest() {
)
buildAndFail(":lib:compileKotlinJvmWithJava") {
assertOutputContains("'compileJava' task (current target is 17) and 'compileKotlinJvmWithJava' task" +
" (current target is 1.8) jvm target compatibility should be set to the same Java version.")
assertHasDiagnostic(KotlinToolingDiagnostics.InconsistentTargetCompatibilityForKotlinAndJavaTasks)
}
}
}
@@ -522,4 +485,4 @@ class JvmTargetValidationTest : KGPBaseTest() {
private fun getJdk11(): JavaInfo = Jvm.forHome(File(System.getProperty("jdk11Home")))
private val String.fullProjectName get() = "kotlin-java-toolchain/$this"
}
}
@@ -280,4 +280,21 @@ object KotlinToolingDiagnostics {
""".trimIndent()
)
}
object InconsistentTargetCompatibilityForKotlinAndJavaTasks : ToolingDiagnosticFactory(predefinedSeverity = null) {
operator fun invoke(
javaTaskName: String,
targetCompatibility: String,
kotlinTaskName: String,
jvmTarget: String,
severity: ToolingDiagnostic.Severity
) = build(
"""
Inconsistent JVM-target compatibility detected for tasks '$javaTaskName' ($targetCompatibility) and '$kotlinTaskName' ($jvmTarget).
${if (severity == WARNING) "This will become an error in Gradle 8.0." else ""}
Read more: https://kotl.in/gradle/jvm/target-validation
""".trimIndent(),
severity
)
}
}
@@ -40,6 +40,7 @@ import org.jetbrains.kotlin.gradle.logging.kotlinDebug
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_SUPPRESS_EXPERIMENTAL_IC_OPTIMIZATIONS_WARNING
import org.jetbrains.kotlin.gradle.plugin.UsesBuildFinishedListenerService
import org.jetbrains.kotlin.gradle.plugin.UsesVariantImplementationFactories
import org.jetbrains.kotlin.gradle.plugin.diagnostics.UsesKotlinToolingDiagnostics
import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService
import org.jetbrains.kotlin.gradle.report.*
import org.jetbrains.kotlin.gradle.utils.*
@@ -62,6 +63,7 @@ abstract class AbstractKotlinCompile<T : CommonCompilerArguments> @Inject constr
UsesVariantImplementationFactories,
UsesBuildFinishedListenerService,
UsesClassLoadersCachingBuildService,
UsesKotlinToolingDiagnostics,
BaseKotlinCompile {
init {
@@ -359,4 +361,4 @@ abstract class AbstractKotlinCompile<T : CommonCompilerArguments> @Inject constr
inputChanges: InputChanges,
taskOutputsBackup: TaskOutputsBackup?
)
}
}
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.gradle.tasks
import org.gradle.api.GradleException
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.file.FileCollection
@@ -19,7 +18,6 @@ import org.gradle.api.tasks.*
import org.gradle.api.tasks.compile.AbstractCompile
import org.gradle.api.tasks.compile.JavaCompile
import org.gradle.api.tasks.util.PatternFilterable
import org.gradle.util.GradleVersion
import org.gradle.work.Incremental
import org.gradle.work.InputChanges
import org.gradle.work.NormalizeLineEndings
@@ -39,6 +37,8 @@ import org.jetbrains.kotlin.gradle.logging.GradlePrintingMessageCollector
import org.jetbrains.kotlin.gradle.logging.kotlinDebug
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer.CreateCompilerArgumentsContext.Companion.create
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics
import org.jetbrains.kotlin.gradle.plugin.diagnostics.ToolingDiagnostic
import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion
import org.jetbrains.kotlin.gradle.report.BuildReportMode
import org.jetbrains.kotlin.gradle.tasks.internal.KotlinJvmOptionsCompat
@@ -311,7 +311,8 @@ abstract class KotlinCompile @Inject constructor(
validateKotlinAndJavaHasSameTargetCompatibility(args)
val gradlePrintingMessageCollector = GradlePrintingMessageCollector(logger, args.allWarningsAsErrors)
val gradleMessageCollector = GradleErrorMessageCollector(
val gradleMessageCollector =
GradleErrorMessageCollector(
gradlePrintingMessageCollector, kotlinPluginVersion = getKotlinPluginVersion(logger)
)
val outputItemCollector = OutputItemsCollectorImpl()
@@ -356,8 +357,11 @@ abstract class KotlinCompile @Inject constructor(
private fun validateKotlinAndJavaHasSameTargetCompatibility(
args: K2JVMCompilerArguments,
) {
val jvmTargetValidationMode: JvmTargetValidationMode = jvmTargetValidationMode.get()
if (jvmTargetValidationMode == JvmTargetValidationMode.IGNORE) return
val severity = when (jvmTargetValidationMode.get()) {
JvmTargetValidationMode.ERROR -> ToolingDiagnostic.Severity.FATAL
JvmTargetValidationMode.WARNING -> ToolingDiagnostic.Severity.WARNING
else -> return
}
associatedJavaCompileTaskTargetCompatibility.orNull?.let { targetCompatibility ->
val normalizedJavaTarget = when (targetCompatibility) {
@@ -370,24 +374,15 @@ abstract class KotlinCompile @Inject constructor(
val jvmTarget = args.jvmTarget ?: JvmTarget.DEFAULT.toString()
if (normalizedJavaTarget != jvmTarget) {
val javaTaskName = associatedJavaCompileTaskName.get()
val errorMessage = buildString {
append("'$javaTaskName' task (current target is $targetCompatibility) and ")
append("'$name' task (current target is $jvmTarget) ")
appendLine("jvm target compatibility should be set to the same Java version.")
if (GradleVersion.current().baseVersion < GradleVersion.version("8.0")) {
append("By default will become an error since Gradle 8.0+! ")
appendLine("Read more: https://kotl.in/gradle/jvm/target-validation")
}
appendLine("Consider using JVM toolchain: https://kotl.in/gradle/jvm/toolchain")
}
when (jvmTargetValidationMode) {
JvmTargetValidationMode.ERROR -> throw GradleException(errorMessage)
JvmTargetValidationMode.WARNING -> logger.warn(errorMessage)
else -> Unit
}
reportDiagnostic(
KotlinToolingDiagnostics.InconsistentTargetCompatibilityForKotlinAndJavaTasks(
javaTaskName = associatedJavaCompileTaskName.get(),
targetCompatibility = targetCompatibility,
kotlinTaskName = name,
jvmTarget = args.jvmTarget ?: "not provided explicitly, picked up default ${JvmTarget.DEFAULT}",
severity = severity
)
)
}
}
}