diff --git a/libraries/tools/kotlin-gradle-plugin/api/kotlin-gradle-plugin.api b/libraries/tools/kotlin-gradle-plugin/api/kotlin-gradle-plugin.api index a7a07d963de..bfa58ed241a 100644 --- a/libraries/tools/kotlin-gradle-plugin/api/kotlin-gradle-plugin.api +++ b/libraries/tools/kotlin-gradle-plugin/api/kotlin-gradle-plugin.api @@ -747,9 +747,14 @@ public abstract interface class org/jetbrains/kotlin/gradle/plugin/mpp/external/ } public abstract interface class org/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotlinCompilationDescriptor$CompilationAssociator { + public static final field Companion Lorg/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotlinCompilationDescriptor$CompilationAssociator$Companion; public abstract fun associate (Lorg/jetbrains/kotlin/gradle/plugin/mpp/external/DecoratedExternalKotlinCompilation;Lorg/jetbrains/kotlin/gradle/plugin/mpp/external/DecoratedExternalKotlinCompilation;)V } +public final class org/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotlinCompilationDescriptor$CompilationAssociator$Companion { + public final fun getDefault ()Lorg/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotlinCompilationDescriptor$CompilationAssociator; +} + public abstract interface class org/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotlinCompilationDescriptor$CompilationFactory { public abstract fun create (Lorg/jetbrains/kotlin/gradle/plugin/mpp/external/DecoratedExternalKotlinCompilation$Delegate;)Lorg/jetbrains/kotlin/gradle/plugin/mpp/DecoratedKotlinCompilation; } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotlinCompilationDescriptor.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotlinCompilationDescriptor.kt index a0dbfd607b0..50dec688901 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotlinCompilationDescriptor.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotlinCompilationDescriptor.kt @@ -12,7 +12,9 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.KotlinTarget import org.jetbrains.kotlin.gradle.plugin.hierarchy.KotlinSourceSetTreeClassifier import org.jetbrains.kotlin.gradle.plugin.mpp.DecoratedKotlinCompilation +import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.DefaultKotlinCompilationAssociator import org.jetbrains.kotlin.gradle.plugin.mpp.external.ExternalKotlinCompilationDescriptor.* +import org.jetbrains.kotlin.gradle.plugin.mpp.internal import org.jetbrains.kotlin.gradle.plugin.mpp.targetHierarchy.SourceSetTreeClassifier import kotlin.properties.Delegates @@ -45,8 +47,15 @@ interface ExternalKotlinCompilationDescriptor { + fun interface CompilationAssociator { fun associate(auxiliary: T, main: DecoratedExternalKotlinCompilation) + + @ExternalKotlinTargetApi + companion object { + val default = CompilationAssociator { aux, main -> + DefaultKotlinCompilationAssociator.associate(aux.target, aux.compilation.internal, main.compilation.internal) + } + } } val compilationName: String @@ -55,7 +64,7 @@ interface ExternalKotlinCompilationDescriptor val friendArtifactResolver: FriendArtifactResolver? - val compilationAssociator: CompilationAssociator? + val compilationAssociator: CompilationAssociator @Suppress("DEPRECATION") @Deprecated("Use .sourceSetTreeClassifierV2 instead") @@ -93,7 +102,7 @@ class ExternalKotlinCompilationDescriptorBuilder by Delegates.notNull() var friendArtifactResolver: FriendArtifactResolver? = null - var compilationAssociator: CompilationAssociator? = null + var compilationAssociator: CompilationAssociator = CompilationAssociator.default @Suppress("DEPRECATION") @Deprecated("Use sourceSetTreeClassifierV2 instead") @@ -117,7 +126,7 @@ private data class ExternalKotlinCompilationDescriptorImpl, override val friendArtifactResolver: FriendArtifactResolver?, - override val compilationAssociator: CompilationAssociator?, + override val compilationAssociator: CompilationAssociator, @Deprecated("Use .sourceSetTreeClassifierV2 instead") @Suppress("DEPRECATION") override val sourceSetTreeClassifier: SourceSetTreeClassifier, diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/external/createExternalKotlinCompilation.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/external/createExternalKotlinCompilation.kt index af1771381c3..058ad88d970 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/external/createExternalKotlinCompilation.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/external/createExternalKotlinCompilation.kt @@ -9,7 +9,6 @@ import org.jetbrains.kotlin.gradle.ExternalKotlinTargetApi import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.hierarchy.SourceSetTreeClassifierWrapper import org.jetbrains.kotlin.gradle.plugin.hierarchy.sourceSetTreeClassifier -import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.DefaultKotlinCompilationAssociator import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.DefaultKotlinCompilationFriendPathsResolver import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinCompilationAssociator import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinCompilationSourceSetsContainer @@ -50,12 +49,12 @@ fun DecoratedExternalKotlinTarget.creat compileAllTaskName = descriptor.compileAllTaskName ?: default.compileAllTaskName ) }, - compilationAssociator = descriptor.compilationAssociator?.let { declaredAssociator -> - @Suppress("unchecked_cast") - KotlinCompilationAssociator { _, first, second -> - declaredAssociator.associate(first.decoratedInstance as T, second.decoratedInstance as DecoratedExternalKotlinCompilation) - } - } ?: DefaultKotlinCompilationAssociator, + compilationAssociator = @Suppress("unchecked_cast") KotlinCompilationAssociator { _, first, second -> + descriptor.compilationAssociator.associate( + first.decoratedInstance as T, + second.decoratedInstance as DecoratedExternalKotlinCompilation + ) + }, compilationFriendPathsResolver = DefaultKotlinCompilationFriendPathsResolver( DefaultKotlinCompilationFriendPathsResolver.FriendArtifactResolver.composite( DefaultKotlinCompilationFriendPathsResolver.DefaultFriendArtifactResolver, diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/ExternalKotlinTargetApiTests.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/ExternalKotlinTargetApiTests.kt index 76ca1902d81..28feeeb2f2b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/ExternalKotlinTargetApiTests.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/ExternalKotlinTargetApiTests.kt @@ -17,12 +17,15 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetTree import org.jetbrains.kotlin.gradle.plugin.hierarchy.KotlinSourceSetTreeClassifier import org.jetbrains.kotlin.gradle.plugin.hierarchy.orNull import org.jetbrains.kotlin.gradle.plugin.launchInStage +import org.jetbrains.kotlin.gradle.plugin.mpp.external.ExternalKotlinCompilationDescriptor.CompilationAssociator import org.jetbrains.kotlin.gradle.plugin.mpp.external.ExternalKotlinCompilationDescriptor.CompilationFactory +import org.jetbrains.kotlin.gradle.plugin.mpp.external.ExternalKotlinCompilationDescriptorBuilder import org.jetbrains.kotlin.gradle.plugin.mpp.external.createCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.external.createExternalKotlinTarget import org.jetbrains.kotlin.gradle.util.* import org.jetbrains.kotlin.gradle.utils.property import org.jetbrains.kotlin.gradle.utils.toMap +import org.jetbrains.kotlin.tooling.core.extrasKeyOf import kotlin.test.* class ExternalKotlinTargetApiTests { @@ -77,6 +80,57 @@ class ExternalKotlinTargetApiTests { assertNull(KotlinSourceSetTree.orNull(auxCompilation)) } + @Test + fun `test - compilation associator - default`() { + val target = kotlin.createExternalKotlinTarget { defaults() } + + val mainCompilation = target.createCompilation { + assertEquals( + CompilationAssociator.default, compilationAssociator, + "Expected CompilationAssociator.default being set in ${ExternalKotlinCompilationDescriptorBuilder::class.simpleName}" + ) + + defaults(kotlin) + compileTaskName = "main" + } + + val auxCompilation = target.createCompilation { + defaults(kotlin) + compilationName = "aux" + } + + auxCompilation.associateWith(mainCompilation) + assertEquals(setOf(mainCompilation), auxCompilation.associateWith.toSet()) + } + + @Test + fun `test - compilation associator - custom`() { + val target = kotlin.createExternalKotlinTarget { defaults() } + val testTraceKey = extrasKeyOf("testTrace") + + val compilationAssociator = CompilationAssociator { auxiliary, main -> + auxiliary.extras[testTraceKey] = "aux" + main.extras[testTraceKey] = "main" + } + + val mainCompilation = target.createCompilation { + defaults(kotlin) + this.compilationAssociator = compilationAssociator + this.compileTaskName = "main" + } + + val auxCompilation = target.createCompilation { + defaults(kotlin) + this.compilationName = "aux" + this.compilationAssociator = compilationAssociator + } + + auxCompilation.associateWith(mainCompilation) + + assertEquals("aux", auxCompilation.extras[testTraceKey]) + assertEquals("main", mainCompilation.extras[testTraceKey]) + } + @Test fun `test - sourcesElements - default configuration`() = buildProjectWithMPP().runLifecycleAwareTest { val target = kotlin.createExternalKotlinTarget { defaults() }