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.model.project.ExternalSystemSourceType
import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil
import com.intellij.openapi.module.Module import com.intellij.openapi.module.Module
import com.intellij.openapi.roots.ModuleOrderEntry
import com.intellij.openapi.roots.ModuleRootModel import com.intellij.openapi.roots.ModuleRootModel
import com.intellij.openapi.roots.OrderEnumerationHandler import com.intellij.openapi.roots.OrderEnumerationHandler
import com.intellij.openapi.roots.OrderRootType import com.intellij.openapi.roots.OrderRootType
@@ -30,6 +31,7 @@ import com.intellij.task.ModuleBuildTask
import com.intellij.task.ProjectTask import com.intellij.task.ProjectTask
import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.idea.project.languageVersionSettings 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.execution.build.GradleProjectTaskRunner
import org.jetbrains.plugins.gradle.model.ExternalSourceDirectorySet import org.jetbrains.plugins.gradle.model.ExternalSourceDirectorySet
import org.jetbrains.plugins.gradle.service.project.data.ExternalProjectDataCache import org.jetbrains.plugins.gradle.service.project.data.ExternalProjectDataCache
@@ -84,6 +86,16 @@ class MultiplatformGradleOrderEnumeratorHandler : OrderEnumerationHandler() {
addOutputModuleRoots(sourceSet.sources[ExternalSystemSourceType.SOURCE], result) 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 return false
} }
@@ -19,17 +19,21 @@ package org.jetbrains.kotlin.idea.run
import com.intellij.execution.Location import com.intellij.execution.Location
import com.intellij.execution.actions.ConfigurationContext import com.intellij.execution.actions.ConfigurationContext
import com.intellij.execution.actions.RunConfigurationProducer 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.project.DumbService
import com.intellij.openapi.util.Ref import com.intellij.openapi.util.Ref
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.util.ClassUtil import com.intellij.psi.util.ClassUtil
import com.intellij.psi.util.PsiTreeUtil import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.kotlin.asJava.toLightClass import org.jetbrains.kotlin.asJava.toLightClass
import org.jetbrains.kotlin.config.TargetPlatformKind
import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName
import org.jetbrains.kotlin.idea.MainFunctionDetector import org.jetbrains.kotlin.idea.MainFunctionDetector
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
import org.jetbrains.kotlin.idea.project.TargetPlatformDetector 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.idea.util.ProjectRootsUtil
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
@@ -58,8 +62,9 @@ class KotlinRunConfigurationProducer : RunConfigurationProducer<JetRunConfigurat
val module = location.module ?: return null 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 val locationElement = location.psiElement
return getEntryPointContainer(locationElement) 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 }
}