[Gradle] Implement IdeJvmAndAndroidSourceDependencyResolver

KT-55112
This commit is contained in:
Sebastian Sellmair
2022-11-23 15:50:39 +01:00
committed by Space Team
parent 38446dc3e8
commit dcc196db04
7 changed files with 81 additions and 24 deletions
@@ -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;
@@ -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,
@@ -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<IdeaKotlinDependency> {
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()
}
@@ -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<IdeaKotlinDependency> {
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<MetadataDependencyResolution.ChooseVisibleSourceSets>()
.flatMap { chooseVisibleSourceSets ->
val projectDependency = chooseVisibleSourceSets.projectDependency ?: return@flatMap emptyList<IdeaKotlinDependency>()
val kotlin = projectDependency.multiplatformExtensionOrNull ?: return@flatMap emptyList<IdeaKotlinDependency>()
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)
}
@@ -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<IdeaKotlinDependency> {
@@ -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,
@@ -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
)
}
@@ -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)
}
}
}
}