diff --git a/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt b/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt index beb1378214a..f60aa368ece 100644 --- a/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt +++ b/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt @@ -24,6 +24,7 @@ import org.jetbrains.jps.model.module.JpsModuleSourceRootType import org.jetbrains.kotlin.gradle.KotlinCompilation import org.jetbrains.kotlin.gradle.KotlinPlatform import org.jetbrains.kotlin.idea.configuration.KotlinSourceSetDataService +import org.jetbrains.kotlin.idea.configuration.kotlinAndroidSourceSets import java.io.File class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService() { diff --git a/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt.173 b/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt.173 index c9a5dbd31e4..30b882d2c3f 100644 --- a/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt.173 +++ b/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt.173 @@ -22,6 +22,7 @@ import org.jetbrains.jps.model.module.JpsModuleSourceRootType import org.jetbrains.kotlin.gradle.KotlinCompilation import org.jetbrains.kotlin.gradle.KotlinPlatform import org.jetbrains.kotlin.idea.configuration.KotlinSourceSetDataService +import org.jetbrains.kotlin.idea.configuration.kotlinAndroidSourceSets import java.io.File class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService() { diff --git a/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt.181 b/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt.181 index aca8ec484b5..35268fcb4a4 100644 --- a/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt.181 +++ b/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt.181 @@ -24,6 +24,7 @@ import org.jetbrains.jps.model.module.JpsModuleSourceRootType import org.jetbrains.kotlin.gradle.KotlinCompilation import org.jetbrains.kotlin.gradle.KotlinPlatform import org.jetbrains.kotlin.idea.configuration.KotlinSourceSetDataService +import org.jetbrains.kotlin.idea.configuration.kotlinAndroidSourceSets import java.io.File class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService() { diff --git a/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt.as31 b/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt.as31 index e17cc00e164..d4762f42b05 100644 --- a/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt.as31 +++ b/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt.as31 @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.gradle.KotlinCompilation import org.jetbrains.kotlin.gradle.KotlinPlatform import org.jetbrains.kotlin.idea.configuration.kotlinSourceSet import org.jetbrains.kotlin.idea.configuration.KotlinSourceSetDataService +import org.jetbrains.kotlin.idea.configuration.kotlinAndroidSourceSets import org.jetbrains.plugins.gradle.model.data.GradleSourceSetData import java.io.File diff --git a/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt.as32 b/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt.as32 index beb1378214a..f60aa368ece 100644 --- a/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt.as32 +++ b/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt.as32 @@ -24,6 +24,7 @@ import org.jetbrains.jps.model.module.JpsModuleSourceRootType import org.jetbrains.kotlin.gradle.KotlinCompilation import org.jetbrains.kotlin.gradle.KotlinPlatform import org.jetbrains.kotlin.idea.configuration.KotlinSourceSetDataService +import org.jetbrains.kotlin.idea.configuration.kotlinAndroidSourceSets import java.io.File class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService() { diff --git a/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidMPPGradleProjectResolver.kt b/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidMPPGradleProjectResolver.kt index 011ff1f2b7b..0fa024b27c7 100644 --- a/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidMPPGradleProjectResolver.kt +++ b/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidMPPGradleProjectResolver.kt @@ -15,21 +15,16 @@ import com.intellij.openapi.externalSystem.model.project.ProjectData import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil import com.intellij.openapi.externalSystem.util.ExternalSystemConstants import com.intellij.openapi.externalSystem.util.Order -import com.intellij.openapi.util.Key import org.gradle.tooling.model.idea.IdeaModule import org.jetbrains.kotlin.gradle.KotlinMPPGradleModel import org.jetbrains.kotlin.gradle.KotlinMPPGradleModelBuilder import org.jetbrains.kotlin.gradle.KotlinPlatform import org.jetbrains.kotlin.idea.configuration.KotlinMPPGradleProjectResolver -import org.jetbrains.kotlin.idea.configuration.KotlinSourceSetInfo +import org.jetbrains.kotlin.idea.configuration.kotlinAndroidSourceSets import org.jetbrains.kotlin.idea.configuration.kotlinSourceSet -import org.jetbrains.kotlin.idea.util.CopyableDataNodeUserDataProperty import org.jetbrains.plugins.gradle.model.data.GradleSourceSetData import org.jetbrains.plugins.gradle.service.project.AbstractProjectResolverExtension -var DataNode.kotlinAndroidSourceSets: List? - by CopyableDataNodeUserDataProperty(Key.create("ANDROID_COMPILATIONS")) - @Order(ExternalSystemConstants.UNORDERED - 1) class KotlinAndroidMPPGradleProjectResolver : AbstractProjectResolverExtension() { private val isAndroidProject by lazy { diff --git a/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidMPPGradleProjectResolver.kt.173 b/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidMPPGradleProjectResolver.kt.173 index 14628cdbf47..f2b8ff3ca43 100644 --- a/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidMPPGradleProjectResolver.kt.173 +++ b/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidMPPGradleProjectResolver.kt.173 @@ -15,21 +15,16 @@ import com.intellij.openapi.externalSystem.model.project.ProjectData import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil import com.intellij.openapi.externalSystem.util.ExternalSystemConstants import com.intellij.openapi.externalSystem.util.Order -import com.intellij.openapi.util.Key import org.gradle.tooling.model.idea.IdeaModule import org.jetbrains.kotlin.gradle.KotlinMPPGradleModel import org.jetbrains.kotlin.gradle.KotlinMPPGradleModelBuilder import org.jetbrains.kotlin.gradle.KotlinPlatform import org.jetbrains.kotlin.idea.configuration.KotlinMPPGradleProjectResolver -import org.jetbrains.kotlin.idea.configuration.KotlinSourceSetInfo +import org.jetbrains.kotlin.idea.configuration.kotlinAndroidSourceSets import org.jetbrains.kotlin.idea.configuration.kotlinSourceSet -import org.jetbrains.kotlin.idea.util.CopyableDataNodeUserDataProperty import org.jetbrains.plugins.gradle.model.data.GradleSourceSetData import org.jetbrains.plugins.gradle.service.project.AbstractProjectResolverExtension -var DataNode.kotlinAndroidSourceSets: List? - by CopyableDataNodeUserDataProperty(Key.create("ANDROID_COMPILATIONS")) - @Order(ExternalSystemConstants.UNORDERED - 1) class KotlinAndroidMPPGradleProjectResolver : AbstractProjectResolverExtension() { private val isAndroidProject by lazy { diff --git a/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidMPPGradleProjectResolver.kt.as31 b/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidMPPGradleProjectResolver.kt.as31 index 011ff1f2b7b..0fa024b27c7 100644 --- a/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidMPPGradleProjectResolver.kt.as31 +++ b/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidMPPGradleProjectResolver.kt.as31 @@ -15,21 +15,16 @@ import com.intellij.openapi.externalSystem.model.project.ProjectData import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil import com.intellij.openapi.externalSystem.util.ExternalSystemConstants import com.intellij.openapi.externalSystem.util.Order -import com.intellij.openapi.util.Key import org.gradle.tooling.model.idea.IdeaModule import org.jetbrains.kotlin.gradle.KotlinMPPGradleModel import org.jetbrains.kotlin.gradle.KotlinMPPGradleModelBuilder import org.jetbrains.kotlin.gradle.KotlinPlatform import org.jetbrains.kotlin.idea.configuration.KotlinMPPGradleProjectResolver -import org.jetbrains.kotlin.idea.configuration.KotlinSourceSetInfo +import org.jetbrains.kotlin.idea.configuration.kotlinAndroidSourceSets import org.jetbrains.kotlin.idea.configuration.kotlinSourceSet -import org.jetbrains.kotlin.idea.util.CopyableDataNodeUserDataProperty import org.jetbrains.plugins.gradle.model.data.GradleSourceSetData import org.jetbrains.plugins.gradle.service.project.AbstractProjectResolverExtension -var DataNode.kotlinAndroidSourceSets: List? - by CopyableDataNodeUserDataProperty(Key.create("ANDROID_COMPILATIONS")) - @Order(ExternalSystemConstants.UNORDERED - 1) class KotlinAndroidMPPGradleProjectResolver : AbstractProjectResolverExtension() { private val isAndroidProject by lazy { diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinMPPDataNodes.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinMPPDataNodes.kt index b414ec1a4ba..741b2e12ee2 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinMPPDataNodes.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinMPPDataNodes.kt @@ -13,7 +13,6 @@ import com.intellij.openapi.util.Key import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments import org.jetbrains.kotlin.gradle.KotlinModule import org.jetbrains.kotlin.gradle.KotlinPlatform -import org.jetbrains.kotlin.gradle.KotlinSourceSet import org.jetbrains.kotlin.idea.util.CopyableDataNodeUserDataProperty import org.jetbrains.plugins.gradle.util.GradleConstants import java.io.File @@ -25,6 +24,9 @@ var DataNode.kotlinSourceSet: KotlinSourceSetInfo? var DataNode.kotlinTargetDataNode: DataNode? by CopyableDataNodeUserDataProperty(Key.create("KOTLIN_TARGET_DATA_NODE")) +var DataNode.kotlinAndroidSourceSets: List? + by CopyableDataNodeUserDataProperty(Key.create("ANDROID_COMPILATIONS")) + class KotlinSourceSetInfo(val kotlinModule: KotlinModule) { var moduleId: String? = null var platform: KotlinPlatform = KotlinPlatform.COMMON @@ -32,7 +34,7 @@ class KotlinSourceSetInfo(val kotlinModule: KotlinModule) { var compilerArguments: CommonCompilerArguments? = null var dependencyClasspath: List = emptyList() var isTestModule: Boolean = false - var sourceSetIdsByName: Map = emptyMap() + var sourceSetIdsByName: MutableMap = LinkedHashMap() } class KotlinTargetData(name: String) : AbstractNamedData(GradleConstants.SYSTEM_ID, name) { 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 fe5d09322ff..68b286e8135 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 @@ -299,6 +299,7 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() { ) { val mppModel = resolverCtx.getExtraProject(gradleModule, KotlinMPPGradleModel::class.java) ?: return processSourceSets(gradleModule, mppModel, ideModule, resolverCtx) { dataNode, sourceSet -> + if (dataNode == null || sourceSet.platform == KotlinPlatform.ANDROID) return@processSourceSets createContentRootData(sourceSet.sourceDirs, sourceSet.sourceType, dataNode) createContentRootData(sourceSet.resourceDirs, sourceSet.resourceType, dataNode) } @@ -346,7 +347,9 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() { val sourceSetGraph = GraphBuilder.directed().build() processSourceSets(gradleModule, mppModel, ideModule, resolverCtx) { dataNode, sourceSet -> sourceSetGraph.addNode(sourceSet) - val productionSourceSet = dataNode.data.productionModuleId + val productionSourceSet = dataNode + ?.data + ?.productionModuleId ?.let { ideModule.findChildModuleByInternalName(it) } ?.kotlinSourceSet ?.kotlinModule @@ -361,21 +364,29 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() { } val closedSourceSetGraph = Graphs.transitiveClosure(sourceSetGraph) for (sourceSet in closedSourceSetGraph.nodes()) { - val fromDataNode = getSiblingKotlinModuleData(sourceSet, gradleModule, ideModule, resolverCtx) ?: continue + val isAndroid = sourceSet.platform == KotlinPlatform.ANDROID + val fromDataNode = if (isAndroid) { + ideModule + } else { + getSiblingKotlinModuleData(sourceSet, gradleModule, ideModule, resolverCtx) + } ?: continue val dependeeSourceSets = closedSourceSetGraph.successors(sourceSet) + val sourceSetInfo = if (isAndroid) { + ideModule.kotlinAndroidSourceSets?.firstOrNull { + (it.kotlinModule as? KotlinCompilation)?.sourceSets?.contains(sourceSet) ?: false + } + } else { + fromDataNode.kotlinSourceSet + } + if (sourceSetInfo != null && sourceSetInfo.kotlinModule is KotlinCompilation) { + val selfName = sourceSetInfo.kotlinModule.fullName() + sourceSetInfo.addSourceSets(dependeeSourceSets, selfName, gradleModule, resolverCtx) + } + if (sourceSet.platform == KotlinPlatform.ANDROID) continue for (dependeeSourceSet in dependeeSourceSets) { val toDataNode = getSiblingKotlinModuleData(dependeeSourceSet, gradleModule, ideModule, resolverCtx) ?: continue addDependency(fromDataNode, toDataNode) } - val sourceSetInfo = fromDataNode.kotlinSourceSet - if (sourceSetInfo != null && sourceSetInfo.kotlinModule is KotlinCompilation) { - val selfName = sourceSetInfo.kotlinModule.fullName() - sourceSetInfo.sourceSetIdsByName = dependeeSourceSets - .asSequence() - .filter { it.fullName() != selfName } - .map { it.name to getKotlinModuleId(gradleModule, it, resolverCtx) } - .toMap() - } if (processedModuleIds.add(getKotlinModuleId(gradleModule, sourceSet, resolverCtx))) { val mergedDependencies = LinkedHashSet().apply { addAll(sourceSet.dependencies) @@ -477,7 +488,7 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() { mppModel: KotlinMPPGradleModel, ideModule: DataNode, resolverCtx: ProjectResolverContext, - processor: (DataNode, KotlinSourceSet) -> Unit + processor: (DataNode?, KotlinSourceSet) -> Unit ) { val sourceSetsMap = HashMap>() for (dataNode in ExternalSystemApiUtil.findAll(ideModule, GradleSourceSetData.KEY)) { @@ -486,9 +497,8 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() { } } for (sourceSet in mppModel.sourceSets.values) { - if (sourceSet.platform == KotlinPlatform.ANDROID) continue val moduleId = getKotlinModuleId(gradleModule, sourceSet, resolverCtx) - val moduleDataNode = sourceSetsMap[moduleId] ?: continue + val moduleDataNode = sourceSetsMap[moduleId] processor(moduleDataNode, sourceSet) } } @@ -630,18 +640,31 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() { gradleModule: IdeaModule, resolverCtx: ProjectResolverContext ): KotlinSourceSetInfo { - return KotlinSourceSetInfo(compilation).also { - it.moduleId = getKotlinModuleId(gradleModule, compilation, resolverCtx) - it.platform = compilation.platform - it.isTestModule = compilation.isTestModule - it.compilerArguments = createCompilerArguments(compilation.arguments.currentArguments, compilation.platform).also { + return KotlinSourceSetInfo(compilation).also { sourceSetInfo -> + sourceSetInfo.moduleId = getKotlinModuleId(gradleModule, compilation, resolverCtx) + sourceSetInfo.platform = compilation.platform + sourceSetInfo.isTestModule = compilation.isTestModule + sourceSetInfo.compilerArguments = createCompilerArguments(compilation.arguments.currentArguments, compilation.platform).also { it.multiPlatform = true } - it.dependencyClasspath = compilation.dependencyClasspath - it.defaultCompilerArguments = createCompilerArguments(compilation.arguments.defaultArguments, compilation.platform) + sourceSetInfo.dependencyClasspath = compilation.dependencyClasspath + sourceSetInfo.defaultCompilerArguments = createCompilerArguments(compilation.arguments.defaultArguments, compilation.platform) + sourceSetInfo.addSourceSets(compilation.sourceSets, compilation.fullName(), gradleModule, resolverCtx) } } + private fun KotlinSourceSetInfo.addSourceSets( + sourceSets: Collection, + selfName: String, + gradleModule: IdeaModule, + resolverCtx: ProjectResolverContext + ) { + sourceSets + .asSequence() + .filter { it.fullName() != selfName } + .forEach { sourceSetIdsByName[it.name] = getKotlinModuleId(gradleModule, it, resolverCtx) } + } + private fun createCompilerArguments(args: List, platform: KotlinPlatform): CommonCompilerArguments { val compilerArguments = IdePlatformKindTooling.getTooling(platform).kind.argumentsClass.newInstance() parseCommandLineArguments(args, compilerArguments)