From 6f96c225d7ce65af3140094904795f3bbe5197ba Mon Sep 17 00:00:00 2001 From: Alexander Likhachev Date: Tue, 6 Apr 2021 18:45:13 +0300 Subject: [PATCH] [Gradle, K/N] Prefer injection over lateinit vars for task configuration #KT-45801 Fixed --- .../native-binaries/groovy-dsl/build.gradle | 5 + .../kotlin-dsl/build.gradle.kts | 5 + .../targets/native/KotlinNativeCompilation.kt | 1 - .../native/KotlinNativeTargetConfigurator.kt | 6 +- .../tasks/KotlinNativePerformanceTask.kt | 6 +- .../targets/native/tasks/KotlinNativeTasks.kt | 104 +++++++++--------- 6 files changed, 65 insertions(+), 62 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-binaries/groovy-dsl/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-binaries/groovy-dsl/build.gradle index 30daaefa84a..8bcaa903317 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-binaries/groovy-dsl/build.gradle +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-binaries/groovy-dsl/build.gradle @@ -15,6 +15,11 @@ repositories { mavenCentral() } +// KT-45801 +tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinNativeCompile).configureEach { + kotlinOptions +} + kotlin { sourceSets { commonMain { diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-binaries/kotlin-dsl/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-binaries/kotlin-dsl/build.gradle.kts index 3a5b254d166..51da0be47a8 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-binaries/kotlin-dsl/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-binaries/kotlin-dsl/build.gradle.kts @@ -7,6 +7,11 @@ repositories { mavenCentral() } +// KT-45801 +tasks.withType().configureEach { + kotlinOptions +} + kotlin { sourceSets["commonMain"].apply { dependencies { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt index 06bcc36f6e1..5c2d2751c4c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt @@ -56,7 +56,6 @@ abstract class AbstractKotlinNativeCompilation( override val compileKotlinTask: KotlinNativeCompile get() = super.compileKotlinTask as KotlinNativeCompile - // A collection containing all source sets used by this compilation @Suppress("UNCHECKED_CAST") override val compileKotlinTaskProvider: TaskProvider get() = super.compileKotlinTaskProvider as TaskProvider diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt index d45b3c633ab..bfd8cb430e6 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt @@ -130,10 +130,9 @@ open class KotlinNativeTargetConfigurator( // region Task creation. private fun Project.createLinkTask(binary: NativeBinary) { val result = registerTask( - binary.linkTaskName + binary.linkTaskName, listOf(binary) ) { val target = binary.target - it.binary = binary it.group = BasePlugin.BUILD_GROUP it.description = "Links ${binary.outputKind.description} '${binary.name}' for a target '${target.name}'." it.enabled = binary.konanTarget.enabledOnCurrentHost @@ -261,9 +260,8 @@ open class KotlinNativeTargetConfigurator( internal fun Project.createKlibCompilationTask(compilation: AbstractKotlinNativeCompilation): TaskProvider { val compileTaskProvider = registerTask( - compilation.compileKotlinTaskName + compilation.compileKotlinTaskName, listOf(compilation) ) { - it.compilation.set(compilation) it.group = BasePlugin.BUILD_GROUP it.description = "Compiles a klibrary from the '${compilation.name}' " + "compilation for target '${compilation.platformType.name}'." diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativePerformanceTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativePerformanceTask.kt index b9be837494d..866e9941151 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativePerformanceTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativePerformanceTask.kt @@ -70,15 +70,15 @@ open class NativePerformanceReport : DefaultTask() { } private fun getPerformanceCompilerOptions() = - (compilerFlagsFromBinary() + binary.linkTask.compilation.get().kotlinOptions.freeCompilerArgs) + (compilerFlagsFromBinary() + binary.linkTask.compilation.kotlinOptions.freeCompilerArgs) .filter { it in listOf("-g", "-opt", "-Xg0") }.map { "\"$it\"" } @TaskAction fun generate() { val compileTasks = if (settings.includeAssociatedTasks) - getAllExecutedTasks(binary.linkTask.compilation.get()) + getAllExecutedTasks(binary.linkTask.compilation) else - listOf(binary.linkTask.compilation.get().compileKotlinTask) + listOf(binary.linkTask.compilation.compileKotlinTask) val allExecutedTasks = listOf(binary.linkTask) + compileTasks val upToDateTasks = allExecutedTasks.filter { it.state.upToDate }.map { it.name } if (upToDateTasks.isNotEmpty()) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt index c428dedaaf5..6bcd436426e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt @@ -14,7 +14,6 @@ import org.gradle.api.file.ConfigurableFileCollection import org.gradle.api.file.FileCollection import org.gradle.api.file.FileTree import org.gradle.api.logging.Logger -import org.gradle.api.provider.Property import org.gradle.api.provider.Provider import org.gradle.api.tasks.* import org.gradle.api.tasks.compile.AbstractCompile @@ -31,7 +30,6 @@ import org.jetbrains.kotlin.gradle.plugin.sources.DefaultLanguageSettingsBuilder import org.jetbrains.kotlin.gradle.targets.native.internal.isAllowCommonizer import org.jetbrains.kotlin.gradle.utils.getValue import org.jetbrains.kotlin.gradle.utils.klibModuleName -import org.jetbrains.kotlin.gradle.utils.newProperty import org.jetbrains.kotlin.gradle.utils.listFilesOrEmpty import org.jetbrains.kotlin.konan.library.KLIB_INTEROP_IR_PROVIDER_IDENTIFIER import org.jetbrains.kotlin.konan.properties.resolvablePropertyList @@ -117,12 +115,7 @@ private fun Collection.filterKlibsPassedToCompiler(project: Project) = fil // endregion abstract class AbstractKotlinNativeCompile : AbstractCompile() { @get:Internal - abstract val compilation: Provider - - @get:Internal - internal val compilationIsShared by lazy { - compilation.get() is KotlinSharedNativeCompilation - } + abstract val compilation: K // region inputs/outputs @get:Input @@ -138,11 +131,15 @@ abstract class AbstractKotlinNativeCompile> @get:Internal - val languageSettings: LanguageSettingsBuilder by lazy { - compilation.get().defaultSourceSet.languageSettings + val languageSettings: LanguageSettingsBuilder by project.provider { + compilation.defaultSourceSet.languageSettings } @get:Input @@ -190,7 +187,7 @@ abstract class AbstractKotlinNativeCompile get() = buildCommonArgs(true) - @get:Internal - internal val languageSettingsBuilder by lazy { - compilation.get().defaultSourceSet.languageSettings + private val languageSettingsBuilder by project.provider { + compilation.defaultSourceSet.languageSettings } // Args used by both the compiler and IDEA. @@ -299,7 +295,7 @@ abstract class AbstractKotlinNativeCompile(), - KotlinCompile { +open class KotlinNativeCompile +@Inject +constructor( @Internal - @Transient // can't be serialized for Gradle configuration avoidance - final override val compilation: Property = - project.newProperty() + @Transient // can't be serialized for Gradle configuration cache + final override val compilation: AbstractKotlinNativeCompilation +) : AbstractKotlinNativeCompile(), + KotlinCompile { @get:Input override val outputKind = LIBRARY @@ -359,8 +357,7 @@ open class KotlinNativeCompile : AbstractKotlinNativeCompile + private val friendModule: FileCollection by project.provider { project.files( - compilationInstance.associateWithTransitiveClosure.map { it.output.allOutputs }, - compilationInstance.friendArtifacts + compilation.associateWithTransitiveClosure.map { it.output.allOutputs }, + compilation.friendArtifacts ) } // endregion. @@ -415,8 +412,8 @@ open class KotlinNativeCompile : AbstractKotlinNativeCompile() { - +open class KotlinNativeLink +@Inject +constructor( + @Internal + val binary: NativeBinary +) : AbstractKotlinNativeCompile() { @get:Internal - @Transient // can't be serialized for Gradle configuration avoidance - final override val compilation: Property = project.newProperty() { binary.compilation } + final override val compilation: KotlinNativeCompilation + get() = binary.compilation init { - dependsOn(project.provider { compilation.get().compileKotlinTask }) + dependsOn(project.provider { compilation.compileKotlinTaskProvider }) // Frameworks actively uses symlinks. // Gradle build cache transforms symlinks into regular files https://guides.gradle.org/using-build-cache/#symbolic_links outputs.cacheIf { outputKind != FRAMEWORK } } - @Internal - lateinit var binary: NativeBinary - @Internal // Taken into account by getSources(). - val intermediateLibrary: Provider = compilation.map { compilationInstance -> - compilationInstance.compileKotlinTask.outputFile.get() - } + val intermediateLibrary: Provider = project.provider { compilation.compileKotlinTask.outputFile.get() } @InputFiles @SkipWhenEmpty override fun getSource(): FileTree = - objects.fileCollection().from(intermediateLibrary.get()).asFileTree + objects.fileCollection().from(intermediateLibrary).asFileTree @OutputDirectory override fun getDestinationDir(): File { @@ -522,7 +518,7 @@ open class KotlinNativeLink : AbstractKotlinNativeCompile> = compilation.map { compilationInstance -> - kotlinOptions.freeCompilerArgs + compilationInstance.kotlinOptions.freeCompilerArgs + override val additionalCompilerOptions: Provider> = project.provider { + kotlinOptions.freeCompilerArgs + compilation.kotlinOptions.freeCompilerArgs } override val kotlinOptions: KotlinCommonToolOptions = NativeLinkOptions() @@ -563,7 +559,7 @@ open class KotlinNativeLink : AbstractKotlinNativeCompile = - project.provider { destinationDir.get().resolve(outputFileName) } + val outputFileProvider: Provider = project.provider { destinationDir.get().resolve(outputFileName) } @get:InputFile @get:PathSensitive(PathSensitivity.RELATIVE)