From d33401b6acdeda38bd94009887802c7cda67566e Mon Sep 17 00:00:00 2001 From: "Vassiliy.Kudryashov" Date: Sat, 2 Dec 2017 01:13:04 +0300 Subject: [PATCH] IDEA-147759 Allow to launch debug mode with Compound Run Configuration --- .../execution/ExecutorRegistryImpl.java | 59 +++++++++++++++---- 1 file changed, 47 insertions(+), 12 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/execution/ExecutorRegistryImpl.java b/platform/lang-impl/src/com/intellij/execution/ExecutorRegistryImpl.java index cf6acbed4f71..d4e0c489d4a9 100644 --- a/platform/lang-impl/src/com/intellij/execution/ExecutorRegistryImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/ExecutorRegistryImpl.java @@ -16,6 +16,7 @@ package com.intellij.execution; import com.intellij.execution.actions.RunContextAction; +import com.intellij.execution.compound.CompoundRunConfiguration; import com.intellij.execution.configurations.RunConfiguration; import com.intellij.execution.executors.DefaultRunExecutor; import com.intellij.execution.impl.ExecutionManagerImpl; @@ -38,6 +39,7 @@ import com.intellij.util.containers.ContainerUtil; import com.intellij.util.messages.MessageBusConnection; import gnu.trove.THashMap; import gnu.trove.THashSet; +import kotlin.Pair; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -197,6 +199,27 @@ public class ExecutorRegistryImpl extends ExecutorRegistry implements Disposable myExecutor = executor; } + private boolean canRun(@NotNull Project project, @NotNull List> pairs) { + if (pairs.isEmpty()) { + return false; + } + for (Pair pair : pairs) { + RunnerAndConfigurationSettings runnerAndConfigurationSettings = pair.getFirst(); + RunConfiguration configuration = runnerAndConfigurationSettings.getConfiguration(); + if (configuration instanceof CompoundRunConfiguration) { + if (!canRun(project, ((CompoundRunConfiguration)configuration).getConfigurationsWithEffectiveRunTargets())) { + return false; + } + } + final ProgramRunner runner = RunnerRegistry.getInstance().getRunner(myExecutor.getId(), configuration); + if (!ExecutionTargetManager.canRun(runnerAndConfigurationSettings, pair.getSecond()) + && runner != null && !isStarting(project, myExecutor.getId(), runner.getRunnerId())) { + return false; + } + } + return true; + } + @Override public void update(final AnActionEvent e) { final Presentation presentation = e.getPresentation(); @@ -217,12 +240,12 @@ public class ExecutorRegistryImpl extends ExecutorRegistry implements Disposable } presentation.setIcon(getInformativeIcon(project, selectedConfiguration)); - final ProgramRunner runner = RunnerRegistry.getInstance().getRunner(myExecutor.getId(), selectedConfiguration.getConfiguration()); - - ExecutionTarget target = ExecutionTargetManager.getActiveTarget(project); - enabled = ExecutionTargetManager.canRun(selectedConfiguration, target) - && runner != null && !isStarting(project, myExecutor.getId(), runner.getRunnerId()); - + RunConfiguration configuration = selectedConfiguration.getConfiguration(); + if (configuration instanceof CompoundRunConfiguration) { + enabled = canRun(project, ((CompoundRunConfiguration)configuration).getConfigurationsWithEffectiveRunTargets()); + } else { + enabled = canRun(project, Collections.singletonList(new Pair<>(selectedConfiguration, ExecutionTargetManager.getActiveTarget(project)))); + } if (enabled) { presentation.setDescription(myExecutor.getDescription()); } @@ -276,6 +299,23 @@ public class ExecutorRegistryImpl extends ExecutorRegistry implements Disposable return RunManager.getInstance(project).getSelectedConfiguration(); } + private void run(@NotNull Project project, @Nullable RunnerAndConfigurationSettings configuration, @NotNull DataContext dataContext) { + if (configuration != null && configuration.getConfiguration() instanceof CompoundRunConfiguration) { + List> pairs = + ((CompoundRunConfiguration)configuration.getConfiguration()).getConfigurationsWithEffectiveRunTargets(); + for (Pair pair : pairs) { + run(project, pair.getFirst(), dataContext); + } + } else { + ExecutionEnvironmentBuilder builder = + configuration == null ? null : ExecutionEnvironmentBuilder.createOrNull(myExecutor, configuration); + if (builder == null) { + return; + } + ExecutionManager.getInstance(project).restartRunProfile(builder.activeTarget().dataContext(dataContext).build()); + } + } + @Override public void actionPerformed(final AnActionEvent e) { final Project project = e.getProject(); @@ -283,12 +323,7 @@ public class ExecutorRegistryImpl extends ExecutorRegistry implements Disposable return; } - RunnerAndConfigurationSettings configuration = getSelectedConfiguration(project); - ExecutionEnvironmentBuilder builder = configuration == null ? null : ExecutionEnvironmentBuilder.createOrNull(myExecutor, configuration); - if (builder == null) { - return; - } - ExecutionManager.getInstance(project).restartRunProfile(builder.activeTarget().dataContext(e.getDataContext()).build()); + run(project, getSelectedConfiguration(project), e.getDataContext()); } } }