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