IDEA-80815 Access to a Groovy console in any Java project

This commit is contained in:
peter
2012-02-14 16:02:20 +01:00
parent 72363bc6ce
commit dbe73abeb1
5 changed files with 64 additions and 25 deletions
@@ -31,11 +31,9 @@ import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.project.DumbAwareAction;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.JavaSdkType;
import com.intellij.openapi.projectRoots.JdkUtil;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.projectRoots.SdkType;
import com.intellij.openapi.projectRoots.*;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.roots.ui.configuration.ModulesAlphaComparator;
import com.intellij.openapi.ui.popup.JBPopupFactory;
import com.intellij.openapi.ui.popup.PopupStep;
import com.intellij.openapi.ui.popup.util.BaseListPopupStep;
@@ -44,24 +42,31 @@ import com.intellij.util.PathsList;
import com.intellij.util.PlatformIcons;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.groovy.GroovyFileType;
import org.jetbrains.plugins.groovy.config.AbstractConfigUtils;
import org.jetbrains.plugins.groovy.config.GroovyConfigUtils;
import org.jetbrains.plugins.groovy.runner.DefaultGroovyScriptRunner;
import org.jetbrains.plugins.groovy.runner.GroovyScriptRunConfiguration;
import org.jetbrains.plugins.groovy.runner.GroovyScriptRunner;
import org.jetbrains.plugins.groovy.util.GroovyUtils;
import org.jetbrains.plugins.groovy.util.LibrariesUtil;
import java.util.ArrayList;
import java.util.List;
import java.util.*;
/**
* @author peter
*/
public class GroovyShellAction extends DumbAwareAction {
private static List<Module> getModulesWithGroovySupport(Project project) {
private static final String GROOVY_SHELL_LAST_MODULE = "Groovy.Shell.LastModule";
private static List<Module> getGroovyCompatibleModules(Project project) {
ArrayList<Module> result = new ArrayList<Module>();
for (Module module : ModuleManager.getInstance(project).getModules()) {
if (LibrariesUtil.getGroovyHomePath(module) != null) {
result.add(module);
if (GroovyUtils.isSuitableModule(module)) {
Sdk sdk = ModuleRootManager.getInstance(module).getSdk();
if (sdk != null && sdk.getSdkType() instanceof JavaSdkType) {
result.add(module);
}
}
}
return result;
@@ -70,7 +75,7 @@ public class GroovyShellAction extends DumbAwareAction {
@Override
public void update(AnActionEvent e) {
final Project project = e.getData(PlatformDataKeys.PROJECT);
if (project != null && !getModulesWithGroovySupport(project).isEmpty()) {
if (project != null && !getGroovyCompatibleModules(project).isEmpty()) {
e.getPresentation().setEnabled(true);
e.getPresentation().setVisible(true);
return;
@@ -84,17 +89,37 @@ public class GroovyShellAction extends DumbAwareAction {
public void actionPerformed(AnActionEvent e) {
final Project project = e.getData(PlatformDataKeys.PROJECT);
assert project != null;
List<Module> modules = getModulesWithGroovySupport(project);
List<Module> modules = getGroovyCompatibleModules(project);
if (modules.size() == 1) {
runShell(modules.get(0));
return;
}
Collections.sort(modules, ModulesAlphaComparator.INSTANCE);
final Map<Module, String> versions = new HashMap<Module, String>();
for (Module module : modules) {
String homePath = LibrariesUtil.getGroovyHomePath(module);
boolean bundled = false;
if (homePath == null) {
homePath = GroovyUtils.getBundledGroovyJar().getParentFile().getParent();
bundled = true;
}
String version = GroovyConfigUtils.getInstance().getSDKVersion(homePath);
versions.put(module, version == AbstractConfigUtils.UNDEFINED_VERSION
? "" : " (" + (bundled ? "Bundled " : "") + "Groovy " + version + ")");
}
BaseListPopupStep<Module> step =
new BaseListPopupStep<Module>("Which module to use classpath of?", modules, PlatformIcons.CONTENT_ROOT_ICON_CLOSED) {
@NotNull
@Override
public String getTextFor(Module value) {
return value.getName() + versions.get(value);
}
@Override
public String getIndexedString(Module value) {
return value.getName();
}
@@ -105,14 +130,14 @@ public class GroovyShellAction extends DumbAwareAction {
@Override
public PopupStep onChosen(Module selectedValue, boolean finalChoice) {
PropertiesComponent.getInstance(selectedValue.getProject()).setValue("Groovy.Shell.LastModule", selectedValue.getName());
PropertiesComponent.getInstance(selectedValue.getProject()).setValue(GROOVY_SHELL_LAST_MODULE, selectedValue.getName());
runShell(selectedValue);
return null;
}
};
for (int i = 0; i < modules.size(); i++) {
Module module = modules.get(i);
if (module.getName().equals(PropertiesComponent.getInstance(project).getValue("Groovy.Shell.LastModule"))) {
if (module.getName().equals(PropertiesComponent.getInstance(project).getValue(GROOVY_SHELL_LAST_MODULE))) {
step.setDefaultOptionIndex(i);
break;
}
@@ -132,7 +157,7 @@ public class GroovyShellAction extends DumbAwareAction {
@Override
protected Process createProcess(CommandLineArgumentsProvider provider) throws ExecutionException {
final JavaParameters javaParameters = GroovyScriptRunConfiguration.createJavaParametersWithSdk(module);
DefaultGroovyScriptRunner.configureGenericGroovyRunner(javaParameters, module, "groovy.ui.GroovyMain");
DefaultGroovyScriptRunner.configureGenericGroovyRunner(javaParameters, module, "groovy.ui.GroovyMain", true);
PathsList list = GroovyScriptRunner.getClassPathFromRootModel(module, true, javaParameters, true);
if (list != null) {
javaParameters.getProgramParametersList().addAll("--classpath", list.getPathsString());
@@ -124,7 +124,7 @@ public class GrabDependencies implements IntentionAction {
//debug
//javaParameters.getVMParametersList().add("-Xdebug"); javaParameters.getVMParametersList().add("-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5239");
DefaultGroovyScriptRunner.configureGenericGroovyRunner(javaParameters, module, "org.jetbrains.plugins.groovy.grape.GrapeRunner");
DefaultGroovyScriptRunner.configureGenericGroovyRunner(javaParameters, module, "org.jetbrains.plugins.groovy.grape.GrapeRunner", false);
PathsList list;
try {
list = GroovyScriptRunner.getClassPathFromRootModel(module, ProjectRootManager.getInstance(project).getFileIndex().isInTestSourceContent(vfile), javaParameters, true);
@@ -32,9 +32,9 @@ import com.intellij.openapi.vfs.CharsetToolkit;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.encoding.EncodingManager;
import com.intellij.openapi.vfs.encoding.EncodingProjectManager;
import com.intellij.util.ObjectUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.groovy.util.GroovyUtils;
import org.jetbrains.plugins.groovy.util.LibrariesUtil;
import java.nio.charset.Charset;
@@ -64,7 +64,7 @@ public class DefaultGroovyScriptRunner extends GroovyScriptRunner {
@Override
public void configureCommandLine(JavaParameters params, @Nullable Module module, boolean tests, VirtualFile script, GroovyScriptRunConfiguration configuration) throws CantRunException {
configureGenericGroovyRunner(params, module, "groovy.ui.GroovyMain");
configureGenericGroovyRunner(params, module, "groovy.ui.GroovyMain", false);
addClasspathFromRootModel(module, tests, params, true);
@@ -80,15 +80,22 @@ public class DefaultGroovyScriptRunner extends GroovyScriptRunner {
params.getProgramParametersList().addParametersString(configuration.getScriptParameters());
}
public static void configureGenericGroovyRunner(@NotNull JavaParameters params, @NotNull Module module, @NotNull String mainClass) {
public static void configureGenericGroovyRunner(@NotNull JavaParameters params, @NotNull Module module, @NotNull String mainClass, boolean mayUseBundled) {
final VirtualFile groovyJar = findGroovyJar(module);
if (groovyJar != null) {
params.getClassPath().add(groovyJar);
} else if (mayUseBundled) {
params.getClassPath().add(GroovyUtils.getBundledGroovyJar());
}
setToolsJar(params);
final String groovyHome = FileUtil.toSystemDependentName(ObjectUtils.assertNotNull(LibrariesUtil.getGroovyHomePath(module)));
String groovyHome = LibrariesUtil.getGroovyHomePath(module);
if (groovyHome != null) {
groovyHome = FileUtil.toSystemDependentName(groovyHome);
} else if (mayUseBundled) {
groovyHome = FileUtil.toCanonicalPath(GroovyUtils.getBundledGroovyJar().getParentFile().getParent());
}
setGroovyHome(params, groovyHome);
final String confPath = getConfPath(groovyHome);
@@ -16,11 +16,15 @@
package org.jetbrains.plugins.groovy.util;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.application.PluginPathManager;
import com.intellij.openapi.module.JavaModuleType;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.groovy.config.GroovyConfigUtils;
import org.jetbrains.plugins.groovy.lang.psi.GroovyFile;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition;
@@ -81,4 +85,11 @@ public abstract class GroovyUtils {
return null;
}
public static File getBundledGroovyJar() {
String root = ApplicationManager.getApplication().isUnitTestMode() ?
PluginPathManager.getPluginHomePath("groovy") + "/../../lib/" : PathManager.getHomePath() + "/lib/";
final File[] groovyJars = getFilesInDirectoryByPattern(root, GroovyConfigUtils.GROOVY_ALL_JAR_PATTERN);
assert groovyJars.length == 1;
return groovyJars[0];
}
}
@@ -16,7 +16,6 @@ import com.intellij.execution.runners.ProgramRunner;
import com.intellij.execution.ui.RunContentDescriptor;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.application.AccessToken;
import com.intellij.openapi.application.PluginPathManager;
import com.intellij.openapi.application.Result;
import com.intellij.openapi.application.WriteAction;
import com.intellij.openapi.application.ex.ApplicationManagerEx;
@@ -47,7 +46,6 @@ import com.intellij.util.ObjectUtils;
import com.intellij.util.concurrency.Semaphore;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.groovy.config.GroovyConfigUtils;
import org.jetbrains.plugins.groovy.util.GroovyUtils;
import javax.swing.*;
@@ -101,10 +99,8 @@ public abstract class GroovyCompilerTestCase extends JavaCodeInsightFixtureTestC
}
protected static void addGroovyLibrary(final Module to) {
final String root = PluginPathManager.getPluginHomePath("groovy") + "/../../lib/";
final File[] groovyJars = GroovyUtils.getFilesInDirectoryByPattern(root, GroovyConfigUtils.GROOVY_ALL_JAR_PATTERN);
assert groovyJars.length == 1;
PsiTestUtil.addLibrary(to, "groovy", root, groovyJars[0].getName());
File jar = GroovyUtils.getBundledGroovyJar();
PsiTestUtil.addLibrary(to, "groovy", jar.getParent(), jar.getName());
}
@Override