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 index d9cfac6cefd..039ecd86cd2 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleCoroutineDebugProjectResolver.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleCoroutineDebugProjectResolver.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.idea.configuration import com.intellij.openapi.diagnostic.Logger import com.intellij.util.Consumer +import org.jetbrains.kotlin.idea.debugger.KotlinDebuggerSettings import org.jetbrains.plugins.gradle.service.project.AbstractProjectResolverExtension class KotlinGradleCoroutineDebugProjectResolver : AbstractProjectResolverExtension() { @@ -14,7 +15,9 @@ class KotlinGradleCoroutineDebugProjectResolver : AbstractProjectResolverExtensi override fun enhanceTaskProcessing(taskNames: MutableList, jvmParametersSetup: String?, initScriptConsumer: Consumer) { try { - setupCoroutineAgentForJvmForkedTestTasks(initScriptConsumer) + val disableCoroutineAgent = KotlinDebuggerSettings.getInstance().debugDisableCoroutineAgent + if (!disableCoroutineAgent) + setupCoroutineAgentForJvmForkedTestTasks(initScriptConsumer) } catch (e: Exception) { log.error("Gradle: not possible to attach a coroutine debugger agent.", e) } @@ -25,11 +28,22 @@ class KotlinGradleCoroutineDebugProjectResolver : AbstractProjectResolverExtensi //language=Gradle """ gradle.taskGraph.beforeTask { Task task -> - if (task instanceof Test) { - def kotlinxCoroutinesDebugJar = task.classpath.find { it.name.startsWith("kotlinx-coroutines-debug") } - if (kotlinxCoroutinesDebugJar) - task.jvmArgs ("-javaagent:${'$'}{kotlinxCoroutinesDebugJar?.absolutePath}", "-ea") - } + if (task instanceof Test) { + def kotlinxCoroutinesDebugJar = task.classpath.find { it.name.startsWith("kotlinx-coroutines-debug") } + if (kotlinxCoroutinesDebugJar) + task.jvmArgs ("-javaagent:${'$'}{kotlinxCoroutinesDebugJar?.absolutePath}", "-ea") + else { + for (lib in task.getClasspath()) { + def results = (lib.getName() =~ /kotlinx-coroutines-core\-([\d\.]+)\.jar${'$'}/).findAll() + if (results) { + def version = results.first()[1] + if (org.gradle.util.VersionNumber.parse( version ) >= org.gradle.util.VersionNumber.parse( '1.3.6' )) { + task.jvmArgs ("-javaagent:${'$'}{lib?.absolutePath}", "-ea") + } + } + } + } + } } """.trimIndent() initScriptConsumer.consume(script) diff --git a/idea/jvm-debugger/jvm-debugger-coroutine/src/org/jetbrains/kotlin/idea/debugger/coroutine/DebuggerConnection.kt b/idea/jvm-debugger/jvm-debugger-coroutine/src/org/jetbrains/kotlin/idea/debugger/coroutine/DebuggerConnection.kt index 34716d9c503..7766e1117cb 100644 --- a/idea/jvm-debugger/jvm-debugger-coroutine/src/org/jetbrains/kotlin/idea/debugger/coroutine/DebuggerConnection.kt +++ b/idea/jvm-debugger/jvm-debugger-coroutine/src/org/jetbrains/kotlin/idea/debugger/coroutine/DebuggerConnection.kt @@ -33,14 +33,15 @@ class DebuggerConnection( val project: Project, val configuration: RunConfigurationBase<*>, val params: JavaParameters?, - val runnerSettings: DebuggingRunnerData? + val runnerSettings: DebuggingRunnerData?, + modifyArgs: Boolean = true ) : XDebuggerManagerListener { var disposable: Disposable? = null var connection: MessageBusConnection? = null private val log by logger init { - if (params is JavaParameters) { + if (params is JavaParameters && modifyArgs) { // gradle related logic in KotlinGradleCoroutineDebugProjectResolver val kotlinxCoroutinesCore = params.classPath?.pathList?.firstOrNull { it.contains("kotlinx-coroutines-core") } val kotlinxCoroutinesDebug = params.classPath?.pathList?.firstOrNull { it.contains("kotlinx-coroutines-debug") } diff --git a/idea/jvm-debugger/jvm-debugger-coroutine/src/org/jetbrains/kotlin/idea/debugger/coroutine/DebuggerListener.kt b/idea/jvm-debugger/jvm-debugger-coroutine/src/org/jetbrains/kotlin/idea/debugger/coroutine/DebuggerListener.kt index e740b3a416f..18223a3f817 100644 --- a/idea/jvm-debugger/jvm-debugger-coroutine/src/org/jetbrains/kotlin/idea/debugger/coroutine/DebuggerListener.kt +++ b/idea/jvm-debugger/jvm-debugger-coroutine/src/org/jetbrains/kotlin/idea/debugger/coroutine/DebuggerListener.kt @@ -34,12 +34,16 @@ class CoroutineDebuggerListener(val project: Project) : DebuggerListener { val isExternalSystemRunConfiguration = configuration is ExternalSystemRunConfiguration val isGradleConfiguration = gradleConfiguration(configuration.type.id) val disableCoroutineAgent = KotlinDebuggerSettings.getInstance().debugDisableCoroutineAgent - if (!disableCoroutineAgent && runnerSettings is DebuggingRunnerData && !isExternalSystemRunConfiguration && !isGradleConfiguration) - return DebuggerConnection(project, configuration, params, runnerSettings) + if (!disableCoroutineAgent && runnerSettings is DebuggingRunnerData) { + if (isExternalSystemRunConfiguration && isGradleConfiguration) + // gradle related logic in KotlinGradleCoroutineDebugProjectResolver + return DebuggerConnection(project, configuration, params, runnerSettings, false) + else + return DebuggerConnection(project, configuration, params, runnerSettings, true) + } return null } private fun gradleConfiguration(configurationName: String) = "GradleRunConfiguration" == configurationName || "KotlinGradleRunConfiguration" == configurationName - } \ No newline at end of file