diff options
Diffstat (limited to 'platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/predicates/ScriptSupport.java')
-rw-r--r-- | platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/predicates/ScriptSupport.java | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/predicates/ScriptSupport.java b/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/predicates/ScriptSupport.java new file mode 100644 index 000000000000..e4136ede2831 --- /dev/null +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/predicates/ScriptSupport.java @@ -0,0 +1,91 @@ +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(); + } + } +} |