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 index 364052e11453..571aabf8485d 100644 --- a/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/predicates/ScriptSupport.java +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/predicates/ScriptSupport.java @@ -16,11 +16,14 @@ 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 org.jetbrains.annotations.NotNull; import java.io.File; import java.io.IOException; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * @author Maxim.Mossienko @@ -41,33 +44,53 @@ public class ScriptSupport { } } + private static Map buildVariableMap(@NotNull MatchResult result, @NotNull Map out) { + final String name = result.getName(); + if (name != null && !result.isMultipleMatch() && !result.isScopeMatch()) { + final Object value = out.get(name); + final PsiElement match = StructuralSearchUtil.getParentIfIdentifier(result.getMatch()); + if (value == null) { + out.put(name, match); + } + else if (value instanceof List) { + @SuppressWarnings("unchecked") + final List list = (List)value; + list.add(match); + } + else if (value instanceof PsiElement){ + final List list = new ArrayList(); + list.add((PsiElement)value); + list.add(match); + out.put(name, list); + } + else { + throw new AssertionError(); + } + } + if (result.hasSons()) { + for (MatchResult son : result.getAllSons()) { + buildVariableMap(son, out); + } + } + return out; + } + public String evaluate(MatchResult result, PsiElement context) { try { - final Binding binding = new Binding(); - + final HashMap variableMap = new HashMap(); if (result != null) { - for(MatchResult r:result.getAllSons()) { - if (r.isMultipleMatch()) { - final ArrayList elements = new ArrayList(); - for (MatchResult r2 : r.getAllSons()) { - elements.add(StructuralSearchUtil.getParentIfIdentifier(r2.getMatch())); - } - binding.setVariable(r.getName(), elements); - } - else { - binding.setVariable(r.getName(), StructuralSearchUtil.getParentIfIdentifier(r.getMatch())); - } + buildVariableMap(result, variableMap); + if (context == null) { + context = result.getMatch(); } } + final Binding binding = new Binding(variableMap); - if (context == null) { - context = result.getMatch(); - } context = StructuralSearchUtil.getParentIfIdentifier(context); binding.setVariable("__context__", context); script.setBinding(binding); - Object o = script.run(); + final Object o = script.run(); return String.valueOf(o); } catch (GroovyRuntimeException ex) { throw new StructuralSearchException(SSRBundle.message("groovy.script.error", ex.getMessage()));