From dbe73abeb115318f65dbab094bd95324ff2ac52d Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 14 Feb 2012 13:51:56 +0100 Subject: [PATCH] IDEA-80815 Access to a Groovy console in any Java project --- .../groovy/console/GroovyShellAction.java | 53 ++++++++++++++----- .../groovy/grape/GrabDependencies.java | 2 +- .../runner/DefaultGroovyScriptRunner.java | 15 ++++-- .../plugins/groovy/util/GroovyUtils.java | 11 ++++ .../compiler/GroovyCompilerTestCase.java | 8 +-- 5 files changed, 64 insertions(+), 25 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/console/GroovyShellAction.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/console/GroovyShellAction.java index b0f977c0bff2..4df327fe2caa 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/console/GroovyShellAction.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/console/GroovyShellAction.java @@ -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 getModulesWithGroovySupport(Project project) { + private static final String GROOVY_SHELL_LAST_MODULE = "Groovy.Shell.LastModule"; + + private static List getGroovyCompatibleModules(Project project) { ArrayList result = new ArrayList(); 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 modules = getModulesWithGroovySupport(project); + List modules = getGroovyCompatibleModules(project); if (modules.size() == 1) { runShell(modules.get(0)); return; } + Collections.sort(modules, ModulesAlphaComparator.INSTANCE); + + final Map versions = new HashMap(); + 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 step = new BaseListPopupStep("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()); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/grape/GrabDependencies.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/grape/GrabDependencies.java index 3dc08f8bdc13..37baf7cb1eb1 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/grape/GrabDependencies.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/grape/GrabDependencies.java @@ -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); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/DefaultGroovyScriptRunner.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/DefaultGroovyScriptRunner.java index e3979fb0e09e..1c8f9abf4d0f 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/DefaultGroovyScriptRunner.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/DefaultGroovyScriptRunner.java @@ -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); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/util/GroovyUtils.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/util/GroovyUtils.java index 8b2eb1998594..a5a6b8d38c20 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/util/GroovyUtils.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/util/GroovyUtils.java @@ -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]; + } } \ No newline at end of file diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GroovyCompilerTestCase.java b/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GroovyCompilerTestCase.java index 5dee59b7d0db..03238af63731 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GroovyCompilerTestCase.java +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GroovyCompilerTestCase.java @@ -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