IDEA-147759 Allow to launch debug mode with Compound Run Configuration

This commit is contained in:
Vassiliy.Kudryashov
2017-12-02 01:15:38 +03:00
parent 2f7889f064
commit d33401b6ac
@@ -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<Pair<RunnerAndConfigurationSettings, ExecutionTarget>> pairs) {
if (pairs.isEmpty()) {
return false;
}
for (Pair<RunnerAndConfigurationSettings, ExecutionTarget> 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<Pair<RunnerAndConfigurationSettings, ExecutionTarget>> pairs =
((CompoundRunConfiguration)configuration.getConfiguration()).getConfigurationsWithEffectiveRunTargets();
for (Pair<RunnerAndConfigurationSettings, ExecutionTarget> 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());
}
}
}