[coroutine][debugger] Unit test support added for Gradle run configurations.

This commit is contained in:
Vladimir Ilmov
2019-11-20 13:17:17 +03:00
parent 82cdcb421b
commit f05a452ef2
6 changed files with 52 additions and 10 deletions
@@ -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")
}
@@ -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
}
}
@@ -91,18 +91,15 @@ internal var Project.listenerCreated: Boolean? by UserDataProperty(Key.create("C
internal fun isCoroutineDebuggerEnabled() = Registry.`is`("kotlin.debugger.coroutines")
internal fun <T : RunConfigurationBase<*>?> 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 <T : RunConfigurationBase<*>?> 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
}
@@ -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.")
}
@@ -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.")
}
+1
View File
@@ -12,6 +12,7 @@
<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.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.allopen.ide.AllOpenProjectResolverExtension" order="last"/>
<projectResolve implementation="org.jetbrains.kotlin.noarg.ide.NoArgProjectResolverExtension" order="last"/>