From 1d41a1cde71fd6ea43f2e13a1ae807c7121c6fc5 Mon Sep 17 00:00:00 2001 From: Sebastian Sellmair Date: Tue, 6 Sep 2022 14:55:09 +0200 Subject: [PATCH] [Gradle][MPP][Minor] kotlinCompilations.kt: Extract abstract classes into separate files This shall increase readability and maintainablity. KT-52726 --- .../plugin/mpp/AbstractKotlinCompilation.kt | 120 +++++++++++++++++ ...bstractKotlinCompilationToRunnableFiles.kt | 26 ++++ .../gradle/plugin/mpp/kotlinCompilations.kt | 122 ------------------ 3 files changed, 146 insertions(+), 122 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/AbstractKotlinCompilation.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/AbstractKotlinCompilationToRunnableFiles.kt diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/AbstractKotlinCompilation.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/AbstractKotlinCompilation.kt new file mode 100644 index 00000000000..b7220fcaad5 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/AbstractKotlinCompilation.kt @@ -0,0 +1,120 @@ +/* + * 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.plugin.mpp + +import org.gradle.api.Action +import org.gradle.api.GradleException +import org.gradle.api.Project +import org.gradle.api.attributes.AttributeContainer +import org.gradle.api.file.FileCollection +import org.gradle.api.tasks.TaskProvider +import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions +import org.jetbrains.kotlin.gradle.dsl.KotlinCompile +import org.jetbrains.kotlin.gradle.dsl.kotlinExtension +import org.jetbrains.kotlin.gradle.plugin.* +import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinCompilationData +import org.jetbrains.kotlin.gradle.plugin.sources.withDependsOnClosure +import org.jetbrains.kotlin.gradle.tasks.locateTask +import org.jetbrains.kotlin.project.model.LanguageSettings +import java.util.* + +abstract class AbstractKotlinCompilation( + internal open val compilationDetails: CompilationDetails, +) : KotlinCompilation, + HasKotlinDependencies, + KotlinCompilationData { + + //region HasKotlinDependencies delegation: delegate members manually for better control and prevention of accidental overrides + private val kotlinDependenciesHolder get() = compilationDetails.kotlinDependenciesHolder + override val apiConfigurationName: String get() = kotlinDependenciesHolder.apiConfigurationName + override val implementationConfigurationName: String get() = kotlinDependenciesHolder.implementationConfigurationName + override val compileOnlyConfigurationName: String get() = kotlinDependenciesHolder.compileOnlyConfigurationName + override val runtimeOnlyConfigurationName: String get() = kotlinDependenciesHolder.runtimeOnlyConfigurationName + final override fun dependencies(configure: KotlinDependencyHandler.() -> Unit) = kotlinDependenciesHolder.dependencies(configure) + final override fun dependencies(configure: Action) = dependencies { configure.execute(this) } + //endregion + + //region KotlinCompilationData delegation: delegate members manually for better control and prevention of accidental overrides + private val compilationData get() = compilationDetails.compilationData + override val compileAllTaskName: String get() = compilationData.compileAllTaskName + final override val compilationPurpose: String get() = compilationData.compilationPurpose + final override val compilationClassifier: String? get() = compilationData.compilationClassifier + final override val languageSettings: LanguageSettings get() = compilationData.languageSettings + final override val ownModuleName: String get() = compilationData.ownModuleName + final override val moduleName: String get() = compilationData.moduleName + final override val friendPaths: Iterable get() = compilationData.friendPaths + final override val platformType: KotlinPlatformType get() = compilationData.platformType + final override val output: KotlinCompilationOutput get() = compilationData.output + final override val compileKotlinTaskName: String get() = compilationData.compileKotlinTaskName + final override val kotlinOptions: T get() = compilationData.kotlinOptions + final override val kotlinSourceDirectoriesByFragmentName get() = compilationData.kotlinSourceDirectoriesByFragmentName + //endregion + + override val target: KotlinTarget get() = compilationDetails.target + + final override val compileDependencyConfigurationName: String + get() = compilationDetails.compileDependencyFilesHolder.dependencyConfigurationName + + final override var compileDependencyFiles: FileCollection + get() = compilationDetails.compileDependencyFilesHolder.dependencyFiles + set(value) { compilationDetails.compileDependencyFilesHolder.dependencyFiles = value } + + final override val kotlinSourceSets: MutableSet get() = + when (val details = compilationDetails) { + is DefaultCompilationDetails -> details.directlyIncludedKotlinSourceSets // mutable in that subtype + // TODO deprecate mutability of this set. We shouldn't allow mutating it directly anyway; + else -> details.directlyIncludedKotlinSourceSets.toMutableSet() + } + + final override val defaultSourceSetName: String get() = compilationDetails.defaultSourceSetName + + final override val compilationName: String get() = compilationDetails.compilationData.compilationPurpose + + override fun kotlinOptions(configure: T.() -> Unit) = + configure(kotlinOptions) + + @Suppress("UNCHECKED_CAST") + override val compileKotlinTask: KotlinCompile + get() = compileKotlinTaskProvider.get() + + @Suppress("UNCHECKED_CAST") + override val compileKotlinTaskProvider: TaskProvider> + get() = target.project.locateTask(compileKotlinTaskName) ?: throw GradleException("Couldn't locate task $compileKotlinTaskName") + + private val attributeContainer by lazy { HierarchyAttributeContainer(target.attributes) } + + override fun getAttributes(): AttributeContainer = attributeContainer + + override val defaultSourceSet: KotlinSourceSet + get() = target.project.kotlinExtension.sourceSets.getByName(defaultSourceSetName) + + override fun defaultSourceSet(configure: KotlinSourceSet.() -> Unit) = defaultSourceSet.configure() + + override fun source(sourceSet: KotlinSourceSet) { + compilationDetails.source(sourceSet) + } + + override fun toString(): String = "compilation '$name' ($target)" + + override fun associateWith(other: KotlinCompilation<*>) { + compilationDetails.associateWith((other as AbstractKotlinCompilation<*>).compilationDetails) + } + + override val associateWith: List> + get() = Collections.unmodifiableList(compilationDetails.associateCompilations.map { it.compilation }) + + override val project: Project + get() = target.project + + override val owner: KotlinTarget + get() = target + + override val allKotlinSourceSets: Set + get() = compilationDetails.directlyIncludedKotlinSourceSets.withDependsOnClosure + + override val relatedConfigurationNames: List + get() = compilationDetails.kotlinDependenciesHolder.relatedConfigurationNames + compileDependencyConfigurationName +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/AbstractKotlinCompilationToRunnableFiles.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/AbstractKotlinCompilationToRunnableFiles.kt new file mode 100644 index 00000000000..98346138a41 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/AbstractKotlinCompilationToRunnableFiles.kt @@ -0,0 +1,26 @@ +/* + * 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.plugin.mpp + +import org.gradle.api.file.FileCollection +import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions +import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationToRunnableFiles + +abstract class AbstractKotlinCompilationToRunnableFiles( + override val compilationDetails: CompilationDetailsWithRuntime, +) : AbstractKotlinCompilation(compilationDetails), + KotlinCompilationToRunnableFiles { + + final override val runtimeDependencyConfigurationName: String get() = compilationDetails.runtimeDependencyFilesHolder.dependencyConfigurationName + final override var runtimeDependencyFiles: FileCollection + get() = compilationDetails.runtimeDependencyFilesHolder.dependencyFiles + set(value) { + compilationDetails.runtimeDependencyFilesHolder.dependencyFiles = value + } + + override val relatedConfigurationNames: List + get() = super.relatedConfigurationNames + runtimeDependencyConfigurationName +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt index 3bd05e33423..5d868c9de81 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt @@ -5,25 +5,17 @@ package org.jetbrains.kotlin.gradle.plugin.mpp -import org.gradle.api.Action -import org.gradle.api.GradleException import org.gradle.api.Project import org.gradle.api.Task -import org.gradle.api.attributes.AttributeContainer import org.gradle.api.execution.TaskExecutionListener -import org.gradle.api.file.FileCollection import org.gradle.api.plugins.ExtraPropertiesExtension import org.gradle.api.provider.Property -import org.gradle.api.tasks.TaskProvider import org.gradle.api.tasks.TaskState import org.jetbrains.kotlin.gradle.dsl.* import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.* -import org.jetbrains.kotlin.gradle.plugin.sources.withDependsOnClosure import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile -import org.jetbrains.kotlin.gradle.tasks.locateTask import org.jetbrains.kotlin.gradle.utils.* -import org.jetbrains.kotlin.project.model.LanguageSettings import org.jetbrains.kotlin.tooling.core.closure import java.util.* import java.util.concurrent.Callable @@ -42,104 +34,6 @@ internal fun KotlinCompilation<*>.isTest(): Boolean = */ internal val KotlinCompilation<*>.kotlinSourceSetsIncludingDefault: Set get() = kotlinSourceSets + defaultSourceSet -abstract class AbstractKotlinCompilation( - internal open val compilationDetails: CompilationDetails, -) : KotlinCompilation, - HasKotlinDependencies, - KotlinCompilationData { - - //region HasKotlinDependencies delegation: delegate members manually for better control and prevention of accidental overrides - private val kotlinDependenciesHolder get() = compilationDetails.kotlinDependenciesHolder - override val apiConfigurationName: String get() = kotlinDependenciesHolder.apiConfigurationName - override val implementationConfigurationName: String get() = kotlinDependenciesHolder.implementationConfigurationName - override val compileOnlyConfigurationName: String get() = kotlinDependenciesHolder.compileOnlyConfigurationName - override val runtimeOnlyConfigurationName: String get() = kotlinDependenciesHolder.runtimeOnlyConfigurationName - final override fun dependencies(configure: KotlinDependencyHandler.() -> Unit) = kotlinDependenciesHolder.dependencies(configure) - final override fun dependencies(configure: Action) = dependencies { configure.execute(this) } - //endregion - - //region KotlinCompilationData delegation: delegate members manually for better control and prevention of accidental overrides - private val compilationData get() = compilationDetails.compilationData - override val compileAllTaskName: String get() = compilationData.compileAllTaskName - final override val compilationPurpose: String get() = compilationData.compilationPurpose - final override val compilationClassifier: String? get() = compilationData.compilationClassifier - final override val languageSettings: LanguageSettings get() = compilationData.languageSettings - final override val ownModuleName: String get() = compilationData.ownModuleName - final override val moduleName: String get() = compilationData.moduleName - final override val friendPaths: Iterable get() = compilationData.friendPaths - final override val platformType: KotlinPlatformType get() = compilationData.platformType - final override val output: KotlinCompilationOutput get() = compilationData.output - final override val compileKotlinTaskName: String get() = compilationData.compileKotlinTaskName - final override val kotlinOptions: T get() = compilationData.kotlinOptions - final override val kotlinSourceDirectoriesByFragmentName get() = compilationData.kotlinSourceDirectoriesByFragmentName - //endregion - - override val target: KotlinTarget get() = compilationDetails.target - - final override val compileDependencyConfigurationName: String - get() = compilationDetails.compileDependencyFilesHolder.dependencyConfigurationName - - final override var compileDependencyFiles: FileCollection - get() = compilationDetails.compileDependencyFilesHolder.dependencyFiles - set(value) { compilationDetails.compileDependencyFilesHolder.dependencyFiles = value } - - final override val kotlinSourceSets: MutableSet get() = - when (val details = compilationDetails) { - is DefaultCompilationDetails -> details.directlyIncludedKotlinSourceSets // mutable in that subtype - // TODO deprecate mutability of this set. We shouldn't allow mutating it directly anyway; - else -> details.directlyIncludedKotlinSourceSets.toMutableSet() - } - - final override val defaultSourceSetName: String get() = compilationDetails.defaultSourceSetName - - final override val compilationName: String get() = compilationDetails.compilationData.compilationPurpose - - override fun kotlinOptions(configure: T.() -> Unit) = - configure(kotlinOptions) - - @Suppress("UNCHECKED_CAST") - override val compileKotlinTask: KotlinCompile - get() = compileKotlinTaskProvider.get() - - @Suppress("UNCHECKED_CAST") - override val compileKotlinTaskProvider: TaskProvider> - get() = target.project.locateTask(compileKotlinTaskName) ?: throw GradleException("Couldn't locate task $compileKotlinTaskName") - - private val attributeContainer by lazy { HierarchyAttributeContainer(target.attributes) } - - override fun getAttributes(): AttributeContainer = attributeContainer - - override val defaultSourceSet: KotlinSourceSet - get() = target.project.kotlinExtension.sourceSets.getByName(defaultSourceSetName) - - override fun defaultSourceSet(configure: KotlinSourceSet.() -> Unit) = defaultSourceSet.configure() - - override fun source(sourceSet: KotlinSourceSet) { - compilationDetails.source(sourceSet) - } - - override fun toString(): String = "compilation '$name' ($target)" - - override fun associateWith(other: KotlinCompilation<*>) { - compilationDetails.associateWith((other as AbstractKotlinCompilation<*>).compilationDetails) - } - - override val associateWith: List> - get() = Collections.unmodifiableList(compilationDetails.associateCompilations.map { it.compilation }) - - override val project: Project - get() = target.project - - override val owner: KotlinTarget - get() = target - - override val allKotlinSourceSets: Set - get() = compilationDetails.directlyIncludedKotlinSourceSets.withDependsOnClosure - - override val relatedConfigurationNames: List - get() = compilationDetails.kotlinDependenciesHolder.relatedConfigurationNames + compileDependencyConfigurationName -} - internal fun addCommonSourcesToKotlinCompileTask( project: Project, taskName: String, @@ -184,22 +78,6 @@ internal fun addSourcesToKotlinCompileTask( internal val KotlinCompilation<*>.associateWithClosure: Iterable> get() = this.closure { it.associateWith } -abstract class AbstractKotlinCompilationToRunnableFiles( - override val compilationDetails: CompilationDetailsWithRuntime, -) : AbstractKotlinCompilation(compilationDetails), - KotlinCompilationToRunnableFiles { - - final override val runtimeDependencyConfigurationName: String get() = compilationDetails.runtimeDependencyFilesHolder.dependencyConfigurationName - final override var runtimeDependencyFiles: FileCollection - get() = compilationDetails.runtimeDependencyFilesHolder.dependencyFiles - set(value) { - compilationDetails.runtimeDependencyFilesHolder.dependencyFiles = value - } - - override val relatedConfigurationNames: List - get() = super.relatedConfigurationNames + runtimeDependencyConfigurationName -} - internal fun KotlinCompilation<*>.disambiguateName(simpleName: String): String { return lowerCamelCaseName( target.disambiguationClassifier,