[coroutine][debugger] Unit test support added for Gradle run configurations.
This commit is contained in:
+42
@@ -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<String>, jvmParametersSetup: String?, initScriptConsumer: Consumer<String>) {
|
||||||
|
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<String>) {
|
||||||
|
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")
|
||||||
|
}
|
||||||
+1
-1
@@ -102,7 +102,7 @@ class CoroutineDumpAction : AnAction(), AnAction.TransparentUpdate {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
val debuggerSession = DebuggerManagerEx.getInstanceEx(project).context.debuggerSession
|
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
|
presentation.isVisible = presentation.isEnabled
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+4
-7
@@ -91,18 +91,15 @@ internal var Project.listenerCreated: Boolean? by UserDataProperty(Key.create("C
|
|||||||
|
|
||||||
internal fun isCoroutineDebuggerEnabled() = Registry.`is`("kotlin.debugger.coroutines")
|
internal fun isCoroutineDebuggerEnabled() = Registry.`is`("kotlin.debugger.coroutines")
|
||||||
|
|
||||||
internal fun <T : RunConfigurationBase<*>?> initializeCoroutineAgent(
|
internal fun initializeCoroutineAgent(params: JavaParameters, it: String?) {
|
||||||
params: JavaParameters,
|
|
||||||
it: String?,
|
|
||||||
configuration: T
|
|
||||||
): Boolean {
|
|
||||||
params.vmParametersList?.add("-javaagent:$it")
|
params.vmParametersList?.add("-javaagent:$it")
|
||||||
params.vmParametersList?.add("-ea")
|
params.vmParametersList?.add("-ea")
|
||||||
|
}
|
||||||
|
|
||||||
|
internal fun <T : RunConfigurationBase<*>?> registerProjectCoroutineListener(configuration: T) {
|
||||||
val project = (configuration as RunConfigurationBase<*>).project
|
val project = (configuration as RunConfigurationBase<*>).project
|
||||||
// add listener to put coroutines tab into debugger tab
|
// add listener to put coroutines tab into debugger tab
|
||||||
if (project.listenerCreated != true) { // prevent multiple listeners creation
|
if (project.listenerCreated != true) { // prevent multiple listeners creation
|
||||||
CoroutineXDebuggerManagerListener(project).attach()
|
CoroutineXDebuggerManagerListener(project).attach()
|
||||||
return true
|
|
||||||
}
|
}
|
||||||
return false
|
|
||||||
}
|
}
|
||||||
+2
-1
@@ -29,7 +29,8 @@ class CoroutinesDebugConfigurationExtension : RunConfigurationExtension() {
|
|||||||
if (runnerSettings is DebuggingRunnerData) {
|
if (runnerSettings is DebuggingRunnerData) {
|
||||||
try {
|
try {
|
||||||
val kotlinxCoroutinesClassPathLib = params?.classPath?.pathList?.first { it.contains("kotlinx-coroutines-debug") }
|
val kotlinxCoroutinesClassPathLib = params?.classPath?.pathList?.first { it.contains("kotlinx-coroutines-debug") }
|
||||||
initializeCoroutineAgent(params!!, kotlinxCoroutinesClassPathLib, configuration)
|
initializeCoroutineAgent(params!!, kotlinxCoroutinesClassPathLib)
|
||||||
|
registerProjectCoroutineListener(configuration)
|
||||||
} catch (e: NoSuchElementException) {
|
} catch (e: NoSuchElementException) {
|
||||||
log.warn("'kotlinx-coroutines-debug' not found in classpath. Coroutine debugger disabled.")
|
log.warn("'kotlinx-coroutines-debug' not found in classpath. Coroutine debugger disabled.")
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -29,7 +29,8 @@ class CoroutinesDebugConfigurationExtension : RunConfigurationExtension() {
|
|||||||
if (runnerSettings is DebuggingRunnerData) {
|
if (runnerSettings is DebuggingRunnerData) {
|
||||||
try {
|
try {
|
||||||
val kotlinxCoroutinesClassPathLib = params?.classPath?.pathList?.first { it.contains("kotlinx-coroutines-debug") }
|
val kotlinxCoroutinesClassPathLib = params?.classPath?.pathList?.first { it.contains("kotlinx-coroutines-debug") }
|
||||||
initializeCoroutineAgent(params!!, kotlinxCoroutinesClassPathLib, configuration)
|
initializeCoroutineAgent(params!!, kotlinxCoroutinesClassPathLib)
|
||||||
|
registerProjectCoroutineListener(configuration)
|
||||||
} catch (e: NoSuchElementException) {
|
} catch (e: NoSuchElementException) {
|
||||||
log.warn("'kotlinx-coroutines-debug' not found in classpath. Coroutine debugger disabled.")
|
log.warn("'kotlinx-coroutines-debug' not found in classpath. Coroutine debugger disabled.")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
<projectResolve implementation="org.jetbrains.kotlin.idea.configuration.KotlinNonJvmGutterConfigurator" />
|
<projectResolve implementation="org.jetbrains.kotlin.idea.configuration.KotlinNonJvmGutterConfigurator" />
|
||||||
<projectResolve implementation="org.jetbrains.kotlin.idea.configuration.KotlinGradleBuildScriptsResolver" order="first"/>
|
<projectResolve implementation="org.jetbrains.kotlin.idea.configuration.KotlinGradleBuildScriptsResolver" order="first"/>
|
||||||
<projectResolve implementation="org.jetbrains.kotlin.idea.configuration.KotlinGradleProjectResolverExtension" order="first"/>
|
<projectResolve implementation="org.jetbrains.kotlin.idea.configuration.KotlinGradleProjectResolverExtension" order="first"/>
|
||||||
|
<projectResolve implementation="org.jetbrains.kotlin.idea.configuration.KotlinGradleCoroutineDebugProjectResolver" order="last"/>
|
||||||
<projectResolve implementation="org.jetbrains.kotlin.kapt.idea.KaptProjectResolverExtension" order="last"/>
|
<projectResolve implementation="org.jetbrains.kotlin.kapt.idea.KaptProjectResolverExtension" order="last"/>
|
||||||
<projectResolve implementation="org.jetbrains.kotlin.allopen.ide.AllOpenProjectResolverExtension" order="last"/>
|
<projectResolve implementation="org.jetbrains.kotlin.allopen.ide.AllOpenProjectResolverExtension" order="last"/>
|
||||||
<projectResolve implementation="org.jetbrains.kotlin.noarg.ide.NoArgProjectResolverExtension" order="last"/>
|
<projectResolve implementation="org.jetbrains.kotlin.noarg.ide.NoArgProjectResolverExtension" order="last"/>
|
||||||
|
|||||||
Reference in New Issue
Block a user