From ad62262f519408f534160ed40cfd449245538b0b Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Sat, 17 Sep 2022 13:58:09 +0200 Subject: [PATCH] Add workaround for external plugin modifying options on JS task execution Currently know problematic place is in 'common-configuration.gradle.kts' setting '-Xklib-relative-path-base'. This is done in task doFirst{} action to avoid remote build cache misses due to absolute path usage. ^KT-27301 In Progress --- .../jetbrains/kotlin/gradle/tasks/Tasks.kt | 23 ++++++++--- .../tasks/internal/KotlinJsOptionsCompat.kt | 41 +++++++++++++++++++ 2 files changed, 58 insertions(+), 6 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/internal/KotlinJsOptionsCompat.kt diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt index ec3120f57c2..5c438b8b6cf 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt @@ -60,6 +60,7 @@ import org.jetbrains.kotlin.gradle.targets.js.ir.DISABLE_PRE_IR import org.jetbrains.kotlin.gradle.targets.js.ir.PRODUCE_JS import org.jetbrains.kotlin.gradle.targets.js.ir.PRODUCE_UNZIPPED_KLIB import org.jetbrains.kotlin.gradle.targets.js.ir.PRODUCE_ZIPPED_KLIB +import org.jetbrains.kotlin.gradle.tasks.internal.KotlinJsOptionsCompat import org.jetbrains.kotlin.gradle.utils.* import org.jetbrains.kotlin.incremental.* import org.jetbrains.kotlin.incremental.ClasspathChanges.ClasspathSnapshotDisabled @@ -935,10 +936,10 @@ abstract class Kotlin2JsCompile @Inject constructor( @Suppress("DEPRECATION") @Deprecated("Replaced by compilerOptions input", replaceWith = ReplaceWith("compilerOptions")) - override val kotlinOptions: KotlinJsOptions = object : KotlinJsOptions { - override val options: CompilerJsOptions - get() = compilerOptions - } + override val kotlinOptions: KotlinJsOptions = KotlinJsOptionsCompat( + { this }, + compilerOptions + ) @get:Input internal var incrementalJsKlib: Boolean = true @@ -991,6 +992,16 @@ abstract class Kotlin2JsCompile @Inject constructor( @get:Input internal abstract val enhancedFreeCompilerArgs: ListProperty + /** + * Workaround for those "nasty" plugins that are adding 'freeCompilerArgs' on task execution phase. + * With properties api it is not possible to update property value after task configuration is finished. + * + * Marking it as `@Internal` as anyway on the configuration phase, when Gradle does task inputs snapshot, + * this input will always be empty. + */ + @get:Internal + internal var additionalFreeCompilerArgs: List = listOf() + override fun createCompilerArgs(): K2JSCompilerArguments = K2JSCompilerArguments() @@ -1015,9 +1026,9 @@ abstract class Kotlin2JsCompile @Inject constructor( } // Rewriting default outputFile property back to outputFilePropertyValue args.outputFile = outputFileProperty.get().absoluteFile.normalize().absolutePath - // Overriding freeArgs from compilerOptions with enhanced one + // Overriding freeArgs from compilerOptions with enhanced one + additional one set on execution phase // containing additional arguments based on the js compilation configuration - args.freeArgs = enhancedFreeCompilerArgs.get() + args.freeArgs = enhancedFreeCompilerArgs.get().union(additionalFreeCompilerArgs).toList() } @get:InputFiles diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/internal/KotlinJsOptionsCompat.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/internal/KotlinJsOptionsCompat.kt new file mode 100644 index 00000000000..71f038ed9d9 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/internal/KotlinJsOptionsCompat.kt @@ -0,0 +1,41 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.tasks.internal + +import org.jetbrains.kotlin.gradle.dsl.* +import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile + +/** + * Temporary workaround for external plugins that tries to set up freeCompilerArgs + * in task execution phase. + */ +@Suppress("DEPRECATION") +class KotlinJsOptionsCompat( + private val task: () -> Kotlin2JsCompile, + override val options: CompilerJsOptions +) : KotlinJsOptions { + override var freeCompilerArgs: List + get() = if (isTaskExecuting) { + task().enhancedFreeCompilerArgs.get() + .union(task().additionalFreeCompilerArgs) + .toList() + } else { + options.freeCompilerArgs.get() + } + + set(value) = if (isTaskExecuting) { + task().logger.warn( + "kotlinOptions.freeCompilerArgs were changed on task execution phase: ${value.joinToString()}\n" + + "This behaviour will be deprecated and become an error in future releases!" + ) + task().additionalFreeCompilerArgs = value + } else { + options.freeCompilerArgs.set(value) + } + + private val isTaskExecuting: Boolean + get() = task().state.executing +}