[Gradle][MPP][Minor] kotlinCompilations.kt: Extract abstract classes into separate files

This shall increase readability and maintainablity.

KT-52726
This commit is contained in:
Sebastian Sellmair
2022-09-06 14:55:09 +02:00
committed by Space
parent 1c52f7c13b
commit 1d41a1cde7
3 changed files with 146 additions and 122 deletions
@@ -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<T : KotlinCommonOptions>(
internal open val compilationDetails: CompilationDetails<T>,
) : KotlinCompilation<T>,
HasKotlinDependencies,
KotlinCompilationData<T> {
//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<KotlinDependencyHandler>) = 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<FileCollection> 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<KotlinSourceSet> 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<T>
get() = compileKotlinTaskProvider.get()
@Suppress("UNCHECKED_CAST")
override val compileKotlinTaskProvider: TaskProvider<out KotlinCompile<T>>
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<KotlinCompilation<*>>
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<KotlinSourceSet>
get() = compilationDetails.directlyIncludedKotlinSourceSets.withDependsOnClosure
override val relatedConfigurationNames: List<String>
get() = compilationDetails.kotlinDependenciesHolder.relatedConfigurationNames + compileDependencyConfigurationName
}
@@ -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<T : KotlinCommonOptions>(
override val compilationDetails: CompilationDetailsWithRuntime<T>,
) : AbstractKotlinCompilation<T>(compilationDetails),
KotlinCompilationToRunnableFiles<T> {
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<String>
get() = super<AbstractKotlinCompilation>.relatedConfigurationNames + runtimeDependencyConfigurationName
}
@@ -5,25 +5,17 @@
package org.jetbrains.kotlin.gradle.plugin.mpp 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.Project
import org.gradle.api.Task import org.gradle.api.Task
import org.gradle.api.attributes.AttributeContainer
import org.gradle.api.execution.TaskExecutionListener import org.gradle.api.execution.TaskExecutionListener
import org.gradle.api.file.FileCollection
import org.gradle.api.plugins.ExtraPropertiesExtension import org.gradle.api.plugins.ExtraPropertiesExtension
import org.gradle.api.provider.Property import org.gradle.api.provider.Property
import org.gradle.api.tasks.TaskProvider
import org.gradle.api.tasks.TaskState import org.gradle.api.tasks.TaskState
import org.jetbrains.kotlin.gradle.dsl.* import org.jetbrains.kotlin.gradle.dsl.*
import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.* 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.AbstractKotlinCompile
import org.jetbrains.kotlin.gradle.tasks.locateTask
import org.jetbrains.kotlin.gradle.utils.* import org.jetbrains.kotlin.gradle.utils.*
import org.jetbrains.kotlin.project.model.LanguageSettings
import org.jetbrains.kotlin.tooling.core.closure import org.jetbrains.kotlin.tooling.core.closure
import java.util.* import java.util.*
import java.util.concurrent.Callable import java.util.concurrent.Callable
@@ -42,104 +34,6 @@ internal fun KotlinCompilation<*>.isTest(): Boolean =
*/ */
internal val KotlinCompilation<*>.kotlinSourceSetsIncludingDefault: Set<KotlinSourceSet> get() = kotlinSourceSets + defaultSourceSet internal val KotlinCompilation<*>.kotlinSourceSetsIncludingDefault: Set<KotlinSourceSet> get() = kotlinSourceSets + defaultSourceSet
abstract class AbstractKotlinCompilation<T : KotlinCommonOptions>(
internal open val compilationDetails: CompilationDetails<T>,
) : KotlinCompilation<T>,
HasKotlinDependencies,
KotlinCompilationData<T> {
//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<KotlinDependencyHandler>) = 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<FileCollection> 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<KotlinSourceSet> 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<T>
get() = compileKotlinTaskProvider.get()
@Suppress("UNCHECKED_CAST")
override val compileKotlinTaskProvider: TaskProvider<out KotlinCompile<T>>
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<KotlinCompilation<*>>
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<KotlinSourceSet>
get() = compilationDetails.directlyIncludedKotlinSourceSets.withDependsOnClosure
override val relatedConfigurationNames: List<String>
get() = compilationDetails.kotlinDependenciesHolder.relatedConfigurationNames + compileDependencyConfigurationName
}
internal fun addCommonSourcesToKotlinCompileTask( internal fun addCommonSourcesToKotlinCompileTask(
project: Project, project: Project,
taskName: String, taskName: String,
@@ -184,22 +78,6 @@ internal fun addSourcesToKotlinCompileTask(
internal val KotlinCompilation<*>.associateWithClosure: Iterable<KotlinCompilation<*>> internal val KotlinCompilation<*>.associateWithClosure: Iterable<KotlinCompilation<*>>
get() = this.closure { it.associateWith } get() = this.closure { it.associateWith }
abstract class AbstractKotlinCompilationToRunnableFiles<T : KotlinCommonOptions>(
override val compilationDetails: CompilationDetailsWithRuntime<T>,
) : AbstractKotlinCompilation<T>(compilationDetails),
KotlinCompilationToRunnableFiles<T> {
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<String>
get() = super<AbstractKotlinCompilation>.relatedConfigurationNames + runtimeDependencyConfigurationName
}
internal fun KotlinCompilation<*>.disambiguateName(simpleName: String): String { internal fun KotlinCompilation<*>.disambiguateName(simpleName: String): String {
return lowerCamelCaseName( return lowerCamelCaseName(
target.disambiguationClassifier, target.disambiguationClassifier,