diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/run/multiplatform/KotlinMultiplatformRunLocationsProvider.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/run/multiplatform/KotlinMultiplatformRunLocationsProvider.kt index 1c15f8eb146..293f022b629 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/run/multiplatform/KotlinMultiplatformRunLocationsProvider.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/run/multiplatform/KotlinMultiplatformRunLocationsProvider.kt @@ -9,10 +9,13 @@ import com.intellij.execution.Location import com.intellij.execution.PsiLocation import com.intellij.execution.actions.MultipleRunLocationsProvider import com.intellij.openapi.module.Module +import com.intellij.openapi.module.ModuleManager +import com.intellij.openapi.roots.ModuleRootManager import org.jetbrains.kotlin.config.KotlinModuleKind import org.jetbrains.kotlin.idea.caches.project.implementingModules import org.jetbrains.kotlin.idea.caches.project.isNewMPPModule import org.jetbrains.kotlin.idea.configuration.toModuleGroup +import org.jetbrains.kotlin.idea.core.isInTestSourceContentKotlinAware import org.jetbrains.kotlin.idea.facet.KotlinFacet class KotlinMultiplatformRunLocationsProvider : MultipleRunLocationsProvider() { @@ -23,7 +26,9 @@ class KotlinMultiplatformRunLocationsProvider : MultipleRunLocationsProvider() { override fun getAlternativeLocations(originalLocation: Location<*>): List> { val originalModule = originalLocation.module ?: return emptyList() - return modulesToRunFrom(originalModule).map { PsiLocation(originalLocation.project, it, originalLocation.psiElement) } + val virtualFile = originalLocation.virtualFile ?: return emptyList() + val shouldRunAsTest = ModuleRootManager.getInstance(originalModule).fileIndex.isInTestSourceContentKotlinAware(virtualFile) + return modulesToRunFrom(originalModule, shouldRunAsTest).map { PsiLocation(originalLocation.project, it, originalLocation.psiElement) } } } @@ -36,11 +41,19 @@ private fun compactedGradleProjectId(module: Module): String? { } } -private fun modulesToRunFrom(originalModule: Module): List { +private fun modulesToRunFrom( + originalModule: Module, + shouldRunAsTest: Boolean +): List { val modules = originalModule.implementingModules - return if (originalModule.isNewMPPModule) { - modules.filter { KotlinFacet.get(it)?.configuration?.settings?.kind == KotlinModuleKind.COMPILATION_AND_SOURCE_SET_HOLDER } - } else { - modules + if (!originalModule.isNewMPPModule) return modules + val compilations = modules.filter { + KotlinFacet.get(it)?.configuration?.settings?.kind == KotlinModuleKind.COMPILATION_AND_SOURCE_SET_HOLDER } + + val project = originalModule.project + // TODO: more robust way to get test/production compilations + val baseName = originalModule.toModuleGroup().baseModule.name + val commonTests = ModuleManager.getInstance(project).findModuleByName(baseName + "_commonTest") ?: return compilations + return compilations.filter { ModuleRootManager.getInstance(it).isDependsOn(commonTests) == shouldRunAsTest } } \ No newline at end of file