[Gradle] Extract configuration of KotlinCompileCommon to a class

Migrate KotlinCompileCommon to properties create Configurator class
to configure the task properties.
This commit is contained in:
Ivan Gavrilovic
2021-04-26 17:26:34 +01:00
committed by teamcityserver
parent ff27a61252
commit 5eed9a4e6e
@@ -17,16 +17,14 @@
package org.jetbrains.kotlin.gradle.tasks
import org.gradle.api.Project
import org.gradle.api.tasks.CacheableTask
import org.gradle.api.tasks.InputFiles
import org.gradle.api.tasks.PathSensitive
import org.gradle.api.tasks.PathSensitivity
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.provider.Property
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.*
import org.jetbrains.kotlin.cli.common.arguments.K2MetadataCompilerArguments
import org.jetbrains.kotlin.compilerRunner.GradleCompilerEnvironment
import org.jetbrains.kotlin.compilerRunner.OutputItemsCollectorImpl
import org.jetbrains.kotlin.gradle.dsl.*
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformCommonOptionsImpl
import org.jetbrains.kotlin.gradle.dsl.fillDefaultValues
import org.jetbrains.kotlin.gradle.internal.tasks.allOutputFiles
import org.jetbrains.kotlin.gradle.logging.GradlePrintingMessageCollector
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
@@ -34,24 +32,57 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinCommonCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.AbstractKotlinFragmentMetadataCompilationData
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinCompilationData
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinMetadataCompilationData
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.refinesClosure
import org.jetbrains.kotlin.gradle.utils.getValue
import org.jetbrains.kotlin.gradle.plugin.sources.resolveAllDependsOnSourceSets
import org.jetbrains.kotlin.incremental.ChangedFiles
import java.io.File
@CacheableTask
open class KotlinCompileCommon : AbstractKotlinCompile<K2MetadataCompilerArguments>(), KotlinCommonCompile {
abstract class KotlinCompileCommon : AbstractKotlinCompile<K2MetadataCompilerArguments>(), KotlinCommonCompile {
override val kotlinOptions: KotlinMultiplatformCommonOptions =
taskData.compilation.kotlinOptions as KotlinMultiplatformCommonOptionsImpl
class Configurator(compilation: KotlinCompilationData<*>) : AbstractKotlinCompile.Configurator<KotlinCompileCommon>(compilation) {
override fun configure(task: KotlinCompileCommon) {
super.configure(task)
task.kotlinOptionsProperty.value(compilation.kotlinOptions as KotlinMultiplatformCommonOptionsImpl).disallowChanges()
task.refinesMetadataPaths.from(getRefinesMetadataPaths(task.project)).disallowChanges()
task.expectActualLinker
.value(task.project.provider { (compilation as? KotlinCommonCompilation)?.isKlibCompilation == true || compilation is KotlinMetadataCompilationData })
.disallowChanges()
}
private fun getRefinesMetadataPaths(project: Project): Provider<Iterable<File>> {
return project.provider {
when (compilation) {
is KotlinCompilation<*> -> {
val defaultKotlinSourceSet: KotlinSourceSet = compilation.defaultSourceSet
val metadataTarget = compilation.owner as KotlinTarget
defaultKotlinSourceSet.resolveAllDependsOnSourceSets()
.mapNotNull { sourceSet -> metadataTarget.compilations.findByName(sourceSet.name)?.output?.classesDirs }
.flatten()
}
is AbstractKotlinFragmentMetadataCompilationData -> {
val fragment = compilation.fragment
project.files(
fragment.refinesClosure.minus(fragment).map {
compilation.metadataCompilationRegistry.byFragment(it).output.classesDirs
}
)
}
else -> error("unexpected compilation type")
}
}
}
}
override val kotlinOptionsProperty: Property<KotlinMultiplatformCommonOptions> = objects.property(KotlinMultiplatformCommonOptions::class.java)
override fun createCompilerArgs(): K2MetadataCompilerArguments =
K2MetadataCompilerArguments()
override fun getSourceRoots(): SourceRoots =
SourceRoots.KotlinOnly.create(getSource(), sourceFilesExtensions)
SourceRoots.KotlinOnly.create(getSource(), sourceFilesExtensions.get())
override fun findKotlinCompilerClasspath(project: Project): List<File> =
findKotlinMetadataCompilerClasspath(project)
@@ -60,11 +91,9 @@ open class KotlinCompileCommon : AbstractKotlinCompile<K2MetadataCompilerArgumen
args.apply { fillDefaultValues() }
super.setupCompilerArgs(args, defaultsOnly = defaultsOnly, ignoreClasspathResolutionErrors = ignoreClasspathResolutionErrors)
args.moduleName = this@KotlinCompileCommon.moduleName
args.moduleName = this@KotlinCompileCommon.moduleName.get()
if ((taskData.compilation as? KotlinCommonCompilation)?.isKlibCompilation == true ||
taskData.compilation is KotlinMetadataCompilationData
) {
if (expectActualLinker.get()) {
args.expectActualLinker = true
}
@@ -83,32 +112,12 @@ open class KotlinCompileCommon : AbstractKotlinCompile<K2MetadataCompilerArgumen
(kotlinOptions as KotlinMultiplatformCommonOptionsImpl).updateArguments(args)
}
private fun outputPathsFromMetadataCompilationsOf(sourceSets: Iterable<KotlinSourceSet>): List<File> {
val metadataTarget = taskData.compilation.owner as KotlinTarget
return sourceSets
.mapNotNull { sourceSet -> metadataTarget.compilations.findByName(sourceSet.name)?.output?.classesDirs }
.flatten()
}
@get:PathSensitive(PathSensitivity.RELATIVE)
@get:InputFiles
internal val refinesMetadataPaths by project.provider {
when (val compilation = taskData.compilation) {
is KotlinCompilation<*> -> {
val defaultKotlinSourceSet: KotlinSourceSet = compilation.defaultSourceSet
outputPathsFromMetadataCompilationsOf(defaultKotlinSourceSet.resolveAllDependsOnSourceSets())
}
is AbstractKotlinFragmentMetadataCompilationData -> {
val fragment = compilation.fragment
project.files(
fragment.refinesClosure.minus(fragment).map {
compilation.metadataCompilationRegistry.byFragment(it).output.classesDirs
}
)
}
else -> error("unexpected compilation type")
}
}
internal val refinesMetadataPaths: ConfigurableFileCollection = objects.fileCollection()
@get:Internal
internal val expectActualLinker = objects.property(Boolean::class.java)
override fun callCompilerAsync(args: K2MetadataCompilerArguments, sourceRoots: SourceRoots, changedFiles: ChangedFiles) {
val messageCollector = GradlePrintingMessageCollector(logger, args.allWarningsAsErrors)