[coroutine debugger] do not attach if configuration scope does not contain coroutine dependency (KTIJ-19215)

GitOrigin-RevId: 203186dc62d36b93bfcf3311e70cbe25af445976
This commit is contained in:
Anna Kozlova
2021-08-02 16:18:45 +00:00
committed by intellij-monorepo-bot
parent 285bfaccf8
commit 8b9143ff22
2 changed files with 14 additions and 9 deletions
@@ -2,6 +2,8 @@
package org.jetbrains.kotlin.idea.debugger.coroutine
import com.intellij.execution.configurations.JavaParameters
import com.intellij.execution.configurations.ModuleBasedConfiguration
import com.intellij.execution.configurations.RunConfigurationBase
import com.intellij.openapi.project.Project
import com.intellij.openapi.projectRoots.JdkUtil
import com.intellij.openapi.vfs.VirtualFile
@@ -28,12 +30,11 @@ internal object CoroutineAgentConnector {
private val versionToCompareTo = DefaultArtifactVersion("1.3.7-255")
private val kotlinxCoroutinesCoreJarRegex = Regex(""".+\W$kotlinxCoroutinesCoreName(-jvm)?-(\d[\w.\-]+)?\.jar""")
fun attachCoroutineAgent(project: Project, params: JavaParameters): Boolean {
if (!params.classPath.containsKotlinxCoroutinesCore()) {
fun attachCoroutineAgent(project: Project, params: JavaParameters, configuration: RunConfigurationBase<*>?): Boolean {
if (!params.classPath.containsKotlinxCoroutinesCore()) {
return false
}
val searchResult = findKotlinxCoroutinesCoreJar(project)
val searchResult = findKotlinxCoroutinesCoreJar(project, configuration)
if (searchResult.debuggerMode == CoroutineDebuggerMode.VERSION_1_3_8_AND_UP &&
searchResult.jarPath != null) {
return initializeCoroutineAgent(params, searchResult.jarPath)
@@ -44,9 +45,9 @@ internal object CoroutineAgentConnector {
private fun PathsList.containsKotlinxCoroutinesCore() =
pathList.any { it.contains(kotlinxCoroutinesCoreName) }
private fun findKotlinxCoroutinesCoreJar(project: Project): KotlinxCoroutinesSearchResult {
private fun findKotlinxCoroutinesCoreJar(project: Project, configuration: RunConfigurationBase<*>?): KotlinxCoroutinesSearchResult {
val matchResult = project
.getJarVirtualFiles(kotlinxCoroutinesPackageName)
.getJarVirtualFiles(project, configuration, kotlinxCoroutinesPackageName)
.matchToPackageRegexInProject(project, kotlinxCoroutinesCoreJarRegex)
if (matchResult == null || matchResult.groupValues.size < 3) {
@@ -71,11 +72,15 @@ internal object CoroutineAgentConnector {
return null
}
private fun Project.getJarVirtualFiles(packageName: String): List<VirtualFile> {
private fun Project.getJarVirtualFiles(project: Project, configuration: RunConfigurationBase<*>?, packageName: String): List<VirtualFile> {
val kotlinxCoroutinesPackage = JavaPsiFacade.getInstance(this)
.findPackage(packageName)
?: return emptyList()
return kotlinxCoroutinesPackage.directories.mapNotNull { it.virtualFile }
var scope = GlobalSearchScope.allScope(project)
if (configuration is ModuleBasedConfiguration<*, *>) {
configuration.configurationModule.module?.let { scope = it.getModuleRuntimeScope(true) }
}
return kotlinxCoroutinesPackage.getDirectories(scope).mapNotNull { it.virtualFile }
}
private fun String.getParentJarPath(): String? {
@@ -41,7 +41,7 @@ class DebuggerConnection(
init {
if (params is JavaParameters && modifyArgs) {
// gradle related logic in KotlinGradleCoroutineDebugProjectResolver
coroutineAgentAttached = CoroutineAgentConnector.attachCoroutineAgent(project, params)
coroutineAgentAttached = CoroutineAgentConnector.attachCoroutineAgent(project, params, configuration)
} else {
coroutineAgentAttached = false
log.debug("Coroutine debugger disabled.")