[multilaunch]: Fix RIDER-105632: Starting Debug on Multi-Launch Configuration has no effect

GitOrigin-RevId: 91f0982c77928c4b1fb417fdd84cc6c50bbed2a7
This commit is contained in:
Andrii Rublov
2024-04-06 00:19:54 +02:00
committed by intellij-monorepo-bot
parent 3c69de703c
commit 026430be93
2 changed files with 42 additions and 11 deletions

View File

@@ -3,12 +3,15 @@ package com.intellij.execution.multilaunch.servicesView
import com.intellij.execution.RunManager
import com.intellij.execution.RunManagerListener
import com.intellij.execution.RunnerAndConfigurationSettings
import com.intellij.execution.compound.CompoundRunConfiguration
import com.intellij.openapi.project.Project
import com.intellij.openapi.startup.ProjectActivity
import com.intellij.execution.multilaunch.MultiLaunchConfiguration
import com.intellij.execution.multilaunch.execution.ExecutionEngine
import com.intellij.execution.multilaunch.execution.ExecutionModel
import com.intellij.execution.multilaunch.execution.MultiLaunchExecutionModel
import com.intellij.execution.multilaunch.execution.executables.impl.RunConfigurationExecutableManager
import com.intellij.execution.multilaunch.state.ExecutableRowSnapshotFactory
import com.intellij.openapi.components.Service
import com.intellij.openapi.components.service
import kotlinx.coroutines.CoroutineScope
@@ -32,27 +35,55 @@ class MultiLaunchServicesRefreshActivity : ProjectActivity {
}
}
inner class MultiLaunchConfigurationsListener(project: Project) : RunManagerListener {
inner class MultiLaunchConfigurationsListener(private val project: Project) : RunManagerListener {
private val serviceViewUpdatePublisher by lazy { MultiLaunchServicesRefresher.getInstance(project) }
private val executionModel by lazy { ExecutionModel.getInstance(project) }
override fun runConfigurationAdded(settings: RunnerAndConfigurationSettings) {
val configuration = settings.configuration as? MultiLaunchConfiguration ?: return
executionModel.configurations.putIfAbsent(configuration, MultiLaunchExecutionModel(settings, configuration))
serviceViewUpdatePublisher.refresh()
when (val configuration = settings.configuration) {
is MultiLaunchConfiguration -> {
executionModel.configurations.putIfAbsent(configuration, MultiLaunchExecutionModel(settings, configuration))
serviceViewUpdatePublisher.refresh()
}
!is CompoundRunConfiguration ->
listContainingMultilaunchConfigs(settings).forEach(::refreshMultilaunch)
}
}
override fun runConfigurationChanged(settings: RunnerAndConfigurationSettings) {
val configuration = settings.configuration as? MultiLaunchConfiguration ?: return
refreshMultilaunch(configuration)
}
override fun runConfigurationRemoved(settings: RunnerAndConfigurationSettings) {
when (val configuration = settings.configuration) {
is MultiLaunchConfiguration -> {
executionModel.configurations.remove(configuration)
serviceViewUpdatePublisher.refresh()
}
!is CompoundRunConfiguration -> {
listContainingMultilaunchConfigs(settings).forEach(::refreshMultilaunch)
}
}
}
private fun listContainingMultilaunchConfigs(settings: RunnerAndConfigurationSettings): List<MultiLaunchConfiguration> {
val runConfigType = RunConfigurationExecutableManager.getInstance(project).type
val runConfigCompositeId = ExecutableRowSnapshotFactory.createCompositeId(runConfigType, settings.uniqueID)
val multilaunchSnapshots = RunManager.getInstance(project).allSettings
.map { it.configuration }
.filterIsInstance<MultiLaunchConfiguration>()
.map { it to it.state }
return multilaunchSnapshots.filter { (_, snapshot) ->
snapshot.rows.any { row -> row.executable?.id == runConfigCompositeId }
}.map { it.first }
}
private fun refreshMultilaunch(configuration: MultiLaunchConfiguration) {
val model = executionModel.configurations[configuration] ?: return
executionModel.configurations.remove(configuration)
executionModel.configurations[configuration] = model
serviceViewUpdatePublisher.refresh(configuration)
}
override fun runConfigurationRemoved(settings: RunnerAndConfigurationSettings) {
val configuration = settings.configuration as? MultiLaunchConfiguration ?: return
executionModel.configurations.remove(configuration)
serviceViewUpdatePublisher.refresh()
}
}
}

View File

@@ -30,7 +30,7 @@ object ExecutableRowSnapshotFactory {
}
}
private fun createCompositeId(type: String, uniqueId: String) = "$type:$uniqueId"
fun createCompositeId(type: String, uniqueId: String) = "$type:$uniqueId"
}
fun ExecutableRow.toSnapshot() =