From 153056b4fda19d9cd95b26d2dab201ce169179d0 Mon Sep 17 00:00:00 2001 From: Vladimir Ilmov Date: Wed, 8 Apr 2020 14:26:17 +0200 Subject: [PATCH] (CoroutineDebugger) Added check if agent is not available in target jvm --- ...tlinGradleCoroutineDebugProjectResolver.kt | 24 +++++++++---------- .../debugger/coroutine/DebuggerConnection.kt | 2 -- .../coroutine/data/CoroutineInfoCache.kt | 9 ++++++- .../proxy/CoroutineDebugProbesProxy.kt | 17 +++++++++---- 4 files changed, 32 insertions(+), 20 deletions(-) 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 ccd12e148ac..d9cfac6cefd 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 @@ -6,10 +6,7 @@ package org.jetbrains.kotlin.idea.configuration import com.intellij.openapi.diagnostic.Logger -import com.intellij.openapi.util.text.StringUtil import com.intellij.util.Consumer -import com.intellij.util.SystemProperties -import org.jetbrains.kotlin.idea.debugger.coroutine.standaloneCoroutineDebuggerEnabled import org.jetbrains.plugins.gradle.service.project.AbstractProjectResolverExtension class KotlinGradleCoroutineDebugProjectResolver : AbstractProjectResolverExtension() { @@ -24,16 +21,17 @@ class KotlinGradleCoroutineDebugProjectResolver : AbstractProjectResolverExtensi } private fun setupCoroutineAgentForJvmForkedTestTasks(initScriptConsumer: Consumer) { - val lines = arrayOf( - "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\")", - " }", - "}" - ) - val script = StringUtil.join(lines, SystemProperties.getLineSeparator()) + val script = + //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") + } + } + """.trimIndent() initScriptConsumer.consume(script) } } \ No newline at end of file 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 ac2928287f5..2a90cab4d78 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 @@ -101,6 +101,4 @@ class DebuggerConnection( } } -fun standaloneCoroutineDebuggerEnabled() = Registry.`is`("kotlin.debugger.coroutines.standalone") - fun coroutineDebuggerTraceEnabled() = Registry.`is`("kotlin.debugger.coroutines.trace") diff --git a/idea/jvm-debugger/jvm-debugger-coroutine/src/org/jetbrains/kotlin/idea/debugger/coroutine/data/CoroutineInfoCache.kt b/idea/jvm-debugger/jvm-debugger-coroutine/src/org/jetbrains/kotlin/idea/debugger/coroutine/data/CoroutineInfoCache.kt index bd8771ff30f..44a116e6b6f 100644 --- a/idea/jvm-debugger/jvm-debugger-coroutine/src/org/jetbrains/kotlin/idea/debugger/coroutine/data/CoroutineInfoCache.kt +++ b/idea/jvm-debugger/jvm-debugger-coroutine/src/org/jetbrains/kotlin/idea/debugger/coroutine/data/CoroutineInfoCache.kt @@ -8,10 +8,17 @@ package org.jetbrains.kotlin.idea.debugger.coroutine.data class CoroutineInfoCache( val cache: MutableList = mutableListOf(), var state: CacheState = CacheState.INIT ) { - fun ok(infoList: List) { + fun ok(infoList: List): CoroutineInfoCache { cache.clear() cache.addAll(infoList) state = CacheState.OK + return this + } + + fun ok(): CoroutineInfoCache { + cache.clear() + state = CacheState.OK + return this } fun fail(): CoroutineInfoCache { diff --git a/idea/jvm-debugger/jvm-debugger-coroutine/src/org/jetbrains/kotlin/idea/debugger/coroutine/proxy/CoroutineDebugProbesProxy.kt b/idea/jvm-debugger/jvm-debugger-coroutine/src/org/jetbrains/kotlin/idea/debugger/coroutine/proxy/CoroutineDebugProbesProxy.kt index c7191a88b66..502ac8d8d51 100644 --- a/idea/jvm-debugger/jvm-debugger-coroutine/src/org/jetbrains/kotlin/idea/debugger/coroutine/proxy/CoroutineDebugProbesProxy.kt +++ b/idea/jvm-debugger/jvm-debugger-coroutine/src/org/jetbrains/kotlin/idea/debugger/coroutine/proxy/CoroutineDebugProbesProxy.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.idea.debugger.coroutine.proxy import com.intellij.debugger.engine.DebuggerManagerThreadImpl import com.intellij.debugger.engine.SuspendContextImpl +import com.intellij.openapi.util.registry.Registry import org.jetbrains.kotlin.idea.debugger.coroutine.command.CoroutineBuilder import org.jetbrains.kotlin.idea.debugger.coroutine.data.CoroutineInfoCache import org.jetbrains.kotlin.idea.debugger.coroutine.data.CoroutineInfoData @@ -25,7 +26,7 @@ class CoroutineDebugProbesProxy(val suspendContext: SuspendContextImpl) { val coroutineInfoCache = CoroutineInfoCache() try { val executionContext = suspendContext.executionContext() ?: return coroutineInfoCache.fail() - val libraryAgentProxy = findProvider(executionContext) + val libraryAgentProxy = findProvider(executionContext) ?: return coroutineInfoCache.ok() val infoList = libraryAgentProxy.dumpCoroutinesInfo() coroutineInfoCache.ok(infoList) } catch (e: Throwable) { @@ -35,8 +36,16 @@ class CoroutineDebugProbesProxy(val suspendContext: SuspendContextImpl) { return coroutineInfoCache } - private fun findProvider(executionContext: DefaultExecutionContext) = - CoroutineLibraryAgent2Proxy.instance(executionContext) ?: CoroutineNoLibraryProxy(executionContext) + private fun findProvider(executionContext: DefaultExecutionContext): CoroutineInfoProvider? { + val agentProxy = CoroutineLibraryAgent2Proxy.instance(executionContext) + if (agentProxy != null) + return agentProxy + if (standaloneCoroutineDebuggerEnabled()) + return CoroutineNoLibraryProxy(executionContext) + return null + } fun frameBuilder() = CoroutineBuilder(suspendContext) -} \ No newline at end of file +} + +fun standaloneCoroutineDebuggerEnabled() = Registry.`is`("kotlin.debugger.coroutines.standalone")