Cleanup JVM toolchain implementation
Remove support for <Gradle 6.7 and fix extension method to accept 'JavaToolchainSpec' instead of 'Any'. ^KT-47924 Fixed
This commit is contained in:
@@ -51,12 +51,14 @@ fun Project.configureJvmToolchain(
|
||||
|
||||
if (shouldOverrideObsoleteJdk(jdkVersion)) {
|
||||
kotlinExtension.jvmToolchain {
|
||||
@Suppress("USELESS_CAST") // Remove after boostrap update
|
||||
(this as JavaToolchainSpec).languageVersion
|
||||
.set(JavaLanguageVersion.of(jdkVersion.overrideMajorVersion!!))
|
||||
}
|
||||
updateJvmTarget(jdkVersion.targetName)
|
||||
} else {
|
||||
kotlinExtension.jvmToolchain {
|
||||
@Suppress("USELESS_CAST") // Remove after boostrap update
|
||||
(this as JavaToolchainSpec).languageVersion
|
||||
.set(JavaLanguageVersion.of(jdkVersion.majorVersion))
|
||||
}
|
||||
|
||||
-4
@@ -74,8 +74,4 @@ interface KotlinJavaToolchain {
|
||||
javaLauncher: Provider<JavaLauncher>
|
||||
)
|
||||
}
|
||||
|
||||
companion object {
|
||||
val TOOLCHAIN_SUPPORTED_VERSION: GradleVersion = GradleVersion.version("6.7")
|
||||
}
|
||||
}
|
||||
|
||||
+14
-14
@@ -19,7 +19,7 @@ import java.io.File
|
||||
@DisplayName("Kotlin Java Toolchain support")
|
||||
class KotlinJavaToolchainTest : KGPBaseTest() {
|
||||
|
||||
@GradleTestVersions(additionalVersions = [TestVersions.Gradle.G_6_7])
|
||||
@GradleTestVersions
|
||||
@GradleTest
|
||||
@DisplayName("Should use by default same jvm as Gradle daemon for jdkHome")
|
||||
internal fun byDefaultShouldUseGradleJDK(gradleVersion: GradleVersion) {
|
||||
@@ -102,7 +102,7 @@ class KotlinJavaToolchainTest : KGPBaseTest() {
|
||||
}
|
||||
|
||||
@DisplayName("Kotlin compile task should reuse build cache when toolchain is set and build is happening on different JDKs")
|
||||
@GradleTestVersions(minVersion = TestVersions.Gradle.G_6_7)
|
||||
@GradleTestVersions
|
||||
@GradleTest
|
||||
internal fun differentBuildJDKBuildCacheHit(gradleVersion: GradleVersion) {
|
||||
val buildCache = workingDir.resolve("custom-jdk-build-cache")
|
||||
@@ -331,7 +331,7 @@ class KotlinJavaToolchainTest : KGPBaseTest() {
|
||||
}
|
||||
|
||||
@DisplayName("Should allow to set JDK version for tasks via Java toolchain")
|
||||
@GradleTestVersions(minVersion = TestVersions.Gradle.G_6_7)
|
||||
@GradleTestVersions
|
||||
@GradleTest
|
||||
internal fun setJdkUsingJavaToolchain(gradleVersion: GradleVersion) {
|
||||
project(
|
||||
@@ -346,7 +346,7 @@ class KotlinJavaToolchainTest : KGPBaseTest() {
|
||||
}
|
||||
|
||||
@DisplayName("Should allow to set Java toolchain via extension")
|
||||
@GradleTestVersions(minVersion = TestVersions.Gradle.G_6_7)
|
||||
@GradleTestVersions
|
||||
@GradleTest
|
||||
internal fun setJdkUsingJavaToolchainViaExtension(gradleVersion: GradleVersion) {
|
||||
project(
|
||||
@@ -361,7 +361,7 @@ class KotlinJavaToolchainTest : KGPBaseTest() {
|
||||
}
|
||||
|
||||
@DisplayName("Toolchain should be correctly supported in multiplatform plugin jvm targets")
|
||||
@GradleTestVersions(minVersion = TestVersions.Gradle.G_6_7)
|
||||
@GradleTestVersions
|
||||
@GradleTest
|
||||
internal fun toolchainCorrectlySupportedInMPPlugin(gradleVersion: GradleVersion) {
|
||||
project(
|
||||
@@ -419,7 +419,7 @@ class KotlinJavaToolchainTest : KGPBaseTest() {
|
||||
}
|
||||
|
||||
@DisplayName("Should set 'jvmTarget' option if user does not specify it explicitly via toolchain setter")
|
||||
@GradleTestVersions(minVersion = TestVersions.Gradle.G_6_7)
|
||||
@GradleTestVersions
|
||||
@GradleTest
|
||||
internal fun shouldSetJvmTargetNonSpecifiedByUserViaToolchain(gradleVersion: GradleVersion) {
|
||||
project(
|
||||
@@ -437,7 +437,7 @@ class KotlinJavaToolchainTest : KGPBaseTest() {
|
||||
}
|
||||
|
||||
@DisplayName("Should not override user specified 'jvmTarget' option via toolchain setter")
|
||||
@GradleTestVersions(minVersion = "6.7.1")
|
||||
@GradleTestVersions
|
||||
@GradleTest
|
||||
internal fun shouldNotOverrideUserSpecifiedJvmTargetViaToolchain(gradleVersion: GradleVersion) {
|
||||
project(
|
||||
@@ -456,7 +456,7 @@ class KotlinJavaToolchainTest : KGPBaseTest() {
|
||||
}
|
||||
|
||||
@DisplayName("Setting toolchain via java extension should also affect Kotlin compilations")
|
||||
@GradleTestVersions(minVersion = TestVersions.Gradle.G_6_7)
|
||||
@GradleTestVersions
|
||||
@GradleTest
|
||||
internal fun settingToolchainViaJavaShouldAlsoWork(gradleVersion: GradleVersion) {
|
||||
project(
|
||||
@@ -487,8 +487,8 @@ class KotlinJavaToolchainTest : KGPBaseTest() {
|
||||
}
|
||||
}
|
||||
|
||||
@DisplayName("Build should not produce warninings when '-no-jdk' option is present")
|
||||
@GradleTestVersions(minVersion = TestVersions.Gradle.G_6_7)
|
||||
@DisplayName("Build should not produce warnings when '-no-jdk' option is present")
|
||||
@GradleTestVersions
|
||||
@GradleTest
|
||||
internal fun noWarningOnNoJdkOptionPresent(gradleVersion: GradleVersion) {
|
||||
project(
|
||||
@@ -520,7 +520,7 @@ class KotlinJavaToolchainTest : KGPBaseTest() {
|
||||
}
|
||||
|
||||
@DisplayName("Toolchain should take into account kotlin options that are set via android extension")
|
||||
@GradleTestVersions(minVersion = TestVersions.Gradle.G_6_7)
|
||||
@GradleTestVersions
|
||||
@GradleTest
|
||||
internal fun kotlinOptionsAndroidAndToolchain(gradleVersion: GradleVersion) {
|
||||
project("android".fullProjectName, gradleVersion) {
|
||||
@@ -544,7 +544,7 @@ class KotlinJavaToolchainTest : KGPBaseTest() {
|
||||
}
|
||||
|
||||
@DisplayName("Toolchain should not make an exception when build is running on JDK 11, but toolchain is set to JDK 1.8")
|
||||
@GradleTestVersions(minVersion = TestVersions.Gradle.G_6_7)
|
||||
@GradleTestVersions
|
||||
@GradleTest
|
||||
internal fun shouldNotRaiseErrorOnJDK11withJDK1_8Toolchain(gradleVersion: GradleVersion) {
|
||||
project(
|
||||
@@ -559,7 +559,7 @@ class KotlinJavaToolchainTest : KGPBaseTest() {
|
||||
}
|
||||
|
||||
@DisplayName("JVM target shouldn't be changed when toolchain is not configured")
|
||||
@GradleTestVersions(minVersion = TestVersions.Gradle.G_6_7)
|
||||
@GradleTestVersions
|
||||
@GradleTest
|
||||
internal fun shouldNotChangeJvmTargetWithNoToolchain(gradleVersion: GradleVersion) {
|
||||
project(
|
||||
@@ -586,7 +586,7 @@ class KotlinJavaToolchainTest : KGPBaseTest() {
|
||||
}
|
||||
|
||||
@DisplayName("Kotlin toolchain should support configuration cache")
|
||||
@GradleTestVersions(minVersion = TestVersions.Gradle.G_6_7)
|
||||
@GradleTestVersions
|
||||
@GradleTest
|
||||
internal fun testConfigurationCache(gradleVersion: GradleVersion) {
|
||||
project(
|
||||
|
||||
+2
-2
@@ -77,9 +77,9 @@ abstract class KotlinTopLevelExtension(internal val project: Project) : KotlinTo
|
||||
/**
|
||||
* Configures [Java toolchain](https://docs.gradle.org/current/userguide/toolchains.html) both for Kotlin JVM and Java tasks.
|
||||
*
|
||||
* @param action - action to configure [JavaToolchainSpec]. You could safely cast `Any` into `JavaToolchainSpec`.
|
||||
* @param action - action to configure [JavaToolchainSpec]
|
||||
*/
|
||||
fun jvmToolchain(action: Action<Any>) {
|
||||
fun jvmToolchain(action: Action<JavaToolchainSpec>) {
|
||||
toolchainSupport.applyToolchain(action)
|
||||
}
|
||||
|
||||
|
||||
+7
-22
@@ -6,7 +6,6 @@
|
||||
package org.jetbrains.kotlin.gradle.dsl
|
||||
|
||||
import org.gradle.api.Action
|
||||
import org.gradle.api.GradleException
|
||||
import org.gradle.api.Project
|
||||
import org.gradle.api.plugins.ExtensionContainer
|
||||
import org.gradle.api.plugins.JavaPluginExtension
|
||||
@@ -14,41 +13,27 @@ import org.gradle.api.plugins.PluginContainer
|
||||
import org.gradle.api.tasks.TaskContainer
|
||||
import org.gradle.jvm.toolchain.JavaToolchainService
|
||||
import org.gradle.jvm.toolchain.JavaToolchainSpec
|
||||
import org.gradle.util.GradleVersion
|
||||
import org.jetbrains.kotlin.gradle.tasks.KotlinJavaToolchain.Companion.TOOLCHAIN_SUPPORTED_VERSION
|
||||
import org.jetbrains.kotlin.gradle.tasks.UsesKotlinJavaToolchain
|
||||
import org.jetbrains.kotlin.gradle.tasks.withType
|
||||
import org.jetbrains.kotlin.gradle.utils.newInstance
|
||||
import javax.inject.Inject
|
||||
|
||||
internal interface ToolchainSupport {
|
||||
fun applyToolchain(action: Action<Any>)
|
||||
fun applyToolchain(action: Action<JavaToolchainSpec>)
|
||||
|
||||
companion object {
|
||||
internal fun createToolchain(
|
||||
project: Project
|
||||
): ToolchainSupport {
|
||||
val currentVersion = GradleVersion.version(project.gradle.gradleVersion)
|
||||
return when {
|
||||
currentVersion < TOOLCHAIN_SUPPORTED_VERSION -> project.objects.newInstance<NonExistingToolchainSupport>()
|
||||
else -> project.objects.newInstance<DefaultToolchainSupport>(
|
||||
project.extensions,
|
||||
project.tasks,
|
||||
project.plugins
|
||||
)
|
||||
}
|
||||
return project.objects.newInstance<DefaultToolchainSupport>(
|
||||
project.extensions,
|
||||
project.tasks,
|
||||
project.plugins
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal abstract class NonExistingToolchainSupport : ToolchainSupport {
|
||||
override fun applyToolchain(
|
||||
action: Action<Any>
|
||||
) {
|
||||
throw GradleException("JavaToolchain support is only available from Gradle 6.7")
|
||||
}
|
||||
}
|
||||
|
||||
internal abstract class DefaultToolchainSupport @Inject constructor(
|
||||
private val extensions: ExtensionContainer,
|
||||
private val tasks: TaskContainer,
|
||||
@@ -64,7 +49,7 @@ internal abstract class DefaultToolchainSupport @Inject constructor(
|
||||
}
|
||||
|
||||
override fun applyToolchain(
|
||||
action: Action<Any>
|
||||
action: Action<JavaToolchainSpec>
|
||||
) {
|
||||
action.execute(toolchainSpec)
|
||||
configureToolchain()
|
||||
|
||||
+1
-4
@@ -123,10 +123,7 @@ abstract class KaptTask @Inject constructor(
|
||||
|
||||
@get:Internal
|
||||
internal val defaultKotlinJavaToolchain: Provider<DefaultKotlinJavaToolchain> = objectFactory
|
||||
.propertyWithNewInstance(
|
||||
project.gradle,
|
||||
{ null }
|
||||
)
|
||||
.propertyWithNewInstance({ null })
|
||||
|
||||
final override val kotlinJavaToolchainProvider: Provider<KotlinJavaToolchain> = defaultKotlinJavaToolchain.cast()
|
||||
|
||||
|
||||
+3
-28
@@ -9,34 +9,27 @@ import org.gradle.api.GradleException
|
||||
import org.gradle.api.JavaVersion
|
||||
import org.gradle.api.file.ProjectLayout
|
||||
import org.gradle.api.file.RegularFileProperty
|
||||
import org.gradle.api.invocation.Gradle
|
||||
import org.gradle.api.model.ObjectFactory
|
||||
import org.gradle.api.provider.Property
|
||||
import org.gradle.api.provider.Provider
|
||||
import org.gradle.api.tasks.Internal
|
||||
import org.gradle.internal.jvm.Jvm
|
||||
import org.gradle.jvm.toolchain.*
|
||||
import org.gradle.util.GradleVersion
|
||||
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
|
||||
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptionsImpl
|
||||
import org.jetbrains.kotlin.gradle.tasks.KotlinJavaToolchain.Companion.TOOLCHAIN_SUPPORTED_VERSION
|
||||
import org.jetbrains.kotlin.gradle.utils.chainedFinalizeValueOnRead
|
||||
import org.jetbrains.kotlin.gradle.utils.property
|
||||
import org.jetbrains.kotlin.gradle.utils.propertyWithConvention
|
||||
import org.jetbrains.kotlin.gradle.utils.providerWithLazyConvention
|
||||
import java.io.File
|
||||
import javax.inject.Inject
|
||||
import kotlin.reflect.full.functions
|
||||
|
||||
internal abstract class DefaultKotlinJavaToolchain @Inject constructor(
|
||||
private val objects: ObjectFactory,
|
||||
projectLayout: ProjectLayout,
|
||||
gradle: Gradle,
|
||||
kotlinCompileTaskProvider: () -> KotlinCompile?
|
||||
) : KotlinJavaToolchain {
|
||||
|
||||
private val currentGradleVersion = GradleVersion.version(gradle.gradleVersion)
|
||||
|
||||
@get:Internal
|
||||
internal val currentJvm: Provider<Jvm> = objects
|
||||
.property(Jvm.current())
|
||||
@@ -116,23 +109,13 @@ internal abstract class DefaultKotlinJavaToolchain @Inject constructor(
|
||||
|
||||
final override val jdk: KotlinJavaToolchain.JdkSetter = DefaultJdkSetter(
|
||||
providedJvm,
|
||||
currentGradleVersion,
|
||||
objects,
|
||||
{ providedJvmExplicitlySet = true },
|
||||
kotlinCompileTaskProvider
|
||||
)
|
||||
|
||||
private val defaultJavaToolchainSetter by lazy(LazyThreadSafetyMode.NONE) {
|
||||
if (currentGradleVersion >= TOOLCHAIN_SUPPORTED_VERSION) {
|
||||
DefaultJavaToolchainSetter(providedJvm, kotlinCompileTaskProvider)
|
||||
} else {
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
final override val toolchain: KotlinJavaToolchain.JavaToolchainSetter
|
||||
get() = defaultJavaToolchainSetter
|
||||
?: throw GradleException("Toolchain support is available from $TOOLCHAIN_SUPPORTED_VERSION")
|
||||
final override val toolchain: KotlinJavaToolchain.JavaToolchainSetter =
|
||||
DefaultJavaToolchainSetter(providedJvm, kotlinCompileTaskProvider)
|
||||
|
||||
/**
|
||||
* Updates [task] 'jvmTarget' if user has configured toolchain and not 'jvmTarget'.
|
||||
@@ -197,7 +180,6 @@ internal abstract class DefaultKotlinJavaToolchain @Inject constructor(
|
||||
|
||||
private class DefaultJdkSetter(
|
||||
private val providedJvm: Property<Jvm>,
|
||||
private val currentGradleVersion: GradleVersion,
|
||||
private val objects: ObjectFactory,
|
||||
private val updateProvidedJdkCallback: () -> Unit,
|
||||
kotlinCompileTaskProvider: () -> KotlinCompile?
|
||||
@@ -219,14 +201,7 @@ internal abstract class DefaultKotlinJavaToolchain @Inject constructor(
|
||||
providedJvm.set(
|
||||
objects.providerWithLazyConvention {
|
||||
updateJvmTarget(jdkVersion)
|
||||
if (currentGradleVersion < GradleVersion.version("6.2.0")) {
|
||||
// Before Gradle 6.2.0 'Jvm.discovered' does not have 'implementationJavaVersion' parameter
|
||||
Jvm::class.functions
|
||||
.first { it.name == "discovered" }
|
||||
.call(jdkHomeLocation, jdkVersion) as Jvm
|
||||
} else {
|
||||
Jvm.discovered(jdkHomeLocation, null, jdkVersion)
|
||||
}
|
||||
Jvm.discovered(jdkHomeLocation, null, jdkVersion)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
+1
-4
@@ -678,10 +678,7 @@ abstract class KotlinCompile @Inject constructor(
|
||||
|
||||
@get:Internal
|
||||
internal val defaultKotlinJavaToolchain: Provider<DefaultKotlinJavaToolchain> = objects
|
||||
.propertyWithNewInstance(
|
||||
project.gradle,
|
||||
{ this }
|
||||
)
|
||||
.propertyWithNewInstance({ this })
|
||||
|
||||
final override val kotlinJavaToolchainProvider: Provider<KotlinJavaToolchain> = defaultKotlinJavaToolchain.cast()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user