mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-80815 Access to a Groovy console in any Java project
This commit is contained in:
@@ -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);
|
||||
|
||||
+11
-4
@@ -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];
|
||||
}
|
||||
}
|
||||
+2
-6
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user