• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2007-2010 Júlio Vilmar Gesser.
3  * Copyright (C) 2011, 2013-2016 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 package com.github.javaparser.ast.visitor;
22 
23 import com.github.javaparser.ast.*;
24 import com.github.javaparser.ast.body.*;
25 import com.github.javaparser.ast.comments.BlockComment;
26 import com.github.javaparser.ast.comments.Comment;
27 import com.github.javaparser.ast.comments.JavadocComment;
28 import com.github.javaparser.ast.comments.LineComment;
29 import com.github.javaparser.ast.expr.*;
30 import com.github.javaparser.ast.modules.*;
31 import com.github.javaparser.ast.stmt.*;
32 import com.github.javaparser.ast.type.*;
33 import com.github.javaparser.utils.Pair;
34 import java.util.ArrayList;
35 import java.util.List;
36 import java.util.Optional;
37 import static com.github.javaparser.utils.Utils.removeElementByObjectIdentity;
38 import static com.github.javaparser.utils.Utils.replaceElementByObjectIdentity;
39 
40 /**
41  * This visitor can be used to save time when some specific nodes needs
42  * to be changed. To do that just extend this class and override the methods
43  * from the nodes who needs to be changed, returning the changed node.
44  * Returning null will remove the node.
45  * <p>
46  * If a node is removed that was required in its parent node,
47  * the parent node will be removed too.
48  *
49  * @author Julio Vilmar Gesser
50  */
51 public class ModifierVisitor<A> implements GenericVisitor<Visitable, A> {
52 
53     @Override
visit(final AnnotationDeclaration n, final A arg)54     public Visitable visit(final AnnotationDeclaration n, final A arg) {
55         NodeList<BodyDeclaration<?>> members = modifyList(n.getMembers(), arg);
56         NodeList<Modifier> modifiers = modifyList(n.getModifiers(), arg);
57         SimpleName name = (SimpleName) n.getName().accept(this, arg);
58         NodeList<AnnotationExpr> annotations = modifyList(n.getAnnotations(), arg);
59         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
60         if (name == null)
61             return null;
62         n.setMembers(members);
63         n.setModifiers(modifiers);
64         n.setName(name);
65         n.setAnnotations(annotations);
66         n.setComment(comment);
67         return n;
68     }
69 
70     @Override
visit(final AnnotationMemberDeclaration n, final A arg)71     public Visitable visit(final AnnotationMemberDeclaration n, final A arg) {
72         Expression defaultValue = n.getDefaultValue().map(s -> (Expression) s.accept(this, arg)).orElse(null);
73         NodeList<Modifier> modifiers = modifyList(n.getModifiers(), arg);
74         SimpleName name = (SimpleName) n.getName().accept(this, arg);
75         Type type = (Type) n.getType().accept(this, arg);
76         NodeList<AnnotationExpr> annotations = modifyList(n.getAnnotations(), arg);
77         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
78         if (name == null || type == null)
79             return null;
80         n.setDefaultValue(defaultValue);
81         n.setModifiers(modifiers);
82         n.setName(name);
83         n.setType(type);
84         n.setAnnotations(annotations);
85         n.setComment(comment);
86         return n;
87     }
88 
89     @Override
visit(final ArrayAccessExpr n, final A arg)90     public Visitable visit(final ArrayAccessExpr n, final A arg) {
91         Expression index = (Expression) n.getIndex().accept(this, arg);
92         Expression name = (Expression) n.getName().accept(this, arg);
93         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
94         if (index == null || name == null)
95             return null;
96         n.setIndex(index);
97         n.setName(name);
98         n.setComment(comment);
99         return n;
100     }
101 
102     @Override
visit(final ArrayCreationExpr n, final A arg)103     public Visitable visit(final ArrayCreationExpr n, final A arg) {
104         Type elementType = (Type) n.getElementType().accept(this, arg);
105         ArrayInitializerExpr initializer = n.getInitializer().map(s -> (ArrayInitializerExpr) s.accept(this, arg)).orElse(null);
106         NodeList<ArrayCreationLevel> levels = modifyList(n.getLevels(), arg);
107         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
108         if (elementType == null || levels.isEmpty())
109             return null;
110         n.setElementType(elementType);
111         n.setInitializer(initializer);
112         n.setLevels(levels);
113         n.setComment(comment);
114         return n;
115     }
116 
117     @Override
visit(final ArrayInitializerExpr n, final A arg)118     public Visitable visit(final ArrayInitializerExpr n, final A arg) {
119         NodeList<Expression> values = modifyList(n.getValues(), arg);
120         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
121         n.setValues(values);
122         n.setComment(comment);
123         return n;
124     }
125 
126     @Override
visit(final AssertStmt n, final A arg)127     public Visitable visit(final AssertStmt n, final A arg) {
128         Expression check = (Expression) n.getCheck().accept(this, arg);
129         Expression message = n.getMessage().map(s -> (Expression) s.accept(this, arg)).orElse(null);
130         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
131         if (check == null)
132             return null;
133         n.setCheck(check);
134         n.setMessage(message);
135         n.setComment(comment);
136         return n;
137     }
138 
139     @Override
visit(final AssignExpr n, final A arg)140     public Visitable visit(final AssignExpr n, final A arg) {
141         Expression target = (Expression) n.getTarget().accept(this, arg);
142         Expression value = (Expression) n.getValue().accept(this, arg);
143         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
144         if (target == null || value == null)
145             return null;
146         n.setTarget(target);
147         n.setValue(value);
148         n.setComment(comment);
149         return n;
150     }
151 
152     @Override
visit(final BinaryExpr n, final A arg)153     public Visitable visit(final BinaryExpr n, final A arg) {
154         Expression left = (Expression) n.getLeft().accept(this, arg);
155         Expression right = (Expression) n.getRight().accept(this, arg);
156         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
157         if (left == null)
158             return right;
159         if (right == null)
160             return left;
161         n.setLeft(left);
162         n.setRight(right);
163         n.setComment(comment);
164         return n;
165     }
166 
167     @Override
visit(final BlockStmt n, final A arg)168     public Visitable visit(final BlockStmt n, final A arg) {
169         NodeList<Statement> statements = modifyList(n.getStatements(), arg);
170         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
171         n.setStatements(statements);
172         n.setComment(comment);
173         return n;
174     }
175 
176     @Override
visit(final BooleanLiteralExpr n, final A arg)177     public Visitable visit(final BooleanLiteralExpr n, final A arg) {
178         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
179         n.setComment(comment);
180         return n;
181     }
182 
183     @Override
visit(final BreakStmt n, final A arg)184     public Visitable visit(final BreakStmt n, final A arg) {
185         Expression value = n.getValue().map(s -> (Expression) s.accept(this, arg)).orElse(null);
186         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
187         n.setValue(value);
188         n.setComment(comment);
189         return n;
190     }
191 
192     @Override
visit(final CastExpr n, final A arg)193     public Visitable visit(final CastExpr n, final A arg) {
194         Expression expression = (Expression) n.getExpression().accept(this, arg);
195         Type type = (Type) n.getType().accept(this, arg);
196         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
197         if (expression == null || type == null)
198             return null;
199         n.setExpression(expression);
200         n.setType(type);
201         n.setComment(comment);
202         return n;
203     }
204 
205     @Override
visit(final CatchClause n, final A arg)206     public Visitable visit(final CatchClause n, final A arg) {
207         BlockStmt body = (BlockStmt) n.getBody().accept(this, arg);
208         Parameter parameter = (Parameter) n.getParameter().accept(this, arg);
209         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
210         if (body == null || parameter == null)
211             return null;
212         n.setBody(body);
213         n.setParameter(parameter);
214         n.setComment(comment);
215         return n;
216     }
217 
218     @Override
visit(final CharLiteralExpr n, final A arg)219     public Visitable visit(final CharLiteralExpr n, final A arg) {
220         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
221         n.setComment(comment);
222         return n;
223     }
224 
225     @Override
visit(final ClassExpr n, final A arg)226     public Visitable visit(final ClassExpr n, final A arg) {
227         Type type = (Type) n.getType().accept(this, arg);
228         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
229         if (type == null)
230             return null;
231         n.setType(type);
232         n.setComment(comment);
233         return n;
234     }
235 
236     @Override
visit(final ClassOrInterfaceDeclaration n, final A arg)237     public Visitable visit(final ClassOrInterfaceDeclaration n, final A arg) {
238         NodeList<ClassOrInterfaceType> extendedTypes = modifyList(n.getExtendedTypes(), arg);
239         NodeList<ClassOrInterfaceType> implementedTypes = modifyList(n.getImplementedTypes(), arg);
240         NodeList<TypeParameter> typeParameters = modifyList(n.getTypeParameters(), arg);
241         NodeList<BodyDeclaration<?>> members = modifyList(n.getMembers(), arg);
242         NodeList<Modifier> modifiers = modifyList(n.getModifiers(), arg);
243         SimpleName name = (SimpleName) n.getName().accept(this, arg);
244         NodeList<AnnotationExpr> annotations = modifyList(n.getAnnotations(), arg);
245         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
246         if (name == null)
247             return null;
248         n.setExtendedTypes(extendedTypes);
249         n.setImplementedTypes(implementedTypes);
250         n.setTypeParameters(typeParameters);
251         n.setMembers(members);
252         n.setModifiers(modifiers);
253         n.setName(name);
254         n.setAnnotations(annotations);
255         n.setComment(comment);
256         return n;
257     }
258 
259     @Override
visit(final ClassOrInterfaceType n, final A arg)260     public Visitable visit(final ClassOrInterfaceType n, final A arg) {
261         SimpleName name = (SimpleName) n.getName().accept(this, arg);
262         ClassOrInterfaceType scope = n.getScope().map(s -> (ClassOrInterfaceType) s.accept(this, arg)).orElse(null);
263         NodeList<Type> typeArguments = modifyList(n.getTypeArguments(), arg);
264         NodeList<AnnotationExpr> annotations = modifyList(n.getAnnotations(), arg);
265         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
266         if (name == null)
267             return null;
268         n.setName(name);
269         n.setScope(scope);
270         n.setTypeArguments(typeArguments);
271         n.setAnnotations(annotations);
272         n.setComment(comment);
273         return n;
274     }
275 
276     @Override
visit(final CompilationUnit n, final A arg)277     public Visitable visit(final CompilationUnit n, final A arg) {
278         NodeList<ImportDeclaration> imports = modifyList(n.getImports(), arg);
279         ModuleDeclaration module = n.getModule().map(s -> (ModuleDeclaration) s.accept(this, arg)).orElse(null);
280         PackageDeclaration packageDeclaration = n.getPackageDeclaration().map(s -> (PackageDeclaration) s.accept(this, arg)).orElse(null);
281         NodeList<TypeDeclaration<?>> types = modifyList(n.getTypes(), arg);
282         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
283         n.setImports(imports);
284         n.setModule(module);
285         n.setPackageDeclaration(packageDeclaration);
286         n.setTypes(types);
287         n.setComment(comment);
288         return n;
289     }
290 
291     @Override
visit(final ConditionalExpr n, final A arg)292     public Visitable visit(final ConditionalExpr n, final A arg) {
293         Expression condition = (Expression) n.getCondition().accept(this, arg);
294         Expression elseExpr = (Expression) n.getElseExpr().accept(this, arg);
295         Expression thenExpr = (Expression) n.getThenExpr().accept(this, arg);
296         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
297         if (condition == null || elseExpr == null || thenExpr == null)
298             return null;
299         n.setCondition(condition);
300         n.setElseExpr(elseExpr);
301         n.setThenExpr(thenExpr);
302         n.setComment(comment);
303         return n;
304     }
305 
306     @Override
visit(final ConstructorDeclaration n, final A arg)307     public Visitable visit(final ConstructorDeclaration n, final A arg) {
308         BlockStmt body = (BlockStmt) n.getBody().accept(this, arg);
309         NodeList<Modifier> modifiers = modifyList(n.getModifiers(), arg);
310         SimpleName name = (SimpleName) n.getName().accept(this, arg);
311         NodeList<Parameter> parameters = modifyList(n.getParameters(), arg);
312         ReceiverParameter receiverParameter = n.getReceiverParameter().map(s -> (ReceiverParameter) s.accept(this, arg)).orElse(null);
313         NodeList<ReferenceType> thrownExceptions = modifyList(n.getThrownExceptions(), arg);
314         NodeList<TypeParameter> typeParameters = modifyList(n.getTypeParameters(), arg);
315         NodeList<AnnotationExpr> annotations = modifyList(n.getAnnotations(), arg);
316         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
317         if (body == null || name == null)
318             return null;
319         n.setBody(body);
320         n.setModifiers(modifiers);
321         n.setName(name);
322         n.setParameters(parameters);
323         n.setReceiverParameter(receiverParameter);
324         n.setThrownExceptions(thrownExceptions);
325         n.setTypeParameters(typeParameters);
326         n.setAnnotations(annotations);
327         n.setComment(comment);
328         return n;
329     }
330 
331     @Override
visit(final ContinueStmt n, final A arg)332     public Visitable visit(final ContinueStmt n, final A arg) {
333         SimpleName label = n.getLabel().map(s -> (SimpleName) s.accept(this, arg)).orElse(null);
334         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
335         n.setLabel(label);
336         n.setComment(comment);
337         return n;
338     }
339 
340     @Override
visit(final DoStmt n, final A arg)341     public Visitable visit(final DoStmt n, final A arg) {
342         Statement body = (Statement) n.getBody().accept(this, arg);
343         Expression condition = (Expression) n.getCondition().accept(this, arg);
344         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
345         if (body == null || condition == null)
346             return null;
347         n.setBody(body);
348         n.setCondition(condition);
349         n.setComment(comment);
350         return n;
351     }
352 
353     @Override
visit(final DoubleLiteralExpr n, final A arg)354     public Visitable visit(final DoubleLiteralExpr n, final A arg) {
355         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
356         n.setComment(comment);
357         return n;
358     }
359 
360     @Override
visit(final EmptyStmt n, final A arg)361     public Visitable visit(final EmptyStmt n, final A arg) {
362         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
363         n.setComment(comment);
364         return n;
365     }
366 
367     @Override
visit(final EnclosedExpr n, final A arg)368     public Visitable visit(final EnclosedExpr n, final A arg) {
369         Expression inner = (Expression) n.getInner().accept(this, arg);
370         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
371         if (inner == null)
372             return null;
373         n.setInner(inner);
374         n.setComment(comment);
375         return n;
376     }
377 
378     @Override
visit(final EnumConstantDeclaration n, final A arg)379     public Visitable visit(final EnumConstantDeclaration n, final A arg) {
380         NodeList<Expression> arguments = modifyList(n.getArguments(), arg);
381         NodeList<BodyDeclaration<?>> classBody = modifyList(n.getClassBody(), arg);
382         SimpleName name = (SimpleName) n.getName().accept(this, arg);
383         NodeList<AnnotationExpr> annotations = modifyList(n.getAnnotations(), arg);
384         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
385         if (name == null)
386             return null;
387         n.setArguments(arguments);
388         n.setClassBody(classBody);
389         n.setName(name);
390         n.setAnnotations(annotations);
391         n.setComment(comment);
392         return n;
393     }
394 
395     @Override
visit(final EnumDeclaration n, final A arg)396     public Visitable visit(final EnumDeclaration n, final A arg) {
397         NodeList<EnumConstantDeclaration> entries = modifyList(n.getEntries(), arg);
398         NodeList<ClassOrInterfaceType> implementedTypes = modifyList(n.getImplementedTypes(), arg);
399         NodeList<BodyDeclaration<?>> members = modifyList(n.getMembers(), arg);
400         NodeList<Modifier> modifiers = modifyList(n.getModifiers(), arg);
401         SimpleName name = (SimpleName) n.getName().accept(this, arg);
402         NodeList<AnnotationExpr> annotations = modifyList(n.getAnnotations(), arg);
403         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
404         if (name == null)
405             return null;
406         n.setEntries(entries);
407         n.setImplementedTypes(implementedTypes);
408         n.setMembers(members);
409         n.setModifiers(modifiers);
410         n.setName(name);
411         n.setAnnotations(annotations);
412         n.setComment(comment);
413         return n;
414     }
415 
416     @Override
visit(final ExplicitConstructorInvocationStmt n, final A arg)417     public Visitable visit(final ExplicitConstructorInvocationStmt n, final A arg) {
418         NodeList<Expression> arguments = modifyList(n.getArguments(), arg);
419         Expression expression = n.getExpression().map(s -> (Expression) s.accept(this, arg)).orElse(null);
420         NodeList<Type> typeArguments = modifyList(n.getTypeArguments(), arg);
421         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
422         n.setArguments(arguments);
423         n.setExpression(expression);
424         n.setTypeArguments(typeArguments);
425         n.setComment(comment);
426         return n;
427     }
428 
429     @Override
visit(final ExpressionStmt n, final A arg)430     public Visitable visit(final ExpressionStmt n, final A arg) {
431         Expression expression = (Expression) n.getExpression().accept(this, arg);
432         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
433         if (expression == null)
434             return null;
435         n.setExpression(expression);
436         n.setComment(comment);
437         return n;
438     }
439 
440     @Override
visit(final FieldAccessExpr n, final A arg)441     public Visitable visit(final FieldAccessExpr n, final A arg) {
442         SimpleName name = (SimpleName) n.getName().accept(this, arg);
443         Expression scope = (Expression) n.getScope().accept(this, arg);
444         NodeList<Type> typeArguments = modifyList(n.getTypeArguments(), arg);
445         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
446         if (name == null || scope == null)
447             return null;
448         n.setName(name);
449         n.setScope(scope);
450         n.setTypeArguments(typeArguments);
451         n.setComment(comment);
452         return n;
453     }
454 
455     @Override
visit(final FieldDeclaration n, final A arg)456     public Visitable visit(final FieldDeclaration n, final A arg) {
457         NodeList<Modifier> modifiers = modifyList(n.getModifiers(), arg);
458         NodeList<VariableDeclarator> variables = modifyList(n.getVariables(), arg);
459         NodeList<AnnotationExpr> annotations = modifyList(n.getAnnotations(), arg);
460         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
461         if (variables.isEmpty())
462             return null;
463         n.setModifiers(modifiers);
464         n.setVariables(variables);
465         n.setAnnotations(annotations);
466         n.setComment(comment);
467         return n;
468     }
469 
470     @Override
visit(final ForEachStmt n, final A arg)471     public Visitable visit(final ForEachStmt n, final A arg) {
472         Statement body = (Statement) n.getBody().accept(this, arg);
473         Expression iterable = (Expression) n.getIterable().accept(this, arg);
474         VariableDeclarationExpr variable = (VariableDeclarationExpr) n.getVariable().accept(this, arg);
475         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
476         if (body == null || iterable == null || variable == null)
477             return null;
478         n.setBody(body);
479         n.setIterable(iterable);
480         n.setVariable(variable);
481         n.setComment(comment);
482         return n;
483     }
484 
485     @Override
visit(final ForStmt n, final A arg)486     public Visitable visit(final ForStmt n, final A arg) {
487         Statement body = (Statement) n.getBody().accept(this, arg);
488         Expression compare = n.getCompare().map(s -> (Expression) s.accept(this, arg)).orElse(null);
489         NodeList<Expression> initialization = modifyList(n.getInitialization(), arg);
490         NodeList<Expression> update = modifyList(n.getUpdate(), arg);
491         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
492         if (body == null)
493             return null;
494         n.setBody(body);
495         n.setCompare(compare);
496         n.setInitialization(initialization);
497         n.setUpdate(update);
498         n.setComment(comment);
499         return n;
500     }
501 
502     @Override
visit(final IfStmt n, final A arg)503     public Visitable visit(final IfStmt n, final A arg) {
504         Expression condition = (Expression) n.getCondition().accept(this, arg);
505         Statement elseStmt = n.getElseStmt().map(s -> (Statement) s.accept(this, arg)).orElse(null);
506         Statement thenStmt = (Statement) n.getThenStmt().accept(this, arg);
507         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
508         if (condition == null || thenStmt == null)
509             return null;
510         n.setCondition(condition);
511         n.setElseStmt(elseStmt);
512         n.setThenStmt(thenStmt);
513         n.setComment(comment);
514         return n;
515     }
516 
517     @Override
visit(final InitializerDeclaration n, final A arg)518     public Visitable visit(final InitializerDeclaration n, final A arg) {
519         BlockStmt body = (BlockStmt) n.getBody().accept(this, arg);
520         NodeList<AnnotationExpr> annotations = modifyList(n.getAnnotations(), arg);
521         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
522         if (body == null)
523             return null;
524         n.setBody(body);
525         n.setAnnotations(annotations);
526         n.setComment(comment);
527         return n;
528     }
529 
530     @Override
visit(final InstanceOfExpr n, final A arg)531     public Visitable visit(final InstanceOfExpr n, final A arg) {
532         Expression expression = (Expression) n.getExpression().accept(this, arg);
533         ReferenceType type = (ReferenceType) n.getType().accept(this, arg);
534         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
535         if (expression == null || type == null)
536             return null;
537         n.setExpression(expression);
538         n.setType(type);
539         n.setComment(comment);
540         return n;
541     }
542 
543     @Override
visit(final IntegerLiteralExpr n, final A arg)544     public Visitable visit(final IntegerLiteralExpr n, final A arg) {
545         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
546         n.setComment(comment);
547         return n;
548     }
549 
550     @Override
visit(final JavadocComment n, final A arg)551     public Visitable visit(final JavadocComment n, final A arg) {
552         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
553         n.setComment(comment);
554         return n;
555     }
556 
557     @Override
visit(final LabeledStmt n, final A arg)558     public Visitable visit(final LabeledStmt n, final A arg) {
559         SimpleName label = (SimpleName) n.getLabel().accept(this, arg);
560         Statement statement = (Statement) n.getStatement().accept(this, arg);
561         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
562         if (label == null || statement == null)
563             return null;
564         n.setLabel(label);
565         n.setStatement(statement);
566         n.setComment(comment);
567         return n;
568     }
569 
570     @Override
visit(final LongLiteralExpr n, final A arg)571     public Visitable visit(final LongLiteralExpr n, final A arg) {
572         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
573         n.setComment(comment);
574         return n;
575     }
576 
577     @Override
visit(final MarkerAnnotationExpr n, final A arg)578     public Visitable visit(final MarkerAnnotationExpr n, final A arg) {
579         Name name = (Name) n.getName().accept(this, arg);
580         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
581         if (name == null)
582             return null;
583         n.setName(name);
584         n.setComment(comment);
585         return n;
586     }
587 
588     @Override
visit(final MemberValuePair n, final A arg)589     public Visitable visit(final MemberValuePair n, final A arg) {
590         SimpleName name = (SimpleName) n.getName().accept(this, arg);
591         Expression value = (Expression) n.getValue().accept(this, arg);
592         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
593         if (name == null || value == null)
594             return null;
595         n.setName(name);
596         n.setValue(value);
597         n.setComment(comment);
598         return n;
599     }
600 
601     @Override
visit(final MethodCallExpr n, final A arg)602     public Visitable visit(final MethodCallExpr n, final A arg) {
603         NodeList<Expression> arguments = modifyList(n.getArguments(), arg);
604         SimpleName name = (SimpleName) n.getName().accept(this, arg);
605         Expression scope = n.getScope().map(s -> (Expression) s.accept(this, arg)).orElse(null);
606         NodeList<Type> typeArguments = modifyList(n.getTypeArguments(), arg);
607         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
608         if (name == null)
609             return null;
610         n.setArguments(arguments);
611         n.setName(name);
612         n.setScope(scope);
613         n.setTypeArguments(typeArguments);
614         n.setComment(comment);
615         return n;
616     }
617 
618     @Override
visit(final MethodDeclaration n, final A arg)619     public Visitable visit(final MethodDeclaration n, final A arg) {
620         BlockStmt body = n.getBody().map(s -> (BlockStmt) s.accept(this, arg)).orElse(null);
621         Type type = (Type) n.getType().accept(this, arg);
622         NodeList<Modifier> modifiers = modifyList(n.getModifiers(), arg);
623         SimpleName name = (SimpleName) n.getName().accept(this, arg);
624         NodeList<Parameter> parameters = modifyList(n.getParameters(), arg);
625         ReceiverParameter receiverParameter = n.getReceiverParameter().map(s -> (ReceiverParameter) s.accept(this, arg)).orElse(null);
626         NodeList<ReferenceType> thrownExceptions = modifyList(n.getThrownExceptions(), arg);
627         NodeList<TypeParameter> typeParameters = modifyList(n.getTypeParameters(), arg);
628         NodeList<AnnotationExpr> annotations = modifyList(n.getAnnotations(), arg);
629         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
630         if (type == null || name == null)
631             return null;
632         n.setBody(body);
633         n.setType(type);
634         n.setModifiers(modifiers);
635         n.setName(name);
636         n.setParameters(parameters);
637         n.setReceiverParameter(receiverParameter);
638         n.setThrownExceptions(thrownExceptions);
639         n.setTypeParameters(typeParameters);
640         n.setAnnotations(annotations);
641         n.setComment(comment);
642         return n;
643     }
644 
645     @Override
visit(final NameExpr n, final A arg)646     public Visitable visit(final NameExpr n, final A arg) {
647         SimpleName name = (SimpleName) n.getName().accept(this, arg);
648         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
649         if (name == null)
650             return null;
651         n.setName(name);
652         n.setComment(comment);
653         return n;
654     }
655 
656     @Override
visit(final NormalAnnotationExpr n, final A arg)657     public Visitable visit(final NormalAnnotationExpr n, final A arg) {
658         NodeList<MemberValuePair> pairs = modifyList(n.getPairs(), arg);
659         Name name = (Name) n.getName().accept(this, arg);
660         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
661         if (name == null)
662             return null;
663         n.setPairs(pairs);
664         n.setName(name);
665         n.setComment(comment);
666         return n;
667     }
668 
669     @Override
visit(final NullLiteralExpr n, final A arg)670     public Visitable visit(final NullLiteralExpr n, final A arg) {
671         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
672         n.setComment(comment);
673         return n;
674     }
675 
676     @Override
visit(final ObjectCreationExpr n, final A arg)677     public Visitable visit(final ObjectCreationExpr n, final A arg) {
678         NodeList<BodyDeclaration<?>> anonymousClassBody = modifyList(n.getAnonymousClassBody(), arg);
679         NodeList<Expression> arguments = modifyList(n.getArguments(), arg);
680         Expression scope = n.getScope().map(s -> (Expression) s.accept(this, arg)).orElse(null);
681         ClassOrInterfaceType type = (ClassOrInterfaceType) n.getType().accept(this, arg);
682         NodeList<Type> typeArguments = modifyList(n.getTypeArguments(), arg);
683         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
684         if (type == null)
685             return null;
686         n.setAnonymousClassBody(anonymousClassBody);
687         n.setArguments(arguments);
688         n.setScope(scope);
689         n.setType(type);
690         n.setTypeArguments(typeArguments);
691         n.setComment(comment);
692         return n;
693     }
694 
695     @Override
visit(final PackageDeclaration n, final A arg)696     public Visitable visit(final PackageDeclaration n, final A arg) {
697         NodeList<AnnotationExpr> annotations = modifyList(n.getAnnotations(), arg);
698         Name name = (Name) n.getName().accept(this, arg);
699         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
700         if (name == null)
701             return null;
702         n.setAnnotations(annotations);
703         n.setName(name);
704         n.setComment(comment);
705         return n;
706     }
707 
708     @Override
visit(final Parameter n, final A arg)709     public Visitable visit(final Parameter n, final A arg) {
710         NodeList<AnnotationExpr> annotations = modifyList(n.getAnnotations(), arg);
711         NodeList<Modifier> modifiers = modifyList(n.getModifiers(), arg);
712         SimpleName name = (SimpleName) n.getName().accept(this, arg);
713         Type type = (Type) n.getType().accept(this, arg);
714         NodeList<AnnotationExpr> varArgsAnnotations = modifyList(n.getVarArgsAnnotations(), arg);
715         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
716         if (name == null || type == null)
717             return null;
718         n.setAnnotations(annotations);
719         n.setModifiers(modifiers);
720         n.setName(name);
721         n.setType(type);
722         n.setVarArgsAnnotations(varArgsAnnotations);
723         n.setComment(comment);
724         return n;
725     }
726 
727     @Override
visit(final Name n, final A arg)728     public Visitable visit(final Name n, final A arg) {
729         Name qualifier = n.getQualifier().map(s -> (Name) s.accept(this, arg)).orElse(null);
730         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
731         n.setQualifier(qualifier);
732         n.setComment(comment);
733         return n;
734     }
735 
736     @Override
visit(final PrimitiveType n, final A arg)737     public Visitable visit(final PrimitiveType n, final A arg) {
738         NodeList<AnnotationExpr> annotations = modifyList(n.getAnnotations(), arg);
739         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
740         n.setAnnotations(annotations);
741         n.setComment(comment);
742         return n;
743     }
744 
745     @Override
visit(final SimpleName n, final A arg)746     public Visitable visit(final SimpleName n, final A arg) {
747         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
748         n.setComment(comment);
749         return n;
750     }
751 
752     @Override
visit(final ArrayType n, final A arg)753     public Visitable visit(final ArrayType n, final A arg) {
754         Type componentType = (Type) n.getComponentType().accept(this, arg);
755         NodeList<AnnotationExpr> annotations = modifyList(n.getAnnotations(), arg);
756         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
757         if (componentType == null)
758             return null;
759         n.setComponentType(componentType);
760         n.setAnnotations(annotations);
761         n.setComment(comment);
762         return n;
763     }
764 
765     @Override
visit(final ArrayCreationLevel n, final A arg)766     public Visitable visit(final ArrayCreationLevel n, final A arg) {
767         NodeList<AnnotationExpr> annotations = modifyList(n.getAnnotations(), arg);
768         Expression dimension = n.getDimension().map(s -> (Expression) s.accept(this, arg)).orElse(null);
769         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
770         n.setAnnotations(annotations);
771         n.setDimension(dimension);
772         n.setComment(comment);
773         return n;
774     }
775 
776     @Override
visit(final IntersectionType n, final A arg)777     public Visitable visit(final IntersectionType n, final A arg) {
778         NodeList<ReferenceType> elements = modifyList(n.getElements(), arg);
779         NodeList<AnnotationExpr> annotations = modifyList(n.getAnnotations(), arg);
780         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
781         if (elements.isEmpty())
782             return null;
783         n.setElements(elements);
784         n.setAnnotations(annotations);
785         n.setComment(comment);
786         return n;
787     }
788 
789     @Override
visit(final UnionType n, final A arg)790     public Visitable visit(final UnionType n, final A arg) {
791         NodeList<ReferenceType> elements = modifyList(n.getElements(), arg);
792         NodeList<AnnotationExpr> annotations = modifyList(n.getAnnotations(), arg);
793         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
794         if (elements.isEmpty())
795             return null;
796         n.setElements(elements);
797         n.setAnnotations(annotations);
798         n.setComment(comment);
799         return n;
800     }
801 
802     @Override
visit(final ReturnStmt n, final A arg)803     public Visitable visit(final ReturnStmt n, final A arg) {
804         Expression expression = n.getExpression().map(s -> (Expression) s.accept(this, arg)).orElse(null);
805         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
806         n.setExpression(expression);
807         n.setComment(comment);
808         return n;
809     }
810 
811     @Override
visit(final SingleMemberAnnotationExpr n, final A arg)812     public Visitable visit(final SingleMemberAnnotationExpr n, final A arg) {
813         Expression memberValue = (Expression) n.getMemberValue().accept(this, arg);
814         Name name = (Name) n.getName().accept(this, arg);
815         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
816         if (memberValue == null || name == null)
817             return null;
818         n.setMemberValue(memberValue);
819         n.setName(name);
820         n.setComment(comment);
821         return n;
822     }
823 
824     @Override
visit(final StringLiteralExpr n, final A arg)825     public Visitable visit(final StringLiteralExpr n, final A arg) {
826         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
827         n.setComment(comment);
828         return n;
829     }
830 
831     @Override
visit(final SuperExpr n, final A arg)832     public Visitable visit(final SuperExpr n, final A arg) {
833         Name typeName = n.getTypeName().map(s -> (Name) s.accept(this, arg)).orElse(null);
834         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
835         n.setTypeName(typeName);
836         n.setComment(comment);
837         return n;
838     }
839 
840     @Override
visit(final SwitchEntry n, final A arg)841     public Visitable visit(final SwitchEntry n, final A arg) {
842         NodeList<Expression> labels = modifyList(n.getLabels(), arg);
843         NodeList<Statement> statements = modifyList(n.getStatements(), arg);
844         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
845         n.setLabels(labels);
846         n.setStatements(statements);
847         n.setComment(comment);
848         return n;
849     }
850 
851     @Override
visit(final SwitchStmt n, final A arg)852     public Visitable visit(final SwitchStmt n, final A arg) {
853         NodeList<SwitchEntry> entries = modifyList(n.getEntries(), arg);
854         Expression selector = (Expression) n.getSelector().accept(this, arg);
855         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
856         if (selector == null)
857             return null;
858         n.setEntries(entries);
859         n.setSelector(selector);
860         n.setComment(comment);
861         return n;
862     }
863 
864     @Override
visit(final SynchronizedStmt n, final A arg)865     public Visitable visit(final SynchronizedStmt n, final A arg) {
866         BlockStmt body = (BlockStmt) n.getBody().accept(this, arg);
867         Expression expression = (Expression) n.getExpression().accept(this, arg);
868         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
869         if (body == null || expression == null)
870             return null;
871         n.setBody(body);
872         n.setExpression(expression);
873         n.setComment(comment);
874         return n;
875     }
876 
877     @Override
visit(final ThisExpr n, final A arg)878     public Visitable visit(final ThisExpr n, final A arg) {
879         Name typeName = n.getTypeName().map(s -> (Name) s.accept(this, arg)).orElse(null);
880         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
881         n.setTypeName(typeName);
882         n.setComment(comment);
883         return n;
884     }
885 
886     @Override
visit(final ThrowStmt n, final A arg)887     public Visitable visit(final ThrowStmt n, final A arg) {
888         Expression expression = (Expression) n.getExpression().accept(this, arg);
889         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
890         if (expression == null)
891             return null;
892         n.setExpression(expression);
893         n.setComment(comment);
894         return n;
895     }
896 
897     @Override
visit(final TryStmt n, final A arg)898     public Visitable visit(final TryStmt n, final A arg) {
899         NodeList<CatchClause> catchClauses = modifyList(n.getCatchClauses(), arg);
900         BlockStmt finallyBlock = n.getFinallyBlock().map(s -> (BlockStmt) s.accept(this, arg)).orElse(null);
901         NodeList<Expression> resources = modifyList(n.getResources(), arg);
902         BlockStmt tryBlock = (BlockStmt) n.getTryBlock().accept(this, arg);
903         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
904         if (tryBlock == null)
905             return null;
906         n.setCatchClauses(catchClauses);
907         n.setFinallyBlock(finallyBlock);
908         n.setResources(resources);
909         n.setTryBlock(tryBlock);
910         n.setComment(comment);
911         return n;
912     }
913 
914     @Override
visit(final LocalClassDeclarationStmt n, final A arg)915     public Visitable visit(final LocalClassDeclarationStmt n, final A arg) {
916         ClassOrInterfaceDeclaration classDeclaration = (ClassOrInterfaceDeclaration) n.getClassDeclaration().accept(this, arg);
917         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
918         if (classDeclaration == null)
919             return null;
920         n.setClassDeclaration(classDeclaration);
921         n.setComment(comment);
922         return n;
923     }
924 
925     @Override
visit(final TypeParameter n, final A arg)926     public Visitable visit(final TypeParameter n, final A arg) {
927         SimpleName name = (SimpleName) n.getName().accept(this, arg);
928         NodeList<ClassOrInterfaceType> typeBound = modifyList(n.getTypeBound(), arg);
929         NodeList<AnnotationExpr> annotations = modifyList(n.getAnnotations(), arg);
930         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
931         if (name == null)
932             return null;
933         n.setName(name);
934         n.setTypeBound(typeBound);
935         n.setAnnotations(annotations);
936         n.setComment(comment);
937         return n;
938     }
939 
940     @Override
visit(final UnaryExpr n, final A arg)941     public Visitable visit(final UnaryExpr n, final A arg) {
942         Expression expression = (Expression) n.getExpression().accept(this, arg);
943         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
944         if (expression == null)
945             return null;
946         n.setExpression(expression);
947         n.setComment(comment);
948         return n;
949     }
950 
951     @Override
visit(final UnknownType n, final A arg)952     public Visitable visit(final UnknownType n, final A arg) {
953         NodeList<AnnotationExpr> annotations = modifyList(n.getAnnotations(), arg);
954         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
955         n.setAnnotations(annotations);
956         n.setComment(comment);
957         return n;
958     }
959 
960     @Override
visit(final VariableDeclarationExpr n, final A arg)961     public Visitable visit(final VariableDeclarationExpr n, final A arg) {
962         NodeList<AnnotationExpr> annotations = modifyList(n.getAnnotations(), arg);
963         NodeList<Modifier> modifiers = modifyList(n.getModifiers(), arg);
964         NodeList<VariableDeclarator> variables = modifyList(n.getVariables(), arg);
965         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
966         if (variables.isEmpty())
967             return null;
968         n.setAnnotations(annotations);
969         n.setModifiers(modifiers);
970         n.setVariables(variables);
971         n.setComment(comment);
972         return n;
973     }
974 
975     @Override
visit(final VariableDeclarator n, final A arg)976     public Visitable visit(final VariableDeclarator n, final A arg) {
977         Expression initializer = n.getInitializer().map(s -> (Expression) s.accept(this, arg)).orElse(null);
978         SimpleName name = (SimpleName) n.getName().accept(this, arg);
979         Type type = (Type) n.getType().accept(this, arg);
980         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
981         if (name == null || type == null)
982             return null;
983         n.setInitializer(initializer);
984         n.setName(name);
985         n.setType(type);
986         n.setComment(comment);
987         return n;
988     }
989 
990     @Override
visit(final VoidType n, final A arg)991     public Visitable visit(final VoidType n, final A arg) {
992         NodeList<AnnotationExpr> annotations = modifyList(n.getAnnotations(), arg);
993         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
994         n.setAnnotations(annotations);
995         n.setComment(comment);
996         return n;
997     }
998 
999     @Override
visit(final WhileStmt n, final A arg)1000     public Visitable visit(final WhileStmt n, final A arg) {
1001         Statement body = (Statement) n.getBody().accept(this, arg);
1002         Expression condition = (Expression) n.getCondition().accept(this, arg);
1003         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
1004         if (body == null || condition == null)
1005             return null;
1006         n.setBody(body);
1007         n.setCondition(condition);
1008         n.setComment(comment);
1009         return n;
1010     }
1011 
1012     @Override
visit(final WildcardType n, final A arg)1013     public Visitable visit(final WildcardType n, final A arg) {
1014         ReferenceType extendedType = n.getExtendedType().map(s -> (ReferenceType) s.accept(this, arg)).orElse(null);
1015         ReferenceType superType = n.getSuperType().map(s -> (ReferenceType) s.accept(this, arg)).orElse(null);
1016         NodeList<AnnotationExpr> annotations = modifyList(n.getAnnotations(), arg);
1017         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
1018         n.setExtendedType(extendedType);
1019         n.setSuperType(superType);
1020         n.setAnnotations(annotations);
1021         n.setComment(comment);
1022         return n;
1023     }
1024 
1025     @Override
visit(final LambdaExpr n, final A arg)1026     public Visitable visit(final LambdaExpr n, final A arg) {
1027         Statement body = (Statement) n.getBody().accept(this, arg);
1028         NodeList<Parameter> parameters = modifyList(n.getParameters(), arg);
1029         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
1030         if (body == null)
1031             return null;
1032         n.setBody(body);
1033         n.setParameters(parameters);
1034         n.setComment(comment);
1035         return n;
1036     }
1037 
1038     @Override
visit(final MethodReferenceExpr n, final A arg)1039     public Visitable visit(final MethodReferenceExpr n, final A arg) {
1040         Expression scope = (Expression) n.getScope().accept(this, arg);
1041         NodeList<Type> typeArguments = modifyList(n.getTypeArguments(), arg);
1042         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
1043         if (scope == null)
1044             return null;
1045         n.setScope(scope);
1046         n.setTypeArguments(typeArguments);
1047         n.setComment(comment);
1048         return n;
1049     }
1050 
1051     @Override
visit(final TypeExpr n, final A arg)1052     public Visitable visit(final TypeExpr n, final A arg) {
1053         Type type = (Type) n.getType().accept(this, arg);
1054         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
1055         if (type == null)
1056             return null;
1057         n.setType(type);
1058         n.setComment(comment);
1059         return n;
1060     }
1061 
1062     @Override
visit(NodeList n, A arg)1063     public Visitable visit(NodeList n, A arg) {
1064         if (n.isEmpty()) {
1065             return n;
1066         }
1067         final List<Pair<Node, Node>> changeList = new ArrayList<>();
1068         final List<Node> listCopy = new ArrayList<>(n);
1069         for (Node node : listCopy) {
1070             final Node newNode = (Node) node.accept(this, arg);
1071             changeList.add(new Pair<>(node, newNode));
1072         }
1073         for (Pair<Node, Node> change : changeList) {
1074             if (change.b == null) {
1075                 removeElementByObjectIdentity(n, change.a);
1076             } else {
1077                 replaceElementByObjectIdentity(n, change.a, change.b);
1078             }
1079         }
1080         return n;
1081     }
1082 
1083     @Override
visit(final ImportDeclaration n, final A arg)1084     public Node visit(final ImportDeclaration n, final A arg) {
1085         Name name = (Name) n.getName().accept(this, arg);
1086         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
1087         if (name == null)
1088             return null;
1089         n.setName(name);
1090         n.setComment(comment);
1091         return n;
1092     }
1093 
1094     @Override
visit(final BlockComment n, final A arg)1095     public Visitable visit(final BlockComment n, final A arg) {
1096         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
1097         n.setComment(comment);
1098         return n;
1099     }
1100 
1101     @Override
visit(final LineComment n, final A arg)1102     public Visitable visit(final LineComment n, final A arg) {
1103         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
1104         n.setComment(comment);
1105         return n;
1106     }
1107 
modifyList(NodeList<N> list, A arg)1108     private <N extends Node> NodeList<N> modifyList(NodeList<N> list, A arg) {
1109         return (NodeList<N>) list.accept(this, arg);
1110     }
1111 
modifyList(Optional<NodeList<N>> list, A arg)1112     private <N extends Node> NodeList<N> modifyList(Optional<NodeList<N>> list, A arg) {
1113         return list.map(ns -> modifyList(ns, arg)).orElse(null);
1114     }
1115 
visit(final ModuleDeclaration n, final A arg)1116     public Visitable visit(final ModuleDeclaration n, final A arg) {
1117         NodeList<AnnotationExpr> annotations = modifyList(n.getAnnotations(), arg);
1118         NodeList<ModuleDirective> directives = modifyList(n.getDirectives(), arg);
1119         Name name = (Name) n.getName().accept(this, arg);
1120         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
1121         if (name == null)
1122             return null;
1123         n.setAnnotations(annotations);
1124         n.setDirectives(directives);
1125         n.setName(name);
1126         n.setComment(comment);
1127         return n;
1128     }
1129 
visit(final ModuleRequiresDirective n, final A arg)1130     public Visitable visit(final ModuleRequiresDirective n, final A arg) {
1131         NodeList<Modifier> modifiers = modifyList(n.getModifiers(), arg);
1132         Name name = (Name) n.getName().accept(this, arg);
1133         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
1134         if (name == null)
1135             return null;
1136         n.setModifiers(modifiers);
1137         n.setName(name);
1138         n.setComment(comment);
1139         return n;
1140     }
1141 
1142     @Override()
visit(final ModuleExportsDirective n, final A arg)1143     public Visitable visit(final ModuleExportsDirective n, final A arg) {
1144         NodeList<Name> moduleNames = modifyList(n.getModuleNames(), arg);
1145         Name name = (Name) n.getName().accept(this, arg);
1146         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
1147         if (name == null)
1148             return null;
1149         n.setModuleNames(moduleNames);
1150         n.setName(name);
1151         n.setComment(comment);
1152         return n;
1153     }
1154 
1155     @Override()
visit(final ModuleProvidesDirective n, final A arg)1156     public Visitable visit(final ModuleProvidesDirective n, final A arg) {
1157         Name name = (Name) n.getName().accept(this, arg);
1158         NodeList<Name> with = modifyList(n.getWith(), arg);
1159         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
1160         if (name == null)
1161             return null;
1162         n.setName(name);
1163         n.setWith(with);
1164         n.setComment(comment);
1165         return n;
1166     }
1167 
1168     @Override()
visit(final ModuleUsesDirective n, final A arg)1169     public Visitable visit(final ModuleUsesDirective n, final A arg) {
1170         Name name = (Name) n.getName().accept(this, arg);
1171         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
1172         if (name == null)
1173             return null;
1174         n.setName(name);
1175         n.setComment(comment);
1176         return n;
1177     }
1178 
1179     @Override
visit(final ModuleOpensDirective n, final A arg)1180     public Visitable visit(final ModuleOpensDirective n, final A arg) {
1181         NodeList<Name> moduleNames = modifyList(n.getModuleNames(), arg);
1182         Name name = (Name) n.getName().accept(this, arg);
1183         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
1184         if (name == null)
1185             return null;
1186         n.setModuleNames(moduleNames);
1187         n.setName(name);
1188         n.setComment(comment);
1189         return n;
1190     }
1191 
1192     @Override
visit(final UnparsableStmt n, final A arg)1193     public Visitable visit(final UnparsableStmt n, final A arg) {
1194         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
1195         n.setComment(comment);
1196         return n;
1197     }
1198 
1199     @Override
visit(final ReceiverParameter n, final A arg)1200     public Visitable visit(final ReceiverParameter n, final A arg) {
1201         NodeList<AnnotationExpr> annotations = modifyList(n.getAnnotations(), arg);
1202         Name name = (Name) n.getName().accept(this, arg);
1203         Type type = (Type) n.getType().accept(this, arg);
1204         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
1205         if (name == null || type == null)
1206             return null;
1207         n.setAnnotations(annotations);
1208         n.setName(name);
1209         n.setType(type);
1210         n.setComment(comment);
1211         return n;
1212     }
1213 
1214     @Override
visit(final VarType n, final A arg)1215     public Visitable visit(final VarType n, final A arg) {
1216         NodeList<AnnotationExpr> annotations = modifyList(n.getAnnotations(), arg);
1217         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
1218         n.setAnnotations(annotations);
1219         n.setComment(comment);
1220         return n;
1221     }
1222 
1223     @Override
visit(final Modifier n, final A arg)1224     public Visitable visit(final Modifier n, final A arg) {
1225         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
1226         n.setComment(comment);
1227         return n;
1228     }
1229 
1230     @Override
visit(final SwitchExpr n, final A arg)1231     public Visitable visit(final SwitchExpr n, final A arg) {
1232         NodeList<SwitchEntry> entries = modifyList(n.getEntries(), arg);
1233         Expression selector = (Expression) n.getSelector().accept(this, arg);
1234         Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
1235         if (selector == null)
1236             return null;
1237         n.setEntries(entries);
1238         n.setSelector(selector);
1239         n.setComment(comment);
1240         return n;
1241     }
1242 }
1243