Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openjdk-multiarch-jdk8u
Path: blob/aarch64-shenandoah-jdk8u272-b10/langtools/src/share/classes/com/sun/source/util/TreeScanner.java
38899 views
1
/*
2
* Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
*
5
* This code is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 only, as
7
* published by the Free Software Foundation. Oracle designates this
8
* particular file as subject to the "Classpath" exception as provided
9
* by Oracle in the LICENSE file that accompanied this code.
10
*
11
* This code is distributed in the hope that it will be useful, but WITHOUT
12
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14
* version 2 for more details (a copy is included in the LICENSE file that
15
* accompanied this code).
16
*
17
* You should have received a copy of the GNU General Public License version
18
* 2 along with this work; if not, write to the Free Software Foundation,
19
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20
*
21
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22
* or visit www.oracle.com if you need additional information or have any
23
* questions.
24
*/
25
26
package com.sun.source.util;
27
28
import com.sun.source.tree.*;
29
30
/**
31
* A TreeVisitor that visits all the child tree nodes.
32
* To visit nodes of a particular type, just override the
33
* corresponding visitXYZ method.
34
* Inside your method, call super.visitXYZ to visit descendant
35
* nodes.
36
*
37
* <p>The default implementation of the visitXYZ methods will determine
38
* a result as follows:
39
* <ul>
40
* <li>If the node being visited has no children, the result will be null.
41
* <li>If the node being visited has one child, the result will be the
42
* result of calling {@code scan} on that child. The child may be a simple node
43
* or itself a list of nodes.
44
* <li> If the node being visited has more than one child, the result will
45
* be determined by calling {@code scan} each child in turn, and then combining the
46
* result of each scan after the first with the cumulative result
47
* so far, as determined by the {@link #reduce} method. Each child may be either
48
* a simple node of a list of nodes. The default behavior of the {@code reduce}
49
* method is such that the result of the visitXYZ method will be the result of
50
* the last child scanned.
51
* </ul>
52
*
53
* <p>Here is an example to count the number of identifier nodes in a tree:
54
* <pre>
55
* class CountIdentifiers extends TreeScanner&lt;Integer,Void&gt; {
56
* {@literal @}Override
57
* public Integer visitIdentifier(IdentifierTree node, Void p) {
58
* return 1;
59
* }
60
* {@literal @}Override
61
* public Integer reduce(Integer r1, Integer r2) {
62
* return (r1 == null ? 0 : r1) + (r2 == null ? 0 : r2);
63
* }
64
* }
65
* </pre>
66
*
67
* @author Peter von der Ah&eacute;
68
* @author Jonathan Gibbons
69
* @since 1.6
70
*/
71
@jdk.Exported
72
public class TreeScanner<R,P> implements TreeVisitor<R,P> {
73
74
/** Scan a single node.
75
*/
76
public R scan(Tree node, P p) {
77
return (node == null) ? null : node.accept(this, p);
78
}
79
80
private R scanAndReduce(Tree node, P p, R r) {
81
return reduce(scan(node, p), r);
82
}
83
84
/** Scan a list of nodes.
85
*/
86
public R scan(Iterable<? extends Tree> nodes, P p) {
87
R r = null;
88
if (nodes != null) {
89
boolean first = true;
90
for (Tree node : nodes) {
91
r = (first ? scan(node, p) : scanAndReduce(node, p, r));
92
first = false;
93
}
94
}
95
return r;
96
}
97
98
private R scanAndReduce(Iterable<? extends Tree> nodes, P p, R r) {
99
return reduce(scan(nodes, p), r);
100
}
101
102
/**
103
* Reduces two results into a combined result.
104
* The default implementation is to return the first parameter.
105
* The general contract of the method is that it may take any action whatsoever.
106
*/
107
public R reduce(R r1, R r2) {
108
return r1;
109
}
110
111
112
/* ***************************************************************************
113
* Visitor methods
114
****************************************************************************/
115
116
public R visitCompilationUnit(CompilationUnitTree node, P p) {
117
R r = scan(node.getPackageAnnotations(), p);
118
r = scanAndReduce(node.getPackageName(), p, r);
119
r = scanAndReduce(node.getImports(), p, r);
120
r = scanAndReduce(node.getTypeDecls(), p, r);
121
return r;
122
}
123
124
public R visitImport(ImportTree node, P p) {
125
return scan(node.getQualifiedIdentifier(), p);
126
}
127
128
public R visitClass(ClassTree node, P p) {
129
R r = scan(node.getModifiers(), p);
130
r = scanAndReduce(node.getTypeParameters(), p, r);
131
r = scanAndReduce(node.getExtendsClause(), p, r);
132
r = scanAndReduce(node.getImplementsClause(), p, r);
133
r = scanAndReduce(node.getMembers(), p, r);
134
return r;
135
}
136
137
public R visitMethod(MethodTree node, P p) {
138
R r = scan(node.getModifiers(), p);
139
r = scanAndReduce(node.getReturnType(), p, r);
140
r = scanAndReduce(node.getTypeParameters(), p, r);
141
r = scanAndReduce(node.getParameters(), p, r);
142
r = scanAndReduce(node.getReceiverParameter(), p, r);
143
r = scanAndReduce(node.getThrows(), p, r);
144
r = scanAndReduce(node.getBody(), p, r);
145
r = scanAndReduce(node.getDefaultValue(), p, r);
146
return r;
147
}
148
149
public R visitVariable(VariableTree node, P p) {
150
R r = scan(node.getModifiers(), p);
151
r = scanAndReduce(node.getType(), p, r);
152
r = scanAndReduce(node.getNameExpression(), p, r);
153
r = scanAndReduce(node.getInitializer(), p, r);
154
return r;
155
}
156
157
public R visitEmptyStatement(EmptyStatementTree node, P p) {
158
return null;
159
}
160
161
public R visitBlock(BlockTree node, P p) {
162
return scan(node.getStatements(), p);
163
}
164
165
public R visitDoWhileLoop(DoWhileLoopTree node, P p) {
166
R r = scan(node.getStatement(), p);
167
r = scanAndReduce(node.getCondition(), p, r);
168
return r;
169
}
170
171
public R visitWhileLoop(WhileLoopTree node, P p) {
172
R r = scan(node.getCondition(), p);
173
r = scanAndReduce(node.getStatement(), p, r);
174
return r;
175
}
176
177
public R visitForLoop(ForLoopTree node, P p) {
178
R r = scan(node.getInitializer(), p);
179
r = scanAndReduce(node.getCondition(), p, r);
180
r = scanAndReduce(node.getUpdate(), p, r);
181
r = scanAndReduce(node.getStatement(), p, r);
182
return r;
183
}
184
185
public R visitEnhancedForLoop(EnhancedForLoopTree node, P p) {
186
R r = scan(node.getVariable(), p);
187
r = scanAndReduce(node.getExpression(), p, r);
188
r = scanAndReduce(node.getStatement(), p, r);
189
return r;
190
}
191
192
public R visitLabeledStatement(LabeledStatementTree node, P p) {
193
return scan(node.getStatement(), p);
194
}
195
196
public R visitSwitch(SwitchTree node, P p) {
197
R r = scan(node.getExpression(), p);
198
r = scanAndReduce(node.getCases(), p, r);
199
return r;
200
}
201
202
public R visitCase(CaseTree node, P p) {
203
R r = scan(node.getExpression(), p);
204
r = scanAndReduce(node.getStatements(), p, r);
205
return r;
206
}
207
208
public R visitSynchronized(SynchronizedTree node, P p) {
209
R r = scan(node.getExpression(), p);
210
r = scanAndReduce(node.getBlock(), p, r);
211
return r;
212
}
213
214
public R visitTry(TryTree node, P p) {
215
R r = scan(node.getResources(), p);
216
r = scanAndReduce(node.getBlock(), p, r);
217
r = scanAndReduce(node.getCatches(), p, r);
218
r = scanAndReduce(node.getFinallyBlock(), p, r);
219
return r;
220
}
221
222
public R visitCatch(CatchTree node, P p) {
223
R r = scan(node.getParameter(), p);
224
r = scanAndReduce(node.getBlock(), p, r);
225
return r;
226
}
227
228
public R visitConditionalExpression(ConditionalExpressionTree node, P p) {
229
R r = scan(node.getCondition(), p);
230
r = scanAndReduce(node.getTrueExpression(), p, r);
231
r = scanAndReduce(node.getFalseExpression(), p, r);
232
return r;
233
}
234
235
public R visitIf(IfTree node, P p) {
236
R r = scan(node.getCondition(), p);
237
r = scanAndReduce(node.getThenStatement(), p, r);
238
r = scanAndReduce(node.getElseStatement(), p, r);
239
return r;
240
}
241
242
public R visitExpressionStatement(ExpressionStatementTree node, P p) {
243
return scan(node.getExpression(), p);
244
}
245
246
public R visitBreak(BreakTree node, P p) {
247
return null;
248
}
249
250
public R visitContinue(ContinueTree node, P p) {
251
return null;
252
}
253
254
public R visitReturn(ReturnTree node, P p) {
255
return scan(node.getExpression(), p);
256
}
257
258
public R visitThrow(ThrowTree node, P p) {
259
return scan(node.getExpression(), p);
260
}
261
262
public R visitAssert(AssertTree node, P p) {
263
R r = scan(node.getCondition(), p);
264
r = scanAndReduce(node.getDetail(), p, r);
265
return r;
266
}
267
268
public R visitMethodInvocation(MethodInvocationTree node, P p) {
269
R r = scan(node.getTypeArguments(), p);
270
r = scanAndReduce(node.getMethodSelect(), p, r);
271
r = scanAndReduce(node.getArguments(), p, r);
272
return r;
273
}
274
275
public R visitNewClass(NewClassTree node, P p) {
276
R r = scan(node.getEnclosingExpression(), p);
277
r = scanAndReduce(node.getIdentifier(), p, r);
278
r = scanAndReduce(node.getTypeArguments(), p, r);
279
r = scanAndReduce(node.getArguments(), p, r);
280
r = scanAndReduce(node.getClassBody(), p, r);
281
return r;
282
}
283
284
public R visitNewArray(NewArrayTree node, P p) {
285
R r = scan(node.getType(), p);
286
r = scanAndReduce(node.getDimensions(), p, r);
287
r = scanAndReduce(node.getInitializers(), p, r);
288
r = scanAndReduce(node.getAnnotations(), p, r);
289
for (Iterable< ? extends Tree> dimAnno : node.getDimAnnotations()) {
290
r = scanAndReduce(dimAnno, p, r);
291
}
292
return r;
293
}
294
295
public R visitLambdaExpression(LambdaExpressionTree node, P p) {
296
R r = scan(node.getParameters(), p);
297
r = scanAndReduce(node.getBody(), p, r);
298
return r;
299
}
300
301
public R visitParenthesized(ParenthesizedTree node, P p) {
302
return scan(node.getExpression(), p);
303
}
304
305
public R visitAssignment(AssignmentTree node, P p) {
306
R r = scan(node.getVariable(), p);
307
r = scanAndReduce(node.getExpression(), p, r);
308
return r;
309
}
310
311
public R visitCompoundAssignment(CompoundAssignmentTree node, P p) {
312
R r = scan(node.getVariable(), p);
313
r = scanAndReduce(node.getExpression(), p, r);
314
return r;
315
}
316
317
public R visitUnary(UnaryTree node, P p) {
318
return scan(node.getExpression(), p);
319
}
320
321
public R visitBinary(BinaryTree node, P p) {
322
R r = scan(node.getLeftOperand(), p);
323
r = scanAndReduce(node.getRightOperand(), p, r);
324
return r;
325
}
326
327
public R visitTypeCast(TypeCastTree node, P p) {
328
R r = scan(node.getType(), p);
329
r = scanAndReduce(node.getExpression(), p, r);
330
return r;
331
}
332
333
public R visitInstanceOf(InstanceOfTree node, P p) {
334
R r = scan(node.getExpression(), p);
335
r = scanAndReduce(node.getType(), p, r);
336
return r;
337
}
338
339
public R visitArrayAccess(ArrayAccessTree node, P p) {
340
R r = scan(node.getExpression(), p);
341
r = scanAndReduce(node.getIndex(), p, r);
342
return r;
343
}
344
345
public R visitMemberSelect(MemberSelectTree node, P p) {
346
return scan(node.getExpression(), p);
347
}
348
349
public R visitMemberReference(MemberReferenceTree node, P p) {
350
R r = scan(node.getQualifierExpression(), p);
351
r = scanAndReduce(node.getTypeArguments(), p, r);
352
return r;
353
}
354
355
public R visitIdentifier(IdentifierTree node, P p) {
356
return null;
357
}
358
359
public R visitLiteral(LiteralTree node, P p) {
360
return null;
361
}
362
363
public R visitPrimitiveType(PrimitiveTypeTree node, P p) {
364
return null;
365
}
366
367
public R visitArrayType(ArrayTypeTree node, P p) {
368
return scan(node.getType(), p);
369
}
370
371
public R visitParameterizedType(ParameterizedTypeTree node, P p) {
372
R r = scan(node.getType(), p);
373
r = scanAndReduce(node.getTypeArguments(), p, r);
374
return r;
375
}
376
377
public R visitUnionType(UnionTypeTree node, P p) {
378
return scan(node.getTypeAlternatives(), p);
379
}
380
381
public R visitIntersectionType(IntersectionTypeTree node, P p) {
382
return scan(node.getBounds(), p);
383
}
384
385
public R visitTypeParameter(TypeParameterTree node, P p) {
386
R r = scan(node.getAnnotations(), p);
387
r = scanAndReduce(node.getBounds(), p, r);
388
return r;
389
}
390
391
public R visitWildcard(WildcardTree node, P p) {
392
return scan(node.getBound(), p);
393
}
394
395
public R visitModifiers(ModifiersTree node, P p) {
396
return scan(node.getAnnotations(), p);
397
}
398
399
public R visitAnnotation(AnnotationTree node, P p) {
400
R r = scan(node.getAnnotationType(), p);
401
r = scanAndReduce(node.getArguments(), p, r);
402
return r;
403
}
404
405
public R visitAnnotatedType(AnnotatedTypeTree node, P p) {
406
R r = scan(node.getAnnotations(), p);
407
r = scanAndReduce(node.getUnderlyingType(), p, r);
408
return r;
409
}
410
411
public R visitOther(Tree node, P p) {
412
return null;
413
}
414
415
public R visitErroneous(ErroneousTree node, P p) {
416
return null;
417
}
418
}
419
420