From 01f1917d2ac9ea21fc2ff6549038dd75b374ea43 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Wed, 11 Jul 2018 19:23:28 +0200 Subject: [PATCH] Run/test line markers: aggregate results across implementing modules --- .../KotlinRunLineMarkerContributor.kt | 43 ++++++++++++------- .../KotlinTestRunLineMarkerContributor.kt | 30 ++++++++----- 2 files changed, 48 insertions(+), 25 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/highlighter/KotlinRunLineMarkerContributor.kt b/idea/src/org/jetbrains/kotlin/idea/highlighter/KotlinRunLineMarkerContributor.kt index 68375950bb0..d7ebb445631 100644 --- a/idea/src/org/jetbrains/kotlin/idea/highlighter/KotlinRunLineMarkerContributor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/highlighter/KotlinRunLineMarkerContributor.kt @@ -21,10 +21,14 @@ import com.intellij.execution.lineMarker.ExecutorAction import com.intellij.execution.lineMarker.RunLineMarkerContributor import com.intellij.icons.AllIcons import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.config.TargetPlatformKind import org.jetbrains.kotlin.idea.MainFunctionDetector +import org.jetbrains.kotlin.idea.caches.project.implementingModules import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny import org.jetbrains.kotlin.idea.js.KotlinJSRunConfigurationDataProvider import org.jetbrains.kotlin.idea.project.TargetPlatformDetector +import org.jetbrains.kotlin.idea.project.targetPlatform +import org.jetbrains.kotlin.idea.util.module import org.jetbrains.kotlin.js.resolve.JsPlatform import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.resolve.TargetPlatform @@ -41,25 +45,34 @@ class KotlinRunLineMarkerContributor : RunLineMarkerContributor() { } if (detector.isMain(function)) { - val platform = TargetPlatformDetector.getPlatform(function.containingKtFile) - val isAvailable = when (platform) { - is JvmPlatform -> true - is JsPlatform, is TargetPlatform.Common -> { - RunConfigurationProducer - .getProducers(function.project) - .asSequence() - .filterIsInstance>() - .filter { !it.isForTests } - .mapNotNull { it.getConfigurationData(function) } - .firstOrNull() != null - } - else -> false - } - if (!isAvailable) return null + val platform = function.containingKtFile.module?.targetPlatform ?: return null + if (!platform.acceptsAsEntryPoint(function)) return null return RunLineMarkerContributor.Info(AllIcons.RunConfigurations.TestState.Run, null, ExecutorAction.getActions(0)) } return null } + + private fun TargetPlatformKind<*>.acceptsAsEntryPoint(function: KtNamedFunction): Boolean { + return when (this) { + is TargetPlatformKind.Common -> { + val module = function.containingKtFile.module ?: return false + return module.implementingModules.any { implementingModule -> + implementingModule.targetPlatform?.takeIf { it !is TargetPlatformKind.Common }?.acceptsAsEntryPoint(function) ?: false + } + } + is TargetPlatformKind.Jvm -> true + is TargetPlatformKind.JavaScript -> { + RunConfigurationProducer + .getProducers(function.project) + .asSequence() + .filterIsInstance>() + .filter { !it.isForTests } + .mapNotNull { it.getConfigurationData(function) } + .firstOrNull() != null + + } + } + } } \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/highlighter/KotlinTestRunLineMarkerContributor.kt b/idea/src/org/jetbrains/kotlin/idea/highlighter/KotlinTestRunLineMarkerContributor.kt index f526337497a..1a5324366e5 100644 --- a/idea/src/org/jetbrains/kotlin/idea/highlighter/KotlinTestRunLineMarkerContributor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/highlighter/KotlinTestRunLineMarkerContributor.kt @@ -30,14 +30,15 @@ import com.intellij.psi.PsiElement import org.jetbrains.kotlin.asJava.classes.KtLightClass import org.jetbrains.kotlin.asJava.toLightClass import org.jetbrains.kotlin.asJava.toLightMethods +import org.jetbrains.kotlin.config.TargetPlatformKind import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptorWithResolutionScopes import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny import org.jetbrains.kotlin.idea.js.KotlinJSRunConfigurationDataProvider -import org.jetbrains.kotlin.idea.project.TargetPlatformDetector +import org.jetbrains.kotlin.idea.project.targetPlatform +import org.jetbrains.kotlin.idea.util.projectStructure.module import org.jetbrains.kotlin.idea.util.string.joinWithEscape -import org.jetbrains.kotlin.js.resolve.JsPlatform import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtNamedDeclaration @@ -45,8 +46,6 @@ import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf -import org.jetbrains.kotlin.resolve.TargetPlatform.Common -import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform import javax.swing.Icon class KotlinTestRunLineMarkerContributor : RunLineMarkerContributor() { @@ -151,12 +150,23 @@ class KotlinTestRunLineMarkerContributor : RunLineMarkerContributor() { // To prevent IDEA failing on red code val descriptor = declaration.resolveToDescriptorIfAny() ?: return null - val platform = TargetPlatformDetector.getPlatform(declaration.containingKtFile) - val icon = when (platform) { - is JvmPlatform -> getJavaTestIcon(declaration) - is JsPlatform, is Common -> getJavaScriptTestIcon(declaration, descriptor) - else -> return null - } ?: return null + val icon = getTestIcon(declaration, descriptor) ?: return null return RunLineMarkerContributor.Info(icon, { "Run Test" }, ExecutorAction.getActions()) } + + private fun getTestIcon(declaration: KtNamedDeclaration, descriptor: DeclarationDescriptor): Icon? { + val module = declaration.module ?: return null + val targetPlatformKind = module.targetPlatform ?: return null + return when (targetPlatformKind) { + is TargetPlatformKind.JavaScript -> getJavaScriptTestIcon(declaration, descriptor) + is TargetPlatformKind.Jvm -> getJavaTestIcon(declaration) + is TargetPlatformKind.Common -> { + val icons = listOfNotNull(getJavaScriptTestIcon(declaration, descriptor), getJavaTestIcon(declaration)) + when (icons.size) { + 0 -> null + else -> icons.distinct().singleOrNull() ?: AllIcons.RunConfigurations.TestState.Run + } + } + } + } }