From 76c37f359a1e0d961f569ba45d594ab60d4e5e24 Mon Sep 17 00:00:00 2001 From: Dmitry Savvinov Date: Thu, 20 Apr 2023 12:15:21 +0200 Subject: [PATCH] [Gradle] Migrate warning about inconsistent JVM target --- .../kotlin/gradle/JvmTargetValidationTest.kt | 81 +++++-------------- .../diagnostics/KotlinToolingDiagnostics.kt | 17 ++++ .../gradle/tasks/AbstractKotlinCompile.kt | 4 +- .../kotlin/gradle/tasks/KotlinCompile.kt | 41 +++++----- 4 files changed, 60 insertions(+), 83 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/JvmTargetValidationTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/JvmTargetValidationTest.kt index d1dd3203708..5d34157c341 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/JvmTargetValidationTest.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/JvmTargetValidationTest.kt @@ -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" -} \ No newline at end of file +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/KotlinToolingDiagnostics.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/KotlinToolingDiagnostics.kt index 9f4ef91956b..5f4d2c3e79d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/KotlinToolingDiagnostics.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/KotlinToolingDiagnostics.kt @@ -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 + ) + } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/AbstractKotlinCompile.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/AbstractKotlinCompile.kt index f52b84fe4f5..4a1c31e440a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/AbstractKotlinCompile.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/AbstractKotlinCompile.kt @@ -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 @Inject constr UsesVariantImplementationFactories, UsesBuildFinishedListenerService, UsesClassLoadersCachingBuildService, + UsesKotlinToolingDiagnostics, BaseKotlinCompile { init { @@ -359,4 +361,4 @@ abstract class AbstractKotlinCompile @Inject constr inputChanges: InputChanges, taskOutputsBackup: TaskOutputsBackup? ) -} \ No newline at end of file +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinCompile.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinCompile.kt index e266085f964..bf4a21ed13f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinCompile.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinCompile.kt @@ -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 + ) + ) } } }