From 358b7ca1d12f7e02f5f475bb3be68745839b96dd Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Wed, 5 Sep 2018 18:39:47 +0300 Subject: [PATCH] MPP: Import library dependencies of transitive dependee source sets #KT-26369 Fixed --- .../KotlinMPPGradleProjectResolver.kt | 43 +++++++++---------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinMPPGradleProjectResolver.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinMPPGradleProjectResolver.kt index bf6127a9c8d..4b1fecba0b2 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinMPPGradleProjectResolver.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinMPPGradleProjectResolver.kt @@ -332,7 +332,7 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() { sourceSetMap, artifactsMap, dataNode, - preprocessDependencies(compilation, ideProject), + preprocessDependencies(compilation.dependencies, ideProject), ideProject ) for (sourceSet in compilation.sourceSets) { @@ -344,50 +344,49 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() { } val sourceSetGraph = GraphBuilder.directed().build() processSourceSets(gradleModule, mppModel, ideModule, resolverCtx) { dataNode, sourceSet -> + sourceSetGraph.addNode(sourceSet) val productionSourceSet = dataNode.data.productionModuleId ?.let { ideModule.findChildModuleByInternalName(it) } ?.kotlinSourceSet ?.kotlinModule if (productionSourceSet != null) { - sourceSetGraph.putEdge(sourceSet, productionSourceSet!!) + sourceSetGraph.putEdge(sourceSet, productionSourceSet) } for (targetSourceSetName in sourceSet.dependsOnSourceSets) { val targetSourceSet = mppModel.sourceSets[targetSourceSetName] ?: continue sourceSetGraph.putEdge(sourceSet, targetSourceSet) } + } + val closedSourceSetGraph = Graphs.transitiveClosure(sourceSetGraph) + for (sourceSet in closedSourceSetGraph.nodes()) { + val fromDataNode = getSiblingKotlinModuleData(sourceSet, gradleModule, ideModule, resolverCtx) ?: continue + val dependeeSourceSets = closedSourceSetGraph.successors(sourceSet) + for (dependeeSourceSet in dependeeSourceSets) { + val toDataNode = getSiblingKotlinModuleData(dependeeSourceSet, gradleModule, ideModule, resolverCtx) ?: continue + addDependency(fromDataNode, toDataNode) + } if (processedModuleIds.add(getKotlinModuleId(gradleModule, sourceSet, resolverCtx))) { + val mergedDependencies = LinkedHashSet().apply { + addAll(sourceSet.dependencies) + dependeeSourceSets.flatMapTo(this) { it.dependencies } + } buildDependencies( resolverCtx, sourceSetMap, artifactsMap, - dataNode, - preprocessDependencies(sourceSet, ideProject), + fromDataNode, + preprocessDependencies(mergedDependencies, ideProject), ideProject ) - if (productionSourceSet != null) { - buildDependencies( - resolverCtx, - sourceSetMap, - artifactsMap, - dataNode, - preprocessDependencies(productionSourceSet, ideProject), - ideProject - ) - } } } - for (edge in Graphs.transitiveClosure(sourceSetGraph).edges()) { - val fromDataNode = getSiblingKotlinModuleData(edge.source(), gradleModule, ideModule, resolverCtx) ?: continue - val toDataNode = getSiblingKotlinModuleData(edge.target(), gradleModule, ideModule, resolverCtx) ?: continue - addDependency(fromDataNode, toDataNode) - } } private fun preprocessDependencies( - kotlinModule: KotlinModule, + dependencies: Set, ideProject: DataNode ): List { - return kotlinModule.dependencies + return dependencies .groupBy { it.id } .mapValues { it.value.firstOrNull { it.scope == "COMPILE" } ?: it.value.lastOrNull() } .values @@ -433,7 +432,7 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() { gradleModule: IdeaModule, ideModule: DataNode, resolverCtx: ProjectResolverContext - ): DataNode<*>? { + ): DataNode? { val usedModuleId = getKotlinModuleId(gradleModule, kotlinModule, resolverCtx) return ideModule.findChildModuleById(usedModuleId) }