From b815cb7e4a7a93ea8c624c573b433b81cf9d846d Mon Sep 17 00:00:00 2001 From: Konstantin Tskhovrebov Date: Thu, 9 Apr 2020 19:37:08 +0300 Subject: [PATCH] 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 --- .../KotlinNativeRunConfigurationProducer.kt | 9 +-- ...otlinNativeRunConfigurationProducer.kt.191 | 77 +++++++++++++++++++ 2 files changed, 79 insertions(+), 7 deletions(-) create mode 100644 idea/idea-native/src/org/jetbrains/kotlin/ide/konan/KotlinNativeRunConfigurationProducer.kt.191 diff --git a/idea/idea-native/src/org/jetbrains/kotlin/ide/konan/KotlinNativeRunConfigurationProducer.kt b/idea/idea-native/src/org/jetbrains/kotlin/ide/konan/KotlinNativeRunConfigurationProducer.kt index 4a9dfc69fe6..33e977633af 100644 --- a/idea/idea-native/src/org/jetbrains/kotlin/ide/konan/KotlinNativeRunConfigurationProducer.kt +++ b/idea/idea-native/src/org/jetbrains/kotlin/ide/konan/KotlinNativeRunConfigurationProducer.kt @@ -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() ?: 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 ): Boolean { - if (GradleConstants.SYSTEM_ID != configuration.settings.externalSystemId) return false + val module = context.module.asNativeModule() ?: return false val function = sourceElement.get()?.parentOfType() ?: return false - val module = function.module.asNativeModule() ?: return false val mainRunTasks = getDebugMainRunTasks(function) if (mainRunTasks.isEmpty()) return false diff --git a/idea/idea-native/src/org/jetbrains/kotlin/ide/konan/KotlinNativeRunConfigurationProducer.kt.191 b/idea/idea-native/src/org/jetbrains/kotlin/ide/konan/KotlinNativeRunConfigurationProducer.kt.191 new file mode 100644 index 00000000000..a5d7cfe0600 --- /dev/null +++ b/idea/idea-native/src/org/jetbrains/kotlin/ide/konan/KotlinNativeRunConfigurationProducer.kt.191 @@ -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(), + 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 + ): 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 { + 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 } + } +} \ No newline at end of file