From 7bae2303aa37da13df51025b847e5122c57bafe1 Mon Sep 17 00:00:00 2001 From: Pavel Kirpichenkov Date: Wed, 11 Jan 2023 15:39:57 +0200 Subject: [PATCH] [MPP] Support import of project-to-project cinterop dependencies KT-54975 --- .../gradle/MppIdeDependencyResolutionIT.kt | 13 ++++--- .../ide/IdeMultiplatformImportFactory.kt | 7 ++++ ...jectToProjectCInteropDependencyResolver.kt | 39 ++++++++++++------- 3 files changed, 39 insertions(+), 20 deletions(-) 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 3d615a0e1e6..d1c38400ae0 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 @@ -123,11 +123,14 @@ class MppIdeDependencyResolutionIT : KGPBaseTest() { dependencies["commonTest"].cinteropDependencies() .assertMatches(binaryCoordinates(Regex("a:dep.*\\(linux_arm64, linux_x64\\)"))) - // TODO (kirpichenkov): project to project dependency, platform source set cinterops - dependencies["linuxX64Main"].cinteropDependencies().assertMatches() - dependencies["linuxX64Test"].cinteropDependencies().assertMatches() - dependencies["linuxArm64Main"].cinteropDependencies().assertMatches() - dependencies["linuxArm64Test"].cinteropDependencies().assertMatches() + dependencies["linuxX64Main"].cinteropDependencies() + .assertMatches(binaryCoordinates(Regex("a:dep-with-cinterop-cinterop-dep.*linux_x64"))) + dependencies["linuxX64Test"].cinteropDependencies() + .assertMatches(binaryCoordinates(Regex("a:dep-with-cinterop-cinterop-dep.*linux_x64"))) + dependencies["linuxArm64Main"].cinteropDependencies() + .assertMatches(binaryCoordinates(Regex("a:dep-with-cinterop-cinterop-dep.*linux_arm64"))) + dependencies["linuxArm64Test"].cinteropDependencies() + .assertMatches(binaryCoordinates(Regex("a:dep-with-cinterop-cinterop-dep.*linux_arm64"))) } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImportFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImportFactory.kt index 97d5b292c97..c10062e4d88 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImportFactory.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImportFactory.kt @@ -107,6 +107,13 @@ internal fun IdeMultiplatformImport(extension: KotlinProjectExtension): IdeMulti level = IdeMultiplatformImport.DependencyResolutionLevel.Default, ) + registerDependencyResolver( + resolver = IdeProjectToProjectCInteropDependencyResolver, + constraint = { SourceSetConstraint.isNative(it) && SourceSetConstraint.isLeaf(it) }, + phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution, + level = IdeMultiplatformImport.DependencyResolutionLevel.Default, + ) + /* Register resolution of dependencies for jvm+android dependencies: This resolver will resolve dependencies visible to the source set from a 'jvm' perspective. diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeProjectToProjectCInteropDependencyResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeProjectToProjectCInteropDependencyResolver.kt index 168e046f7c5..613175f8450 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeProjectToProjectCInteropDependencyResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeProjectToProjectCInteropDependencyResolver.kt @@ -7,25 +7,34 @@ package org.jetbrains.kotlin.gradle.plugin.ide.dependencyResolvers import org.gradle.api.artifacts.component.ProjectComponentIdentifier import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinDependency +import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.ide.IdeDependencyResolver +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeCompilation +import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSet +import org.jetbrains.kotlin.gradle.plugin.sources.internal +import org.jetbrains.kotlin.gradle.targets.native.internal.locateOrCreateCInteropDependencyConfiguration +import org.jetbrains.kotlin.utils.addToStdlib.safeAs object IdeProjectToProjectCInteropDependencyResolver : IdeDependencyResolver { - private val platformDependencyResolver = IdeBinaryDependencyResolver( - resolvedArtifactHandler = handler@{ artifact, context -> - val identifier = artifact.id.componentIdentifier as? ProjectComponentIdentifier - ?: return@handler null - - val projectArtifact = context.allArtifacts.filter { otherArtifact -> - val otherIdentifier = otherArtifact.id.componentIdentifier - otherIdentifier is ProjectComponentIdentifier && otherIdentifier.projectName == identifier.projectName - } - - null - } - ) override fun resolve(sourceSet: KotlinSourceSet): Set { - return platformDependencyResolver.resolve(sourceSet) + if (sourceSet !is DefaultKotlinSourceSet) return emptySet() + + val compilation = sourceSet.internal.compilations.singleOrNull { it.platformType != KotlinPlatformType.common } + ?.safeAs() ?: return emptySet() + + val project = sourceSet.project + val configuration = project.locateOrCreateCInteropDependencyConfiguration(compilation) + + val cinteropFiles = project.files( + { + configuration.incoming.artifactView { + it.componentFilter { identifier -> identifier is ProjectComponentIdentifier } + }.artifacts.map { it.file } + } + ) + + return resolveCinteropDependencies(project, cinteropFiles) } -} \ No newline at end of file +}