From 75d771fc39e43c941f515d7c7f6ee62a006f55a7 Mon Sep 17 00:00:00 2001 From: Sebastian Sellmair Date: Thu, 4 May 2023 17:47:32 +0200 Subject: [PATCH] [Gradle][K2] Respect compile task's sourceFileFilter when building -Xfragment-sources ^KT-58466 Verification Pending --- .../tasks/KotlinNativeCompilerArgBuilder.kt | 2 +- .../targets/native/tasks/KotlinNativeTasks.kt | 2 +- .../gradle/tasks/AbstractKotlinCompileTool.kt | 33 ++++++++++--------- .../gradle/tasks/K2MultiplatformStructure.kt | 33 +++++-------------- .../kotlin/gradle/tasks/Kotlin2JsCompile.kt | 2 +- .../kotlin/gradle/tasks/KotlinCompile.kt | 2 +- .../unitTests/K2MultiplatformStructureTest.kt | 10 ++++-- 7 files changed, 36 insertions(+), 48 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeCompilerArgBuilder.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeCompilerArgBuilder.kt index a5842c5690b..33021b21154 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeCompilerArgBuilder.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeCompilerArgBuilder.kt @@ -87,7 +87,7 @@ internal fun buildKotlinNativeKlibCompilerArgs( */ if (sharedCompilationData == null) { add("-Xfragments=${k2MultiplatformCompilationData.fragmentsCompilerArgs.joinToString(",")}") - add("-Xfragment-sources=${k2MultiplatformCompilationData.fragmentSourcesCompilerArgs.joinToString(",")}") + add("-Xfragment-sources=${k2MultiplatformCompilationData.fragmentSourcesCompilerArgs().joinToString(",")}") add("-Xfragment-refines=${k2MultiplatformCompilationData.fragmentRefinesCompilerArgs.joinToString(",")}") } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt index 4d82c68af0a..1e21999c5b7 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt @@ -476,7 +476,7 @@ internal constructor( sources { args -> /* Shared native compilations in K2 still use -Xcommon-sources and klib dependencies */ if (compilerOptions.usesK2.get() && sharedCompilationData == null) { - args.fragmentSources = multiplatformStructure.fragmentSourcesCompilerArgs + args.fragmentSources = multiplatformStructure.fragmentSourcesCompilerArgs(sourceFileFilter) } else { args.commonSources = commonSourcesTree.files.takeIf { it.isNotEmpty() }?.toPathsArray() } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/AbstractKotlinCompileTool.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/AbstractKotlinCompileTool.kt index 467fa22dcc0..2f15c936fac 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/AbstractKotlinCompileTool.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/AbstractKotlinCompileTool.kt @@ -29,17 +29,18 @@ import org.jetbrains.kotlin.gradle.utils.property import javax.inject.Inject abstract class AbstractKotlinCompileTool @Inject constructor( - objectFactory: ObjectFactory + objectFactory: ObjectFactory, ) : DefaultTask(), KotlinCompileTool, KotlinCompilerArgumentsProducer, CompilerArgumentAware, TaskWithLocalState { - private val patternFilterable = PatternSet() + @Internal + protected val sourceFileFilter = PatternSet() init { - patternFilterable.include( + sourceFileFilter.include( DEFAULT_KOTLIN_SOURCE_FILES_EXTENSIONS.flatMap { ext -> ext.fileExtensionCasePermutations().map { "**/*.$it" } } ) } @@ -48,7 +49,7 @@ abstract class AbstractKotlinCompileTool @Inject constr override val sources: FileCollection = objectFactory.fileCollection() .from( - { sourceFiles.asFileTree.matching(patternFilterable) } + { sourceFiles.asFileTree.matching(sourceFileFilter) } ) override fun source(vararg sources: Any) { @@ -64,49 +65,49 @@ abstract class AbstractKotlinCompileTool @Inject constr } @Internal - final override fun getIncludes(): MutableSet = patternFilterable.includes + final override fun getIncludes(): MutableSet = sourceFileFilter.includes @Internal - final override fun getExcludes(): MutableSet = patternFilterable.excludes + final override fun getExcludes(): MutableSet = sourceFileFilter.excludes final override fun setIncludes(includes: Iterable): PatternFilterable = also { - patternFilterable.setIncludes(includes) + sourceFileFilter.setIncludes(includes) } final override fun setExcludes(excludes: Iterable): PatternFilterable = also { - patternFilterable.setExcludes(excludes) + sourceFileFilter.setExcludes(excludes) } final override fun include(vararg includes: String?): PatternFilterable = also { - patternFilterable.include(*includes) + sourceFileFilter.include(*includes) } final override fun include(includes: Iterable): PatternFilterable = also { - patternFilterable.include(includes) + sourceFileFilter.include(includes) } final override fun include(includeSpec: Spec): PatternFilterable = also { - patternFilterable.include(includeSpec) + sourceFileFilter.include(includeSpec) } final override fun include(includeSpec: Closure<*>): PatternFilterable = also { - patternFilterable.include(includeSpec) + sourceFileFilter.include(includeSpec) } final override fun exclude(vararg excludes: String?): PatternFilterable = also { - patternFilterable.exclude(*excludes) + sourceFileFilter.exclude(*excludes) } final override fun exclude(excludes: Iterable): PatternFilterable = also { - patternFilterable.exclude(excludes) + sourceFileFilter.exclude(excludes) } final override fun exclude(excludeSpec: Spec): PatternFilterable = also { - patternFilterable.exclude(excludeSpec) + sourceFileFilter.exclude(excludeSpec) } final override fun exclude(excludeSpec: Closure<*>): PatternFilterable = also { - patternFilterable.exclude(excludeSpec) + sourceFileFilter.exclude(excludeSpec) } @get:Internal diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/K2MultiplatformStructure.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/K2MultiplatformStructure.kt index b76a4587c71..3f1894087ba 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/K2MultiplatformStructure.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/K2MultiplatformStructure.kt @@ -9,12 +9,10 @@ import org.gradle.api.file.FileCollection import org.gradle.api.provider.ListProperty import org.gradle.api.provider.SetProperty import org.gradle.api.tasks.* +import org.gradle.api.tasks.util.PatternFilterable import org.gradle.work.Incremental import org.gradle.work.NormalizeLineEndings -import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments import org.jetbrains.kotlin.gradle.InternalKotlinGradlePluginApi -import org.jetbrains.kotlin.gradle.dsl.KotlinCommonCompilerOptions -import org.jetbrains.kotlin.gradle.dsl.usesK2 @InternalKotlinGradlePluginApi abstract class K2MultiplatformStructure { @@ -24,7 +22,7 @@ abstract class K2MultiplatformStructure { @Input val fromFragmentName: String, @Input - val toFragmentName: String + val toFragmentName: String, ) @InternalKotlinGradlePluginApi @@ -37,7 +35,7 @@ abstract class K2MultiplatformStructure { @get:Incremental @get:NormalizeLineEndings @get:PathSensitive(PathSensitivity.RELATIVE) - val sources: FileCollection + val sources: FileCollection, ) @get:Nested @@ -50,9 +48,11 @@ abstract class K2MultiplatformStructure { internal val K2MultiplatformStructure.fragmentsCompilerArgs: Array get() = fragments.get().map { it.fragmentName }.toSet().toTypedArray() -internal val K2MultiplatformStructure.fragmentSourcesCompilerArgs: Array - get() = fragments.get().flatMap { sourceSet -> - sourceSet.sources.files.map { sourceFile -> "${sourceSet.fragmentName}:${sourceFile.absolutePath}" } +internal fun K2MultiplatformStructure.fragmentSourcesCompilerArgs(sourceFileFilter: PatternFilterable? = null): Array = + fragments.get().flatMap { sourceSet -> + sourceSet.sources + .run { if (sourceFileFilter != null) asFileTree.matching(sourceFileFilter) else this } + .files.map { sourceFile -> "${sourceSet.fragmentName}:${sourceFile.absolutePath}" } }.toTypedArray() internal val K2MultiplatformStructure.fragmentRefinesCompilerArgs: Array @@ -60,20 +60,3 @@ internal val K2MultiplatformStructure.fragmentRefinesCompilerArgs: Array "${edge.fromFragmentName}:${edge.toFragmentName}" }.toTypedArray() -internal fun CommonCompilerArguments.configureK2Multiplatform(multiplatformStructure: K2MultiplatformStructure) { - fragments = multiplatformStructure.fragmentsCompilerArgs - fragmentSources = multiplatformStructure.fragmentSourcesCompilerArgs - fragmentRefines = multiplatformStructure.fragmentRefinesCompilerArgs -} - -internal fun CommonCompilerArguments.configureMultiplatform( - options: KotlinCommonCompilerOptions, - k1CommonSources: FileCollection, - k2MultiplatformFragments: K2MultiplatformStructure -) { - if (options.usesK2.get()) { - configureK2Multiplatform(k2MultiplatformFragments) - } else { - commonSources = k1CommonSources.map { it.absolutePath }.toTypedArray() - } -} diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/Kotlin2JsCompile.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/Kotlin2JsCompile.kt index f4ddfcee9c0..52fd31aad00 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/Kotlin2JsCompile.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/Kotlin2JsCompile.kt @@ -197,7 +197,7 @@ abstract class Kotlin2JsCompile @Inject constructor( } if (compilerOptions.usesK2.get()) { - args.fragmentSources = multiplatformStructure.fragmentSourcesCompilerArgs + args.fragmentSources = multiplatformStructure.fragmentSourcesCompilerArgs(sourceFileFilter) } else { args.commonSources = commonSourceSet.asFileTree.toPathsArray() } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinCompile.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinCompile.kt index ff807c6c3de..560284839b7 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinCompile.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinCompile.kt @@ -267,7 +267,7 @@ abstract class KotlinCompile @Inject constructor( sources { args -> if (compilerOptions.usesK2.get()) { - args.fragmentSources = multiplatformStructure.fragmentSourcesCompilerArgs + args.fragmentSources = multiplatformStructure.fragmentSourcesCompilerArgs(sourceFileFilter) } else { args.commonSources = commonSourceSet.asFileTree.toPathsArray() } diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/K2MultiplatformStructureTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/K2MultiplatformStructureTest.kt index 90f25a94b28..c4b800725d9 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/K2MultiplatformStructureTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/K2MultiplatformStructureTest.kt @@ -18,11 +18,9 @@ import org.jetbrains.kotlin.gradle.internal.CompilerArgumentAware import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer.CreateCompilerArgumentsContext.Companion.lenient import org.jetbrains.kotlin.gradle.plugin.KotlinJsCompilerType.IR -import org.jetbrains.kotlin.gradle.tasks.K2MultiplatformCompilationTask -import org.jetbrains.kotlin.gradle.tasks.K2MultiplatformStructure +import org.jetbrains.kotlin.gradle.tasks.* import org.jetbrains.kotlin.gradle.tasks.K2MultiplatformStructure.Fragment import org.jetbrains.kotlin.gradle.tasks.K2MultiplatformStructure.RefinesEdge -import org.jetbrains.kotlin.gradle.tasks.configureK2Multiplatform import org.jetbrains.kotlin.gradle.util.applyMultiplatformPlugin import org.jetbrains.kotlin.gradle.util.buildProject import org.jetbrains.kotlin.gradle.util.enableDefaultStdlibDependency @@ -159,3 +157,9 @@ private fun K2MultiplatformCompilationTask.buildCompilerArguments(): CommonCompi this as CompilerArgumentAware return this.createCompilerArguments(lenient) } + +internal fun CommonCompilerArguments.configureK2Multiplatform(multiplatformStructure: K2MultiplatformStructure) { + fragments = multiplatformStructure.fragmentsCompilerArgs + fragmentSources = multiplatformStructure.fragmentSourcesCompilerArgs() + fragmentRefines = multiplatformStructure.fragmentRefinesCompilerArgs +}