Support running main() under JVM in multiplatform projects
#KT-20093 In progress
This commit is contained in:
+12
@@ -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 }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user