IDEA-103303 "BeforeLaunch" tools in run/debug configurations do not do macro substitution

(After review http://crucible.labs.intellij.net/cru/CR-IC-2352)
This commit is contained in:
Vassiliy Kudryashov
2013-09-17 16:30:15 +04:00
parent 1b52604d81
commit fda2edf600
7 changed files with 51 additions and 57 deletions
@@ -21,7 +21,6 @@ import com.intellij.execution.runners.ExecutionEnvironment;
import com.intellij.execution.runners.ProgramRunner;
import com.intellij.execution.ui.RunContentDescriptor;
import com.intellij.execution.ui.RunContentManager;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.project.Project;
import com.intellij.util.messages.Topic;
import org.jetbrains.annotations.NotNull;
@@ -94,7 +93,7 @@ public abstract class ExecutionManager {
//currentDescriptor is null for toolbar/popup action and not null for actions in run/debug toolwindows
/**
* @deprecated use similar one with DataContext parameter {@link #restartRunProfile(com.intellij.openapi.project.Project, com.intellij.openapi.actionSystem.DataContext, Executor, ExecutionTarget, RunnerAndConfigurationSettings, com.intellij.execution.ui.RunContentDescriptor)}
* @deprecated use {@link #restartRunProfile(com.intellij.execution.runners.ProgramRunner, com.intellij.execution.runners.ExecutionEnvironment, com.intellij.execution.ui.RunContentDescriptor)}
*/
public abstract void restartRunProfile(@NotNull Project project,
@NotNull Executor executor,
@@ -102,13 +101,6 @@ public abstract class ExecutionManager {
@Nullable RunnerAndConfigurationSettings configuration,
@Nullable RunContentDescriptor currentDescriptor);
public abstract void restartRunProfile(@NotNull Project project,
@NotNull DataContext context,
@NotNull Executor executor,
@NotNull ExecutionTarget target,
@Nullable RunnerAndConfigurationSettings configuration,
@Nullable RunContentDescriptor currentDescriptor);
public abstract void restartRunProfile(@Nullable ProgramRunner runner,
@NotNull ExecutionEnvironment environment,
@Nullable RunContentDescriptor currentDescriptor);
@@ -24,15 +24,21 @@ import com.intellij.execution.configurations.RunnerSettings;
import com.intellij.execution.ui.RunContentDescriptor;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.DataKey;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.UserDataHolderBase;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.TestOnly;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicLong;
import static com.intellij.openapi.actionSystem.LangDataKeys.*;
public class ExecutionEnvironment extends UserDataHolderBase {
private static final AtomicLong myIdHolder = new AtomicLong(1L);
@@ -207,11 +213,34 @@ public class ExecutionEnvironment extends UserDataHolderBase {
}
void setDataContext(@NotNull DataContext dataContext) {
myDataContext = dataContext;
myDataContext = CachingDataContext.cacheIfNeed(dataContext);
}
@Nullable
public DataContext getDataContext() {
return myDataContext;
}
private static class CachingDataContext implements DataContext {
private static final DataKey[] keys = {PROJECT, PROJECT_FILE_DIRECTORY, EDITOR, VIRTUAL_FILE, MODULE, PSI_FILE};
private final Map<String, Object> values = new HashMap<String, Object>();
@NotNull
static CachingDataContext cacheIfNeed(@NotNull DataContext context) {
if (context instanceof CachingDataContext)
return (CachingDataContext)context;
return new CachingDataContext(context);
}
private CachingDataContext(DataContext context) {
for (DataKey key : keys) {
values.put(key.getName(), key.getData(context));
}
}
@Override
public Object getData(@NonNls String dataId) {
return values.get(dataId);
}
}
}
@@ -17,9 +17,9 @@
package com.intellij.execution;
import com.intellij.execution.actions.RunContextAction;
import com.intellij.execution.impl.HackyDataContext;
import com.intellij.execution.process.ProcessHandler;
import com.intellij.execution.runners.ExecutionEnvironment;
import com.intellij.execution.runners.ExecutionEnvironmentBuilder;
import com.intellij.execution.runners.ProgramRunner;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.diagnostic.Logger;
@@ -255,7 +255,14 @@ public class ExecutorRegistryImpl extends ExecutorRegistry {
}
ExecutionTarget target = ExecutionTargetManager.getActiveTarget(project);
ExecutionManager.getInstance(project).restartRunProfile(project, HackyDataContext.hackIfNeed(dataContext), myExecutor, target, configuration, null);
ExecutionEnvironmentBuilder builder = new ExecutionEnvironmentBuilder(project, myExecutor);
ProgramRunner runner = ProgramRunnerUtil.getRunner(myExecutor.getId(), configuration);
if (runner == null) {
return;
}
builder.setDataContext(dataContext).setTarget(target).setRunnerAndSettings(runner, configuration);
ExecutionManager.getInstance(project).restartRunProfile(runner, builder.build(), null);
}
}
}
@@ -19,7 +19,6 @@ package com.intellij.execution;
import com.intellij.execution.configurations.ConfigurationFactory;
import com.intellij.execution.configurations.ConfigurationType;
import com.intellij.execution.configurations.RunConfiguration;
import com.intellij.execution.impl.HackyDataContext;
import com.intellij.execution.impl.RunDialog;
import com.intellij.execution.impl.RunManagerImpl;
import com.intellij.execution.runners.ExecutionEnvironmentBuilder;
@@ -103,10 +102,7 @@ public class ProgramRunnerUtil {
try {
ExecutionEnvironmentBuilder builder =
new ExecutionEnvironmentBuilder(project, executor).setRunnerAndSettings(runner, configuration).setTarget(target)
.setContentToReuse(contentToReuse).assignNewId();
if (context != null) {
builder.setDataContext(HackyDataContext.hackIfNeed(context));
}
.setContentToReuse(contentToReuse).assignNewId().setDataContext(context);
runner.execute(builder.build());
}
catch (ExecutionException e) {
@@ -282,21 +282,12 @@ public class ExecutionManagerImpl extends ExecutionManager implements ProjectCom
restartRunProfile(project, null, null, null, null, null, executor, target, configuration, currentDescriptor);
}
@Override
public void restartRunProfile(@NotNull Project project,
@NotNull DataContext context,
@NotNull Executor executor,
@NotNull ExecutionTarget target,
@Nullable RunnerAndConfigurationSettings configuration,
@Nullable RunContentDescriptor currentDescriptor) {
restartRunProfile(project, context, null, null, null, null, executor, target, configuration, currentDescriptor);
}
@Override
public void restartRunProfile(@Nullable ProgramRunner runner,
@NotNull ExecutionEnvironment environment,
@Nullable RunContentDescriptor currentDescriptor) {
restartRunProfile(environment.getProject(), null,
restartRunProfile(environment.getProject(),
environment.getDataContext(),
runner,
environment.getRunProfile(),
environment.getRunnerSettings(),
@@ -376,10 +367,7 @@ public class ExecutionManagerImpl extends ExecutionManager implements ProjectCom
try {
ExecutionEnvironmentBuilder builder = new ExecutionEnvironmentBuilder(project, executor);
builder.setRunProfile(runProfile).setRunnerSettings(runnerSettings).setContentToReuse(descriptor)
.setTarget(target).setConfigurationSettings(configurationPerRunnerSettings);
if (context != null) {
builder.setDataContext(HackyDataContext.hackIfNeed(context));
}
.setTarget(target).setConfigurationSettings(configurationPerRunnerSettings).setDataContext(context);
if (configuration != null) {
builder.setRunnerAndSettings(runner, configuration);
} else {
@@ -13,18 +13,17 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.execution.impl;
package com.intellij.tools;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.DataKey;
import com.intellij.openapi.actionSystem.LangDataKeys;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import java.util.HashMap;
import java.util.Map;
import static com.intellij.openapi.actionSystem.LangDataKeys.*;
/**
* Stores main keys from DataContext.
*
@@ -33,27 +32,11 @@ import java.util.Map;
*
* @author Konstantin Bulenkov
*/
public class HackyDataContext implements DataContext {
private static final DataKey[] keys = {
PlatformDataKeys.PROJECT,
PlatformDataKeys.PROJECT_FILE_DIRECTORY,
PlatformDataKeys.EDITOR,
PlatformDataKeys.VIRTUAL_FILE,
LangDataKeys.MODULE,
LangDataKeys.PSI_FILE
};
class HackyDataContext implements DataContext {
private static final DataKey[] keys = {PROJECT, PROJECT_FILE_DIRECTORY, EDITOR, VIRTUAL_FILE, MODULE, PSI_FILE};
private final Map<String, Object> values = new HashMap<String, Object>();
@NotNull
public static HackyDataContext hackIfNeed(@NotNull DataContext context) {
if (context instanceof HackyDataContext)
return (HackyDataContext)context;
return new HackyDataContext(context);
}
private HackyDataContext(DataContext context) {
HackyDataContext(DataContext context) {
for (DataKey key : keys) {
values.put(key.getName(), key.getData(context));
}
@@ -16,7 +16,6 @@
package com.intellij.tools;
import com.intellij.execution.impl.HackyDataContext;
import com.intellij.execution.process.ProcessListener;
import com.intellij.ide.macro.MacroManager;
import com.intellij.openapi.actionSystem.AnAction;
@@ -76,7 +75,7 @@ public class ToolAction extends AnAction implements DumbAware {
static boolean runTool(String actionId, DataContext context, @Nullable AnActionEvent e, long executionId, @Nullable ProcessListener processListener) {
Tool tool = findTool(actionId, context);
if (tool != null) {
return tool.execute(e, HackyDataContext.hackIfNeed(context), executionId, processListener);
return tool.execute(e, new HackyDataContext(context), executionId, processListener);
}
return false;
}