From 9b296513718dba1abd1d211a70944e666041cb24 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 20 Aug 2018 12:06:06 +0300 Subject: [PATCH] Has actual (new MPP): handle possible actual in "common" module Before this commit, we assumed all actual declarations are in platform modules, and each platform has no more than one actual. In new MPP, actual declarations can be also in common code, and each platform as well as common code can include more than one actual declarations for given expected. #KT-26217 Fixed --- .../highlighter/markers/HasActualMarker.kt | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) 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 fef9c813622..861ba641c48 100644 --- a/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/HasActualMarker.kt +++ b/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/HasActualMarker.kt @@ -19,29 +19,34 @@ package org.jetbrains.kotlin.idea.highlighter.markers import com.intellij.codeInsight.daemon.impl.PsiElementListNavigator import com.intellij.ide.util.DefaultPsiElementCellRenderer import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.descriptors.MemberDescriptor -import org.jetbrains.kotlin.idea.caches.project.implementingDescriptors -import org.jetbrains.kotlin.idea.caches.resolve.findModuleDescriptor import org.jetbrains.kotlin.idea.core.toDescriptor import org.jetbrains.kotlin.idea.util.actualsForExpected -import org.jetbrains.kotlin.idea.util.hasActualsFor import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.resolve.MultiTargetPlatform +import org.jetbrains.kotlin.resolve.descriptorUtil.module import org.jetbrains.kotlin.resolve.getMultiTargetPlatform import java.awt.event.MouseEvent fun getPlatformActualTooltip(declaration: KtDeclaration?): String? { - val descriptor = declaration?.toDescriptor() as? MemberDescriptor ?: return null - val commonModuleDescriptor = declaration.containingKtFile.findModuleDescriptor() + val actualDeclarations = declaration?.actualsForExpected() ?: return null + if (actualDeclarations.isEmpty()) return null - val platformModulesWithActuals = commonModuleDescriptor.implementingDescriptors.filter { - it.hasActualsFor(descriptor) - } - if (platformModulesWithActuals.isEmpty()) return null - - return platformModulesWithActuals.joinToString(prefix = "Has actuals in ") { - (it.getMultiTargetPlatform() as MultiTargetPlatform.Specific).platform - } + return actualDeclarations.asSequence() + .mapNotNull { it.toDescriptor()?.module } + .groupBy { it.getMultiTargetPlatform() } + .filter { (platform, _) -> platform != null } + .entries + .joinToString(prefix = "Has actuals in ") { (platform, modules) -> + val modulesSuffix = if (modules.size <= 1) "" else " (${modules.size} modules)" + when (platform) { + is MultiTargetPlatform.Specific -> + "${platform.platform}$modulesSuffix" + MultiTargetPlatform.Common -> + "common$modulesSuffix" + null -> + throw AssertionError("Platform should not be null") + } + } } fun navigateToPlatformActual(e: MouseEvent?, declaration: KtDeclaration?) {