[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
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<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(
project: Project,
taskName: String,
@@ -184,22 +78,6 @@ internal fun addSourcesToKotlinCompileTask(
internal val KotlinCompilation<*>.associateWithClosure: Iterable<KotlinCompilation<*>>
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 {
return lowerCamelCaseName(
target.disambiguationClassifier,