From ed7442e73de43920450148b4a5750241a1a022b4 Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 28 May 2015 11:18:31 +0200 Subject: [PATCH] StandardPatterns.and: join the conditions to make PsiNamePatternCondition extractable --- .../intellij/patterns/StandardPatterns.java | 55 +++++++++++-------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/platform/core-api/src/com/intellij/patterns/StandardPatterns.java b/platform/core-api/src/com/intellij/patterns/StandardPatterns.java index 89b94964b2e7..9d8a5f3fc071 100644 --- a/platform/core-api/src/com/intellij/patterns/StandardPatterns.java +++ b/platform/core-api/src/com/intellij/patterns/StandardPatterns.java @@ -18,6 +18,7 @@ package com.intellij.patterns; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Key; import com.intellij.util.ProcessingContext; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -122,32 +123,42 @@ public class StandardPatterns { } public static ElementPattern and(final ElementPattern... patterns) { - return new ObjectPattern.Capture(new InitialPatternConditionPlus(Object.class) { - @Override - public boolean accepts(@Nullable final Object o, final ProcessingContext context) { - for (final ElementPattern pattern : patterns) { - if (!pattern.accepts(o, context)) return false; - } - return true; + final List initial = ContainerUtil.newSmartList(); + for (ElementPattern pattern : patterns) { + initial.add(pattern.getCondition().getInitialCondition()); + } + ObjectPattern.Capture result = composeInitialConditions(initial); + for (ElementPattern pattern : patterns) { + for (PatternCondition condition : (List>)pattern.getCondition().getConditions()) { + result = result.with((PatternCondition)condition); } + } + return result; + } - @Override - public void append(@NotNull @NonNls final StringBuilder builder, final String indent) { - boolean first = true; - for (final ElementPattern pattern : patterns) { - if (!first) { - builder.append("\n").append(indent); + @NotNull + private static ObjectPattern.Capture composeInitialConditions(final List initial) { + return new ObjectPattern.Capture(new InitialPatternCondition(Object.class) { + @Override + public boolean accepts(@Nullable final Object o, final ProcessingContext context) { + for (final InitialPatternCondition pattern : initial) { + if (!pattern.accepts(o, context)) return false; } - first = false; - pattern.getCondition().append(builder, indent + " "); + return true; } - } - - @Override - public List> getPatterns() { - return Arrays.>asList(patterns); - } - }); + + @Override + public void append(@NotNull @NonNls final StringBuilder builder, final String indent) { + boolean first = true; + for (final InitialPatternCondition pattern : initial) { + if (!first) { + builder.append("\n").append(indent); + } + first = false; + pattern.append(builder, indent + " "); + } + } + }); } public static ObjectPattern.Capture not(final ElementPattern pattern) {