Lift up module platform check and add bunch for 191.
191 bunch uses directly PsiTreeUtil instead kotlin extension because without it class loader's loads different classes in runtime and ClassCastException happens. Fix #KT-38149
This commit is contained in:
+2
-7
@@ -13,17 +13,13 @@ import com.intellij.openapi.module.Module
|
||||
import com.intellij.openapi.util.Ref
|
||||
import com.intellij.psi.PsiElement
|
||||
import com.intellij.psi.util.parentOfType
|
||||
import org.jetbrains.kotlin.config.KotlinFacetSettingsProvider
|
||||
import org.jetbrains.kotlin.idea.facet.externalSystemNativeMainRunTasks
|
||||
import org.jetbrains.kotlin.idea.isMainFunction
|
||||
import org.jetbrains.kotlin.idea.project.platform
|
||||
import org.jetbrains.kotlin.idea.util.module
|
||||
import org.jetbrains.kotlin.platform.isCommon
|
||||
import org.jetbrains.kotlin.platform.konan.isNative
|
||||
import org.jetbrains.kotlin.psi.KtFunction
|
||||
import org.jetbrains.plugins.gradle.service.execution.GradleExternalTaskConfigurationType
|
||||
import org.jetbrains.plugins.gradle.service.execution.GradleRunConfiguration
|
||||
import org.jetbrains.plugins.gradle.util.GradleConstants
|
||||
|
||||
|
||||
class KotlinNativeRunConfigurationProducer :
|
||||
@@ -36,9 +32,9 @@ class KotlinNativeRunConfigurationProducer :
|
||||
GradleExternalTaskConfigurationType.getInstance().factory
|
||||
|
||||
override fun isConfigurationFromContext(configuration: GradleRunConfiguration, context: ConfigurationContext): Boolean {
|
||||
val module = context.module.asNativeModule() ?: return false
|
||||
val location = context.location ?: return false
|
||||
val function = location.psiElement.parentOfType<KtFunction>() ?: return false
|
||||
val module = function.module.asNativeModule() ?: return false
|
||||
|
||||
val mainRunTasks = getDebugMainRunTasks(function)
|
||||
if (mainRunTasks.isEmpty()) return false
|
||||
@@ -52,9 +48,8 @@ class KotlinNativeRunConfigurationProducer :
|
||||
context: ConfigurationContext,
|
||||
sourceElement: Ref<PsiElement>
|
||||
): Boolean {
|
||||
if (GradleConstants.SYSTEM_ID != configuration.settings.externalSystemId) return false
|
||||
val module = context.module.asNativeModule() ?: return false
|
||||
val function = sourceElement.get()?.parentOfType<KtFunction>() ?: return false
|
||||
val module = function.module.asNativeModule() ?: return false
|
||||
|
||||
val mainRunTasks = getDebugMainRunTasks(function)
|
||||
if (mainRunTasks.isEmpty()) return false
|
||||
|
||||
+77
@@ -0,0 +1,77 @@
|
||||
/*
|
||||
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.ide.konan
|
||||
|
||||
import com.intellij.execution.actions.ConfigurationContext
|
||||
import com.intellij.execution.actions.LazyRunConfigurationProducer
|
||||
import com.intellij.execution.configurations.ConfigurationFactory
|
||||
import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil
|
||||
import com.intellij.openapi.module.Module
|
||||
import com.intellij.openapi.util.Ref
|
||||
import com.intellij.psi.PsiElement
|
||||
import com.intellij.psi.util.PsiTreeUtil
|
||||
import org.jetbrains.kotlin.idea.facet.externalSystemNativeMainRunTasks
|
||||
import org.jetbrains.kotlin.idea.project.platform
|
||||
import org.jetbrains.kotlin.idea.util.module
|
||||
import org.jetbrains.kotlin.platform.konan.isNative
|
||||
import org.jetbrains.kotlin.psi.KtFunction
|
||||
import org.jetbrains.plugins.gradle.service.execution.GradleExternalTaskConfigurationType
|
||||
import org.jetbrains.plugins.gradle.service.execution.GradleRunConfiguration
|
||||
|
||||
|
||||
class KotlinNativeRunConfigurationProducer :
|
||||
LazyRunConfigurationProducer<GradleRunConfiguration>(),
|
||||
KotlinNativeRunConfigurationProvider {
|
||||
|
||||
override val isForTests = false
|
||||
|
||||
override fun getConfigurationFactory(): ConfigurationFactory =
|
||||
GradleExternalTaskConfigurationType.getInstance().factory
|
||||
|
||||
override fun isConfigurationFromContext(configuration: GradleRunConfiguration, context: ConfigurationContext): Boolean {
|
||||
val module = context.module.asNativeModule() ?: return false
|
||||
val location = context.location ?: return false
|
||||
val function = PsiTreeUtil.getParentOfType(location.psiElement, KtFunction::class.java) ?: return false
|
||||
|
||||
val mainRunTasks = getDebugMainRunTasks(function)
|
||||
if (mainRunTasks.isEmpty()) return false
|
||||
|
||||
return configuration.settings.externalProjectPath == ExternalSystemApiUtil.getExternalProjectPath(module)
|
||||
&& configuration.settings.taskNames == mainRunTasks
|
||||
}
|
||||
|
||||
override fun setupConfigurationFromContext(
|
||||
configuration: GradleRunConfiguration,
|
||||
context: ConfigurationContext,
|
||||
sourceElement: Ref<PsiElement>
|
||||
): Boolean {
|
||||
val module = context.module.asNativeModule() ?: return false
|
||||
val function = PsiTreeUtil.getParentOfType(sourceElement.get(), KtFunction::class.java) ?: return false
|
||||
|
||||
val mainRunTasks = getDebugMainRunTasks(function)
|
||||
if (mainRunTasks.isEmpty()) return false
|
||||
|
||||
configuration.settings.apply {
|
||||
externalProjectPath = ExternalSystemApiUtil.getExternalProjectPath(module)
|
||||
taskNames = mainRunTasks
|
||||
}
|
||||
configuration.name = mainRunTasks.first()
|
||||
configuration.isScriptDebugEnabled = false
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
private fun Module?.asNativeModule(): Module? = takeIf { it?.platform.isNative() }
|
||||
|
||||
private fun getDebugMainRunTasks(function: KtFunction): List<String> {
|
||||
val functionName = function.fqName?.asString() ?: return emptyList()
|
||||
val module = function.module ?: return emptyList()
|
||||
|
||||
return module.externalSystemNativeMainRunTasks()
|
||||
.filter { it.debuggable && it.entryPoint == functionName }
|
||||
.map { it.taskName }
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user