[groovy] script configuration: ensure runner configured in checkConfiguration()

This commit is contained in:
Daniil Ovchinnikov
2016-11-23 17:05:52 +03:00
parent f224cc0422
commit fcadcf7820
6 changed files with 59 additions and 87 deletions
@@ -17,9 +17,10 @@ package org.jetbrains.plugins.gradle.config;
import com.intellij.compiler.options.CompileStepBeforeRun;
import com.intellij.compiler.options.CompileStepBeforeRunNoErrorCheck;
import com.intellij.execution.*;
import com.intellij.execution.CantRunException;
import com.intellij.execution.Location;
import com.intellij.execution.RunManagerEx;
import com.intellij.execution.configurations.JavaParameters;
import com.intellij.execution.configurations.RunProfile;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.externalSystem.psi.search.ExternalModuleBuildGlobalSearchScope;
import com.intellij.openapi.externalSystem.util.ExternalSystemConstants;
@@ -172,12 +173,10 @@ public class GradleScriptType extends GroovyRunnableScriptType {
}
@Override
public boolean ensureRunnerConfigured(@Nullable Module module, RunProfile profile, Executor executor, final Project project) throws ExecutionException {
if (project != null && profile instanceof GroovyScriptRunConfiguration) {
GroovyScriptRunConfiguration configuration = (GroovyScriptRunConfiguration)profile;
String parameters = configuration.getProgramParameters();
if (parameters != null) {
// TODO den implement
public void ensureRunnerConfigured(@NotNull GroovyScriptRunConfiguration configuration) {
String parameters = configuration.getProgramParameters();
if (parameters != null) {
// TODO den implement
// GradleTasksList list = GradleUtil.getToolWindowElement(GradleTasksList.class, project, ExternalSystemDataKeys.RECENT_TASKS_LIST);
// if (list != null) {
// ExternalSystemTaskDescriptor descriptor = new ExternalSystemTaskDescriptor(parameters, null);
@@ -185,7 +184,6 @@ public class GradleScriptType extends GroovyRunnableScriptType {
// list.setFirst(descriptor);
// GradleLocalSettings.getInstance(project).setRecentTasks(list.getModel().getTasks());
// }
}
}
final GradleInstallationManager libraryManager = ServiceManager.getService(GradleInstallationManager.class);
// TODO den implement
@@ -203,7 +201,6 @@ public class GradleScriptType extends GroovyRunnableScriptType {
// return false;
// }
// }
return true;
}
@Override
@@ -15,6 +15,7 @@
*/
package org.jetbrains.plugins.groovy.lang.psi.util;
import com.intellij.openapi.project.DumbService;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiMethodUtil;
import com.intellij.psi.util.PsiTreeUtil;
@@ -27,6 +28,7 @@ public class GroovyRunnerPsiUtil {
@Nullable
public static PsiClass getRunningClass(@Nullable PsiElement element) {
if (element == null) return null;
if (DumbService.isDumb(element.getProject())) return null;
final PsiFile file = element.getContainingFile();
if (!(file instanceof GroovyFile)) return null;
@@ -16,19 +16,16 @@
package org.jetbrains.plugins.groovy.gant;
import com.intellij.execution.CantRunException;
import com.intellij.execution.Executor;
import com.intellij.execution.configurations.JavaParameters;
import com.intellij.execution.configurations.RunProfile;
import com.intellij.execution.configurations.RuntimeConfigurationException;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.options.ShowSettingsUtil;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.libraries.LibraryUtil;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.containers.ContainerUtil;
import icons.JetgroovyIcons;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.groovy.config.GroovyConfigUtils;
@@ -55,20 +52,13 @@ public class GantRunner extends GroovyScriptRunner {
}
@Override
public boolean ensureRunnerConfigured(@Nullable Module module, RunProfile profile, Executor executor, final Project project) {
if (GantUtils.getSDKInstallPath(module, project).isEmpty()) {
int result = Messages
.showOkCancelDialog("Gant is not configured. Do you want to configure it?", "Configure Gant SDK",
JetgroovyIcons.Groovy.Gant_16x16);
if (result == Messages.OK) {
ShowSettingsUtil.getInstance().editConfigurable(project, new GantConfigurable(project));
}
if (GantUtils.getSDKInstallPath(module, project).isEmpty()) {
return false;
}
public void ensureRunnerConfigured(@NotNull GroovyScriptRunConfiguration configuration) throws RuntimeConfigurationException {
Project project = configuration.getProject();
if (GantUtils.getSDKInstallPath(configuration.getModule(), project).isEmpty()) {
RuntimeConfigurationException e = new RuntimeConfigurationException("Gant is not configured");
e.setQuickFix(() -> ShowSettingsUtil.getInstance().editConfigurable(project, new GantConfigurable(project)));
throw e;
}
return true;
}
private static String getGantConfPath(final String gantHome) {
@@ -17,14 +17,10 @@
package org.jetbrains.plugins.groovy.runner;
import com.intellij.execution.CantRunException;
import com.intellij.execution.ExecutionException;
import com.intellij.execution.Executor;
import com.intellij.execution.configurations.JavaParameters;
import com.intellij.execution.configurations.RunProfile;
import com.intellij.execution.runners.ExecutionUtil;
import com.intellij.execution.configurations.RuntimeConfigurationException;
import com.intellij.execution.util.ScriptFileUtil;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ui.configuration.ClasspathEditor;
import com.intellij.openapi.roots.ui.configuration.ModulesConfigurator;
import com.intellij.openapi.util.Comparing;
@@ -52,17 +48,17 @@ public class DefaultGroovyScriptRunner extends GroovyScriptRunner {
}
@Override
public boolean ensureRunnerConfigured(@Nullable Module module, RunProfile profile, Executor executor, final Project project) throws ExecutionException {
public void ensureRunnerConfigured(@NotNull GroovyScriptRunConfiguration configuration) throws RuntimeConfigurationException {
Module module = configuration.getModule();
if (module == null) {
throw new ExecutionException("Module is not specified");
throw new RuntimeConfigurationException("Module is not specified");
}
if (LibrariesUtil.getGroovyHomePath(module) == null) {
ExecutionUtil.handleExecutionError(project, executor.getToolWindowId(), profile, new ExecutionException("Groovy is not configured"));
ModulesConfigurator.showDialog(module.getProject(), module.getName(), ClasspathEditor.NAME);
return false;
RuntimeConfigurationException e = new RuntimeConfigurationException("Groovy is not configured for module '" + module.getName() + "'");
e.setQuickFix(() -> ModulesConfigurator.showDialog(module.getProject(), module.getName(), ClasspathEditor.NAME));
throw e;
}
return true;
}
@Override
@@ -15,7 +15,10 @@
*/
package org.jetbrains.plugins.groovy.runner;
import com.intellij.execution.*;
import com.intellij.execution.CommonJavaRunConfigurationParameters;
import com.intellij.execution.ExecutionException;
import com.intellij.execution.Executor;
import com.intellij.execution.ExternalizablePath;
import com.intellij.execution.configurations.*;
import com.intellij.execution.process.OSProcessHandler;
import com.intellij.execution.process.ProcessAdapter;
@@ -24,7 +27,6 @@ import com.intellij.execution.runners.ExecutionEnvironment;
import com.intellij.execution.util.ProgramParametersUtil;
import com.intellij.execution.util.ScriptFileUtil;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.options.SettingsEditor;
@@ -71,7 +73,6 @@ import java.util.Map;
public class GroovyScriptRunConfiguration extends ModuleBasedConfiguration<RunConfigurationModule>
implements CommonJavaRunConfigurationParameters, RefactoringListenerProvider {
private static final Logger LOG = Logger.getInstance(GroovyScriptRunConfiguration.class);
private String vmParams;
private String workDir;
private boolean isDebugEnabled;
@@ -94,7 +95,7 @@ public class GroovyScriptRunConfiguration extends ModuleBasedConfiguration<RunCo
@Override
public Collection<Module> getValidModules() {
Module[] modules = ModuleManager.getInstance(getProject()).getModules();
final GroovyScriptRunner scriptRunner = findConfiguration();
final GroovyScriptRunner scriptRunner = getScriptRunner();
if (scriptRunner == null) {
return Arrays.asList(modules);
}
@@ -110,21 +111,20 @@ public class GroovyScriptRunConfiguration extends ModuleBasedConfiguration<RunCo
}
@Nullable
private GroovyScriptRunner findConfiguration() {
final VirtualFile scriptFile = getScriptFile();
if (scriptFile == null) {
return null;
}
private GroovyScriptRunner getScriptRunner() {
final VirtualFile scriptFile = ScriptFileUtil.findScriptFileByPath(getScriptPath());
if (scriptFile == null) return null;
final PsiFile psiFile = PsiManager.getInstance(getProject()).findFile(scriptFile);
if (!(psiFile instanceof GroovyFile)) {
return null;
if (!(psiFile instanceof GroovyFile)) return null;
final GroovyFile groovyFile = (GroovyFile)psiFile;
if (groovyFile.isScript()) {
return GroovyScriptUtil.getScriptType(groovyFile).getRunner();
}
if (!((GroovyFile)psiFile).isScript()) {
else {
return new DefaultGroovyScriptRunner();
}
return GroovyScriptUtil.getScriptType((GroovyFile)psiFile).getRunner();
}
@Override
@@ -159,22 +159,11 @@ public class GroovyScriptRunConfiguration extends ModuleBasedConfiguration<RunCo
@Override
public RunProfileState getState(@NotNull Executor executor, @NotNull ExecutionEnvironment environment) throws ExecutionException {
final VirtualFile script = getScriptFile();
if (script == null) {
throw new CantRunException("Cannot find script " + scriptPath);
}
final VirtualFile scriptFile = ScriptFileUtil.findScriptFileByPath(getScriptPath());
assert scriptFile != null;
final GroovyScriptRunner scriptRunner = findConfiguration();
if (scriptRunner == null) {
throw new CantRunException("Unknown script type " + scriptPath);
}
final Module module = getModule();
if (!scriptRunner.ensureRunnerConfigured(module, this, executor, getProject())) {
return null;
}
final boolean tests = ProjectRootManager.getInstance(getProject()).getFileIndex().isInTestSourceContent(script);
final GroovyScriptRunner scriptRunner = getScriptRunner();
assert scriptRunner != null;
return new JavaCommandLineState(environment) {
@NotNull
@@ -198,9 +187,11 @@ public class GroovyScriptRunConfiguration extends ModuleBasedConfiguration<RunCo
@Override
protected JavaParameters createJavaParameters() throws ExecutionException {
final Module module = getModule();
final boolean tests = ProjectRootManager.getInstance(getProject()).getFileIndex().isInTestSourceContent(scriptFile);
JavaParameters params = createJavaParametersWithSdk(module);
ProgramParametersUtil.configureConfiguration(params, GroovyScriptRunConfiguration.this);
scriptRunner.configureCommandLine(params, module, tests, script, GroovyScriptRunConfiguration.this);
scriptRunner.configureCommandLine(params, module, tests, scriptFile, GroovyScriptRunConfiguration.this);
return params;
}
@@ -273,19 +264,6 @@ public class GroovyScriptRunConfiguration extends ModuleBasedConfiguration<RunCo
return params;
}
@Nullable
private VirtualFile getScriptFile() {
return ScriptFileUtil.findScriptFileByPath(scriptPath);
}
@Nullable
private PsiClass getScriptClass() {
final VirtualFile scriptFile = getScriptFile();
if (scriptFile == null) return null;
final PsiFile file = PsiManager.getInstance(getProject()).findFile(scriptFile);
return GroovyRunnerPsiUtil.getRunningClass(file);
}
@Override
@NotNull
public SettingsEditor<? extends RunConfiguration> getConfigurationEditor() {
@@ -295,7 +273,19 @@ public class GroovyScriptRunConfiguration extends ModuleBasedConfiguration<RunCo
@Override
public void checkConfiguration() throws RuntimeConfigurationException {
super.checkConfiguration();
final PsiClass toRun = getScriptClass();
final String scriptPath = getScriptPath();
final VirtualFile script = ScriptFileUtil.findScriptFileByPath(scriptPath);
if (script == null) throw new RuntimeConfigurationException("Cannot find script " + scriptPath);
final GroovyScriptRunner scriptRunner = getScriptRunner();
if (scriptRunner == null) throw new RuntimeConfigurationException("Unknown script type " + scriptPath);
scriptRunner.ensureRunnerConfigured(this);
final PsiFile file = PsiManager.getInstance(getProject()).findFile(script);
final PsiClass toRun = GroovyRunnerPsiUtil.getRunningClass(file);
if (toRun == null) {
throw new RuntimeConfigurationWarning(GroovyBundle.message("class.does.not.exist"));
}
@@ -16,12 +16,9 @@
package org.jetbrains.plugins.groovy.runner;
import com.intellij.execution.CantRunException;
import com.intellij.execution.ExecutionException;
import com.intellij.execution.Executor;
import com.intellij.execution.configurations.JavaParameters;
import com.intellij.execution.configurations.RunProfile;
import com.intellij.execution.configurations.RuntimeConfigurationException;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.JavaSdkType;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.OrderEnumerator;
@@ -47,7 +44,7 @@ public abstract class GroovyScriptRunner {
public abstract boolean isValidModule(@NotNull Module module);
public abstract boolean ensureRunnerConfigured(@Nullable Module module, RunProfile profile, Executor executor, final Project project) throws ExecutionException;
public abstract void ensureRunnerConfigured(@NotNull GroovyScriptRunConfiguration configuration) throws RuntimeConfigurationException;
public abstract void configureCommandLine(JavaParameters params, @Nullable Module module, boolean tests, VirtualFile script,
GroovyScriptRunConfiguration configuration) throws CantRunException;