blob: e4136ede2831a6e8e8c81e1546b96319bbe5608f [file] [log] [blame]
package com.intellij.structuralsearch.impl.matcher.predicates;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.psi.PsiElement;
import com.intellij.structuralsearch.MatchResult;
import com.intellij.structuralsearch.SSRBundle;
import com.intellij.structuralsearch.StructuralSearchException;
import com.intellij.structuralsearch.StructuralSearchUtil;
import com.intellij.structuralsearch.impl.matcher.MatchResultImpl;
import groovy.lang.Binding;
import groovy.lang.GroovyRuntimeException;
import groovy.lang.GroovyShell;
import groovy.lang.Script;
import org.codehaus.groovy.control.CompilationFailedException;
import org.codehaus.groovy.control.ErrorCollector;
import org.codehaus.groovy.control.MultipleCompilationErrorsException;
import org.codehaus.groovy.control.messages.Message;
import org.codehaus.groovy.control.messages.SyntaxErrorMessage;
import org.codehaus.groovy.syntax.SyntaxException;
import java.io.File;
import java.io.IOException;
import java.util.List;
/**
* @author Maxim.Mossienko
* Date: 11.06.2009
* Time: 16:25:12
*/
public class ScriptSupport {
private final Script script;
public ScriptSupport(String text, String name) {
File scriptFile = new File(text);
GroovyShell shell = new GroovyShell();
try {
script = scriptFile.exists() ? shell.parse(scriptFile):shell.parse(text, name);
} catch (Exception ex) {
Logger.getInstance(getClass().getName()).error(ex);
throw new RuntimeException(ex);
}
}
public String evaluate(MatchResultImpl result, PsiElement context) {
try {
Binding binding = new Binding();
if (result != null) {
for(MatchResult r:result.getMatches()) {
binding.setVariable(r.getName(),r.getMatchRef().getElement());
}
}
if (context == null) {
context = result.getMatchRef().getElement();
}
if (StructuralSearchUtil.isIdentifier(context)) context = context.getParent();
binding.setVariable("__context__", context);
script.setBinding(binding);
Object o = script.run();
return String.valueOf(o);
} catch (GroovyRuntimeException ex) {
throw new StructuralSearchException(SSRBundle.message("groovy.script.error", ex.getMessage()));
}
}
public static String checkValidScript(String scriptText) {
try {
final File scriptFile = new File(scriptText);
final GroovyShell shell = new GroovyShell();
final Script script = scriptFile.exists() ? shell.parse(scriptFile) : shell.parse(scriptText);
return null;
} catch (IOException e) {
return e.getMessage();
} catch (MultipleCompilationErrorsException e) {
final ErrorCollector errorCollector = e.getErrorCollector();
final List<Message> errors = errorCollector.getErrors();
for (Message error : errors) {
if (error instanceof SyntaxErrorMessage) {
final SyntaxErrorMessage errorMessage = (SyntaxErrorMessage)error;
final SyntaxException cause = errorMessage.getCause();
return cause.getMessage();
}
}
return e.getMessage();
} catch (CompilationFailedException ex) {
return ex.getLocalizedMessage();
}
}
}