1/*
2 * Copyright (C) 2007-2010 Júlio Vilmar Gesser.
3 * Copyright (C) 2011, 2013-2015 The JavaParser Team.
4 *
5 * This file is part of JavaParser.
6 *
7 * JavaParser can be used either under the terms of
8 * a) the GNU Lesser General Public License as published by
9 *     the Free Software Foundation, either version 3 of the License, or
10 *     (at your option) any later version.
11 * b) the terms of the Apache License
12 *
13 * You should have received a copy of both licenses in LICENCE.LGPL and
14 * LICENCE.APACHE. Please refer to those files for details.
15 *
16 * JavaParser is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 * GNU Lesser General Public License for more details.
20 */
21
22package com.github.javaparser.ast.visitor;
23
24import com.github.javaparser.ast.comments.BlockComment;
25import com.github.javaparser.ast.comments.Comment;
26import com.github.javaparser.ast.CompilationUnit;
27import com.github.javaparser.ast.ImportDeclaration;
28import com.github.javaparser.ast.comments.LineComment;
29import com.github.javaparser.ast.PackageDeclaration;
30import com.github.javaparser.ast.TypeParameter;
31import com.github.javaparser.ast.body.AnnotationDeclaration;
32import com.github.javaparser.ast.body.AnnotationMemberDeclaration;
33import com.github.javaparser.ast.body.BodyDeclaration;
34import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
35import com.github.javaparser.ast.body.ConstructorDeclaration;
36import com.github.javaparser.ast.body.EmptyMemberDeclaration;
37import com.github.javaparser.ast.body.EmptyTypeDeclaration;
38import com.github.javaparser.ast.body.EnumConstantDeclaration;
39import com.github.javaparser.ast.body.EnumDeclaration;
40import com.github.javaparser.ast.body.FieldDeclaration;
41import com.github.javaparser.ast.body.InitializerDeclaration;
42import com.github.javaparser.ast.comments.JavadocComment;
43import com.github.javaparser.ast.body.MethodDeclaration;
44import com.github.javaparser.ast.body.MultiTypeParameter;
45import com.github.javaparser.ast.body.Parameter;
46import com.github.javaparser.ast.body.TypeDeclaration;
47import com.github.javaparser.ast.body.VariableDeclarator;
48import com.github.javaparser.ast.body.VariableDeclaratorId;
49import com.github.javaparser.ast.expr.*;
50import com.github.javaparser.ast.stmt.AssertStmt;
51import com.github.javaparser.ast.stmt.BlockStmt;
52import com.github.javaparser.ast.stmt.BreakStmt;
53import com.github.javaparser.ast.stmt.CatchClause;
54import com.github.javaparser.ast.stmt.ContinueStmt;
55import com.github.javaparser.ast.stmt.DoStmt;
56import com.github.javaparser.ast.stmt.EmptyStmt;
57import com.github.javaparser.ast.stmt.ExplicitConstructorInvocationStmt;
58import com.github.javaparser.ast.stmt.ExpressionStmt;
59import com.github.javaparser.ast.stmt.ForStmt;
60import com.github.javaparser.ast.stmt.ForeachStmt;
61import com.github.javaparser.ast.stmt.IfStmt;
62import com.github.javaparser.ast.stmt.LabeledStmt;
63import com.github.javaparser.ast.stmt.ReturnStmt;
64import com.github.javaparser.ast.stmt.Statement;
65import com.github.javaparser.ast.stmt.SwitchEntryStmt;
66import com.github.javaparser.ast.stmt.SwitchStmt;
67import com.github.javaparser.ast.stmt.SynchronizedStmt;
68import com.github.javaparser.ast.stmt.ThrowStmt;
69import com.github.javaparser.ast.stmt.TryStmt;
70import com.github.javaparser.ast.stmt.TypeDeclarationStmt;
71import com.github.javaparser.ast.stmt.WhileStmt;
72import com.github.javaparser.ast.type.*;
73
74import static com.github.javaparser.ast.internal.Utils.isNullOrEmpty;
75
76/**
77 * @author Julio Vilmar Gesser
78 */
79public abstract class VoidVisitorAdapter<A> implements VoidVisitor<A> {
80
81	@Override public void visit(final AnnotationDeclaration n, final A arg) {
82		visitComment(n.getComment(), arg);
83		if (n.getJavaDoc() != null) {
84			n.getJavaDoc().accept(this, arg);
85		}
86		if (n.getAnnotations() != null) {
87			for (final AnnotationExpr a : n.getAnnotations()) {
88				a.accept(this, arg);
89			}
90		}
91		if (n.getMembers() != null) {
92			for (final BodyDeclaration member : n.getMembers()) {
93				member.accept(this, arg);
94			}
95		}
96	}
97
98	@Override public void visit(final AnnotationMemberDeclaration n, final A arg) {
99		visitComment(n.getComment(), arg);
100		if (n.getJavaDoc() != null) {
101			n.getJavaDoc().accept(this, arg);
102		}
103		if (n.getAnnotations() != null) {
104			for (final AnnotationExpr a : n.getAnnotations()) {
105				a.accept(this, arg);
106			}
107		}
108		n.getType().accept(this, arg);
109		if (n.getDefaultValue() != null) {
110			n.getDefaultValue().accept(this, arg);
111		}
112	}
113
114	@Override public void visit(final ArrayAccessExpr n, final A arg) {
115		visitComment(n.getComment(), arg);
116		n.getName().accept(this, arg);
117		n.getIndex().accept(this, arg);
118	}
119
120	@Override public void visit(final ArrayCreationExpr n, final A arg) {
121		visitComment(n.getComment(), arg);
122		n.getType().accept(this, arg);
123		if (!isNullOrEmpty(n.getDimensions())) {
124			for (final Expression dim : n.getDimensions()) {
125				dim.accept(this, arg);
126			}
127		} else {
128			n.getInitializer().accept(this, arg);
129		}
130	}
131
132	@Override public void visit(final ArrayInitializerExpr n, final A arg) {
133		visitComment(n.getComment(), arg);
134		if (n.getValues() != null) {
135			for (final Expression expr : n.getValues()) {
136				expr.accept(this, arg);
137			}
138		}
139	}
140
141	@Override public void visit(final AssertStmt n, final A arg) {
142		visitComment(n.getComment(), arg);
143		n.getCheck().accept(this, arg);
144		if (n.getMessage() != null) {
145			n.getMessage().accept(this, arg);
146		}
147	}
148
149	@Override public void visit(final AssignExpr n, final A arg) {
150		visitComment(n.getComment(), arg);
151		n.getTarget().accept(this, arg);
152		n.getValue().accept(this, arg);
153	}
154
155	@Override public void visit(final BinaryExpr n, final A arg) {
156		visitComment(n.getComment(), arg);
157		n.getLeft().accept(this, arg);
158		n.getRight().accept(this, arg);
159	}
160
161	@Override public void visit(final BlockComment n, final A arg) {
162		visitComment(n.getComment(), arg);
163	}
164
165	@Override public void visit(final BlockStmt n, final A arg) {
166		visitComment(n.getComment(), arg);
167		if (n.getStmts() != null) {
168			for (final Statement s : n.getStmts()) {
169				s.accept(this, arg);
170			}
171		}
172	}
173
174	@Override public void visit(final BooleanLiteralExpr n, final A arg) {
175		visitComment(n.getComment(), arg);
176	}
177
178	@Override public void visit(final BreakStmt n, final A arg) {
179		visitComment(n.getComment(), arg);
180	}
181
182	@Override public void visit(final CastExpr n, final A arg) {
183		visitComment(n.getComment(), arg);
184		n.getType().accept(this, arg);
185		n.getExpr().accept(this, arg);
186	}
187
188	@Override public void visit(final CatchClause n, final A arg) {
189		visitComment(n.getComment(), arg);
190		n.getExcept().accept(this, arg);
191		n.getCatchBlock().accept(this, arg);
192	}
193
194	@Override public void visit(final CharLiteralExpr n, final A arg) {
195		visitComment(n.getComment(), arg);
196	}
197
198	@Override public void visit(final ClassExpr n, final A arg) {
199		visitComment(n.getComment(), arg);
200		n.getType().accept(this, arg);
201	}
202
203	@Override public void visit(final ClassOrInterfaceDeclaration n, final A arg) {
204		visitComment(n.getComment(), arg);
205		if (n.getJavaDoc() != null) {
206			n.getJavaDoc().accept(this, arg);
207		}
208		if (n.getAnnotations() != null) {
209			for (final AnnotationExpr a : n.getAnnotations()) {
210				a.accept(this, arg);
211			}
212		}
213		if (n.getTypeParameters() != null) {
214			for (final TypeParameter t : n.getTypeParameters()) {
215				t.accept(this, arg);
216			}
217		}
218		if (n.getExtends() != null) {
219			for (final ClassOrInterfaceType c : n.getExtends()) {
220				c.accept(this, arg);
221			}
222		}
223
224		if (n.getImplements() != null) {
225			for (final ClassOrInterfaceType c : n.getImplements()) {
226				c.accept(this, arg);
227			}
228		}
229		if (n.getMembers() != null) {
230			for (final BodyDeclaration member : n.getMembers()) {
231				member.accept(this, arg);
232			}
233		}
234	}
235
236	@Override public void visit(final ClassOrInterfaceType n, final A arg) {
237		visitComment(n.getComment(), arg);
238		if (n.getScope() != null) {
239			n.getScope().accept(this, arg);
240		}
241		if (n.getTypeArgs() != null) {
242			for (final Type t : n.getTypeArgs()) {
243				t.accept(this, arg);
244			}
245		}
246	}
247
248	@Override public void visit(final CompilationUnit n, final A arg) {
249		visitComment(n.getComment(), arg);
250		if (n.getPackage() != null) {
251			n.getPackage().accept(this, arg);
252		}
253		if (n.getImports() != null) {
254			for (final ImportDeclaration i : n.getImports()) {
255				i.accept(this, arg);
256			}
257		}
258		if (n.getTypes() != null) {
259			for (final TypeDeclaration typeDeclaration : n.getTypes()) {
260				typeDeclaration.accept(this, arg);
261			}
262		}
263	}
264
265	@Override public void visit(final ConditionalExpr n, final A arg) {
266		visitComment(n.getComment(), arg);
267		n.getCondition().accept(this, arg);
268		n.getThenExpr().accept(this, arg);
269		n.getElseExpr().accept(this, arg);
270	}
271
272	@Override public void visit(final ConstructorDeclaration n, final A arg) {
273		visitComment(n.getComment(), arg);
274		if (n.getJavaDoc() != null) {
275			n.getJavaDoc().accept(this, arg);
276		}
277		if (n.getAnnotations() != null) {
278			for (final AnnotationExpr a : n.getAnnotations()) {
279				a.accept(this, arg);
280			}
281		}
282		if (n.getTypeParameters() != null) {
283			for (final TypeParameter t : n.getTypeParameters()) {
284				t.accept(this, arg);
285			}
286		}
287		if (n.getParameters() != null) {
288			for (final Parameter p : n.getParameters()) {
289				p.accept(this, arg);
290			}
291		}
292		if (n.getThrows() != null) {
293			for (final NameExpr name : n.getThrows()) {
294				name.accept(this, arg);
295			}
296		}
297		n.getBlock().accept(this, arg);
298	}
299
300	@Override public void visit(final ContinueStmt n, final A arg) {
301		visitComment(n.getComment(), arg);
302	}
303
304	@Override public void visit(final DoStmt n, final A arg) {
305		visitComment(n.getComment(), arg);
306		n.getBody().accept(this, arg);
307		n.getCondition().accept(this, arg);
308	}
309
310	@Override public void visit(final DoubleLiteralExpr n, final A arg) {
311		visitComment(n.getComment(), arg);
312	}
313
314	@Override public void visit(final EmptyMemberDeclaration n, final A arg) {
315		visitComment(n.getComment(), arg);
316		if (n.getJavaDoc() != null) {
317			n.getJavaDoc().accept(this, arg);
318		}
319	}
320
321	@Override public void visit(final EmptyStmt n, final A arg) {
322		visitComment(n.getComment(), arg);
323	}
324
325	@Override public void visit(final EmptyTypeDeclaration n, final A arg) {
326		visitComment(n.getComment(), arg);
327		if (n.getJavaDoc() != null) {
328			n.getJavaDoc().accept(this, arg);
329		}
330	}
331
332	@Override public void visit(final EnclosedExpr n, final A arg) {
333		visitComment(n.getComment(), arg);
334		n.getInner().accept(this, arg);
335	}
336
337	@Override public void visit(final EnumConstantDeclaration n, final A arg) {
338		visitComment(n.getComment(), arg);
339		if (n.getJavaDoc() != null) {
340			n.getJavaDoc().accept(this, arg);
341		}
342		if (n.getAnnotations() != null) {
343			for (final AnnotationExpr a : n.getAnnotations()) {
344				a.accept(this, arg);
345			}
346		}
347		if (n.getArgs() != null) {
348			for (final Expression e : n.getArgs()) {
349				e.accept(this, arg);
350			}
351		}
352		if (n.getClassBody() != null) {
353			for (final BodyDeclaration member : n.getClassBody()) {
354				member.accept(this, arg);
355			}
356		}
357	}
358
359	@Override public void visit(final EnumDeclaration n, final A arg) {
360		visitComment(n.getComment(), arg);
361		if (n.getJavaDoc() != null) {
362			n.getJavaDoc().accept(this, arg);
363		}
364		if (n.getAnnotations() != null) {
365			for (final AnnotationExpr a : n.getAnnotations()) {
366				a.accept(this, arg);
367			}
368		}
369		if (n.getImplements() != null) {
370			for (final ClassOrInterfaceType c : n.getImplements()) {
371				c.accept(this, arg);
372			}
373		}
374		if (n.getEntries() != null) {
375			for (final EnumConstantDeclaration e : n.getEntries()) {
376				e.accept(this, arg);
377			}
378		}
379		if (n.getMembers() != null) {
380			for (final BodyDeclaration member : n.getMembers()) {
381				member.accept(this, arg);
382			}
383		}
384	}
385
386	@Override public void visit(final ExplicitConstructorInvocationStmt n, final A arg) {
387		visitComment(n.getComment(), arg);
388		if (!n.isThis()) {
389			if (n.getExpr() != null) {
390				n.getExpr().accept(this, arg);
391			}
392		}
393		if (n.getTypeArgs() != null) {
394			for (final Type t : n.getTypeArgs()) {
395				t.accept(this, arg);
396			}
397		}
398		if (n.getArgs() != null) {
399			for (final Expression e : n.getArgs()) {
400				e.accept(this, arg);
401			}
402		}
403	}
404
405	@Override public void visit(final ExpressionStmt n, final A arg) {
406		visitComment(n.getComment(), arg);
407		n.getExpression().accept(this, arg);
408	}
409
410	@Override public void visit(final FieldAccessExpr n, final A arg) {
411		visitComment(n.getComment(), arg);
412		n.getScope().accept(this, arg);
413	}
414
415	@Override public void visit(final FieldDeclaration n, final A arg) {
416		visitComment(n.getComment(), arg);
417		if (n.getJavaDoc() != null) {
418			n.getJavaDoc().accept(this, arg);
419		}
420		if (n.getAnnotations() != null) {
421			for (final AnnotationExpr a : n.getAnnotations()) {
422				a.accept(this, arg);
423			}
424		}
425		n.getType().accept(this, arg);
426		for (final VariableDeclarator var : n.getVariables()) {
427			var.accept(this, arg);
428		}
429	}
430
431	@Override public void visit(final ForeachStmt n, final A arg) {
432		visitComment(n.getComment(), arg);
433		n.getVariable().accept(this, arg);
434		n.getIterable().accept(this, arg);
435		n.getBody().accept(this, arg);
436	}
437
438	@Override public void visit(final ForStmt n, final A arg) {
439		visitComment(n.getComment(), arg);
440		if (n.getInit() != null) {
441			for (final Expression e : n.getInit()) {
442				e.accept(this, arg);
443			}
444		}
445		if (n.getCompare() != null) {
446			n.getCompare().accept(this, arg);
447		}
448		if (n.getUpdate() != null) {
449			for (final Expression e : n.getUpdate()) {
450				e.accept(this, arg);
451			}
452		}
453		n.getBody().accept(this, arg);
454	}
455
456	@Override public void visit(final IfStmt n, final A arg) {
457		visitComment(n.getComment(), arg);
458		n.getCondition().accept(this, arg);
459		n.getThenStmt().accept(this, arg);
460		if (n.getElseStmt() != null) {
461			n.getElseStmt().accept(this, arg);
462		}
463	}
464
465	@Override public void visit(final ImportDeclaration n, final A arg) {
466		visitComment(n.getComment(), arg);
467		n.getName().accept(this, arg);
468	}
469
470	@Override public void visit(final InitializerDeclaration n, final A arg) {
471		visitComment(n.getComment(), arg);
472		if (n.getJavaDoc() != null) {
473			n.getJavaDoc().accept(this, arg);
474		}
475		n.getBlock().accept(this, arg);
476	}
477
478	@Override public void visit(final InstanceOfExpr n, final A arg) {
479		visitComment(n.getComment(), arg);
480		n.getExpr().accept(this, arg);
481		n.getType().accept(this, arg);
482	}
483
484	@Override public void visit(final IntegerLiteralExpr n, final A arg) {
485		visitComment(n.getComment(), arg);
486	}
487
488	@Override public void visit(final IntegerLiteralMinValueExpr n, final A arg) {
489		visitComment(n.getComment(), arg);
490	}
491
492	@Override public void visit(final JavadocComment n, final A arg) {
493		visitComment(n.getComment(), arg);
494	}
495
496	@Override public void visit(final LabeledStmt n, final A arg) {
497		visitComment(n.getComment(), arg);
498		n.getStmt().accept(this, arg);
499	}
500
501	@Override public void visit(final LineComment n, final A arg) {
502		visitComment(n.getComment(), arg);
503	}
504
505	@Override public void visit(final LongLiteralExpr n, final A arg) {
506		visitComment(n.getComment(), arg);
507	}
508
509	@Override public void visit(final LongLiteralMinValueExpr n, final A arg) {
510		visitComment(n.getComment(), arg);
511	}
512
513	@Override public void visit(final MarkerAnnotationExpr n, final A arg) {
514		visitComment(n.getComment(), arg);
515		n.getName().accept(this, arg);
516	}
517
518	@Override public void visit(final MemberValuePair n, final A arg) {
519		visitComment(n.getComment(), arg);
520		n.getValue().accept(this, arg);
521	}
522
523	@Override public void visit(final MethodCallExpr n, final A arg) {
524		visitComment(n.getComment(), arg);
525		if (n.getScope() != null) {
526			n.getScope().accept(this, arg);
527		}
528		if (n.getTypeArgs() != null) {
529			for (final Type t : n.getTypeArgs()) {
530				t.accept(this, arg);
531			}
532		}
533		if (n.getArgs() != null) {
534			for (final Expression e : n.getArgs()) {
535				e.accept(this, arg);
536			}
537		}
538	}
539
540	@Override public void visit(final MethodDeclaration n, final A arg) {
541		visitComment(n.getComment(), arg);
542		if (n.getJavaDoc() != null) {
543			n.getJavaDoc().accept(this, arg);
544		}
545		if (n.getAnnotations() != null) {
546			for (final AnnotationExpr a : n.getAnnotations()) {
547				a.accept(this, arg);
548			}
549		}
550		if (n.getTypeParameters() != null) {
551			for (final TypeParameter t : n.getTypeParameters()) {
552				t.accept(this, arg);
553			}
554		}
555		n.getType().accept(this, arg);
556		if (n.getParameters() != null) {
557			for (final Parameter p : n.getParameters()) {
558				p.accept(this, arg);
559			}
560		}
561		if (n.getThrows() != null) {
562			for (final NameExpr name : n.getThrows()) {
563				name.accept(this, arg);
564			}
565		}
566		if (n.getBody() != null) {
567			n.getBody().accept(this, arg);
568		}
569	}
570
571	@Override public void visit(final NameExpr n, final A arg) {
572		visitComment(n.getComment(), arg);
573	}
574
575	@Override public void visit(final NormalAnnotationExpr n, final A arg) {
576		visitComment(n.getComment(), arg);
577		n.getName().accept(this, arg);
578		if (n.getPairs() != null) {
579			for (final MemberValuePair m : n.getPairs()) {
580				m.accept(this, arg);
581			}
582		}
583	}
584
585	@Override public void visit(final NullLiteralExpr n, final A arg) {
586		visitComment(n.getComment(), arg);
587	}
588
589	@Override public void visit(final ObjectCreationExpr n, final A arg) {
590		visitComment(n.getComment(), arg);
591		if (n.getScope() != null) {
592			n.getScope().accept(this, arg);
593		}
594		if (n.getTypeArgs() != null) {
595			for (final Type t : n.getTypeArgs()) {
596				t.accept(this, arg);
597			}
598		}
599		n.getType().accept(this, arg);
600		if (n.getArgs() != null) {
601			for (final Expression e : n.getArgs()) {
602				e.accept(this, arg);
603			}
604		}
605		if (n.getAnonymousClassBody() != null) {
606			for (final BodyDeclaration member : n.getAnonymousClassBody()) {
607				member.accept(this, arg);
608			}
609		}
610	}
611
612	@Override public void visit(final PackageDeclaration n, final A arg) {
613		visitComment(n.getComment(), arg);
614		if (n.getAnnotations() != null) {
615			for (final AnnotationExpr a : n.getAnnotations()) {
616				a.accept(this, arg);
617			}
618		}
619		n.getName().accept(this, arg);
620	}
621
622	@Override public void visit(final Parameter n, final A arg) {
623		visitComment(n.getComment(), arg);
624		if (n.getAnnotations() != null) {
625			for (final AnnotationExpr a : n.getAnnotations()) {
626				a.accept(this, arg);
627			}
628		}
629		n.getType().accept(this, arg);
630		n.getId().accept(this, arg);
631	}
632
633	@Override public void visit(final MultiTypeParameter n, final A arg) {
634		visitComment(n.getComment(), arg);
635		if (n.getAnnotations() != null) {
636			for (final AnnotationExpr a : n.getAnnotations()) {
637				a.accept(this, arg);
638			}
639		}
640		for (final Type type : n.getTypes()) {
641			type.accept(this, arg);
642		}
643		n.getId().accept(this, arg);
644	}
645
646	@Override public void visit(final PrimitiveType n, final A arg) {
647		visitComment(n.getComment(), arg);
648	}
649
650	@Override public void visit(final QualifiedNameExpr n, final A arg) {
651		visitComment(n.getComment(), arg);
652		n.getQualifier().accept(this, arg);
653	}
654
655	@Override public void visit(final ReferenceType n, final A arg) {
656		visitComment(n.getComment(), arg);
657		n.getType().accept(this, arg);
658	}
659
660	@Override public void visit(final ReturnStmt n, final A arg) {
661		visitComment(n.getComment(), arg);
662		if (n.getExpr() != null) {
663			n.getExpr().accept(this, arg);
664		}
665	}
666
667	@Override public void visit(final SingleMemberAnnotationExpr n, final A arg) {
668		visitComment(n.getComment(), arg);
669		n.getName().accept(this, arg);
670		n.getMemberValue().accept(this, arg);
671	}
672
673	@Override public void visit(final StringLiteralExpr n, final A arg) {
674		visitComment(n.getComment(), arg);
675	}
676
677	@Override public void visit(final SuperExpr n, final A arg) {
678		visitComment(n.getComment(), arg);
679		if (n.getClassExpr() != null) {
680			n.getClassExpr().accept(this, arg);
681		}
682	}
683
684	@Override public void visit(final SwitchEntryStmt n, final A arg) {
685		visitComment(n.getComment(), arg);
686		if (n.getLabel() != null) {
687			n.getLabel().accept(this, arg);
688		}
689		if (n.getStmts() != null) {
690			for (final Statement s : n.getStmts()) {
691				s.accept(this, arg);
692			}
693		}
694	}
695
696	@Override public void visit(final SwitchStmt n, final A arg) {
697		visitComment(n.getComment(), arg);
698		n.getSelector().accept(this, arg);
699		if (n.getEntries() != null) {
700			for (final SwitchEntryStmt e : n.getEntries()) {
701				e.accept(this, arg);
702			}
703		}
704	}
705
706	@Override public void visit(final SynchronizedStmt n, final A arg) {
707		visitComment(n.getComment(), arg);
708		n.getExpr().accept(this, arg);
709		n.getBlock().accept(this, arg);
710	}
711
712	@Override public void visit(final ThisExpr n, final A arg) {
713		visitComment(n.getComment(), arg);
714		if (n.getClassExpr() != null) {
715			n.getClassExpr().accept(this, arg);
716		}
717	}
718
719	@Override public void visit(final ThrowStmt n, final A arg) {
720		visitComment(n.getComment(), arg);
721		n.getExpr().accept(this, arg);
722	}
723
724	@Override public void visit(final TryStmt n, final A arg) {
725		visitComment(n.getComment(), arg);
726		if (n.getResources() != null) {
727			for (final VariableDeclarationExpr v : n.getResources()) {
728				v.accept(this, arg);
729			}
730		}
731		n.getTryBlock().accept(this, arg);
732		if (n.getCatchs() != null) {
733			for (final CatchClause c : n.getCatchs()) {
734				c.accept(this, arg);
735			}
736		}
737		if (n.getFinallyBlock() != null) {
738			n.getFinallyBlock().accept(this, arg);
739		}
740	}
741
742	@Override public void visit(final TypeDeclarationStmt n, final A arg) {
743		visitComment(n.getComment(), arg);
744		n.getTypeDeclaration().accept(this, arg);
745	}
746
747	@Override public void visit(final TypeParameter n, final A arg) {
748		visitComment(n.getComment(), arg);
749		if (n.getTypeBound() != null) {
750			for (final ClassOrInterfaceType c : n.getTypeBound()) {
751				c.accept(this, arg);
752			}
753		}
754	}
755
756	@Override public void visit(final UnaryExpr n, final A arg) {
757		visitComment(n.getComment(), arg);
758		n.getExpr().accept(this, arg);
759	}
760
761	@Override public void visit(final UnknownType n, final A arg) {
762		visitComment(n.getComment(), arg);
763	}
764
765	@Override public void visit(final VariableDeclarationExpr n, final A arg) {
766		visitComment(n.getComment(), arg);
767		if (n.getAnnotations() != null) {
768			for (final AnnotationExpr a : n.getAnnotations()) {
769				a.accept(this, arg);
770			}
771		}
772		n.getType().accept(this, arg);
773		for (final VariableDeclarator v : n.getVars()) {
774			v.accept(this, arg);
775		}
776	}
777
778	@Override public void visit(final VariableDeclarator n, final A arg) {
779		visitComment(n.getComment(), arg);
780		n.getId().accept(this, arg);
781		if (n.getInit() != null) {
782			n.getInit().accept(this, arg);
783		}
784	}
785
786	@Override public void visit(final VariableDeclaratorId n, final A arg) {
787		visitComment(n.getComment(), arg);
788	}
789
790	@Override public void visit(final VoidType n, final A arg) {
791		visitComment(n.getComment(), arg);
792	}
793
794	@Override public void visit(final WhileStmt n, final A arg) {
795		visitComment(n.getComment(), arg);
796		n.getCondition().accept(this, arg);
797		n.getBody().accept(this, arg);
798	}
799
800	@Override public void visit(final WildcardType n, final A arg) {
801		visitComment(n.getComment(), arg);
802		if (n.getExtends() != null) {
803			n.getExtends().accept(this, arg);
804		}
805		if (n.getSuper() != null) {
806			n.getSuper().accept(this, arg);
807		}
808	}
809
810    @Override
811    public void visit(LambdaExpr n, final A arg) {
812        if (n.getParameters() != null) {
813            for (final Parameter a : n.getParameters()) {
814                a.accept(this, arg);
815            }
816        }
817        if (n.getBody() != null) {
818            n.getBody().accept(this, arg);
819        }
820    }
821
822    @Override
823    public void visit(MethodReferenceExpr n, final A arg) {
824        if (n.getTypeParameters() != null) {
825            for (final TypeParameter a : n.getTypeParameters()) {
826                a.accept(this, arg);
827            }
828        }
829        if (n.getScope() != null) {
830            n.getScope().accept(this, arg);
831        }
832    }
833
834    @Override
835    public void visit(TypeExpr n, final A arg) {
836        if (n.getType() != null) {
837            n.getType().accept(this, arg);
838        }
839    }
840
841    private void visitComment(final Comment n, final A arg) {
842		if (n != null) {
843			n.accept(this, arg);
844		}
845	}
846}
847