diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleCoroutineDebugProjectResolver.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleCoroutineDebugProjectResolver.kt new file mode 100644 index 00000000000..b77ae18d7dd --- /dev/null +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleCoroutineDebugProjectResolver.kt @@ -0,0 +1,42 @@ +/* + * Copyright 2010-2019 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.idea.configuration + +import com.intellij.openapi.diagnostic.Logger +import com.intellij.openapi.util.registry.Registry +import com.intellij.openapi.util.text.StringUtil +import com.intellij.util.Consumer +import com.intellij.util.SystemProperties +import org.jetbrains.plugins.gradle.service.project.AbstractProjectResolverExtension + +class KotlinGradleCoroutineDebugProjectResolver : AbstractProjectResolverExtension() { + val log = Logger.getInstance(this::class.java) + + override fun enhanceTaskProcessing(taskNames: MutableList, jvmParametersSetup: String?, initScriptConsumer: Consumer) { + try { + if (coroutineDebuggerEnabled()) + setupCoroutineAgentForJvmForkedTestTasks(initScriptConsumer) + } catch (e: Exception) { + log.error("Gradle: not possible to attach coroutine debugger agent. Coroutine debugger disabled.", e) + } + } + + private fun setupCoroutineAgentForJvmForkedTestTasks(initScriptConsumer: Consumer) { + val lines = arrayOf( + "gradle.taskGraph.beforeTask { Task task ->", + " if (task instanceof Test) {", + " def kotlinxCoroutinesDebugJar = task.classpath.find { it.name.contains(\"kotlinx-coroutines-debug\") }", + " if (kotlinxCoroutinesDebugJar)", + " task.jvmArgs (\"-javaagent:\${kotlinxCoroutinesDebugJar?.absolutePath}\", \"-ea\")", + " }", + "}" + ) + val script = StringUtil.join(lines, SystemProperties.getLineSeparator()) + initScriptConsumer.consume(script) + } + + private fun coroutineDebuggerEnabled() = Registry.`is`("kotlin.debugger.coroutines") +} \ No newline at end of file diff --git a/idea/jvm-debugger/jvm-debugger-core/src/org/jetbrains/kotlin/idea/debugger/coroutines/CoroutineDumpAction.kt b/idea/jvm-debugger/jvm-debugger-core/src/org/jetbrains/kotlin/idea/debugger/coroutines/CoroutineDumpAction.kt index 06ea99f3381..ad9d74285f1 100644 --- a/idea/jvm-debugger/jvm-debugger-core/src/org/jetbrains/kotlin/idea/debugger/coroutines/CoroutineDumpAction.kt +++ b/idea/jvm-debugger/jvm-debugger-core/src/org/jetbrains/kotlin/idea/debugger/coroutines/CoroutineDumpAction.kt @@ -102,7 +102,7 @@ class CoroutineDumpAction : AnAction(), AnAction.TransparentUpdate { return } val debuggerSession = DebuggerManagerEx.getInstanceEx(project).context.debuggerSession - presentation.isEnabled = debuggerSession != null && debuggerSession.isAttached && Registry.`is`("kotlin.debugger" + ".coroutines") + presentation.isEnabled = debuggerSession != null && debuggerSession.isAttached && isCoroutineDebuggerEnabled() presentation.isVisible = presentation.isEnabled } } \ No newline at end of file diff --git a/idea/jvm-debugger/jvm-debugger-core/src/org/jetbrains/kotlin/idea/debugger/coroutines/CoroutineXDebuggerManagerListener.kt b/idea/jvm-debugger/jvm-debugger-core/src/org/jetbrains/kotlin/idea/debugger/coroutines/CoroutineXDebuggerManagerListener.kt index 8ede98a952a..180f36a572e 100644 --- a/idea/jvm-debugger/jvm-debugger-core/src/org/jetbrains/kotlin/idea/debugger/coroutines/CoroutineXDebuggerManagerListener.kt +++ b/idea/jvm-debugger/jvm-debugger-core/src/org/jetbrains/kotlin/idea/debugger/coroutines/CoroutineXDebuggerManagerListener.kt @@ -91,18 +91,15 @@ internal var Project.listenerCreated: Boolean? by UserDataProperty(Key.create("C internal fun isCoroutineDebuggerEnabled() = Registry.`is`("kotlin.debugger.coroutines") -internal fun ?> initializeCoroutineAgent( - params: JavaParameters, - it: String?, - configuration: T -): Boolean { +internal fun initializeCoroutineAgent(params: JavaParameters, it: String?) { params.vmParametersList?.add("-javaagent:$it") params.vmParametersList?.add("-ea") +} + +internal fun ?> registerProjectCoroutineListener(configuration: T) { val project = (configuration as RunConfigurationBase<*>).project // add listener to put coroutines tab into debugger tab if (project.listenerCreated != true) { // prevent multiple listeners creation CoroutineXDebuggerManagerListener(project).attach() - return true } - return false } \ No newline at end of file diff --git a/idea/jvm-debugger/jvm-debugger-core/src/org/jetbrains/kotlin/idea/debugger/coroutines/CoroutinesDebugConfigurationExtension.kt b/idea/jvm-debugger/jvm-debugger-core/src/org/jetbrains/kotlin/idea/debugger/coroutines/CoroutinesDebugConfigurationExtension.kt index c5ba8da45b4..f8ef97fcf66 100644 --- a/idea/jvm-debugger/jvm-debugger-core/src/org/jetbrains/kotlin/idea/debugger/coroutines/CoroutinesDebugConfigurationExtension.kt +++ b/idea/jvm-debugger/jvm-debugger-core/src/org/jetbrains/kotlin/idea/debugger/coroutines/CoroutinesDebugConfigurationExtension.kt @@ -29,7 +29,8 @@ class CoroutinesDebugConfigurationExtension : RunConfigurationExtension() { if (runnerSettings is DebuggingRunnerData) { try { val kotlinxCoroutinesClassPathLib = params?.classPath?.pathList?.first { it.contains("kotlinx-coroutines-debug") } - initializeCoroutineAgent(params!!, kotlinxCoroutinesClassPathLib, configuration) + initializeCoroutineAgent(params!!, kotlinxCoroutinesClassPathLib) + registerProjectCoroutineListener(configuration) } catch (e: NoSuchElementException) { log.warn("'kotlinx-coroutines-debug' not found in classpath. Coroutine debugger disabled.") } diff --git a/idea/jvm-debugger/jvm-debugger-core/src/org/jetbrains/kotlin/idea/debugger/coroutines/CoroutinesDebugConfigurationExtension.kt.193 b/idea/jvm-debugger/jvm-debugger-core/src/org/jetbrains/kotlin/idea/debugger/coroutines/CoroutinesDebugConfigurationExtension.kt.193 index bb196287791..935e04f49fe 100644 --- a/idea/jvm-debugger/jvm-debugger-core/src/org/jetbrains/kotlin/idea/debugger/coroutines/CoroutinesDebugConfigurationExtension.kt.193 +++ b/idea/jvm-debugger/jvm-debugger-core/src/org/jetbrains/kotlin/idea/debugger/coroutines/CoroutinesDebugConfigurationExtension.kt.193 @@ -29,7 +29,8 @@ class CoroutinesDebugConfigurationExtension : RunConfigurationExtension() { if (runnerSettings is DebuggingRunnerData) { try { val kotlinxCoroutinesClassPathLib = params?.classPath?.pathList?.first { it.contains("kotlinx-coroutines-debug") } - initializeCoroutineAgent(params!!, kotlinxCoroutinesClassPathLib, configuration) + initializeCoroutineAgent(params!!, kotlinxCoroutinesClassPathLib) + registerProjectCoroutineListener(configuration) } catch (e: NoSuchElementException) { log.warn("'kotlinx-coroutines-debug' not found in classpath. Coroutine debugger disabled.") } diff --git a/idea/resources/META-INF/gradle-java.xml b/idea/resources/META-INF/gradle-java.xml index b197b1c143b..8d6c3c34d3d 100644 --- a/idea/resources/META-INF/gradle-java.xml +++ b/idea/resources/META-INF/gradle-java.xml @@ -12,6 +12,7 @@ +