EA-61477 (assert: SharedImplUtil.findFileElement)
[idea/community.git] / platform / structuralsearch / source / com / intellij / structuralsearch / impl / matcher / MatchResultImpl.java
1 package com.intellij.structuralsearch.impl.matcher;
2
3 import com.intellij.psi.PsiElement;
4 import com.intellij.structuralsearch.MatchResult;
5 import com.intellij.structuralsearch.plugin.util.SmartPsiPointer;
6 import org.jetbrains.annotations.NonNls;
7
8 import java.util.ArrayList;
9 import java.util.Iterator;
10 import java.util.List;
11
12 /**
13  * Class describing the match result
14  */
15 public final class MatchResultImpl extends MatchResult {
16   private String name;
17   private SmartPsiPointer matchRef;
18   private int start;
19   private int end = -1;
20   private String matchImage;
21   private List<MatchResult> matches;
22   private MatchResult parent;
23   private boolean target;
24
25   @NonNls public static final String DEFAULT_NAME2 = "end of context match";
26   @NonNls public static final String DEFAULT_NAME = "start of context match";
27   private boolean myScopeMatch;
28   private boolean myMultipleMatch;
29   @NonNls private static final String NULL = "null";
30   private MatchResultImpl myContext;
31
32   MatchResultImpl() {
33   }
34
35   public MatchResultImpl(String name, String image, SmartPsiPointer ref, boolean target) {
36     this(name,image,ref,0,-1,target);
37   }
38
39   public MatchResultImpl(String name, String image, SmartPsiPointer ref, int start, int end,boolean target) {
40     matchRef = ref;
41     this.name = name;
42     matchImage = image;
43     this.target = target;
44     this.start = start;
45     this.end = end;
46   }
47
48   public String getMatchImage() {
49     if (matchImage==null) {
50       matchImage = NULL;
51     }
52     return matchImage;
53   }
54
55   public void setParent(MatchResult parent) {
56     this.parent = parent;
57   }
58
59   public SmartPsiPointer getMatchRef() {
60     return matchRef;
61   }
62
63   public PsiElement getMatch() {
64     return matchRef.getElement();
65   }
66
67   public void setMatchRef(SmartPsiPointer matchStart) {
68     matchRef = matchStart;
69   }
70
71   public String getName() {
72     return name;
73   }
74
75   public void setName(String name) {
76     this.name = name;
77   }
78
79   public List<MatchResult> getMatches() {
80     if (matches==null) matches = new ArrayList<MatchResult>();
81     return matches;
82   }
83
84   public List<MatchResult> getAllSons() {
85     return getMatches();
86   }
87
88   public boolean hasSons() {
89     return matches!=null;
90   }
91
92   public boolean isScopeMatch() {
93     return myScopeMatch;
94   }
95
96   public boolean isMultipleMatch() {
97     return myMultipleMatch;
98   }
99
100   public void clear() {
101     if (matchRef != null) {
102       matchRef.clear();
103       matchRef = null;
104     }
105
106     if (matches != null) {
107       for (final MatchResult match : matches) {
108         ((MatchResultImpl)match).clear();
109       }
110       matches = null;
111     }
112
113     name = null;
114     matchImage = null;
115   }
116
117   public void clearMatches() {
118     matches = null;
119   }
120
121   public void setScopeMatch(final boolean scopeMatch) {
122     myScopeMatch = scopeMatch;
123   }
124
125   public void setMultipleMatch(final boolean multipleMatch) {
126     myMultipleMatch = multipleMatch;
127   }
128
129   public MatchResultImpl findSon(String name) {
130     if (matches!=null) {
131       // @todo this could be performance bottleneck, replace with hash lookup!
132       for (final MatchResult match : matches) {
133         final MatchResultImpl res = (MatchResultImpl)match;
134
135         if (name.equals(res.getName())) {
136           return res;
137         }
138       }
139     }
140     return null;
141   }
142
143   public MatchResultImpl removeSon(String typedVar) {
144     if (matches == null) return null;
145
146     // @todo this could be performance bottleneck, replace with hash lookup!
147     for(Iterator<MatchResult> i=matches.iterator();i.hasNext();) {
148       final MatchResultImpl res = (MatchResultImpl)i.next();
149       if (typedVar.equals(res.getName())) {
150         i.remove();
151         return res;
152       }
153     }
154
155     return null;
156   }
157
158   public void addSon(MatchResultImpl result) {
159     getMatches().add(result);
160   }
161
162   public void setMatchImage(String matchImage) {
163     this.matchImage = matchImage;
164   }
165
166   public boolean isTarget() {
167     return target;
168   }
169
170   public void setTarget(boolean target) {
171     this.target = target;
172   }
173
174   public boolean isMatchImageNull() {
175     return matchImage==null;
176   }
177
178   public int getStart() {
179     return start;
180   }
181
182   public void setStart(int start) {
183     this.start = start;
184   }
185
186   public int getEnd() {
187     return end;
188   }
189
190   public void setEnd(int end) {
191     this.end = end;
192   }
193
194   public void setContext(final MatchResultImpl context) {
195     myContext = context;
196   }
197
198   public MatchResultImpl getContext() {
199     return myContext;
200   }
201
202   @Override
203   public String toString() {
204     return "MatchResultImpl{name='" + name + '\'' + ", matchImage='" + matchImage + '\'' + "}";
205   }
206 }
207