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.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 }
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user