patterns in openapi
[fedora-idea.git] / dom / openapi / src / com / intellij / patterns / DomElementPattern.java
blobd19f60f5caa28f201ce50948c423fb2575d84d46
1 /*
2 * Copyright (c) 2000-2007 JetBrains s.r.o. All Rights Reserved.
3 */
4 package com.intellij.patterns;
6 import com.intellij.util.xml.DomElement;
7 import com.intellij.util.xml.DomElementVisitor;
8 import com.intellij.util.xml.reflect.AbstractDomChildrenDescription;
9 import com.intellij.util.xml.reflect.DomChildrenDescription;
10 import org.jetbrains.annotations.NonNls;
11 import org.jetbrains.annotations.NotNull;
12 import org.jetbrains.annotations.Nullable;
14 import java.util.ArrayList;
15 import java.util.List;
17 /**
18 * @author peter
20 public class DomElementPattern<T extends DomElement,Self extends DomElementPattern<T,Self>> extends TreeElementPattern<DomElement,T,Self> {
21 protected DomElementPattern(final Class<T> aClass) {
22 super(aClass);
25 protected DomElementPattern(@NotNull final NullablePatternCondition condition) {
26 super(condition);
29 protected DomElement getParent(@NotNull DomElement t) {
30 return t.getParent();
33 protected DomElement[] getChildren(@NotNull final DomElement domElement) {
34 final List<DomElement> children = new ArrayList<DomElement>();
35 domElement.acceptChildren(new DomElementVisitor() {
36 public void visitDomElement(final DomElement element) {
37 children.add(element);
39 });
40 return children.toArray(new DomElement[children.size()]);
43 public static class Capture<T extends DomElement> extends DomElementPattern<T, Capture<T>> {
44 protected Capture(final Class<T> aClass) {
45 super(aClass);
48 public Capture() {
49 super(new NullablePatternCondition() {
50 public boolean accepts(@Nullable final Object o,
51 final MatchingContext matchingContext, @NotNull final TraverseContext traverseContext) {
52 return o instanceof DomElement;
54 });
58 public Self withChild(@NonNls @NotNull final String localName, final ElementPattern pattern) {
59 return with(new PatternCondition<T>() {
60 public boolean accepts(@NotNull final T t, final MatchingContext matchingContext, @NotNull final TraverseContext traverseContext) {
61 for (final AbstractDomChildrenDescription description : t.getGenericInfo().getChildrenDescriptions()) {
62 if (!(description instanceof DomChildrenDescription) || localName.equals(((DomChildrenDescription)description).getXmlElementName())) {
63 for (final DomElement element : description.getValues(t)) {
64 if (localName.equals(element.getXmlElementName()) && pattern.accepts(element, matchingContext, traverseContext)) {
65 return true;
70 return false;
72 });