1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package com.puppycrawl.tools.checkstyle.api;
20
21 import java.util.BitSet;
22
23 import antlr.CommonASTWithHiddenTokens;
24 import antlr.Token;
25 import antlr.collections.AST;
26
27
28
29
30
31
32
33
34
35
36
37
38 public final class DetailAST extends CommonASTWithHiddenTokens
39 {
40
41 private static final long serialVersionUID = -2580884815577559874L;
42
43
44 private static final int NOT_INITIALIZED = Integer.MIN_VALUE;
45
46
47 private int lineNo = NOT_INITIALIZED;
48
49 private int columnNo = NOT_INITIALIZED;
50
51
52 private int childCount = NOT_INITIALIZED;
53
54 private DetailAST parent;
55
56 private DetailAST previousSibling;
57
58
59
60
61
62
63 private BitSet branchTokenTypes;
64
65 @Override
66 public void initialize(Token tok)
67 {
68 super.initialize(tok);
69 lineNo = tok.getLine();
70 columnNo = tok.getColumn() - 1;
71 }
72
73 @Override
74 public void initialize(AST ast)
75 {
76 final DetailAST da = (DetailAST) ast;
77 setText(da.getText());
78 setType(da.getType());
79 lineNo = da.getLineNo();
80 columnNo = da.getColumnNo();
81 hiddenAfter = da.getHiddenAfter();
82 hiddenBefore = da.getHiddenBefore();
83 }
84
85 @Override
86 public void setFirstChild(AST ast)
87 {
88 childCount = NOT_INITIALIZED;
89 super.setFirstChild(ast);
90 if (ast != null) {
91 ((DetailAST) ast).setParent(this);
92 }
93 }
94
95 @Override
96 public void setNextSibling(AST ast)
97 {
98 super.setNextSibling(ast);
99 if ((ast != null) && (parent != null)) {
100 ((DetailAST) ast).setParent(parent);
101 }
102 if (ast != null) {
103 ((DetailAST) ast).setPreviousSibling(this);
104 }
105 }
106
107
108
109
110
111
112 public void addPreviousSibling(DetailAST ast)
113 {
114 if (ast != null) {
115 ast.setParent(parent);
116 final DetailAST previousSibling = this.getPreviousSibling();
117
118 if (previousSibling != null) {
119 ast.setPreviousSibling(previousSibling);
120 previousSibling.setNextSibling(ast);
121 }
122 else if (parent != null) {
123 parent.setFirstChild(ast);
124 }
125
126 ast.setNextSibling(this);
127 this.setPreviousSibling(ast);
128 }
129 }
130
131
132
133
134
135
136 public void addNextSibling(DetailAST ast)
137 {
138 if (ast != null) {
139 ast.setParent(parent);
140 final DetailAST nextSibling = this.getNextSibling();
141
142 if (nextSibling != null) {
143 ast.setNextSibling(nextSibling);
144 nextSibling.setPreviousSibling(ast);
145 }
146
147 ast.setPreviousSibling(this);
148 this.setNextSibling(ast);
149 }
150 }
151
152
153
154
155
156 void setPreviousSibling(DetailAST ast)
157 {
158 previousSibling = ast;
159 }
160
161 @Override
162 public void addChild(AST ast)
163 {
164 super.addChild(ast);
165 if (ast != null) {
166 ((DetailAST) ast).setParent(this);
167 (getFirstChild()).setParent(this);
168 }
169 }
170
171
172
173
174
175
176 public int getChildCount()
177 {
178
179 if (childCount == NOT_INITIALIZED) {
180 childCount = 0;
181 AST child = getFirstChild();
182
183 while (child != null) {
184 childCount += 1;
185 child = child.getNextSibling();
186 }
187 }
188 return childCount;
189 }
190
191
192
193
194
195
196
197 void setParent(DetailAST parent)
198 {
199
200
201 this.parent = parent;
202 final DetailAST nextSibling = getNextSibling();
203 if (nextSibling != null) {
204 nextSibling.setParent(parent);
205 nextSibling.setPreviousSibling(this);
206 }
207 }
208
209
210
211
212
213 public DetailAST getParent()
214 {
215 return parent;
216 }
217
218
219 public int getLineNo()
220 {
221 if (lineNo == NOT_INITIALIZED) {
222
223
224 DetailAST child = getFirstChild();
225 while (child != null) {
226
227 if (TokenTypes.isCommentType(child.getType())) {
228 child = child.getNextSibling();
229 }
230 else {
231 return child.getLineNo();
232 }
233 }
234
235 DetailAST sibling = getNextSibling();
236 while (sibling != null) {
237
238 if (TokenTypes.isCommentType(sibling.getType())) {
239 sibling = sibling.getNextSibling();
240 }
241 else {
242 return sibling.getLineNo();
243 }
244 }
245 }
246 return lineNo;
247 }
248
249
250
251
252
253
254 public void setLineNo(int lineNo)
255 {
256 this.lineNo = lineNo;
257 }
258
259
260 public int getColumnNo()
261 {
262 if (columnNo == NOT_INITIALIZED) {
263
264
265 DetailAST child = getFirstChild();
266 while (child != null) {
267
268 if (TokenTypes.isCommentType(child.getType())) {
269 child = child.getNextSibling();
270 }
271 else {
272 return child.getColumnNo();
273 }
274 }
275
276 DetailAST sibling = getNextSibling();
277 while (sibling != null) {
278
279 if (TokenTypes.isCommentType(sibling.getType())) {
280 sibling = sibling.getNextSibling();
281 }
282 else {
283 return sibling.getColumnNo();
284 }
285 }
286 }
287 return columnNo;
288 }
289
290
291
292
293
294
295 public void setColumnNo(int columnNo)
296 {
297 this.columnNo = columnNo;
298 }
299
300
301 public DetailAST getLastChild()
302 {
303 DetailAST ast = getFirstChild();
304 while ((ast != null) && (ast.getNextSibling() != null)) {
305 ast = ast.getNextSibling();
306 }
307 return ast;
308 }
309
310
311
312
313 private BitSet getBranchTokenTypes()
314 {
315
316 if (branchTokenTypes == null) {
317
318 branchTokenTypes = new BitSet();
319 branchTokenTypes.set(getType());
320
321
322 DetailAST child = getFirstChild();
323 while (child != null) {
324 final BitSet childTypes = child.getBranchTokenTypes();
325 branchTokenTypes.or(childTypes);
326
327 child = child.getNextSibling();
328 }
329 }
330 return branchTokenTypes;
331 }
332
333
334
335
336
337
338
339
340 public boolean branchContains(int type)
341 {
342 return getBranchTokenTypes().get(type);
343 }
344
345
346
347
348
349
350 public int getChildCount(int type)
351 {
352 int count = 0;
353 for (AST i = getFirstChild(); i != null; i = i.getNextSibling()) {
354 if (i.getType() == type) {
355 count++;
356 }
357 }
358 return count;
359 }
360
361
362
363
364
365 public DetailAST getPreviousSibling()
366 {
367 return previousSibling;
368 }
369
370
371
372
373
374
375 public DetailAST findFirstToken(int type)
376 {
377 DetailAST retVal = null;
378 for (DetailAST i = getFirstChild(); i != null; i = i.getNextSibling()) {
379 if (i.getType() == type) {
380 retVal = i;
381 break;
382 }
383 }
384 return retVal;
385 }
386
387 @Override
388 public String toString()
389 {
390 return super.toString() + "[" + getLineNo() + "x" + getColumnNo() + "]";
391 }
392
393 @Override
394 public DetailAST getNextSibling()
395 {
396 return (DetailAST) super.getNextSibling();
397 }
398
399 @Override
400 public DetailAST getFirstChild()
401 {
402 return (DetailAST) super.getFirstChild();
403 }
404
405 }