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