From 3b7fbeb71b1b8a5387eca341ca3fe430b83a221a Mon Sep 17 00:00:00 2001 From: Dmitry Savvinov Date: Fri, 24 Apr 2020 16:22:54 +0300 Subject: [PATCH] Fallback to M2-implementation of dependsOn in AS + M3 ^KT-33809 --- .../idea/caches/project/multiplatformUtil.kt | 49 ++++++++++++++----- 1 file changed, 36 insertions(+), 13 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 796968c7d4a..fd2d62b5200 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 @@ -56,6 +56,12 @@ private val Module.facetSettings get() = KotlinFacet.get(this)?.configuration?.s val Module.implementingModules: List get() = cacheInvalidatingOnRootModifications { + fun Module.implementingModulesM2(moduleManager: ModuleManager): List { + return moduleManager.getModuleDependentModules(this).filter { + it.isNewMPPModule && it.externalProjectId == externalProjectId + } + } + val moduleManager = ModuleManager.getInstance(project) when (facetSettings?.mppVersion) { @@ -63,13 +69,19 @@ val Module.implementingModules: List KotlinMultiplatformVersion.M3 -> { val thisModuleStableName = stableModuleName + val result = mutableSetOf() + moduleManager.modules.filterTo(result) { it.facetSettings?.dependsOnModuleNames?.contains(thisModuleStableName) == true } - moduleManager.modules.filter { it.facetSettings?.dependsOnModuleNames?.contains(thisModuleStableName) == true } + // HACK: we do not import proper dependsOn for android source-sets in M3, + // so add all Android modules that M2-implemention would've added, + // to at least not make things worse. + // See KT-33809 for details + implementingModulesM2(moduleManager).forEach { if (it !in result && it.isAndroidModule()) result += it } + + result.toList() } - KotlinMultiplatformVersion.M2 -> moduleManager.getModuleDependentModules(this).filter { - it.isNewMPPModule && it.externalProjectId == externalProjectId - } + KotlinMultiplatformVersion.M2 -> implementingModulesM2(moduleManager) KotlinMultiplatformVersion.M1 -> moduleManager.modules.filter { name in it.findOldFashionedImplementedModuleNames() } } @@ -90,24 +102,35 @@ private val Project.modulesByLinkedKey: Map val Module.implementedModules: List get() = cacheInvalidatingOnRootModifications { + fun Module.implementedModulesM2(): List { + return rootManager.dependencies.filter { + // TODO: remove additional android check + it.isNewMPPModule && + it.platform.isCommon() && + it.externalProjectId == externalProjectId && + (isAndroidModule() || it.isTestModule == isTestModule) + } + } + val facetSettings = facetSettings when (facetSettings?.mppVersion) { null -> emptyList() KotlinMultiplatformVersion.M3 -> { - facetSettings.dependsOnModuleNames.mapNotNull { - project.modulesByLinkedKey[it] + if (isAndroidModule()) { + // HACK: we do not import proper dependsOn for android source-sets in M3, so fallback to M2-impl + // to at least not make things worse. + // See KT-33809 for details + implementedModulesM2() + } else { + facetSettings.dependsOnModuleNames.mapNotNull { + project.modulesByLinkedKey[it] + } } } KotlinMultiplatformVersion.M2 -> { - rootManager.dependencies.filter { - // TODO: remove additional android check - it.isNewMPPModule && - it.platform.isCommon() && - it.externalProjectId == externalProjectId && - (isAndroidModule() || it.isTestModule == isTestModule) - } + implementedModulesM2() } KotlinMultiplatformVersion.M1 -> {