Fix jvm target validation does not work for MPP JVM withJava target
Related KotlinCompile to JavaCompile wiring is happening on KotlinJvmTarget initialization before 'withJava' configuration runs. At that point linked JavaCompile task is null. Fix delays wiring to execution phase when such task should be available. ^KT-55119 Fixed
This commit is contained in:
committed by
Space Team
parent
1f76d39e66
commit
a90664574c
+53
-1
@@ -321,7 +321,6 @@ class JvmTargetValidationTest : KGPBaseTest() {
|
||||
}
|
||||
|
||||
@DisplayName("Validation should work correctly for KaptGenerateStubs task")
|
||||
@GradleTestVersions
|
||||
@GradleTest
|
||||
internal fun kaptGenerateStubsValidateCorrect(gradleVersion: GradleVersion) {
|
||||
project(
|
||||
@@ -387,6 +386,59 @@ class JvmTargetValidationTest : KGPBaseTest() {
|
||||
}
|
||||
}
|
||||
|
||||
@MppGradlePluginTests
|
||||
@DisplayName("Validation should show error for MPP JVM target withJava")
|
||||
@GradleTest
|
||||
internal fun mppWithJavaFailValidation(gradleVersion: GradleVersion) {
|
||||
project("kt-31468-multiple-jvm-targets-with-java", gradleVersion) {
|
||||
gradleProperties.append(
|
||||
"""
|
||||
kotlin.jvm.target.validation.mode = error
|
||||
""".trimIndent()
|
||||
)
|
||||
|
||||
subProject("lib").buildGradleKts.appendText(
|
||||
"""
|
||||
|
|
||||
|java {
|
||||
| targetCompatibility = JavaVersion.VERSION_17
|
||||
| sourceCompatibility = JavaVersion.VERSION_17
|
||||
|}
|
||||
""".trimMargin()
|
||||
)
|
||||
|
||||
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.")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@MppGradlePluginTests
|
||||
@DisplayName("Validation should not run MPP JVM target without withJava")
|
||||
@GradleTest
|
||||
internal fun mppJvmNotFailValidation(gradleVersion: GradleVersion) {
|
||||
project("kt-31468-multiple-jvm-targets-with-java", gradleVersion) {
|
||||
gradleProperties.append(
|
||||
"""
|
||||
kotlin.jvm.target.validation.mode = error
|
||||
""".trimIndent()
|
||||
)
|
||||
|
||||
subProject("lib").buildGradleKts.appendText(
|
||||
"""
|
||||
|
|
||||
|java {
|
||||
| targetCompatibility = JavaVersion.VERSION_17
|
||||
| sourceCompatibility = JavaVersion.VERSION_17
|
||||
|}
|
||||
""".trimMargin()
|
||||
)
|
||||
|
||||
build(":lib:compileKotlinPlainJvm")
|
||||
}
|
||||
}
|
||||
|
||||
private fun TestProject.setJavaCompilationCompatibility(
|
||||
target: JavaVersion
|
||||
) {
|
||||
|
||||
+19
-1
@@ -6,6 +6,7 @@
|
||||
@file:Suppress("PackageDirectoryMismatch") // Old package for compatibility
|
||||
package org.jetbrains.kotlin.gradle.plugin.mpp
|
||||
|
||||
import org.gradle.api.provider.Provider
|
||||
import org.gradle.api.tasks.TaskProvider
|
||||
import org.gradle.api.tasks.compile.JavaCompile
|
||||
import org.jetbrains.kotlin.gradle.dsl.*
|
||||
@@ -23,7 +24,7 @@ open class KotlinJvmCompilation @Inject internal constructor(
|
||||
) : AbstractKotlinCompilationToRunnableFiles<KotlinJvmOptions>(compilation),
|
||||
KotlinCompilationWithResources<KotlinJvmOptions> {
|
||||
|
||||
override val target: KotlinJvmTarget = compilation.target as KotlinJvmTarget
|
||||
final override val target: KotlinJvmTarget = compilation.target as KotlinJvmTarget
|
||||
|
||||
override val compilerOptions: HasCompilerOptions<KotlinJvmCompilerOptions> =
|
||||
compilation.compilerOptions.castCompilerOptionsType()
|
||||
@@ -42,6 +43,10 @@ open class KotlinJvmCompilation @Inject internal constructor(
|
||||
override val compileTaskProvider: TaskProvider<out KotlinCompilationTask<KotlinJvmCompilerOptions>>
|
||||
get() = compilation.compileTaskProvider as TaskProvider<KotlinCompilationTask<KotlinJvmCompilerOptions>>
|
||||
|
||||
/**
|
||||
* **Note**: requesting this too early (right after target creation and before any target configuration) may falsely return `null`
|
||||
* value, but later target will be configured to run with Java enabled. If possible, please use [compileJavaTaskProviderSafe].
|
||||
*/
|
||||
val compileJavaTaskProvider: TaskProvider<out JavaCompile>?
|
||||
get() = if (target.withJavaEnabled) {
|
||||
val project = target.project
|
||||
@@ -52,6 +57,19 @@ open class KotlinJvmCompilation @Inject internal constructor(
|
||||
project.tasks.withType(JavaCompile::class.java).named(javaSourceSet.compileJavaTaskName)
|
||||
} else null
|
||||
|
||||
/**
|
||||
* Alternative to [compileJavaTaskProvider] to safely receive [JavaCompile] task provider when [KotlinJvmTarget.withJavaEnabled]
|
||||
* will be enabled after call to this method.
|
||||
*/
|
||||
internal val compileJavaTaskProviderSafe: Provider<JavaCompile> = target.project.providers
|
||||
.provider { if (target.withJavaEnabled) Unit else null }
|
||||
.map {
|
||||
project.javaSourceSets.getByName(compilationName).compileJavaTaskName
|
||||
}
|
||||
.flatMap {
|
||||
project.tasks.named(it, JavaCompile::class.java)
|
||||
}
|
||||
|
||||
override val processResourcesTaskName: String
|
||||
get() = compilation.processResourcesTaskName ?: error("Missing 'processResourcesTaskName'")
|
||||
}
|
||||
|
||||
+4
-4
@@ -70,7 +70,7 @@ internal open class BaseKotlinCompileConfig<TASK : KotlinCompile> : AbstractKotl
|
||||
|
||||
constructor(compilationInfo: KotlinCompilationInfo) : super(compilationInfo) {
|
||||
val javaTaskProvider = when (val compilation = compilationInfo.tcsOrNull?.compilation) {
|
||||
is KotlinJvmCompilation -> compilation.compileJavaTaskProvider
|
||||
is KotlinJvmCompilation -> compilation.compileJavaTaskProviderSafe
|
||||
is KotlinJvmAndroidCompilation -> compilation.compileJavaTaskProvider
|
||||
is KotlinWithJavaCompilation<*, *> -> compilation.compileJavaTaskProvider
|
||||
else -> null
|
||||
@@ -78,9 +78,9 @@ internal open class BaseKotlinCompileConfig<TASK : KotlinCompile> : AbstractKotl
|
||||
|
||||
configureTaskProvider { taskProvider ->
|
||||
taskProvider.configure { task ->
|
||||
javaTaskProvider?.let {
|
||||
task.associatedJavaCompileTaskTargetCompatibility.value(javaTaskProvider.map { it.targetCompatibility })
|
||||
task.associatedJavaCompileTaskName.value(javaTaskProvider.name)
|
||||
javaTaskProvider?.let { javaTask ->
|
||||
task.associatedJavaCompileTaskTargetCompatibility.value(javaTask.map { it.targetCompatibility })
|
||||
task.associatedJavaCompileTaskName.value(javaTask.map { it.name })
|
||||
}
|
||||
|
||||
@Suppress("DEPRECATION")
|
||||
|
||||
@@ -55,7 +55,6 @@ org.jetbrains.kotlin.idea.navigation.GotoWithMultipleLibrariesTest.testOneHasSou
|
||||
org.jetbrains.kotlin.idea.navigation.GotoWithMultipleLibrariesTest.testSeveralWithSource,,, FLAKY
|
||||
org.jetbrains.kotlin.tools.projectWizard.wizard.ProjectTemplateNewWizardProjectImportTestGenerated.GradleGroovy.testMultiplatformApplication,,,
|
||||
org.jetbrains.kotlin.tools.projectWizard.wizard.ProjectTemplateNewWizardProjectImportTestGenerated.GradleKts.testMultiplatformApplication,,,
|
||||
org.jetbrains.kotlin.gradle.NewMultiplatformIT.testJavaSupportInJvmTargets,,,
|
||||
org.jetbrains.kotlin.checkers.JavaAgainstKotlinBinariesCheckerTestGenerated.testJvmOverloadsFunctions,,, FLAKY
|
||||
org.jetbrains.kotlin.checkers.JavaAgainstKotlinBinariesCheckerTestGenerated.testReturnInnerClasses,,, FLAKY
|
||||
org.jetbrains.kotlin.checkers.JavaAgainstKotlinBinariesCheckerTestGenerated.testThrowsOnGenericMethod,,, FLAKY
|
||||
|
||||
|
Reference in New Issue
Block a user