diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/run/KotlinMultiplatformJUnitRecognizer.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/run/KotlinMultiplatformJUnitRecognizer.kt index 3df59c32baf..fd0b61faf23 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/run/KotlinMultiplatformJUnitRecognizer.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/run/KotlinMultiplatformJUnitRecognizer.kt @@ -26,7 +26,7 @@ import org.jetbrains.kotlin.descriptors.TypeAliasDescriptor import org.jetbrains.kotlin.descriptors.annotations.AnnotationWithTarget import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.findModuleDescriptor -import org.jetbrains.kotlin.idea.facet.findImplementingDescriptors +import org.jetbrains.kotlin.idea.facet.implementingDescriptors import org.jetbrains.kotlin.idea.highlighter.markers.actualsFor import org.jetbrains.kotlin.idea.project.targetPlatform import org.jetbrains.kotlin.idea.util.module @@ -41,7 +41,7 @@ class KotlinMultiplatformJUnitRecognizer : JUnitRecognizer() { if (origin.module?.targetPlatform !is TargetPlatformKind.Common) return false val moduleDescriptor = origin.containingKtFile.findModuleDescriptor() - val implModules = moduleDescriptor.findImplementingDescriptors() + val implModules = moduleDescriptor.implementingDescriptors if (implModules.isEmpty()) return false val bindingContext = origin.analyze(BodyResolveMode.PARTIAL) diff --git a/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt b/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt index ccf163d2ef8..c370b7dd9ab 100644 --- a/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt @@ -25,8 +25,10 @@ import com.intellij.openapi.projectRoots.JavaSdkVersion import com.intellij.openapi.projectRoots.ProjectJdkTable import com.intellij.openapi.roots.ModuleRootManager import com.intellij.openapi.roots.ModuleRootModel +import com.intellij.openapi.roots.ProjectRootModificationTracker import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.util.text.StringUtil +import com.intellij.psi.util.CachedValueProvider import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.caches.resolve.KotlinCacheService import org.jetbrains.kotlin.cli.common.arguments.* @@ -128,11 +130,9 @@ private fun Module.findImplementingModules(modelsProvider: IdeModifiableModelsPr } } -fun ModuleDescriptor.findImplementingDescriptors(): List { - val moduleSourceInfo = getCapability(ModuleInfo.Capability) as? ModuleSourceInfo ?: return emptyList() - val module = moduleSourceInfo.module - val modelsProvider = IdeModifiableModelsProviderImpl(module.project) - val implementingModules = module.findImplementingModules(modelsProvider) +private fun Module.findImplementingDescriptors(moduleSourceInfo: ModuleSourceInfo): List { + val modelsProvider = IdeModifiableModelsProviderImpl(project) + val implementingModules = findImplementingModules(modelsProvider) return implementingModules.mapNotNull { val implementingModuleInfo = when (moduleSourceInfo) { is ModuleProductionSourceInfo -> it.productionSourceInfo() @@ -140,11 +140,23 @@ fun ModuleDescriptor.findImplementingDescriptors(): List { else -> null } implementingModuleInfo?.let { - KotlinCacheService.getInstance(module.project).getResolutionFacadeByModuleInfo(it, it.platform)?.moduleDescriptor + KotlinCacheService.getInstance(project).getResolutionFacadeByModuleInfo(it, it.platform)?.moduleDescriptor } } } +val ModuleDescriptor.implementingDescriptors: List + get() { + val moduleSourceInfo = getCapability(ModuleInfo.Capability) as? ModuleSourceInfo ?: return emptyList() + val module = moduleSourceInfo.module + return module.cached(CachedValueProvider { + CachedValueProvider.Result( + module.findImplementingDescriptors(moduleSourceInfo), + ProjectRootModificationTracker.getInstance(module.project) + ) + }) + } + fun Module.getOrCreateFacet(modelsProvider: IdeModifiableModelsProvider, useProjectSettings: Boolean, commitModel: Boolean = false): KotlinFacet { diff --git a/idea/src/org/jetbrains/kotlin/idea/highlighter/PlatformExpectedAnnotator.kt b/idea/src/org/jetbrains/kotlin/idea/highlighter/PlatformExpectedAnnotator.kt index a57b522eab8..4ccb08c6fca 100644 --- a/idea/src/org/jetbrains/kotlin/idea/highlighter/PlatformExpectedAnnotator.kt +++ b/idea/src/org/jetbrains/kotlin/idea/highlighter/PlatformExpectedAnnotator.kt @@ -23,7 +23,7 @@ import org.jetbrains.kotlin.caches.resolve.KotlinCacheService import org.jetbrains.kotlin.descriptors.MemberDescriptor import org.jetbrains.kotlin.idea.caches.resolve.findModuleDescriptor import org.jetbrains.kotlin.idea.core.toDescriptor -import org.jetbrains.kotlin.idea.facet.findImplementingDescriptors +import org.jetbrains.kotlin.idea.facet.implementingDescriptors import org.jetbrains.kotlin.idea.project.TargetPlatformDetector import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtDeclaration @@ -41,7 +41,7 @@ class PlatformExpectedAnnotator : Annotator { if (TargetPlatformDetector.getPlatform(declaration.containingKtFile) !is TargetPlatform.Common) return - val implementingModules = declaration.findModuleDescriptor().findImplementingDescriptors() + val implementingModules = declaration.findModuleDescriptor().implementingDescriptors if (implementingModules.isEmpty()) return val descriptor = declaration.toDescriptor() as? MemberDescriptor ?: return diff --git a/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/HasActualMarker.kt b/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/HasActualMarker.kt index ace7b71a986..c578bb1bce9 100644 --- a/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/HasActualMarker.kt +++ b/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/HasActualMarker.kt @@ -22,7 +22,7 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.idea.caches.resolve.findModuleDescriptor import org.jetbrains.kotlin.idea.caches.resolve.unsafeResolveToDescriptor import org.jetbrains.kotlin.idea.core.toDescriptor -import org.jetbrains.kotlin.idea.facet.findImplementingDescriptors +import org.jetbrains.kotlin.idea.facet.implementingDescriptors import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.MultiTargetPlatform @@ -48,7 +48,7 @@ fun getPlatformActualTooltip(declaration: KtDeclaration): String? { val descriptor = declaration.toDescriptor() as? MemberDescriptor ?: return null val commonModuleDescriptor = declaration.containingKtFile.findModuleDescriptor() - val platformModulesWithActuals = commonModuleDescriptor.findImplementingDescriptors().filter { + val platformModulesWithActuals = commonModuleDescriptor.implementingDescriptors.filter { it.hasActualsFor(descriptor) } if (platformModulesWithActuals.isEmpty()) return null @@ -74,7 +74,7 @@ private fun DeclarationDescriptor.actualsForExpected(): Collection