Support running main() under JVM in multiplatform projects

#KT-20093 In progress
This commit is contained in:
Dmitry Jemerov
2017-09-07 14:56:54 +02:00
parent 0b143e982f
commit 62b3059425
2 changed files with 25 additions and 2 deletions
@@ -21,6 +21,7 @@ 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.roots.ModuleOrderEntry
import com.intellij.openapi.roots.ModuleRootModel
import com.intellij.openapi.roots.OrderEnumerationHandler
import com.intellij.openapi.roots.OrderRootType
@@ -30,6 +31,7 @@ import com.intellij.task.ModuleBuildTask
import com.intellij.task.ProjectTask
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.idea.project.languageVersionSettings
import org.jetbrains.kotlin.idea.util.rootManager
import org.jetbrains.plugins.gradle.execution.build.GradleProjectTaskRunner
import org.jetbrains.plugins.gradle.model.ExternalSourceDirectorySet
import org.jetbrains.plugins.gradle.service.project.data.ExternalProjectDataCache
@@ -84,6 +86,16 @@ class MultiplatformGradleOrderEnumeratorHandler : OrderEnumerationHandler() {
addOutputModuleRoots(sourceSet.sources[ExternalSystemSourceType.SOURCE], result)
}
}
val implModule = rootModel.module.findJvmImplementationModule()
implModule
?.rootManager
?.orderEntries()
?.satisfying { orderEntry -> (orderEntry as? ModuleOrderEntry)?.module != rootModel.module }
?.compileOnly()
?.classesRoots
?.mapTo(result) { it.url }
return false
}
@@ -19,17 +19,21 @@ package org.jetbrains.kotlin.idea.run
import com.intellij.execution.Location
import com.intellij.execution.actions.ConfigurationContext
import com.intellij.execution.actions.RunConfigurationProducer
import com.intellij.openapi.module.Module
import com.intellij.openapi.module.ModuleManager
import com.intellij.openapi.project.DumbService
import com.intellij.openapi.util.Ref
import com.intellij.psi.PsiElement
import com.intellij.psi.util.ClassUtil
import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.kotlin.asJava.toLightClass
import org.jetbrains.kotlin.config.TargetPlatformKind
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName
import org.jetbrains.kotlin.idea.MainFunctionDetector
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
import org.jetbrains.kotlin.idea.project.TargetPlatformDetector
import org.jetbrains.kotlin.idea.project.targetPlatform
import org.jetbrains.kotlin.idea.util.ProjectRootsUtil
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
@@ -58,8 +62,9 @@ class KotlinRunConfigurationProducer : RunConfigurationProducer<JetRunConfigurat
val module = location.module ?: return null
if (TargetPlatformDetector.getPlatform(module) != JvmPlatform) return null
if (TargetPlatformDetector.getPlatform(module) !is JvmPlatform && module.findJvmImplementationModule() == null) {
return null
}
val locationElement = location.psiElement
return getEntryPointContainer(locationElement)
@@ -121,3 +126,9 @@ class KotlinRunConfigurationProducer : RunConfigurationProducer<JetRunConfigurat
}
}
fun Module.findJvmImplementationModule(): Module? {
if (targetPlatform != TargetPlatformKind.Common) return null
val allDependentModules = ModuleManager.getInstance(project).getModuleDependentModules(this)
return allDependentModules.first { it.targetPlatform is TargetPlatformKind.Jvm }
}