[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
|
||||
}
|
||||
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
|
||||
}
|
||||
}
|
||||
+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 <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
|
||||
}
|
||||
+2
-1
@@ -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.")
|
||||
}
|
||||
|
||||
+2
-1
@@ -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.")
|
||||
}
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
Reference in New Issue
Block a user