Fix dependsOn module names

Use Gradle Project IDs instead of names, because for composite Gradle
builds module names are appended with some additional prefixes, which
causes mismatch
This commit is contained in:
Dmitry Savvinov
2019-10-17 14:26:08 +03:00
parent b37dc32e03
commit 2c6fbb6ece
2 changed files with 28 additions and 4 deletions
@@ -7,9 +7,12 @@ package org.jetbrains.kotlin.idea.caches.project
import com.intellij.facet.FacetManager import com.intellij.facet.FacetManager
import com.intellij.facet.FacetTypeRegistry import com.intellij.facet.FacetTypeRegistry
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.externalSystem.ExternalSystemModulePropertyManager
import com.intellij.openapi.externalSystem.service.project.IdeModelsProviderImpl import com.intellij.openapi.externalSystem.service.project.IdeModelsProviderImpl
import com.intellij.openapi.module.Module import com.intellij.openapi.module.Module
import com.intellij.openapi.module.ModuleManager import com.intellij.openapi.module.ModuleManager
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.analyzer.ModuleInfo
import org.jetbrains.kotlin.caches.project.cacheInvalidatingOnRootModifications import org.jetbrains.kotlin.caches.project.cacheInvalidatingOnRootModifications
@@ -58,7 +61,11 @@ val Module.implementingModules: List<Module>
when (facetSettings?.mppVersion) { when (facetSettings?.mppVersion) {
null -> emptyList() null -> emptyList()
KotlinMultiplatformVersion.M3 -> moduleManager.modules.filter { it.facetSettings?.dependsOnModuleNames?.contains(name) == true } KotlinMultiplatformVersion.M3 -> {
val thisModuleStableName = stableModuleName
moduleManager.modules.filter { it.facetSettings?.dependsOnModuleNames?.contains(thisModuleStableName) == true }
}
KotlinMultiplatformVersion.M2 -> moduleManager.getModuleDependentModules(this).filter { KotlinMultiplatformVersion.M2 -> moduleManager.getModuleDependentModules(this).filter {
it.isNewMPPModule && it.externalProjectId == externalProjectId it.isNewMPPModule && it.externalProjectId == externalProjectId
@@ -68,6 +75,19 @@ val Module.implementingModules: List<Module>
} }
} }
private val Module.stableModuleName: String
get() = ExternalSystemModulePropertyManager.getInstance(this).getLinkedProjectId()
?: name.also {
if (!ApplicationManager.getApplication().isUnitTestMode) LOG.error("Don't have a LinkedProjectId for module $this for HMPP!")
}
private val Project.modulesByLinkedKey: Map<String, Module>
get() = cacheInvalidatingOnRootModifications {
val moduleManager = ModuleManager.getInstance(this)
moduleManager.modules.associateBy { it.stableModuleName }
}
val Module.implementedModules: List<Module> val Module.implementedModules: List<Module>
get() = cacheInvalidatingOnRootModifications { get() = cacheInvalidatingOnRootModifications {
val facetSettings = facetSettings val facetSettings = facetSettings
@@ -75,8 +95,9 @@ val Module.implementedModules: List<Module>
null -> emptyList() null -> emptyList()
KotlinMultiplatformVersion.M3 -> { KotlinMultiplatformVersion.M3 -> {
val modelsProvider = IdeModelsProviderImpl(project) facetSettings.dependsOnModuleNames.mapNotNull {
facetSettings.dependsOnModuleNames.mapNotNull { modelsProvider.findIdeModule(it) } project.modulesByLinkedKey[it]
}
} }
KotlinMultiplatformVersion.M2 -> { KotlinMultiplatformVersion.M2 -> {
@@ -34,6 +34,7 @@ import org.jetbrains.kotlin.config.ExternalSystemTestTask
import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.gradle.* import org.jetbrains.kotlin.gradle.*
import org.jetbrains.kotlin.idea.configuration.GradlePropertiesFileFacade.Companion.KOTLIN_NOT_IMPORTED_COMMON_SOURCE_SETS_SETTING import org.jetbrains.kotlin.idea.configuration.GradlePropertiesFileFacade.Companion.KOTLIN_NOT_IMPORTED_COMMON_SOURCE_SETS_SETTING
import org.jetbrains.kotlin.idea.configuration.KotlinMPPGradleProjectResolver.Companion.fullName
import org.jetbrains.kotlin.idea.platform.IdePlatformKindTooling import org.jetbrains.kotlin.idea.platform.IdePlatformKindTooling
import org.jetbrains.kotlin.util.removeSuffixIfPresent import org.jetbrains.kotlin.util.removeSuffixIfPresent
import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult
@@ -868,7 +869,9 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() {
info.gradleModuleId = getModuleId(resolverCtx, gradleModule) info.gradleModuleId = getModuleId(resolverCtx, gradleModule)
info.actualPlatforms.addSimplePlatforms(sourceSet.actualPlatforms.platforms) info.actualPlatforms.addSimplePlatforms(sourceSet.actualPlatforms.platforms)
info.isTestModule = sourceSet.isTestModule info.isTestModule = sourceSet.isTestModule
info.dependsOn = sourceSet.dependsOnSourceSets.toList().map { gradleModule.name + "_" + it } info.dependsOn = sourceSet.dependsOnSourceSets.toList().map {
getModuleId(resolverCtx, gradleModule) + ":" + it
}
//TODO(auskov): target flours are lost here //TODO(auskov): target flours are lost here
info.compilerArguments = createCompilerArguments(emptyList(), sourceSet.actualPlatforms.getSinglePlatform()).also { info.compilerArguments = createCompilerArguments(emptyList(), sourceSet.actualPlatforms.getSinglePlatform()).also {
it.multiPlatform = true it.multiPlatform = true