Skip to content

Commit 3f1faa2

Browse files
sellmairSpace Team
authored and
Space Team
committed
[Gradle] ExternalTargetApi: Add sourcesElements-published and add this configuration to the published component
^KT-58109 In Progress
1 parent aee9b7a commit 3f1faa2

File tree

7 files changed

+126
-9
lines changed

7 files changed

+126
-9
lines changed

libraries/tools/kotlin-gradle-plugin/api/kotlin-gradle-plugin.api

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -720,7 +720,9 @@ public class org/jetbrains/kotlin/gradle/plugin/mpp/external/DecoratedExternalKo
720720
public final fun getRuntimeElementsConfiguration ()Lorg/gradle/api/artifacts/Configuration;
721721
public fun getRuntimeElementsConfigurationName ()Ljava/lang/String;
722722
public final fun getRuntimeElementsPublishedConfiguration ()Lorg/gradle/api/artifacts/Configuration;
723+
public final fun getSourcesElementsConfiguration ()Lorg/gradle/api/artifacts/Configuration;
723724
public fun getSourcesElementsConfigurationName ()Ljava/lang/String;
725+
public final fun getSourcesElementsPublishedConfiguration ()Lorg/gradle/api/artifacts/Configuration;
724726
public fun getTargetName ()Ljava/lang/String;
725727
public fun getUseDisambiguationClassifierAsSourceSetNamePrefix ()Z
726728
public fun isSourcesPublishable ()Z
@@ -799,6 +801,7 @@ public abstract interface class org/jetbrains/kotlin/gradle/plugin/mpp/external/
799801
public abstract fun getRuntimeElements ()Lorg/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotlinTargetConfigurationDescriptor;
800802
public abstract fun getRuntimeElementsPublished ()Lorg/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotlinTargetConfigurationDescriptor;
801803
public abstract fun getSourcesElements ()Lorg/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotlinTargetConfigurationDescriptor;
804+
public abstract fun getSourcesElementsPublished ()Lorg/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotlinTargetConfigurationDescriptor;
802805
public abstract fun getTargetFactory ()Lorg/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotlinTargetDescriptor$TargetFactory;
803806
public abstract fun getTargetName ()Ljava/lang/String;
804807
}
@@ -816,6 +819,7 @@ public final class org/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotli
816819
public final fun getRuntimeElements ()Lorg/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotlinTargetConfigurationDescriptorBuilder;
817820
public final fun getRuntimeElementsPublished ()Lorg/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotlinTargetConfigurationDescriptorBuilder;
818821
public final fun getSourcesElements ()Lorg/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotlinTargetConfigurationDescriptorBuilder;
822+
public final fun getSourcesElementsPublished ()Lorg/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotlinTargetConfigurationDescriptorBuilder;
819823
public final fun getTargetFactory ()Lorg/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotlinTargetDescriptor$TargetFactory;
820824
public final fun getTargetName ()Ljava/lang/String;
821825
public final fun setPlatformType (Lorg/jetbrains/kotlin/gradle/plugin/KotlinPlatformType;)V

libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/external/DecoratedExternalKotlinTarget.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.InternalKotlinTarget
4040
*/
4141
@ExternalKotlinTargetApi
4242
open class DecoratedExternalKotlinTarget internal constructor(
43-
internal val delegate: ExternalKotlinTargetImpl
43+
internal val delegate: ExternalKotlinTargetImpl,
4444
) : InternalKotlinTarget by delegate {
4545
constructor(delegate: Delegate) : this(delegate.impl)
4646

@@ -50,10 +50,20 @@ open class DecoratedExternalKotlinTarget internal constructor(
5050

5151
val runtimeElementsConfiguration: Configuration = delegate.runtimeElementsConfiguration
5252

53+
/**
54+
* @since 1.9.20
55+
*/
56+
val sourcesElementsConfiguration: Configuration = delegate.sourcesElementsConfiguration
57+
5358
val apiElementsPublishedConfiguration: Configuration = delegate.apiElementsPublishedConfiguration
5459

5560
val runtimeElementsPublishedConfiguration: Configuration = delegate.runtimeElementsPublishedConfiguration
5661

62+
/**
63+
* @since 1.9.20
64+
*/
65+
val sourcesElementsPublishedConfiguration: Configuration = delegate.sourcesElementsPublishedConfiguration
66+
5767
internal val logger: Logger = delegate.logger
5868
}
5969

libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotlinTargetDescriptor.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ interface ExternalKotlinTargetDescriptor<T : DecoratedExternalKotlinTarget> {
3737
val apiElementsPublished: ExternalKotlinTargetConfigurationDescriptor<T>
3838
val runtimeElementsPublished: ExternalKotlinTargetConfigurationDescriptor<T>
3939

40+
/**
41+
* @since 1.9.20
42+
*/
43+
val sourcesElementsPublished: ExternalKotlinTargetConfigurationDescriptor<T>
44+
4045
val configure: ((T) -> Unit)?
4146
val configureIdeImport: (IdeMultiplatformImport.() -> Unit)?
4247
}
@@ -91,6 +96,12 @@ class ExternalKotlinTargetDescriptorBuilder<T : DecoratedExternalKotlinTarget> i
9196
val runtimeElementsPublished: ExternalKotlinTargetConfigurationDescriptorBuilder<T> =
9297
ExternalKotlinTargetConfigurationDescriptorBuilder()
9398

99+
/**
100+
* @since 1.9.20
101+
*/
102+
val sourcesElementsPublished: ExternalKotlinTargetConfigurationDescriptorBuilder<T> =
103+
ExternalKotlinTargetConfigurationDescriptorBuilder()
104+
94105
private var configure: ((T) -> Unit)? = null
95106

96107
/**
@@ -128,6 +139,7 @@ class ExternalKotlinTargetDescriptorBuilder<T : DecoratedExternalKotlinTarget> i
128139
sourcesElements = sourcesElements.build(),
129140
apiElementsPublished = apiElementsPublished.build(),
130141
runtimeElementsPublished = runtimeElementsPublished.build(),
142+
sourcesElementsPublished = sourcesElementsPublished.build(),
131143
configure = configure,
132144
configureIdeImport = configureIdeImport
133145
)
@@ -142,6 +154,7 @@ private data class ExternalKotlinTargetDescriptorImpl<T : DecoratedExternalKotli
142154
override val sourcesElements: ExternalKotlinTargetConfigurationDescriptor<T>,
143155
override val apiElementsPublished: ExternalKotlinTargetConfigurationDescriptor<T>,
144156
override val runtimeElementsPublished: ExternalKotlinTargetConfigurationDescriptor<T>,
157+
override val sourcesElementsPublished: ExternalKotlinTargetConfigurationDescriptor<T>,
145158
override val configure: ((T) -> Unit)?,
146159
override val configureIdeImport: (IdeMultiplatformImport.() -> Unit)?,
147160
) : ExternalKotlinTargetDescriptor<T>

libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotlinTargetImpl.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ internal class ExternalKotlinTargetImpl internal constructor(
3232
val sourcesElementsConfiguration: Configuration,
3333
val apiElementsPublishedConfiguration: Configuration,
3434
val runtimeElementsPublishedConfiguration: Configuration,
35+
val sourcesElementsPublishedConfiguration: Configuration,
3536
val kotlinTargetComponent: ExternalKotlinTargetComponent,
3637
private val artifactsTaskLocator: ArtifactsTaskLocator,
3738
) : InternalKotlinTarget {
@@ -78,7 +79,7 @@ internal class ExternalKotlinTargetImpl internal constructor(
7879
@InternalKotlinGradlePluginApi
7980
override val kotlinComponents: Set<KotlinTargetComponent> = setOf(kotlinTargetComponent)
8081

81-
override val components: Set<SoftwareComponent> by lazy {
82+
override val components: Set<ExternalKotlinTargetSoftwareComponent> by lazy {
8283
logger.debug("Creating SoftwareComponent")
8384
setOf(ExternalKotlinTargetSoftwareComponent(this))
8485
}

libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotlinTargetSoftwareComponent.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ internal fun ExternalKotlinTargetSoftwareComponent(
3131
details.mapToMavenScope("runtime")
3232
}
3333

34+
if (target.isSourcesPublishable) {
35+
adhocSoftwareComponent.addVariantsFromConfiguration(target.sourcesElementsPublishedConfiguration) { _ -> }
36+
}
37+
3438
@OptIn(UnsafeApi::class)
3539
return ExternalKotlinTargetSoftwareComponent(
3640
target.project.multiplatformExtension,
@@ -42,7 +46,7 @@ internal fun ExternalKotlinTargetSoftwareComponent(
4246
internal class ExternalKotlinTargetSoftwareComponent @UnsafeApi constructor(
4347
private val multiplatformExtension: KotlinMultiplatformExtension,
4448
private val adhocSoftwareComponent: SoftwareComponentInternal,
45-
private val kotlinTargetComponent: ExternalKotlinTargetComponent
49+
private val kotlinTargetComponent: ExternalKotlinTargetComponent,
4650
) : ComponentWithCoordinates, ComponentWithVariants, SoftwareComponentInternal {
4751
override fun getName(): String = adhocSoftwareComponent.name
4852
override fun getUsages(): Set<UsageContext> = adhocSoftwareComponent.usages

libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/external/createExternalKotlinTarget.kt

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import org.jetbrains.kotlin.gradle.utils.named
3232
*/
3333
@ExternalKotlinTargetApi
3434
fun <T : DecoratedExternalKotlinTarget> KotlinMultiplatformExtension.createExternalKotlinTarget(
35-
descriptor: ExternalKotlinTargetDescriptor<T>
35+
descriptor: ExternalKotlinTargetDescriptor<T>,
3636
): T {
3737
val apiElementsConfiguration = project.configurations.maybeCreate(lowerCamelCaseName(descriptor.targetName, "apiElements"))
3838
val runtimeElementsConfiguration = project.configurations.maybeCreate(lowerCamelCaseName(descriptor.targetName, "runtimeElements"))
@@ -44,6 +44,9 @@ fun <T : DecoratedExternalKotlinTarget> KotlinMultiplatformExtension.createExter
4444
val runtimeElementsPublishedConfiguration =
4545
project.configurations.maybeCreate(lowerCamelCaseName(descriptor.targetName, "runtimeElements-published"))
4646

47+
val sourcesElementsPublishedConfiguration =
48+
project.configurations.maybeCreate(lowerCamelCaseName(descriptor.targetName, "sourcesElements-published"))
49+
4750
val kotlinTargetComponent = ExternalKotlinTargetComponent(
4851
ExternalKotlinTargetComponent.TargetProvider.byTargetName(this, descriptor.targetName)
4952
)
@@ -62,6 +65,7 @@ fun <T : DecoratedExternalKotlinTarget> KotlinMultiplatformExtension.createExter
6265
sourcesElementsConfiguration = sourcesElementsConfiguration,
6366
apiElementsPublishedConfiguration = apiElementsPublishedConfiguration,
6467
runtimeElementsPublishedConfiguration = runtimeElementsPublishedConfiguration,
68+
sourcesElementsPublishedConfiguration = sourcesElementsPublishedConfiguration,
6569
kotlinTargetComponent = kotlinTargetComponent,
6670
artifactsTaskLocator = artifactsTaskLocator
6771
)
@@ -71,6 +75,7 @@ fun <T : DecoratedExternalKotlinTarget> KotlinMultiplatformExtension.createExter
7175
target.setupRuntimeElements(runtimeElementsConfiguration)
7276
target.setupRuntimeElements(runtimeElementsPublishedConfiguration)
7377
target.setupSourcesElements(sourcesElementsConfiguration)
78+
target.setupSourcesElements(sourcesElementsPublishedConfiguration)
7479
apiElementsConfiguration.markConsumable()
7580
runtimeElementsConfiguration.markConsumable()
7681
sourcesElementsConfiguration.markConsumable()
@@ -80,6 +85,8 @@ fun <T : DecoratedExternalKotlinTarget> KotlinMultiplatformExtension.createExter
8085
apiElementsPublishedConfiguration.isCanBeResolved = false
8186
runtimeElementsPublishedConfiguration.isCanBeResolved = false
8287
runtimeElementsPublishedConfiguration.isCanBeConsumed = false
88+
sourcesElementsPublishedConfiguration.isCanBeConsumed = false
89+
sourcesElementsPublishedConfiguration.isCanBeResolved = false
8390

8491
val decorated = descriptor.targetFactory.create(DecoratedExternalKotlinTarget.Delegate(target))
8592
target.onCreated()
@@ -90,6 +97,7 @@ fun <T : DecoratedExternalKotlinTarget> KotlinMultiplatformExtension.createExter
9097
descriptor.sourcesElements.configure?.invoke(decorated, sourcesElementsConfiguration)
9198
descriptor.apiElementsPublished.configure?.invoke(decorated, apiElementsPublishedConfiguration)
9299
descriptor.runtimeElementsPublished.configure?.invoke(decorated, runtimeElementsPublishedConfiguration)
100+
descriptor.sourcesElementsPublished.configure?.invoke(decorated, sourcesElementsPublishedConfiguration)
93101
descriptor.configureIdeImport?.invoke(project.kotlinIdeMultiplatformImport)
94102

95103
targets.add(decorated)
@@ -102,7 +110,7 @@ fun <T : DecoratedExternalKotlinTarget> KotlinMultiplatformExtension.createExter
102110
*/
103111
@ExternalKotlinTargetApi
104112
fun <T : DecoratedExternalKotlinTarget> KotlinMultiplatformExtension.createExternalKotlinTarget(
105-
descriptor: ExternalKotlinTargetDescriptorBuilder<T>.() -> Unit
113+
descriptor: ExternalKotlinTargetDescriptorBuilder<T>.() -> Unit,
106114
): T {
107115
return createExternalKotlinTarget(ExternalKotlinTargetDescriptor(descriptor))
108116
}
@@ -121,4 +129,4 @@ private fun ExternalKotlinTargetImpl.setupRuntimeElements(configuration: Configu
121129

122130
private fun ExternalKotlinTargetImpl.setupSourcesElements(configuration: Configuration) {
123131
configuration.configureSourcesPublicationAttributes(this)
124-
}
132+
}

libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/ExternalKotlinTargetApiTests.kt

Lines changed: 80 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77

88
package org.jetbrains.kotlin.gradle.unitTests
99

10+
import org.gradle.api.attributes.Attribute
11+
import org.gradle.api.attributes.Category
12+
import org.gradle.api.attributes.DocsType
1013
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
1114
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
1215
import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle
@@ -20,9 +23,8 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.external.ExternalKotlinTargetDescr
2023
import org.jetbrains.kotlin.gradle.util.buildProjectWithMPP
2124
import org.jetbrains.kotlin.gradle.util.runLifecycleAwareTest
2225
import org.jetbrains.kotlin.gradle.utils.property
23-
import kotlin.test.Test
24-
import kotlin.test.assertEquals
25-
import kotlin.test.assertNull
26+
import org.jetbrains.kotlin.gradle.utils.toMap
27+
import kotlin.test.*
2628

2729
class ExternalKotlinTargetApiTests {
2830

@@ -89,4 +91,79 @@ class ExternalKotlinTargetApiTests {
8991
assertEquals(KotlinSourceSetTree.main, KotlinSourceSetTree.orNull(mainCompilation))
9092
assertNull(KotlinSourceSetTree.orNull(auxCompilation))
9193
}
94+
95+
@Test
96+
fun `test - sourcesElements - default configuration`() = buildProjectWithMPP().runLifecycleAwareTest {
97+
val target = kotlin.createExternalKotlinTarget<FakeTarget> { defaults() }
98+
99+
assertNotEquals(target.sourcesElementsConfiguration, target.sourcesElementsPublishedConfiguration)
100+
101+
assertEquals(
102+
target.sourcesElementsConfigurationName,
103+
target.sourcesElementsConfiguration.name
104+
)
105+
106+
assertEquals(
107+
target.sourcesElementsConfiguration.attributes.toMap(),
108+
target.sourcesElementsPublishedConfiguration.attributes.toMap(),
109+
"Expected sourcesElements and sourcesElementsPublished to contain the same attributes"
110+
)
111+
112+
assertEquals(
113+
KotlinPlatformType.jvm, target.sourcesElementsPublishedConfiguration.attributes.getAttribute(KotlinPlatformType.attribute),
114+
"Expected KotlinPlatformType attribute to be present"
115+
)
116+
117+
assertEquals(
118+
Category.DOCUMENTATION, target.sourcesElementsPublishedConfiguration.attributes.getAttribute(Category.CATEGORY_ATTRIBUTE)?.name,
119+
"Expected 'Category.DOCUMENTATION' as category attribute"
120+
)
121+
122+
assertEquals(
123+
DocsType.SOURCES, target.sourcesElementsPublishedConfiguration.attributes.getAttribute(DocsType.DOCS_TYPE_ATTRIBUTE)?.name,
124+
"Expected 'DocsType.SOURCES' attribute"
125+
)
126+
}
127+
128+
@Test
129+
fun `test - sourcesElements - configure`() = buildProjectWithMPP().runLifecycleAwareTest {
130+
val testAttribute = Attribute.of("for.test", String::class.java)
131+
132+
val target = kotlin.createExternalKotlinTarget<FakeTarget> {
133+
defaults()
134+
sourcesElements.configure { target, configuration ->
135+
assertEquals(target.sourcesElementsConfiguration, configuration)
136+
configuration.attributes.attribute(testAttribute, "sourcesElements")
137+
}
138+
139+
sourcesElementsPublished.configure { target, configuration ->
140+
assertEquals(target.sourcesElementsPublishedConfiguration, configuration)
141+
configuration.attributes.attribute(testAttribute, "sourcesElements-published")
142+
}
143+
}
144+
145+
/* Check traces left before */
146+
assertEquals("sourcesElements", target.sourcesElementsConfiguration.attributes.getAttribute(testAttribute))
147+
assertEquals("sourcesElements-published", target.sourcesElementsPublishedConfiguration.attributes.getAttribute(testAttribute))
148+
}
149+
150+
@Test
151+
fun `test - sourcesElements - publication`() = buildProjectWithMPP().runLifecycleAwareTest {
152+
val target = kotlin.createExternalKotlinTarget<FakeTarget> { defaults() }
153+
val component = target.delegate.components.singleOrNull() ?: fail("Expected single 'component' for external target")
154+
155+
component.usages.find { it.name == target.sourcesElementsPublishedConfiguration.name }
156+
?: fail("Missing sourcesElements usage")
157+
}
158+
159+
@Test
160+
fun `test - sourcesElements - publication - withSourcesJar set to false`() = buildProjectWithMPP().runLifecycleAwareTest {
161+
val target = kotlin.createExternalKotlinTarget<FakeTarget> { defaults() }
162+
target.withSourcesJar(false)
163+
val component = target.delegate.components.singleOrNull() ?: fail("Expected single 'component' for external target")
164+
val sourcesUsage = component.usages.find { it.name.contains("sources", true) }
165+
if (sourcesUsage != null) {
166+
fail("Unexpected usage '${sourcesUsage.name} in target publication")
167+
}
168+
}
92169
}

0 commit comments

Comments
 (0)