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