From dcc196db0414c1664b4cb9e01a8d6509618cde83 Mon Sep 17 00:00:00 2001 From: Sebastian Sellmair Date: Wed, 23 Nov 2022 15:50:39 +0100 Subject: [PATCH] [Gradle] Implement IdeJvmAndAndroidSourceDependencyResolver KT-55112 --- .../idea/tcs/IdeaKotlinSourceDependency.kt | 3 +- .../ide/IdeMultiplatformImportFactory.kt | 7 ++++ .../IdeFriendSourceDependencyResolver.kt | 13 +----- ...deJvmAndAndroidSourceDependencyResolver.kt | 41 +++++++++++++++++++ ...leMultiplatformSourceDependencyResolver.kt | 2 - .../kotlin/gradle/plugin/ide/factories.kt | 20 +++++++++ .../ide/IdeResolveSourceDependenciesTest.kt | 19 ++++----- 7 files changed, 81 insertions(+), 24 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeJvmAndAndroidSourceDependencyResolver.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/factories.kt diff --git a/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/idea/tcs/IdeaKotlinSourceDependency.kt b/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/idea/tcs/IdeaKotlinSourceDependency.kt index 1d86ba8bba1..fcdc37065c0 100644 --- a/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/idea/tcs/IdeaKotlinSourceDependency.kt +++ b/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/idea/tcs/IdeaKotlinSourceDependency.kt @@ -6,12 +6,13 @@ package org.jetbrains.kotlin.gradle.idea.tcs import org.jetbrains.kotlin.tooling.core.MutableExtras +import org.jetbrains.kotlin.tooling.core.mutableExtrasOf import java.io.Serializable data class IdeaKotlinSourceDependency( val type: Type, override val coordinates: IdeaKotlinSourceCoordinates, - override val extras: MutableExtras + override val extras: MutableExtras = mutableExtrasOf() ) : IdeaKotlinDependency { enum class Type : Serializable { Regular, Friend, DependsOn; 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 a08e0213340..35dd96d62cf 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 @@ -34,6 +34,13 @@ fun IdeMultiplatformImport(extension: KotlinMultiplatformExtension): IdeMultipla level = IdeMultiplatformImport.DependencyResolutionLevel.Default ) + registerDependencyResolver( + resolver = IdeJvmAndAndroidSourceDependencyResolver, + constraint = IdeMultiplatformImport.SourceSetConstraint.unconstrained, + phase = IdeMultiplatformImport.DependencyResolutionPhase.SourceDependencyResolution, + level = IdeMultiplatformImport.DependencyResolutionLevel.Default + ) + registerDependencyResolver( resolver = IdeTransformedMetadataDependencyResolver, constraint = IdeMultiplatformImport.SourceSetConstraint.isMetadata, diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeFriendSourceDependencyResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeFriendSourceDependencyResolver.kt index adc880572c0..98657c369e2 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeFriendSourceDependencyResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeFriendSourceDependencyResolver.kt @@ -6,27 +6,18 @@ package org.jetbrains.kotlin.gradle.plugin.ide.dependencyResolvers import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinDependency -import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinSourceCoordinates import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinSourceDependency import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.ide.IdeDependencyResolver -import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.currentBuildId +import org.jetbrains.kotlin.gradle.plugin.ide.IdeaKotlinSourceCoordinates import org.jetbrains.kotlin.gradle.plugin.sources.getVisibleSourceSetsFromAssociateCompilations -import org.jetbrains.kotlin.gradle.plugin.sources.project -import org.jetbrains.kotlin.tooling.core.mutableExtrasOf object IdeFriendSourceDependencyResolver : IdeDependencyResolver { override fun resolve(sourceSet: KotlinSourceSet): Set { return getVisibleSourceSetsFromAssociateCompilations(sourceSet).map { friendSourceSet -> IdeaKotlinSourceDependency( type = IdeaKotlinSourceDependency.Type.Friend, - extras = mutableExtrasOf(), - coordinates = IdeaKotlinSourceCoordinates( - buildId = friendSourceSet.project.currentBuildId().toString(), - projectPath = friendSourceSet.project.path, - projectName = friendSourceSet.project.name, - sourceSetName = friendSourceSet.name - ) + coordinates = IdeaKotlinSourceCoordinates(friendSourceSet) ) }.toSet() } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeJvmAndAndroidSourceDependencyResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeJvmAndAndroidSourceDependencyResolver.kt new file mode 100644 index 00000000000..abdf1da5b35 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeJvmAndAndroidSourceDependencyResolver.kt @@ -0,0 +1,41 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.plugin.ide.dependencyResolvers + +import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull +import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinDependency +import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinSourceDependency +import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinSourceDependency.Type.Regular +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.ide.IdeaKotlinSourceCoordinates +import org.jetbrains.kotlin.gradle.plugin.mpp.MetadataDependencyResolution +import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSet +import org.jetbrains.kotlin.gradle.plugin.sources.KotlinDependencyScope.* +import org.jetbrains.kotlin.gradle.plugin.sources.internal + +object IdeJvmAndAndroidSourceDependencyResolver : IdeDependencyResolver { + override fun resolve(sourceSet: KotlinSourceSet): Set { + if (!sourceSet.isJvmAndAndroid) return emptySet() + if (sourceSet !is DefaultKotlinSourceSet) return emptySet() + return sourceSet.dependencyTransformations[API_SCOPE]?.metadataDependencyResolutions?.toList().orEmpty() + .plus(sourceSet.dependencyTransformations[IMPLEMENTATION_SCOPE]?.metadataDependencyResolutions?.toList().orEmpty()) + .plus(sourceSet.dependencyTransformations[COMPILE_ONLY_SCOPE]?.metadataDependencyResolutions?.toList().orEmpty()) + .filterIsInstance() + .flatMap { chooseVisibleSourceSets -> + val projectDependency = chooseVisibleSourceSets.projectDependency ?: return@flatMap emptyList() + val kotlin = projectDependency.multiplatformExtensionOrNull ?: return@flatMap emptyList() + kotlin.sourceSets + .filter { sourceSet -> sourceSet.isJvmAndAndroid } + .map { sourceSet -> IdeaKotlinSourceDependency(type = Regular, coordinates = IdeaKotlinSourceCoordinates(sourceSet)) } + } + .toSet() + } + + private val KotlinSourceSet.isJvmAndAndroid: Boolean + get() = internal.compilations.map { it.platformType }.toSet() == setOf(KotlinPlatformType.androidJvm, KotlinPlatformType.jvm) +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeVisibleMultiplatformSourceDependencyResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeVisibleMultiplatformSourceDependencyResolver.kt index 5765a6565a4..a7ba388dbf3 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeVisibleMultiplatformSourceDependencyResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeVisibleMultiplatformSourceDependencyResolver.kt @@ -14,7 +14,6 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.MetadataDependencyResolution import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.currentBuildId import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.sources.KotlinDependencyScope.* -import org.jetbrains.kotlin.tooling.core.mutableExtrasOf object IdeVisibleMultiplatformSourceDependencyResolver : IdeDependencyResolver { override fun resolve(sourceSet: KotlinSourceSet): Set { @@ -34,7 +33,6 @@ object IdeVisibleMultiplatformSourceDependencyResolver : IdeDependencyResolver { return resolution.allVisibleSourceSetNames.map { visibleSourceSetName -> IdeaKotlinSourceDependency( type = IdeaKotlinSourceDependency.Type.Regular, - extras = mutableExtrasOf(), coordinates = IdeaKotlinSourceCoordinates( buildId = project.currentBuildId().toString(), projectPath = project.path, diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/factories.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/factories.kt new file mode 100644 index 00000000000..bc281b99ca7 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/factories.kt @@ -0,0 +1,20 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.plugin.ide + +import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinSourceCoordinates +import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet +import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.currentBuildId +import org.jetbrains.kotlin.gradle.plugin.sources.project + +internal fun IdeaKotlinSourceCoordinates(sourceSet: KotlinSourceSet): IdeaKotlinSourceCoordinates { + return IdeaKotlinSourceCoordinates( + buildId = sourceSet.project.currentBuildId().toString(), + projectPath = sourceSet.project.path, + projectName = sourceSet.project.name, + sourceSetName = sourceSet.name + ) +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/ide/IdeResolveSourceDependenciesTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/ide/IdeResolveSourceDependenciesTest.kt index 81e00ad643d..9affb42c90d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/ide/IdeResolveSourceDependenciesTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/ide/IdeResolveSourceDependenciesTest.kt @@ -16,7 +16,6 @@ import org.jetbrains.kotlin.gradle.idea.testFixtures.tcs.dependsOnDependency import org.jetbrains.kotlin.gradle.idea.testFixtures.tcs.friendSourceDependency import org.jetbrains.kotlin.gradle.idea.testFixtures.tcs.regularSourceDependency import org.jetbrains.kotlin.gradle.plugin.ide.kotlinIdeMultiplatformImport -import kotlin.test.Ignore import kotlin.test.Test class IdeResolveSourceDependenciesTest { @@ -97,7 +96,6 @@ class IdeResolveSourceDependenciesTest { ) } - @Ignore("No solution yet") @Test fun `test - multiplatform to multiplatform - sample 1 - jvmAndAndroid`() { assumeAndroidSdkAvailable() @@ -109,18 +107,19 @@ class IdeResolveSourceDependenciesTest { androidLibrary { compileSdk = 33 } multiplatformExtension.apply { - targetHierarchy.default { - common { - group("jvmAndAndroid") { - jvm() - android() - } - } - } + targetHierarchy.default() linuxX64() linuxArm64() jvm() android() + + sourceSets.getByName("commonMain").let { commonMain -> + sourceSets.create("jvmAndAndroidMain").let { jvmAndAndroidMain -> + jvmAndAndroidMain.dependsOn(commonMain) + sourceSets.getByName("jvmMain").dependsOn(jvmAndAndroidMain) + sourceSets.getByName("androidMain").dependsOn(jvmAndAndroidMain) + } + } } }