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:
Konstantin Tskhovrebov
2020-04-09 19:37:08 +03:00
parent 27827cd364
commit b815cb7e4a
2 changed files with 79 additions and 7 deletions
@@ -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
@@ -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 }
}
}