From 9d2b9df3b4948c4c7117b3475064724dede1d8c2 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Fri, 8 Sep 2017 13:43:15 +0200 Subject: [PATCH] Correctly run multiplatform modules When a JVM run configuration requests compiling a common module, compile the corresponding JVM module instead. --- .../MultiplatformGradleProjectTaskRunner.kt | 46 +++++++++++++++++-- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/run/MultiplatformGradleProjectTaskRunner.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/run/MultiplatformGradleProjectTaskRunner.kt index 1d91184a753..f6d8731acc2 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/run/MultiplatformGradleProjectTaskRunner.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/run/MultiplatformGradleProjectTaskRunner.kt @@ -16,21 +16,24 @@ package org.jetbrains.kotlin.idea.run +import com.intellij.execution.configurations.JavaRunConfigurationModule import com.intellij.execution.configurations.ModuleBasedConfiguration import com.intellij.openapi.externalSystem.ExternalSystemModulePropertyManager import com.intellij.openapi.externalSystem.model.project.ExternalSystemSourceType import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil import com.intellij.openapi.module.Module +import com.intellij.openapi.project.Project import com.intellij.openapi.roots.ModuleOrderEntry import com.intellij.openapi.roots.ModuleRootModel import com.intellij.openapi.roots.OrderEnumerationHandler import com.intellij.openapi.roots.OrderRootType import com.intellij.openapi.vfs.VfsUtilCore -import com.intellij.task.ExecuteRunConfigurationTask -import com.intellij.task.ModuleBuildTask -import com.intellij.task.ProjectTask +import com.intellij.task.* +import com.intellij.task.impl.ModuleBuildTaskImpl import org.jetbrains.kotlin.config.LanguageFeature +import org.jetbrains.kotlin.config.TargetPlatformKind import org.jetbrains.kotlin.idea.project.languageVersionSettings +import org.jetbrains.kotlin.idea.project.targetPlatform import org.jetbrains.kotlin.idea.util.rootManager import org.jetbrains.plugins.gradle.execution.build.GradleProjectTaskRunner import org.jetbrains.plugins.gradle.model.ExternalSourceDirectorySet @@ -62,6 +65,43 @@ class MultiplatformGradleProjectTaskRunner : GradleProjectTaskRunner() { else -> false } + + override fun run( + project: Project, + context: ProjectTaskContext, + callback: ProjectTaskNotification?, + tasks: Collection + ) { + val configuration = context.runConfiguration + if (configuration is ModuleBasedConfiguration<*> && + (configuration.configurationModule is JavaRunConfigurationModule || configuration is JetRunConfiguration)) { + + val module = configuration.configurationModule.module + if (module?.targetPlatform == TargetPlatformKind.Common) { + val implModule = module.findJvmImplementationModule() + if (implModule != null) { + val replacedTasks = tasks.map { it.replaceModule(module, implModule) } + super.run(project, context, callback, replacedTasks) + return + } + } + } + + super.run(project, context, callback, tasks) + } + + private fun ProjectTask.replaceModule(origin: Module, replacement: Module): ProjectTask = + when (this) { + is ModuleFilesBuildTask -> this + + is ModuleBuildTask -> + if (module == origin) + ModuleBuildTaskImpl(replacement, isIncrementalBuild, isIncludeDependentModules, isIncludeRuntimeDependencies) + else + this + + else -> this + } } class MultiplatformGradleOrderEnumeratorHandler : OrderEnumerationHandler() {