From 619e2bc0dbc3f522f833cf1edee4713b14d092df Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Fri, 14 Sep 2018 17:24:40 +0300 Subject: [PATCH] MPP: Allow 'implements' relation only within the same Gradle project Also allow COMMON modules on the "implementer" side --- .../kotlin/idea/caches/project/multiplatformUtil.kt | 9 +++++++-- .../kotlin/idea/configuration/KotlinMPPDataNodes.kt | 1 + .../idea/configuration/KotlinMPPGradleProjectResolver.kt | 2 ++ .../idea/configuration/KotlinSourceSetDataService.kt | 2 ++ .../org/jetbrains/kotlin/config/KotlinFacetSettings.kt | 2 ++ .../org/jetbrains/kotlin/config/facetSerialization.kt | 4 ++++ 6 files changed, 18 insertions(+), 2 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/multiplatformUtil.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/multiplatformUtil.kt index 4b8df2299eb..8bab4f82c58 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/multiplatformUtil.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/multiplatformUtil.kt @@ -28,6 +28,9 @@ import org.jetbrains.kotlin.resolve.TargetPlatform val Module.isNewMPPModule: Boolean get() = KotlinFacet.get(this)?.configuration?.settings?.kind?.isNewMPP ?: false +val Module.externalProjectId: String + get() = KotlinFacet.get(this)?.configuration?.settings?.externalProjectId ?: "" + val Module.isMPPModule: Boolean get() { val settings = KotlinFacet.get(this)?.configuration?.settings ?: return false @@ -42,7 +45,7 @@ val Module.implementingModules: List CachedValueProvider.Result( if (isNewMPPModule) { moduleManager.getModuleDependentModules(this).filter { - it.isNewMPPModule && it.platform !is CommonIdePlatformKind.Platform + it.isNewMPPModule && it.externalProjectId == externalProjectId } } else { moduleManager.modules.filter { name in it.findOldFashionedImplementedModuleNames() } @@ -56,7 +59,9 @@ val Module.implementedModules: List CachedValueProvider { CachedValueProvider.Result( if (isNewMPPModule) { - rootManager.dependencies.filter { it.isNewMPPModule && it.platform is CommonIdePlatformKind.Platform } + rootManager.dependencies.filter { + it.isNewMPPModule && it.platform is CommonIdePlatformKind.Platform && it.externalProjectId == externalProjectId + } } else { val modelsProvider = IdeModelsProviderImpl(project) findOldFashionedImplementedModuleNames().mapNotNull { modelsProvider.findIdeModule(it) } 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 741b2e12ee2..5b0839e32d2 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 @@ -29,6 +29,7 @@ var DataNode.kotlinAndroidSourceSets: List? class KotlinSourceSetInfo(val kotlinModule: KotlinModule) { var moduleId: String? = null + var gradleModuleId: String = "" var platform: KotlinPlatform = KotlinPlatform.COMMON var defaultCompilerArguments: CommonCompilerArguments? = null var compilerArguments: CommonCompilerArguments? = null 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 68b286e8135..98c83a81b9f 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 @@ -619,6 +619,7 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() { return KotlinSourceSetInfo(sourceSet).also { info -> val languageSettings = sourceSet.languageSettings info.moduleId = getKotlinModuleId(gradleModule, sourceSet, resolverCtx) + info.gradleModuleId = getModuleId(resolverCtx, gradleModule) info.platform = sourceSet.platform info.isTestModule = sourceSet.isTestModule info.compilerArguments = createCompilerArguments(emptyList(), sourceSet.platform).also { @@ -642,6 +643,7 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() { ): KotlinSourceSetInfo { return KotlinSourceSetInfo(compilation).also { sourceSetInfo -> sourceSetInfo.moduleId = getKotlinModuleId(gradleModule, compilation, resolverCtx) + sourceSetInfo.gradleModuleId = getModuleId(resolverCtx, gradleModule) sourceSetInfo.platform = compilation.platform sourceSetInfo.isTestModule = compilation.isTestModule sourceSetInfo.compilerArguments = createCompilerArguments(compilation.arguments.currentArguments, compilation.platform).also { diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinSourceSetDataService.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinSourceSetDataService.kt index 103c67a7d58..ae5acbda5de 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinSourceSetDataService.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinSourceSetDataService.kt @@ -119,6 +119,8 @@ class KotlinSourceSetDataService : AbstractProjectDataService val node = mainModuleNode.findChildModuleById(sourceSetId) ?: return@mapNotNull null val data = node.data as? ModuleData ?: return@mapNotNull null diff --git a/idea/idea-jps-common/src/org/jetbrains/kotlin/config/KotlinFacetSettings.kt b/idea/idea-jps-common/src/org/jetbrains/kotlin/config/KotlinFacetSettings.kt index 14c0d2f3136..912246c6457 100644 --- a/idea/idea-jps-common/src/org/jetbrains/kotlin/config/KotlinFacetSettings.kt +++ b/idea/idea-jps-common/src/org/jetbrains/kotlin/config/KotlinFacetSettings.kt @@ -216,6 +216,8 @@ class KotlinFacetSettings { var kind: KotlinModuleKind = KotlinModuleKind.DEFAULT var sourceSetNames: List = emptyList() var isTestModule: Boolean = false + + var externalProjectId: String = "" } interface KotlinFacetSettingsProvider { diff --git a/idea/idea-jps-common/src/org/jetbrains/kotlin/config/facetSerialization.kt b/idea/idea-jps-common/src/org/jetbrains/kotlin/config/facetSerialization.kt index 33eb65f939a..d0480dfbcc5 100644 --- a/idea/idea-jps-common/src/org/jetbrains/kotlin/config/facetSerialization.kt +++ b/idea/idea-jps-common/src/org/jetbrains/kotlin/config/facetSerialization.kt @@ -132,6 +132,7 @@ private fun readV2AndLaterConfig(element: Element): KotlinFacetSettings { } else null } ?: KotlinModuleKind.DEFAULT isTestModule = element.getAttributeValue("isTestModule")?.toBoolean() ?: false + externalProjectId = element.getAttributeValue("externalProjectId") ?: "" element.getChild("compilerSettings")?.let { compilerSettings = CompilerSettings() XmlSerializer.deserializeInto(compilerSettings!!, it) @@ -292,6 +293,9 @@ private fun KotlinFacetSettings.writeLatestConfig(element: Element) { element.addContent(Element("newMppModelJpsModuleKind").apply { addContent(kind.name) }) element.setAttribute("isTestModule", isTestModule.toString()) } + if (externalProjectId.isNotEmpty()) { + element.setAttribute("externalProjectId", externalProjectId) + } productionOutputPath?.let { if (it != (compilerArguments as? K2JSCompilerArguments)?.outputFile) { element.addContent(Element("productionOutputPath").apply { addContent(PathUtil.toSystemIndependentName(it)) })