mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
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:
@@ -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 {
|
||||
|
||||
+6
-23
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user