diff --git a/libraries/tools/kotlin-gradle-plugin-idea/src/testFixtures/kotlin/org/jetbrains/kotlin/gradle/idea/testFixtures/tcs/ideaDependencyMatcherBuilders.kt b/libraries/tools/kotlin-gradle-plugin-idea/src/testFixtures/kotlin/org/jetbrains/kotlin/gradle/idea/testFixtures/tcs/ideaDependencyMatcherBuilders.kt index 0345f260d90..b61dfb7dfbd 100644 --- a/libraries/tools/kotlin-gradle-plugin-idea/src/testFixtures/kotlin/org/jetbrains/kotlin/gradle/idea/testFixtures/tcs/ideaDependencyMatcherBuilders.kt +++ b/libraries/tools/kotlin-gradle-plugin-idea/src/testFixtures/kotlin/org/jetbrains/kotlin/gradle/idea/testFixtures/tcs/ideaDependencyMatcherBuilders.kt @@ -6,12 +6,11 @@ package org.jetbrains.kotlin.gradle.idea.testFixtures.tcs import org.gradle.api.Project -import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinBinaryCoordinates import org.gradle.api.artifacts.component.BuildIdentifier import org.gradle.api.internal.project.ProjectInternal import org.gradle.internal.build.BuildState -import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinDependency -import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinSourceDependency +import org.jetbrains.kotlin.gradle.idea.tcs.* +import org.jetbrains.kotlin.gradle.idea.tcs.extras.sourcesClasspath fun buildIdeaKotlinDependencyMatchers(notation: Any?): List { return when (notation) { @@ -77,4 +76,34 @@ fun anyDependency(): IdeaKotlinDependencyMatcher = object : IdeaKotlinDependency /* Duplicated: Aks Gradle for public API? */ private fun Project.currentBuildId(): BuildIdentifier = - (project as ProjectInternal).services.get(BuildState::class.java).buildIdentifier \ No newline at end of file + (project as ProjectInternal).services.get(BuildState::class.java).buildIdentifier + + +class IdeaKotlinDependencyMatcherWithSourcesFile( + private val upstreamMatcher: IdeaKotlinDependencyMatcher, + private val filePattern: Regex, +) : IdeaKotlinDependencyMatcher { + override val description: String + get() = upstreamMatcher.description + " with resolved sources file '$filePattern'" + + override fun matches(dependency: IdeaKotlinDependency): Boolean { + if (!upstreamMatcher.matches(dependency)) return false + + // only binary dependencies can have resolved sources file attached + if (dependency !is IdeaKotlinBinaryDependency) return false + + // at the moment we expect only 1 source file be associated with dependency + val sourcesFile = dependency.sourcesClasspath.singleOrNull() ?: return false + + // require that *ALL* files in sourcesClasspath matches the file pattern + return sourcesFile.toString().matches(filePattern) + } + + override fun toString(): String = "$upstreamMatcher with resolved sources file '$filePattern'" +} + +fun IdeaKotlinDependencyMatcher.withResolvedSourcesFile(endsWith: String) = + IdeaKotlinDependencyMatcherWithSourcesFile( + upstreamMatcher = this, + filePattern = Regex(".*$endsWith") + ) \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/MppIdeDependencyResolutionIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/MppIdeDependencyResolutionIT.kt index c39a5d8b817..4b0a7e05a47 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/MppIdeDependencyResolutionIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/MppIdeDependencyResolutionIT.kt @@ -8,10 +8,7 @@ package org.jetbrains.kotlin.gradle import org.gradle.util.GradleVersion import org.jetbrains.kotlin.commonizer.CommonizerTarget import org.jetbrains.kotlin.commonizer.identityString -import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinBinaryDependency -import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinDependency -import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinResolvedBinaryDependency -import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinUnresolvedBinaryDependency +import org.jetbrains.kotlin.gradle.idea.tcs.* import org.jetbrains.kotlin.gradle.idea.tcs.extras.* import org.jetbrains.kotlin.gradle.idea.testFixtures.tcs.* import org.jetbrains.kotlin.gradle.testbase.* @@ -395,6 +392,33 @@ class MppIdeDependencyResolutionIT : KGPBaseTest() { } } + @GradleTest + fun `test resolve sources for dependency with multiple capabilities`(gradleVersion: GradleVersion) { + project("kt-63226-multiple-capabilities", gradleVersion) { + build(":producer:publish") + + resolveIdeDependencies(":consumer") { dependencies -> + dependencies["jvmMain"].getOrFail( + binaryCoordinates("test:producer:1.0") + .withResolvedSourcesFile("producer-1.0-sources.jar") + ) + + // according to build.gradle.kts of test project jvmTest should have both artifacts from :producer + // one with regular capabilities + dependencies["jvmTest"].getOrFail( + binaryCoordinates("test:producer:1.0") + .withResolvedSourcesFile("producer-1.0-sources.jar") + ) + + // and another with foo capability + dependencies["jvmTest"].getOrFail( + binaryCoordinates("test:producer:1.0") + .withResolvedSourcesFile("producer-1.0-foo-sources.jar") + ) + } + } + } + private fun Iterable.cinteropDependencies() = this.filterIsInstance().filter { it.klibExtra?.isInterop == true && !it.isNativeStdlib && !it.isNativeDistribution diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-63226-multiple-capabilities/consumer/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-63226-multiple-capabilities/consumer/build.gradle.kts new file mode 100644 index 00000000000..e6f08e1a005 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-63226-multiple-capabilities/consumer/build.gradle.kts @@ -0,0 +1,25 @@ +plugins { + kotlin("multiplatform") +} + +repositories { + maven(rootDir.resolve("repo")) + mavenLocal() + mavenCentral() +} + +kotlin { + jvm() + + sourceSets.jvmMain.dependencies { + implementation("test:producer:1.0") + } + + sourceSets.jvmTest.dependencies { + implementation("test:producer:1.0") { + capabilities { + requireCapability("test:foo:1.0") + } + } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-63226-multiple-capabilities/producer/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-63226-multiple-capabilities/producer/build.gradle.kts new file mode 100644 index 00000000000..96ffbb5d99f --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-63226-multiple-capabilities/producer/build.gradle.kts @@ -0,0 +1,29 @@ +plugins { + `java-library` + `maven-publish` +} + +group = "test" +version = "1.0" + +publishing { + publications { + create("maven", MavenPublication::class.java) { + from(components["java"]) + } + } + + repositories { + maven(rootDir.resolve("repo")) + } +} + + +java { + withSourcesJar() + registerFeature("foo") { + withSourcesJar() + usingSourceSet(sourceSets.create("foo")) + capability("test", "foo", "1.0") + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-63226-multiple-capabilities/producer/src/foo/java/Foo.java b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-63226-multiple-capabilities/producer/src/foo/java/Foo.java new file mode 100644 index 00000000000..4ce430da24a --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-63226-multiple-capabilities/producer/src/foo/java/Foo.java @@ -0,0 +1,2 @@ +public class Foo { +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-63226-multiple-capabilities/producer/src/main/java/Main.java b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-63226-multiple-capabilities/producer/src/main/java/Main.java new file mode 100644 index 00000000000..70464179bc8 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-63226-multiple-capabilities/producer/src/main/java/Main.java @@ -0,0 +1,2 @@ +public class Main { +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-63226-multiple-capabilities/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-63226-multiple-capabilities/settings.gradle.kts new file mode 100644 index 00000000000..2dc76d8d61d --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-63226-multiple-capabilities/settings.gradle.kts @@ -0,0 +1,3 @@ + +include(":producer") +include(":consumer")