a separate executor for hot swapping is a bit too much, introduce a JavaProgramPatcher extension for just adding a parameter to command line

This commit is contained in:
peter
2010-03-25 16:15:08 +00:00
parent f8573e24a3
commit 50f78d6405
5 changed files with 44 additions and 38 deletions
@@ -24,6 +24,7 @@ import com.intellij.execution.configurations.*;
import com.intellij.execution.executors.DefaultDebugExecutor;
import com.intellij.execution.runners.ExecutionEnvironment;
import com.intellij.execution.runners.JavaPatchableProgramRunner;
import com.intellij.execution.runners.JavaProgramPatcher;
import com.intellij.execution.ui.RunContentDescriptor;
import com.intellij.history.LocalHistory;
import com.intellij.history.LocalHistoryConfiguration;
@@ -64,6 +65,7 @@ public class GenericDebuggerRunner extends JavaPatchableProgramRunner<GenericDeb
ExecutionEnvironment env) throws ExecutionException {
if (state instanceof JavaCommandLine) {
final JavaParameters parameters = ((JavaCommandLine)state).getJavaParameters();
runCustomPatchers(parameters, state.getRunnerSettings(), executor);
RemoteConnection connection = DebuggerManagerImpl.createDebugParameters(parameters, true, DebuggerSettings.getInstance().DEBUGGER_TRANSPORT, "", false);
return attachVirtualMachine(project, executor, state, contentToReuse, env, connection, true);
}
@@ -114,6 +116,13 @@ public class GenericDebuggerRunner extends JavaPatchableProgramRunner<GenericDeb
return DebuggerManagerImpl.createDebugParameters(javaParameters, debuggerSettings, false);
}
private static void runCustomPatchers(JavaParameters javaParameters, RunnerSettings settings, Executor executor) {
final RunProfile profile = settings.getRunProfile();
for (JavaProgramPatcher patcher : JavaProgramPatcher.EP_NAME.getExtensions()) {
patcher.patchJavaParameters(executor, profile, javaParameters);
}
}
public SettingsEditor<GenericDebuggerRunnerSettings> getSettingsEditor(final Executor executor, RunConfiguration configuration) {
if (configuration instanceof RunConfigurationWithRunnerSettings) {
if (((RunConfigurationWithRunnerSettings)configuration).isSettingsNeeded()) {
@@ -0,0 +1,17 @@
package com.intellij.execution.runners;
import com.intellij.execution.Executor;
import com.intellij.execution.configurations.JavaParameters;
import com.intellij.execution.configurations.RunProfile;
import com.intellij.openapi.extensions.ExtensionPointName;
/**
* For now, used only to patch the debugged run configuration. May be extended to other executors when needed.
*
* @author peter
*/
public interface JavaProgramPatcher {
ExtensionPointName<JavaProgramPatcher> EP_NAME = ExtensionPointName.create("com.intellij.java.programPatcher");
void patchJavaParameters(Executor executor, RunProfile configuration, JavaParameters javaParameters);
}
@@ -2,13 +2,13 @@
<id>org.intellij.groovy.hotswap</id>
<name>Groovy HotSwap</name>
<description>Enables HotSwap functionality in Groovy classes</description>
<version>0.4</version>
<idea-version since-build="93.90" until-build="96.1"/>
<version>0.5</version>
<idea-version since-build="94.632" until-build="96.1"/>
<vendor logo="/org/jetbrains/plugins/groovy/images/groovy_16x16.png" url="http://www.jetbrains.com">JetBrains Inc.</vendor>
<depends>org.intellij.groovy</depends>
<extensions defaultExtensionNs="com.intellij">
<programRunner implementation="org.jetbrains.plugins.groovy.debugger.GroovyHotSwapper"/>
<java.programPatcher implementation="org.jetbrains.plugins.groovy.debugger.GroovyHotSwapper"/>
</extensions>
</idea-plugin>
@@ -1,23 +1,16 @@
package org.jetbrains.plugins.groovy.debugger;
import com.intellij.debugger.impl.GenericDebuggerRunner;
import com.intellij.execution.ExecutionException;
import com.intellij.execution.Executor;
import com.intellij.execution.application.ApplicationConfiguration;
import com.intellij.execution.configurations.JavaCommandLine;
import com.intellij.execution.configurations.JavaParameters;
import com.intellij.execution.configurations.RunConfiguration;
import com.intellij.execution.configurations.RunProfile;
import com.intellij.execution.configurations.RunProfileState;
import com.intellij.execution.executors.DefaultDebugExecutor;
import com.intellij.execution.runners.ExecutionEnvironment;
import com.intellij.execution.ui.RunContentDescriptor;
import com.intellij.execution.runners.JavaProgramPatcher;
import com.intellij.openapi.application.PluginPathManager;
import com.intellij.openapi.project.Project;
import com.intellij.psi.search.FilenameIndex;
import com.intellij.util.PathUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.groovy.GroovyFileTypeLoader;
import org.jetbrains.plugins.groovy.runner.GroovyScriptRunConfiguration;
import java.io.File;
import java.util.ArrayList;
@@ -27,17 +20,7 @@ import java.util.List;
/**
* @author peter
*/
public class GroovyHotSwapper extends GenericDebuggerRunner {
public boolean canRun(@NotNull final String executorId, @NotNull final RunProfile profile) {
if (!executorId.equals(DefaultDebugExecutor.EXECUTOR_ID)) {
return false;
}
if ("false".equals(System.getProperty("enable.groovy.hotswap", "true"))) {
return false;
}
return profile instanceof GroovyScriptRunConfiguration || profile instanceof ApplicationConfiguration;
}
public class GroovyHotSwapper implements JavaProgramPatcher {
private static boolean endsWithAny(String s, List<String> endings) {
for (String extension : endings) {
@@ -61,23 +44,17 @@ public class GroovyHotSwapper extends GenericDebuggerRunner {
return false;
}
@NotNull
public String getRunnerId() {
return "GroovyHotSwapper";
}
@Override
protected RunContentDescriptor createContentDescriptor(Project project,
Executor executor,
RunProfileState state,
RunContentDescriptor contentToReuse,
ExecutionEnvironment env) throws ExecutionException {
if (state instanceof JavaCommandLine && containsGroovyClasses(project)) {
final JavaParameters params = ((JavaCommandLine)state).getJavaParameters();
params.getVMParametersList().add("-javaagent:" + getAgentJarPath());
public void patchJavaParameters(Executor executor, RunProfile configuration, JavaParameters javaParameters) {
if (!executor.getId().equals(DefaultDebugExecutor.EXECUTOR_ID)) {
return;
}
if ("false".equals(System.getProperty("enable.groovy.hotswap", "true"))) {
return;
}
return super.createContentDescriptor(project, executor, state, contentToReuse, env);
if (configuration instanceof RunConfiguration && containsGroovyClasses(((RunConfiguration)configuration).getProject())) {
javaParameters.getVMParametersList().add("-javaagent:" + getAgentJarPath());
}
}
private static String getAgentJarPath() {
+3
View File
@@ -82,6 +82,9 @@
<extensionPoint name="debugger.jvmDebugProvider"
interface="com.intellij.debugger.engine.JVMDebugProvider"/>
<extensionPoint name="java.programPatcher"
beanClass="com.intellij.execution.runners.JavaProgramPatcher"/>
<extensionPoint name="OrderRootTypeUI"
beanClass="com.intellij.openapi.extensions.KeyedFactoryEPBean"/>