[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.JavaInfo
import org.gradle.internal.jvm.Jvm import org.gradle.internal.jvm.Jvm
import org.gradle.util.GradleVersion import org.gradle.util.GradleVersion
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics
import org.jetbrains.kotlin.gradle.testbase.* import org.jetbrains.kotlin.gradle.testbase.*
import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.DisplayName
import java.io.File import java.io.File
@@ -40,13 +41,7 @@ class JvmTargetValidationTest : KGPBaseTest() {
) )
buildAndFail("assemble") { buildAndFail("assemble") {
assertOutputContains( assertHasDiagnostic(KotlinToolingDiagnostics.InconsistentTargetCompatibilityForKotlinAndJavaTasks)
"'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"
)
} }
} }
} }
@@ -79,13 +74,7 @@ class JvmTargetValidationTest : KGPBaseTest() {
) )
build("assemble") { build("assemble") {
assertOutputDoesNotContain( assertNoDiagnostic(KotlinToolingDiagnostics.InconsistentTargetCompatibilityForKotlinAndJavaTasks)
"'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"
)
} }
} }
} }
@@ -108,10 +97,7 @@ class JvmTargetValidationTest : KGPBaseTest() {
) )
build("assemble") { build("assemble") {
assertOutputContains( assertHasDiagnostic(KotlinToolingDiagnostics.InconsistentTargetCompatibilityForKotlinAndJavaTasks)
"'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"
)
} }
} }
} }
@@ -136,10 +122,7 @@ class JvmTargetValidationTest : KGPBaseTest() {
) )
build("assemble") { build("assemble") {
assertOutputDoesNotContain( assertNoDiagnostic(KotlinToolingDiagnostics.InconsistentTargetCompatibilityForKotlinAndJavaTasks)
"'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."
)
} }
} }
} }
@@ -160,10 +143,7 @@ class JvmTargetValidationTest : KGPBaseTest() {
) )
build("build") { build("build") {
assertOutputDoesNotContain( assertNoDiagnostic(KotlinToolingDiagnostics.InconsistentTargetCompatibilityForKotlinAndJavaTasks)
"'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."
)
} }
} }
} }
@@ -204,13 +184,13 @@ class JvmTargetValidationTest : KGPBaseTest() {
) )
build("build") { build("build") {
assertOutputContains( assertHasDiagnostic(
"'compileTestJava' task (current target is 1.8) and 'compileTestKotlin' task (current target is 11) jvm target " + KotlinToolingDiagnostics.InconsistentTargetCompatibilityForKotlinAndJavaTasks,
"compatibility should be set to the same Java version." withSubstring = "compileTestKotlin"
) )
assertOutputDoesNotContain( assertNoDiagnostic(
"'compileJava' task (current target is 1.8) and 'compileKotlin' task (current target is 11) jvm target compatibility " + KotlinToolingDiagnostics.InconsistentTargetCompatibilityForKotlinAndJavaTasks,
"should be set to the same Java version." withSubstring = "compileKotlin"
) )
} }
} }
@@ -266,10 +246,7 @@ class JvmTargetValidationTest : KGPBaseTest() {
javaSourcesDir().resolve("demo/HelloWorld.java").deleteExisting() javaSourcesDir().resolve("demo/HelloWorld.java").deleteExisting()
build("assemble") { build("assemble") {
assertOutputDoesNotContain( assertNoDiagnostic(KotlinToolingDiagnostics.InconsistentTargetCompatibilityForKotlinAndJavaTasks)
"'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."
)
} }
javaSourcesDir().resolve("demo/Greeter.java").modify { javaSourcesDir().resolve("demo/Greeter.java").modify {
@@ -277,10 +254,7 @@ class JvmTargetValidationTest : KGPBaseTest() {
} }
build("assemble") { build("assemble") {
assertOutputDoesNotContain( assertNoDiagnostic(KotlinToolingDiagnostics.InconsistentTargetCompatibilityForKotlinAndJavaTasks)
"'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."
)
} }
} }
} }
@@ -302,10 +276,7 @@ class JvmTargetValidationTest : KGPBaseTest() {
) )
build("assemble") { build("assemble") {
assertOutputContains( assertHasDiagnostic(KotlinToolingDiagnostics.InconsistentTargetCompatibilityForKotlinAndJavaTasks)
"'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"
)
} }
} }
} }
@@ -330,9 +301,7 @@ class JvmTargetValidationTest : KGPBaseTest() {
) )
build("assemble") { build("assemble") {
assertOutputContains( assertHasDiagnostic(KotlinToolingDiagnostics.InconsistentTargetCompatibilityForKotlinAndJavaTasks)
"'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."
)
} }
javaSourcesDir().resolve("demo").run { javaSourcesDir().resolve("demo").run {
@@ -352,9 +321,7 @@ class JvmTargetValidationTest : KGPBaseTest() {
} }
build("assemble") { build("assemble") {
assertOutputContains( assertHasDiagnostic(KotlinToolingDiagnostics.InconsistentTargetCompatibilityForKotlinAndJavaTasks)
"'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."
)
} }
} }
} }
@@ -400,6 +367,7 @@ class JvmTargetValidationTest : KGPBaseTest() {
internal fun errorByDefaultWithGradle8(gradleVersion: GradleVersion) { internal fun errorByDefaultWithGradle8(gradleVersion: GradleVersion) {
project("simple".fullProjectName, gradleVersion) { project("simple".fullProjectName, gradleVersion) {
//language=Groovy //language=Groovy
@Suppress("UnnecessaryQualifiedReference")
buildGradle.appendText( buildGradle.appendText(
""" """
| |
@@ -411,15 +379,11 @@ class JvmTargetValidationTest : KGPBaseTest() {
if (gradleVersion.baseVersion >= GradleVersion.version("8.0")) { if (gradleVersion.baseVersion >= GradleVersion.version("8.0")) {
buildAndFail("assemble") { buildAndFail("assemble") {
assertOutputContains( assertHasDiagnostic(KotlinToolingDiagnostics.InconsistentTargetCompatibilityForKotlinAndJavaTasks)
"'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."
)
} }
} else { } else {
build("assemble") { build("assemble") {
assertOutputContains( assertHasDiagnostic(KotlinToolingDiagnostics.InconsistentTargetCompatibilityForKotlinAndJavaTasks)
"'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."
)
} }
} }
} }
@@ -447,8 +411,7 @@ class JvmTargetValidationTest : KGPBaseTest() {
) )
buildAndFail(":lib:compileKotlinJvmWithJava") { buildAndFail(":lib:compileKotlinJvmWithJava") {
assertOutputContains("'compileJava' task (current target is 17) and 'compileKotlinJvmWithJava' task" + assertHasDiagnostic(KotlinToolingDiagnostics.InconsistentTargetCompatibilityForKotlinAndJavaTasks)
" (current target is 1.8) jvm target compatibility should be set to the same Java version.")
} }
} }
} }
@@ -280,4 +280,21 @@ object KotlinToolingDiagnostics {
""".trimIndent() """.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.PropertiesProvider.PropertyNames.KOTLIN_SUPPRESS_EXPERIMENTAL_IC_OPTIMIZATIONS_WARNING
import org.jetbrains.kotlin.gradle.plugin.UsesBuildFinishedListenerService import org.jetbrains.kotlin.gradle.plugin.UsesBuildFinishedListenerService
import org.jetbrains.kotlin.gradle.plugin.UsesVariantImplementationFactories 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.plugin.statistics.KotlinBuildStatsService
import org.jetbrains.kotlin.gradle.report.* import org.jetbrains.kotlin.gradle.report.*
import org.jetbrains.kotlin.gradle.utils.* import org.jetbrains.kotlin.gradle.utils.*
@@ -62,6 +63,7 @@ abstract class AbstractKotlinCompile<T : CommonCompilerArguments> @Inject constr
UsesVariantImplementationFactories, UsesVariantImplementationFactories,
UsesBuildFinishedListenerService, UsesBuildFinishedListenerService,
UsesClassLoadersCachingBuildService, UsesClassLoadersCachingBuildService,
UsesKotlinToolingDiagnostics,
BaseKotlinCompile { BaseKotlinCompile {
init { init {
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.gradle.tasks package org.jetbrains.kotlin.gradle.tasks
import org.gradle.api.GradleException
import org.gradle.api.file.ConfigurableFileCollection import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.DirectoryProperty import org.gradle.api.file.DirectoryProperty
import org.gradle.api.file.FileCollection 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.AbstractCompile
import org.gradle.api.tasks.compile.JavaCompile import org.gradle.api.tasks.compile.JavaCompile
import org.gradle.api.tasks.util.PatternFilterable import org.gradle.api.tasks.util.PatternFilterable
import org.gradle.util.GradleVersion
import org.gradle.work.Incremental import org.gradle.work.Incremental
import org.gradle.work.InputChanges import org.gradle.work.InputChanges
import org.gradle.work.NormalizeLineEndings 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.logging.kotlinDebug
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer.CreateCompilerArgumentsContext.Companion.create 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.plugin.getKotlinPluginVersion
import org.jetbrains.kotlin.gradle.report.BuildReportMode import org.jetbrains.kotlin.gradle.report.BuildReportMode
import org.jetbrains.kotlin.gradle.tasks.internal.KotlinJvmOptionsCompat import org.jetbrains.kotlin.gradle.tasks.internal.KotlinJvmOptionsCompat
@@ -311,7 +311,8 @@ abstract class KotlinCompile @Inject constructor(
validateKotlinAndJavaHasSameTargetCompatibility(args) validateKotlinAndJavaHasSameTargetCompatibility(args)
val gradlePrintingMessageCollector = GradlePrintingMessageCollector(logger, args.allWarningsAsErrors) val gradlePrintingMessageCollector = GradlePrintingMessageCollector(logger, args.allWarningsAsErrors)
val gradleMessageCollector = GradleErrorMessageCollector( val gradleMessageCollector =
GradleErrorMessageCollector(
gradlePrintingMessageCollector, kotlinPluginVersion = getKotlinPluginVersion(logger) gradlePrintingMessageCollector, kotlinPluginVersion = getKotlinPluginVersion(logger)
) )
val outputItemCollector = OutputItemsCollectorImpl() val outputItemCollector = OutputItemsCollectorImpl()
@@ -356,8 +357,11 @@ abstract class KotlinCompile @Inject constructor(
private fun validateKotlinAndJavaHasSameTargetCompatibility( private fun validateKotlinAndJavaHasSameTargetCompatibility(
args: K2JVMCompilerArguments, args: K2JVMCompilerArguments,
) { ) {
val jvmTargetValidationMode: JvmTargetValidationMode = jvmTargetValidationMode.get() val severity = when (jvmTargetValidationMode.get()) {
if (jvmTargetValidationMode == JvmTargetValidationMode.IGNORE) return JvmTargetValidationMode.ERROR -> ToolingDiagnostic.Severity.FATAL
JvmTargetValidationMode.WARNING -> ToolingDiagnostic.Severity.WARNING
else -> return
}
associatedJavaCompileTaskTargetCompatibility.orNull?.let { targetCompatibility -> associatedJavaCompileTaskTargetCompatibility.orNull?.let { targetCompatibility ->
val normalizedJavaTarget = when (targetCompatibility) { val normalizedJavaTarget = when (targetCompatibility) {
@@ -370,24 +374,15 @@ abstract class KotlinCompile @Inject constructor(
val jvmTarget = args.jvmTarget ?: JvmTarget.DEFAULT.toString() val jvmTarget = args.jvmTarget ?: JvmTarget.DEFAULT.toString()
if (normalizedJavaTarget != jvmTarget) { if (normalizedJavaTarget != jvmTarget) {
val javaTaskName = associatedJavaCompileTaskName.get() reportDiagnostic(
KotlinToolingDiagnostics.InconsistentTargetCompatibilityForKotlinAndJavaTasks(
val errorMessage = buildString { javaTaskName = associatedJavaCompileTaskName.get(),
append("'$javaTaskName' task (current target is $targetCompatibility) and ") targetCompatibility = targetCompatibility,
append("'$name' task (current target is $jvmTarget) ") kotlinTaskName = name,
appendLine("jvm target compatibility should be set to the same Java version.") jvmTarget = args.jvmTarget ?: "not provided explicitly, picked up default ${JvmTarget.DEFAULT}",
if (GradleVersion.current().baseVersion < GradleVersion.version("8.0")) { severity = severity
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
}
} }
} }
} }