diff --git a/platform/lang-api/src/com/intellij/execution/ExecutionManager.java b/platform/lang-api/src/com/intellij/execution/ExecutionManager.java index 30f0e985fc17..5e9029ebf93f 100644 --- a/platform/lang-api/src/com/intellij/execution/ExecutionManager.java +++ b/platform/lang-api/src/com/intellij/execution/ExecutionManager.java @@ -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); diff --git a/platform/lang-api/src/com/intellij/execution/runners/ExecutionEnvironment.java b/platform/lang-api/src/com/intellij/execution/runners/ExecutionEnvironment.java index 1b59c834de71..d3e509742309 100644 --- a/platform/lang-api/src/com/intellij/execution/runners/ExecutionEnvironment.java +++ b/platform/lang-api/src/com/intellij/execution/runners/ExecutionEnvironment.java @@ -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 values = new HashMap(); + + @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); + } + } } diff --git a/platform/lang-impl/src/com/intellij/execution/ExecutorRegistryImpl.java b/platform/lang-impl/src/com/intellij/execution/ExecutorRegistryImpl.java index 75eb3d2d125d..c9e29e1fc4da 100644 --- a/platform/lang-impl/src/com/intellij/execution/ExecutorRegistryImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/ExecutorRegistryImpl.java @@ -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); } } } diff --git a/platform/lang-impl/src/com/intellij/execution/ProgramRunnerUtil.java b/platform/lang-impl/src/com/intellij/execution/ProgramRunnerUtil.java index 937c6fb2c327..3f45de3c7edc 100644 --- a/platform/lang-impl/src/com/intellij/execution/ProgramRunnerUtil.java +++ b/platform/lang-impl/src/com/intellij/execution/ProgramRunnerUtil.java @@ -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) { diff --git a/platform/lang-impl/src/com/intellij/execution/impl/ExecutionManagerImpl.java b/platform/lang-impl/src/com/intellij/execution/impl/ExecutionManagerImpl.java index ba7bb1eda07e..2f2a0bb819bb 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/ExecutionManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/ExecutionManagerImpl.java @@ -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 { diff --git a/platform/lang-impl/src/com/intellij/execution/impl/HackyDataContext.java b/platform/lang-impl/src/com/intellij/tools/HackyDataContext.java similarity index 66% rename from platform/lang-impl/src/com/intellij/execution/impl/HackyDataContext.java rename to platform/lang-impl/src/com/intellij/tools/HackyDataContext.java index 8fdd424ca421..98e942b73c72 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/HackyDataContext.java +++ b/platform/lang-impl/src/com/intellij/tools/HackyDataContext.java @@ -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 values = new HashMap(); - @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)); } diff --git a/platform/lang-impl/src/com/intellij/tools/ToolAction.java b/platform/lang-impl/src/com/intellij/tools/ToolAction.java index 54f2a556634a..d02d0c26c8ed 100644 --- a/platform/lang-impl/src/com/intellij/tools/ToolAction.java +++ b/platform/lang-impl/src/com/intellij/tools/ToolAction.java @@ -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; }