2 * Copyright (c) 2000-2007 JetBrains s.r.o. All Rights Reserved.
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
;
20 public class DomElementPattern
<T
extends DomElement
,Self
extends DomElementPattern
<T
,Self
>> extends TreeElementPattern
<DomElement
,T
,Self
> {
21 protected DomElementPattern(final Class
<T
> aClass
) {
25 protected DomElementPattern(@NotNull final NullablePatternCondition condition
) {
29 protected DomElement
getParent(@NotNull DomElement t
) {
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
);
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
) {
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
;
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
)) {