StandardPatterns.and: join the conditions to make PsiNamePatternCondition extractable

This commit is contained in:
peter
2015-05-28 11:18:31 +02:00
parent 17ccd19a8e
commit ed7442e73d
@@ -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 <E> ElementPattern<E> and(final ElementPattern<? extends E>... patterns) {
return new ObjectPattern.Capture<E>(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<InitialPatternCondition> initial = ContainerUtil.newSmartList();
for (ElementPattern<?> pattern : patterns) {
initial.add(pattern.getCondition().getInitialCondition());
}
ObjectPattern.Capture<E> result = composeInitialConditions(initial);
for (ElementPattern pattern : patterns) {
for (PatternCondition<?> condition : (List<PatternCondition<?>>)pattern.getCondition().getConditions()) {
result = result.with((PatternCondition<? super E>)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 <E> ObjectPattern.Capture<E> composeInitialConditions(final List<InitialPatternCondition> initial) {
return new ObjectPattern.Capture<E>(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<ElementPattern<?>> getPatterns() {
return Arrays.<ElementPattern<?>>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 <E> ObjectPattern.Capture<E> not(final ElementPattern<E> pattern) {