[Gradle] Implement CompilationAssociator.default, ...

... to allow extending the default behaviour for ExternalTargetApi consumers

^KT-59562 Verification Pending
This commit is contained in:
Sebastian Sellmair
2023-06-29 09:23:34 +02:00
committed by Space Team
parent 966a342bf1
commit 4e85434536
4 changed files with 78 additions and 11 deletions
@@ -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;
}
@@ -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<T : DecoratedExternalKotlinCompila
* handling them on behalf of the authors of the external [KotlinTarget]
*/
@ExternalKotlinTargetApi
fun interface CompilationAssociator<T : DecoratedExternalKotlinCompilation> {
fun interface CompilationAssociator<in T : DecoratedExternalKotlinCompilation> {
fun associate(auxiliary: T, main: DecoratedExternalKotlinCompilation)
@ExternalKotlinTargetApi
companion object {
val default = CompilationAssociator<DecoratedExternalKotlinCompilation> { aux, main ->
DefaultKotlinCompilationAssociator.associate(aux.target, aux.compilation.internal, main.compilation.internal)
}
}
}
val compilationName: String
@@ -55,7 +64,7 @@ interface ExternalKotlinCompilationDescriptor<T : DecoratedExternalKotlinCompila
val defaultSourceSet: KotlinSourceSet
val compilationFactory: CompilationFactory<T>
val friendArtifactResolver: FriendArtifactResolver<T>?
val compilationAssociator: CompilationAssociator<T>?
val compilationAssociator: CompilationAssociator<T>
@Suppress("DEPRECATION")
@Deprecated("Use .sourceSetTreeClassifierV2 instead")
@@ -93,7 +102,7 @@ class ExternalKotlinCompilationDescriptorBuilder<T : DecoratedExternalKotlinComp
var defaultSourceSet: KotlinSourceSet by Delegates.notNull()
var compilationFactory: CompilationFactory<T> by Delegates.notNull()
var friendArtifactResolver: FriendArtifactResolver<T>? = null
var compilationAssociator: CompilationAssociator<T>? = null
var compilationAssociator: CompilationAssociator<T> = CompilationAssociator.default
@Suppress("DEPRECATION")
@Deprecated("Use sourceSetTreeClassifierV2 instead")
@@ -117,7 +126,7 @@ private data class ExternalKotlinCompilationDescriptorImpl<T : DecoratedExternal
override val defaultSourceSet: KotlinSourceSet,
override val compilationFactory: CompilationFactory<T>,
override val friendArtifactResolver: FriendArtifactResolver<T>?,
override val compilationAssociator: CompilationAssociator<T>?,
override val compilationAssociator: CompilationAssociator<T>,
@Deprecated("Use .sourceSetTreeClassifierV2 instead")
@Suppress("DEPRECATION")
override val sourceSetTreeClassifier: SourceSetTreeClassifier,
@@ -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 <T : DecoratedExternalKotlinCompilation> 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,
@@ -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<FakeTarget> { defaults() }
val mainCompilation = target.createCompilation<FakeCompilation> {
assertEquals(
CompilationAssociator.default, compilationAssociator,
"Expected CompilationAssociator.default being set in ${ExternalKotlinCompilationDescriptorBuilder::class.simpleName}"
)
defaults(kotlin)
compileTaskName = "main"
}
val auxCompilation = target.createCompilation<FakeCompilation> {
defaults(kotlin)
compilationName = "aux"
}
auxCompilation.associateWith(mainCompilation)
assertEquals(setOf(mainCompilation), auxCompilation.associateWith.toSet())
}
@Test
fun `test - compilation associator - custom`() {
val target = kotlin.createExternalKotlinTarget<FakeTarget> { defaults() }
val testTraceKey = extrasKeyOf<String>("testTrace")
val compilationAssociator = CompilationAssociator<FakeCompilation> { auxiliary, main ->
auxiliary.extras[testTraceKey] = "aux"
main.extras[testTraceKey] = "main"
}
val mainCompilation = target.createCompilation<FakeCompilation> {
defaults(kotlin)
this.compilationAssociator = compilationAssociator
this.compileTaskName = "main"
}
val auxCompilation = target.createCompilation<FakeCompilation> {
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<FakeTarget> { defaults() }