From 4210e13103cc9b6045782784c62cd13484daa98d Mon Sep 17 00:00:00 2001 From: Anton Lakotka Date: Tue, 17 Jan 2023 10:47:03 +0100 Subject: [PATCH] [Gradle] Remove duplication logic from metadata transformation task ^KT-49933 --- .../MetadataDependencyTransformationTask.kt | 88 +++++++++---------- .../KotlinMetadataTargetConfigurator.kt | 2 +- 2 files changed, 43 insertions(+), 47 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MetadataDependencyTransformationTask.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MetadataDependencyTransformationTask.kt index 8acb5cf4866..95b5cff1532 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MetadataDependencyTransformationTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MetadataDependencyTransformationTask.kt @@ -6,12 +6,10 @@ package org.jetbrains.kotlin.gradle.plugin.mpp import org.gradle.api.DefaultTask -import org.gradle.api.file.ConfigurableFileCollection import org.gradle.api.file.FileCollection import org.gradle.api.file.ProjectLayout import org.gradle.api.file.RegularFileProperty import org.gradle.api.model.ObjectFactory -import org.gradle.api.provider.Provider import org.gradle.api.tasks.* import org.gradle.work.NormalizeLineEndings import org.jetbrains.kotlin.gradle.dsl.kotlinExtension @@ -58,10 +56,24 @@ open class MetadataDependencyTransformationTask } } + @Transient // Only needed for configuring task inputs + private val parentTransformationTasksLazy: Lazy>>? = lazy { + dependsOnClosureWithInterCompilationDependencies(kotlinSourceSet).mapNotNull { + project + .tasks + .locateTask(KotlinMetadataTargetConfigurator.transformGranularMetadataTaskName(it.name)) + } + } + private val participatingSourceSets: Set get() = participatingSourceSetsLazy?.value ?: error("`participatingSourceSets` is null. " + "Probably it is accessed it during Task Execution with state loaded from Configuration Cache") + private val parentTransformationTasks: List> get() = + parentTransformationTasksLazy?.value + ?: error("`parentTransformationTasks` is null. " + + "Probably it is accessed it during Task Execution with state loaded from Configuration Cache") + @Suppress("unused") // Gradle input @get:Input internal val inputSourceSetsAndCompilations: Map> by lazy { @@ -90,15 +102,19 @@ open class MetadataDependencyTransformationTask .apply { set(outputsDir.resolve("${kotlinSourceSet.name}.visibleSourceSets")) } @get:InputFiles - val parentVisibleSourceSetFiles: ConfigurableFileCollection = project.filesProvider { - val parentSourceSets: List> = dependsOnClosureWithInterCompilationDependencies(kotlinSourceSet).mapNotNull { - project - .tasks - .locateTask(KotlinMetadataTargetConfigurator.transformGranularMetadataTaskName(it.name)) - ?.flatMap { it.visibleSourceSetsFile.map { it.asFile } } + val parentVisibleSourceSetFiles: FileCollection = project.filesProvider { + parentTransformationTasks.map { taskProvider -> + taskProvider.flatMap { task -> + task.visibleSourceSetsFile.map { it.asFile } + } } + } - parentSourceSets + @get:InputFiles + val parentTransformedLibraries: FileCollection = project.filesProvider { + parentTransformationTasks.map { taskProvider -> + taskProvider.map { task -> task.ownTransformedLibraries } + } } //endregion Task Configuration State & Inputs @@ -117,46 +133,23 @@ open class MetadataDependencyTransformationTask val metadataDependencyResolutions = transformation.metadataDependencyResolutions - metadataDependencyResolutions - .filterIsInstance() - .forEach { chooseVisibleSourceSets -> - objectFactory.transformMetadataLibrariesForBuild(chooseVisibleSourceSets, outputsDir, true) + val transformedLibraries = metadataDependencyResolutions + .flatMap { resolution -> + when (resolution) { + is MetadataDependencyResolution.ChooseVisibleSourceSets -> + objectFactory.transformMetadataLibrariesForBuild(resolution, outputsDir, true) + is MetadataDependencyResolution.KeepOriginalDependency -> + transformationParameters.resolvedMetadataConfiguration.componentArtifacts(resolution.dependency).map { it.file } + is MetadataDependencyResolution.Exclude -> emptyList() + } } - writeTransformedLibraries(metadataDependencyResolutions) + writeTransformedLibraries(transformedLibraries) writeVisibleSourceSets(transformation.visibleSourceSetsByComponentId) } - private fun writeTransformedLibraries(resolutions: Iterable) { - val fileList = resolutions.flatMap { resolution -> - val files: Iterable = when (resolution) { - is MetadataDependencyResolution.ChooseVisibleSourceSets -> when (val metadataProvider = resolution.metadataProvider) { - is MetadataDependencyResolution.ChooseVisibleSourceSets.MetadataProvider.ArtifactMetadataProvider -> metadataProvider.read { content -> - resolution.allVisibleSourceSetNames.mapNotNull { sourceSet -> - val metadataBinary = content.getSourceSet(sourceSet).metadataBinary ?: return@mapNotNull null - val outputBinaryFile = outputsDir.resolve(metadataBinary.relativeFile) - metadataBinary.copyTo(outputBinaryFile) - outputBinaryFile - } - } - is MetadataDependencyResolution.ChooseVisibleSourceSets.MetadataProvider.ProjectMetadataProvider -> { - resolution.allVisibleSourceSetNames.flatMap { sourceSet -> - metadataProvider.getSourceSetCompiledMetadata(sourceSet).files - } - } - } - is MetadataDependencyResolution.Exclude -> emptySet() - is MetadataDependencyResolution.KeepOriginalDependency -> transformationParameters - .resolvedMetadataConfiguration - .componentArtifacts(resolution.dependency) - .map { it.file } - } - - files - } - - val content = fileList.joinToString(System.lineSeparator()) - + private fun writeTransformedLibraries(files: List) { + val content = files.joinToString(System.lineSeparator()) transformedLibrariesFileIndex.get().asFile.writeText(content) } @@ -174,10 +167,13 @@ open class MetadataDependencyTransformationTask id to visibleSourceSetsString.split(",").toSet() } - @get:Internal // Warning! transformedLibraries is available only after Task Execution - val transformedLibraries: FileCollection = project.filesProvider { + @get:Internal // Warning! ownTransformedLibraries is available only after Task Execution + val ownTransformedLibraries: FileCollection = project.filesProvider { transformedLibrariesFileIndex.map { regularFile -> regularFile.asFile.readLines().map { File(it) } } } + + @get:Internal // Warning! allTransformedLibraries is available only after Task Execution + val allTransformedLibraries: FileCollection get() = ownTransformedLibraries + parentTransformedLibraries } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt index 7f63f1f4046..b01646d21fc 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt @@ -359,7 +359,7 @@ class KotlinMetadataTargetConfigurator : compilation.compileDependencyFiles += project.filesProvider { artifacts.filterNot { it.isMpp }.map { it.file } } // Transformed Multiplatform Libraries based on source set visibility - compilation.compileDependencyFiles += project.files(transformationTask.map { it.transformedLibraries }) + compilation.compileDependencyFiles += project.files(transformationTask.map { it.allTransformedLibraries }) if (compilation is KotlinSharedNativeCompilation && sourceSet is DefaultKotlinSourceSet) { compilation.compileDependencyFiles += project.createCInteropMetadataDependencyClasspath(sourceSet)