MPP: Implement transitive import of dependencies between source sets
This commit is contained in:
committed by
Mikhail Glukhikh
parent
49b5695664
commit
543934762e
+19
-12
@@ -5,6 +5,8 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.configuration
|
package org.jetbrains.kotlin.idea.configuration
|
||||||
|
|
||||||
|
import com.google.common.graph.GraphBuilder
|
||||||
|
import com.google.common.graph.Graphs
|
||||||
import com.intellij.openapi.externalSystem.model.DataNode
|
import com.intellij.openapi.externalSystem.model.DataNode
|
||||||
import com.intellij.openapi.externalSystem.model.ProjectKeys
|
import com.intellij.openapi.externalSystem.model.ProjectKeys
|
||||||
import com.intellij.openapi.externalSystem.model.project.*
|
import com.intellij.openapi.externalSystem.model.project.*
|
||||||
@@ -330,10 +332,12 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() {
|
|||||||
)
|
)
|
||||||
for (sourceSet in compilation.sourceSets) {
|
for (sourceSet in compilation.sourceSets) {
|
||||||
if (sourceSet.fullName() == compilation.fullName()) continue
|
if (sourceSet.fullName() == compilation.fullName()) continue
|
||||||
addDependency(dataNode, sourceSet, gradleModule, ideModule, resolverCtx)
|
val targetDataNode = getSiblingKotlinModuleData(sourceSet, gradleModule, ideModule, resolverCtx) ?: continue
|
||||||
|
addDependency(dataNode, targetDataNode)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
val sourceSetGraph = GraphBuilder.directed().build<KotlinSourceSet>()
|
||||||
processSourceSets(gradleModule, mppModel, ideModule, resolverCtx) { dataNode, sourceSet ->
|
processSourceSets(gradleModule, mppModel, ideModule, resolverCtx) { dataNode, sourceSet ->
|
||||||
dataNode.data.productionModuleId?.let {
|
dataNode.data.productionModuleId?.let {
|
||||||
val productionModuleDataNode = ideModule.findChildModuleByInternalName(it)
|
val productionModuleDataNode = ideModule.findChildModuleByInternalName(it)
|
||||||
@@ -341,6 +345,10 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() {
|
|||||||
addDependency(dataNode, productionModuleDataNode)
|
addDependency(dataNode, productionModuleDataNode)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for (targetSourceSetName in sourceSet.dependsOnSourceSets) {
|
||||||
|
val targetSourceSet = mppModel.sourceSets[targetSourceSetName] ?: continue
|
||||||
|
sourceSetGraph.putEdge(sourceSet, targetSourceSet)
|
||||||
|
}
|
||||||
if (processedModuleIds.add(getKotlinModuleId(gradleModule, sourceSet, resolverCtx))) {
|
if (processedModuleIds.add(getKotlinModuleId(gradleModule, sourceSet, resolverCtx))) {
|
||||||
buildDependencies(
|
buildDependencies(
|
||||||
resolverCtx,
|
resolverCtx,
|
||||||
@@ -351,10 +359,11 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() {
|
|||||||
ideProject
|
ideProject
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
for (targetSourceSetName in sourceSet.dependsOnSourceSets) {
|
}
|
||||||
val targetSourceSet = mppModel.sourceSets[targetSourceSetName] ?: continue
|
for (edge in Graphs.transitiveClosure(sourceSetGraph).edges()) {
|
||||||
addDependency(dataNode, targetSourceSet, gradleModule, ideModule, resolverCtx)
|
val fromDataNode = getSiblingKotlinModuleData(edge.source(), gradleModule, ideModule, resolverCtx) ?: continue
|
||||||
}
|
val toDataNode = getSiblingKotlinModuleData(edge.target(), gradleModule, ideModule, resolverCtx) ?: continue
|
||||||
|
addDependency(fromDataNode, toDataNode)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -403,16 +412,14 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() {
|
|||||||
fromModule.createChild(ProjectKeys.MODULE_DEPENDENCY, moduleDependencyData)
|
fromModule.createChild(ProjectKeys.MODULE_DEPENDENCY, moduleDependencyData)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun addDependency(
|
private fun getSiblingKotlinModuleData(
|
||||||
fromModule: DataNode<*>,
|
kotlinModule: KotlinModule,
|
||||||
toModule: KotlinModule,
|
|
||||||
gradleModule: IdeaModule,
|
gradleModule: IdeaModule,
|
||||||
ideModule: DataNode<ModuleData>,
|
ideModule: DataNode<ModuleData>,
|
||||||
resolverCtx: ProjectResolverContext
|
resolverCtx: ProjectResolverContext
|
||||||
) {
|
): DataNode<*>? {
|
||||||
val usedModuleId = getKotlinModuleId(gradleModule, toModule, resolverCtx)
|
val usedModuleId = getKotlinModuleId(gradleModule, kotlinModule, resolverCtx)
|
||||||
val usedModuleDataNode = ideModule.findChildModuleById(usedModuleId) ?: return
|
return ideModule.findChildModuleById(usedModuleId)
|
||||||
addDependency(fromModule, usedModuleDataNode)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createContentRootData(sourceDirs: Set<File>, sourceType: ExternalSystemSourceType, parentNode: DataNode<*>) {
|
private fun createContentRootData(sourceDirs: Set<File>, sourceType: ExternalSystemSourceType, parentNode: DataNode<*>) {
|
||||||
|
|||||||
Reference in New Issue
Block a user