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 */
21package com.github.javaparser.ast.visitor;
22
23import com.github.javaparser.ast.*;
24import com.github.javaparser.ast.body.*;
25import com.github.javaparser.ast.comments.*;
26import com.github.javaparser.ast.expr.*;
27import com.github.javaparser.ast.modules.*;
28import com.github.javaparser.ast.stmt.*;
29import com.github.javaparser.ast.type.*;
30import java.util.Optional;
31import javax.annotation.Generated;
32
33/**
34 * A visitor that clones (copies) a node and all its children.
35 */
36public class CloneVisitor implements GenericVisitor<Visitable, Object> {
37
38    @Override
39    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
40    public Visitable visit(final CompilationUnit n, final Object arg) {
41        NodeList<ImportDeclaration> imports = cloneList(n.getImports(), arg);
42        ModuleDeclaration module = cloneNode(n.getModule(), arg);
43        PackageDeclaration packageDeclaration = cloneNode(n.getPackageDeclaration(), arg);
44        NodeList<TypeDeclaration<?>> types = cloneList(n.getTypes(), arg);
45        Comment comment = cloneNode(n.getComment(), arg);
46        CompilationUnit r = new CompilationUnit(n.getTokenRange().orElse(null), packageDeclaration, imports, types, module);
47        r.setComment(comment);
48        return r;
49    }
50
51    @Override
52    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
53    public Visitable visit(final PackageDeclaration n, final Object arg) {
54        NodeList<AnnotationExpr> annotations = cloneList(n.getAnnotations(), arg);
55        Name name = cloneNode(n.getName(), arg);
56        Comment comment = cloneNode(n.getComment(), arg);
57        PackageDeclaration r = new PackageDeclaration(n.getTokenRange().orElse(null), annotations, name);
58        r.setComment(comment);
59        return r;
60    }
61
62    @Override
63    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
64    public Visitable visit(final TypeParameter n, final Object arg) {
65        SimpleName name = cloneNode(n.getName(), arg);
66        NodeList<ClassOrInterfaceType> typeBound = cloneList(n.getTypeBound(), arg);
67        NodeList<AnnotationExpr> annotations = cloneList(n.getAnnotations(), arg);
68        Comment comment = cloneNode(n.getComment(), arg);
69        TypeParameter r = new TypeParameter(n.getTokenRange().orElse(null), name, typeBound, annotations);
70        r.setComment(comment);
71        return r;
72    }
73
74    @Override
75    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
76    public Visitable visit(final LineComment n, final Object arg) {
77        Comment comment = cloneNode(n.getComment(), arg);
78        LineComment r = new LineComment(n.getTokenRange().orElse(null), n.getContent());
79        r.setComment(comment);
80        return r;
81    }
82
83    @Override
84    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
85    public Visitable visit(final BlockComment n, final Object arg) {
86        Comment comment = cloneNode(n.getComment(), arg);
87        BlockComment r = new BlockComment(n.getTokenRange().orElse(null), n.getContent());
88        r.setComment(comment);
89        return r;
90    }
91
92    @Override
93    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
94    public Visitable visit(final ClassOrInterfaceDeclaration n, final Object arg) {
95        NodeList<ClassOrInterfaceType> extendedTypes = cloneList(n.getExtendedTypes(), arg);
96        NodeList<ClassOrInterfaceType> implementedTypes = cloneList(n.getImplementedTypes(), arg);
97        NodeList<TypeParameter> typeParameters = cloneList(n.getTypeParameters(), arg);
98        NodeList<BodyDeclaration<?>> members = cloneList(n.getMembers(), arg);
99        SimpleName name = cloneNode(n.getName(), arg);
100        NodeList<AnnotationExpr> annotations = cloneList(n.getAnnotations(), arg);
101        Comment comment = cloneNode(n.getComment(), arg);
102        ClassOrInterfaceDeclaration r = new ClassOrInterfaceDeclaration(n.getTokenRange().orElse(null), n.getModifiers(), annotations, n.isInterface(), name, typeParameters, extendedTypes, implementedTypes, members);
103        r.setComment(comment);
104        return r;
105    }
106
107    @Override
108    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
109    public Visitable visit(final EnumDeclaration n, final Object arg) {
110        NodeList<EnumConstantDeclaration> entries = cloneList(n.getEntries(), arg);
111        NodeList<ClassOrInterfaceType> implementedTypes = cloneList(n.getImplementedTypes(), arg);
112        NodeList<BodyDeclaration<?>> members = cloneList(n.getMembers(), arg);
113        SimpleName name = cloneNode(n.getName(), arg);
114        NodeList<AnnotationExpr> annotations = cloneList(n.getAnnotations(), arg);
115        Comment comment = cloneNode(n.getComment(), arg);
116        EnumDeclaration r = new EnumDeclaration(n.getTokenRange().orElse(null), n.getModifiers(), annotations, name, implementedTypes, entries, members);
117        r.setComment(comment);
118        return r;
119    }
120
121    @Override
122    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
123    public Visitable visit(final EnumConstantDeclaration n, final Object arg) {
124        NodeList<Expression> arguments = cloneList(n.getArguments(), arg);
125        NodeList<BodyDeclaration<?>> classBody = cloneList(n.getClassBody(), arg);
126        SimpleName name = cloneNode(n.getName(), arg);
127        NodeList<AnnotationExpr> annotations = cloneList(n.getAnnotations(), arg);
128        Comment comment = cloneNode(n.getComment(), arg);
129        EnumConstantDeclaration r = new EnumConstantDeclaration(n.getTokenRange().orElse(null), annotations, name, arguments, classBody);
130        r.setComment(comment);
131        return r;
132    }
133
134    @Override
135    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
136    public Visitable visit(final AnnotationDeclaration n, final Object arg) {
137        NodeList<BodyDeclaration<?>> members = cloneList(n.getMembers(), arg);
138        SimpleName name = cloneNode(n.getName(), arg);
139        NodeList<AnnotationExpr> annotations = cloneList(n.getAnnotations(), arg);
140        Comment comment = cloneNode(n.getComment(), arg);
141        AnnotationDeclaration r = new AnnotationDeclaration(n.getTokenRange().orElse(null), n.getModifiers(), annotations, name, members);
142        r.setComment(comment);
143        return r;
144    }
145
146    @Override
147    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
148    public Visitable visit(final AnnotationMemberDeclaration n, final Object arg) {
149        Expression defaultValue = cloneNode(n.getDefaultValue(), arg);
150        SimpleName name = cloneNode(n.getName(), arg);
151        Type type = cloneNode(n.getType(), arg);
152        NodeList<AnnotationExpr> annotations = cloneList(n.getAnnotations(), arg);
153        Comment comment = cloneNode(n.getComment(), arg);
154        AnnotationMemberDeclaration r = new AnnotationMemberDeclaration(n.getTokenRange().orElse(null), n.getModifiers(), annotations, type, name, defaultValue);
155        r.setComment(comment);
156        return r;
157    }
158
159    @Override
160    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
161    public Visitable visit(final FieldDeclaration n, final Object arg) {
162        NodeList<VariableDeclarator> variables = cloneList(n.getVariables(), arg);
163        NodeList<AnnotationExpr> annotations = cloneList(n.getAnnotations(), arg);
164        Comment comment = cloneNode(n.getComment(), arg);
165        FieldDeclaration r = new FieldDeclaration(n.getTokenRange().orElse(null), n.getModifiers(), annotations, variables);
166        r.setComment(comment);
167        return r;
168    }
169
170    @Override
171    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
172    public Visitable visit(final VariableDeclarator n, final Object arg) {
173        Expression initializer = cloneNode(n.getInitializer(), arg);
174        SimpleName name = cloneNode(n.getName(), arg);
175        Type type = cloneNode(n.getType(), arg);
176        Comment comment = cloneNode(n.getComment(), arg);
177        VariableDeclarator r = new VariableDeclarator(n.getTokenRange().orElse(null), type, name, initializer);
178        r.setComment(comment);
179        return r;
180    }
181
182    @Override
183    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
184    public Visitable visit(final ConstructorDeclaration n, final Object arg) {
185        BlockStmt body = cloneNode(n.getBody(), arg);
186        SimpleName name = cloneNode(n.getName(), arg);
187        NodeList<Parameter> parameters = cloneList(n.getParameters(), arg);
188        ReceiverParameter receiverParameter = cloneNode(n.getReceiverParameter(), arg);
189        NodeList<ReferenceType> thrownExceptions = cloneList(n.getThrownExceptions(), arg);
190        NodeList<TypeParameter> typeParameters = cloneList(n.getTypeParameters(), arg);
191        NodeList<AnnotationExpr> annotations = cloneList(n.getAnnotations(), arg);
192        Comment comment = cloneNode(n.getComment(), arg);
193        ConstructorDeclaration r = new ConstructorDeclaration(n.getTokenRange().orElse(null), n.getModifiers(), annotations, typeParameters, name, parameters, thrownExceptions, body, receiverParameter);
194        r.setComment(comment);
195        return r;
196    }
197
198    @Override
199    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
200    public Visitable visit(final MethodDeclaration n, final Object arg) {
201        BlockStmt body = cloneNode(n.getBody(), arg);
202        Type type = cloneNode(n.getType(), arg);
203        SimpleName name = cloneNode(n.getName(), arg);
204        NodeList<Parameter> parameters = cloneList(n.getParameters(), arg);
205        ReceiverParameter receiverParameter = cloneNode(n.getReceiverParameter(), arg);
206        NodeList<ReferenceType> thrownExceptions = cloneList(n.getThrownExceptions(), arg);
207        NodeList<TypeParameter> typeParameters = cloneList(n.getTypeParameters(), arg);
208        NodeList<AnnotationExpr> annotations = cloneList(n.getAnnotations(), arg);
209        Comment comment = cloneNode(n.getComment(), arg);
210        MethodDeclaration r = new MethodDeclaration(n.getTokenRange().orElse(null), n.getModifiers(), annotations, typeParameters, type, name, parameters, thrownExceptions, body, receiverParameter);
211        r.setComment(comment);
212        return r;
213    }
214
215    @Override
216    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
217    public Visitable visit(final Parameter n, final Object arg) {
218        NodeList<AnnotationExpr> annotations = cloneList(n.getAnnotations(), arg);
219        SimpleName name = cloneNode(n.getName(), arg);
220        Type type = cloneNode(n.getType(), arg);
221        NodeList<AnnotationExpr> varArgsAnnotations = cloneList(n.getVarArgsAnnotations(), arg);
222        Comment comment = cloneNode(n.getComment(), arg);
223        Parameter r = new Parameter(n.getTokenRange().orElse(null), n.getModifiers(), annotations, type, n.isVarArgs(), varArgsAnnotations, name);
224        r.setComment(comment);
225        return r;
226    }
227
228    @Override
229    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
230    public Visitable visit(final InitializerDeclaration n, final Object arg) {
231        BlockStmt body = cloneNode(n.getBody(), arg);
232        NodeList<AnnotationExpr> annotations = cloneList(n.getAnnotations(), arg);
233        Comment comment = cloneNode(n.getComment(), arg);
234        InitializerDeclaration r = new InitializerDeclaration(n.getTokenRange().orElse(null), n.isStatic(), body);
235        r.setComment(comment);
236        return r;
237    }
238
239    @Override
240    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
241    public Visitable visit(final JavadocComment n, final Object arg) {
242        Comment comment = cloneNode(n.getComment(), arg);
243        JavadocComment r = new JavadocComment(n.getTokenRange().orElse(null), n.getContent());
244        r.setComment(comment);
245        return r;
246    }
247
248    @Override
249    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
250    public Visitable visit(final ClassOrInterfaceType n, final Object arg) {
251        SimpleName name = cloneNode(n.getName(), arg);
252        ClassOrInterfaceType scope = cloneNode(n.getScope(), arg);
253        NodeList<Type> typeArguments = cloneList(n.getTypeArguments().orElse(null), arg);
254        NodeList<AnnotationExpr> annotations = cloneList(n.getAnnotations(), arg);
255        Comment comment = cloneNode(n.getComment(), arg);
256        ClassOrInterfaceType r = new ClassOrInterfaceType(n.getTokenRange().orElse(null), scope, name, typeArguments, annotations);
257        r.setComment(comment);
258        return r;
259    }
260
261    @Override
262    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
263    public Visitable visit(final PrimitiveType n, final Object arg) {
264        NodeList<AnnotationExpr> annotations = cloneList(n.getAnnotations(), arg);
265        Comment comment = cloneNode(n.getComment(), arg);
266        PrimitiveType r = new PrimitiveType(n.getTokenRange().orElse(null), n.getType(), annotations);
267        r.setComment(comment);
268        return r;
269    }
270
271    @Override
272    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
273    public Visitable visit(final ArrayType n, final Object arg) {
274        Type componentType = cloneNode(n.getComponentType(), arg);
275        NodeList<AnnotationExpr> annotations = cloneList(n.getAnnotations(), arg);
276        Comment comment = cloneNode(n.getComment(), arg);
277        ArrayType r = new ArrayType(n.getTokenRange().orElse(null), componentType, n.getOrigin(), annotations);
278        r.setComment(comment);
279        return r;
280    }
281
282    @Override
283    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
284    public Visitable visit(final ArrayCreationLevel n, final Object arg) {
285        NodeList<AnnotationExpr> annotations = cloneList(n.getAnnotations(), arg);
286        Expression dimension = cloneNode(n.getDimension(), arg);
287        Comment comment = cloneNode(n.getComment(), arg);
288        ArrayCreationLevel r = new ArrayCreationLevel(n.getTokenRange().orElse(null), dimension, annotations);
289        r.setComment(comment);
290        return r;
291    }
292
293    @Override
294    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
295    public Visitable visit(final IntersectionType n, final Object arg) {
296        NodeList<ReferenceType> elements = cloneList(n.getElements(), arg);
297        NodeList<AnnotationExpr> annotations = cloneList(n.getAnnotations(), arg);
298        Comment comment = cloneNode(n.getComment(), arg);
299        IntersectionType r = new IntersectionType(n.getTokenRange().orElse(null), elements);
300        r.setComment(comment);
301        return r;
302    }
303
304    @Override
305    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
306    public Visitable visit(final UnionType n, final Object arg) {
307        NodeList<ReferenceType> elements = cloneList(n.getElements(), arg);
308        NodeList<AnnotationExpr> annotations = cloneList(n.getAnnotations(), arg);
309        Comment comment = cloneNode(n.getComment(), arg);
310        UnionType r = new UnionType(n.getTokenRange().orElse(null), elements);
311        r.setComment(comment);
312        return r;
313    }
314
315    @Override
316    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
317    public Visitable visit(final VoidType n, final Object arg) {
318        NodeList<AnnotationExpr> annotations = cloneList(n.getAnnotations(), arg);
319        Comment comment = cloneNode(n.getComment(), arg);
320        VoidType r = new VoidType(n.getTokenRange().orElse(null));
321        r.setComment(comment);
322        return r;
323    }
324
325    @Override
326    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
327    public Visitable visit(final WildcardType n, final Object arg) {
328        ReferenceType extendedType = cloneNode(n.getExtendedType(), arg);
329        ReferenceType superType = cloneNode(n.getSuperType(), arg);
330        NodeList<AnnotationExpr> annotations = cloneList(n.getAnnotations(), arg);
331        Comment comment = cloneNode(n.getComment(), arg);
332        WildcardType r = new WildcardType(n.getTokenRange().orElse(null), extendedType, superType, annotations);
333        r.setComment(comment);
334        return r;
335    }
336
337    @Override
338    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
339    public Visitable visit(final UnknownType n, final Object arg) {
340        NodeList<AnnotationExpr> annotations = cloneList(n.getAnnotations(), arg);
341        Comment comment = cloneNode(n.getComment(), arg);
342        UnknownType r = new UnknownType(n.getTokenRange().orElse(null));
343        r.setComment(comment);
344        return r;
345    }
346
347    @Override
348    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
349    public Visitable visit(final ArrayAccessExpr n, final Object arg) {
350        Expression index = cloneNode(n.getIndex(), arg);
351        Expression name = cloneNode(n.getName(), arg);
352        Comment comment = cloneNode(n.getComment(), arg);
353        ArrayAccessExpr r = new ArrayAccessExpr(n.getTokenRange().orElse(null), name, index);
354        r.setComment(comment);
355        return r;
356    }
357
358    @Override
359    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
360    public Visitable visit(final ArrayCreationExpr n, final Object arg) {
361        Type elementType = cloneNode(n.getElementType(), arg);
362        ArrayInitializerExpr initializer = cloneNode(n.getInitializer(), arg);
363        NodeList<ArrayCreationLevel> levels = cloneList(n.getLevels(), arg);
364        Comment comment = cloneNode(n.getComment(), arg);
365        ArrayCreationExpr r = new ArrayCreationExpr(n.getTokenRange().orElse(null), elementType, levels, initializer);
366        r.setComment(comment);
367        return r;
368    }
369
370    @Override
371    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
372    public Visitable visit(final ArrayInitializerExpr n, final Object arg) {
373        NodeList<Expression> values = cloneList(n.getValues(), arg);
374        Comment comment = cloneNode(n.getComment(), arg);
375        ArrayInitializerExpr r = new ArrayInitializerExpr(n.getTokenRange().orElse(null), values);
376        r.setComment(comment);
377        return r;
378    }
379
380    @Override
381    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
382    public Visitable visit(final AssignExpr n, final Object arg) {
383        Expression target = cloneNode(n.getTarget(), arg);
384        Expression value = cloneNode(n.getValue(), arg);
385        Comment comment = cloneNode(n.getComment(), arg);
386        AssignExpr r = new AssignExpr(n.getTokenRange().orElse(null), target, value, n.getOperator());
387        r.setComment(comment);
388        return r;
389    }
390
391    @Override
392    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
393    public Visitable visit(final BinaryExpr n, final Object arg) {
394        Expression left = cloneNode(n.getLeft(), arg);
395        Expression right = cloneNode(n.getRight(), arg);
396        Comment comment = cloneNode(n.getComment(), arg);
397        BinaryExpr r = new BinaryExpr(n.getTokenRange().orElse(null), left, right, n.getOperator());
398        r.setComment(comment);
399        return r;
400    }
401
402    @Override
403    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
404    public Visitable visit(final CastExpr n, final Object arg) {
405        Expression expression = cloneNode(n.getExpression(), arg);
406        Type type = cloneNode(n.getType(), arg);
407        Comment comment = cloneNode(n.getComment(), arg);
408        CastExpr r = new CastExpr(n.getTokenRange().orElse(null), type, expression);
409        r.setComment(comment);
410        return r;
411    }
412
413    @Override
414    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
415    public Visitable visit(final ClassExpr n, final Object arg) {
416        Type type = cloneNode(n.getType(), arg);
417        Comment comment = cloneNode(n.getComment(), arg);
418        ClassExpr r = new ClassExpr(n.getTokenRange().orElse(null), type);
419        r.setComment(comment);
420        return r;
421    }
422
423    @Override
424    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
425    public Visitable visit(final ConditionalExpr n, final Object arg) {
426        Expression condition = cloneNode(n.getCondition(), arg);
427        Expression elseExpr = cloneNode(n.getElseExpr(), arg);
428        Expression thenExpr = cloneNode(n.getThenExpr(), arg);
429        Comment comment = cloneNode(n.getComment(), arg);
430        ConditionalExpr r = new ConditionalExpr(n.getTokenRange().orElse(null), condition, thenExpr, elseExpr);
431        r.setComment(comment);
432        return r;
433    }
434
435    @Override
436    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
437    public Visitable visit(final EnclosedExpr n, final Object arg) {
438        Expression inner = cloneNode(n.getInner(), arg);
439        Comment comment = cloneNode(n.getComment(), arg);
440        EnclosedExpr r = new EnclosedExpr(n.getTokenRange().orElse(null), inner);
441        r.setComment(comment);
442        return r;
443    }
444
445    @Override
446    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
447    public Visitable visit(final FieldAccessExpr n, final Object arg) {
448        SimpleName name = cloneNode(n.getName(), arg);
449        Expression scope = cloneNode(n.getScope(), arg);
450        NodeList<Type> typeArguments = cloneList(n.getTypeArguments().orElse(null), arg);
451        Comment comment = cloneNode(n.getComment(), arg);
452        FieldAccessExpr r = new FieldAccessExpr(n.getTokenRange().orElse(null), scope, typeArguments, name);
453        r.setComment(comment);
454        return r;
455    }
456
457    @Override
458    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
459    public Visitable visit(final InstanceOfExpr n, final Object arg) {
460        Expression expression = cloneNode(n.getExpression(), arg);
461        ReferenceType type = cloneNode(n.getType(), arg);
462        Comment comment = cloneNode(n.getComment(), arg);
463        InstanceOfExpr r = new InstanceOfExpr(n.getTokenRange().orElse(null), expression, type);
464        r.setComment(comment);
465        return r;
466    }
467
468    @Override
469    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
470    public Visitable visit(final StringLiteralExpr n, final Object arg) {
471        Comment comment = cloneNode(n.getComment(), arg);
472        StringLiteralExpr r = new StringLiteralExpr(n.getTokenRange().orElse(null), n.getValue());
473        r.setComment(comment);
474        return r;
475    }
476
477    @Override
478    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
479    public Visitable visit(final IntegerLiteralExpr n, final Object arg) {
480        Comment comment = cloneNode(n.getComment(), arg);
481        IntegerLiteralExpr r = new IntegerLiteralExpr(n.getTokenRange().orElse(null), n.getValue());
482        r.setComment(comment);
483        return r;
484    }
485
486    @Override
487    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
488    public Visitable visit(final LongLiteralExpr n, final Object arg) {
489        Comment comment = cloneNode(n.getComment(), arg);
490        LongLiteralExpr r = new LongLiteralExpr(n.getTokenRange().orElse(null), n.getValue());
491        r.setComment(comment);
492        return r;
493    }
494
495    @Override
496    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
497    public Visitable visit(final CharLiteralExpr n, final Object arg) {
498        Comment comment = cloneNode(n.getComment(), arg);
499        CharLiteralExpr r = new CharLiteralExpr(n.getTokenRange().orElse(null), n.getValue());
500        r.setComment(comment);
501        return r;
502    }
503
504    @Override
505    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
506    public Visitable visit(final DoubleLiteralExpr n, final Object arg) {
507        Comment comment = cloneNode(n.getComment(), arg);
508        DoubleLiteralExpr r = new DoubleLiteralExpr(n.getTokenRange().orElse(null), n.getValue());
509        r.setComment(comment);
510        return r;
511    }
512
513    @Override
514    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
515    public Visitable visit(final BooleanLiteralExpr n, final Object arg) {
516        Comment comment = cloneNode(n.getComment(), arg);
517        BooleanLiteralExpr r = new BooleanLiteralExpr(n.getTokenRange().orElse(null), n.getValue());
518        r.setComment(comment);
519        return r;
520    }
521
522    @Override
523    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
524    public Visitable visit(final NullLiteralExpr n, final Object arg) {
525        Comment comment = cloneNode(n.getComment(), arg);
526        NullLiteralExpr r = new NullLiteralExpr(n.getTokenRange().orElse(null));
527        r.setComment(comment);
528        return r;
529    }
530
531    @Override
532    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
533    public Visitable visit(final MethodCallExpr n, final Object arg) {
534        NodeList<Expression> arguments = cloneList(n.getArguments(), arg);
535        SimpleName name = cloneNode(n.getName(), arg);
536        Expression scope = cloneNode(n.getScope(), arg);
537        NodeList<Type> typeArguments = cloneList(n.getTypeArguments().orElse(null), arg);
538        Comment comment = cloneNode(n.getComment(), arg);
539        MethodCallExpr r = new MethodCallExpr(n.getTokenRange().orElse(null), scope, typeArguments, name, arguments);
540        r.setComment(comment);
541        return r;
542    }
543
544    @Override
545    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
546    public Visitable visit(final NameExpr n, final Object arg) {
547        SimpleName name = cloneNode(n.getName(), arg);
548        Comment comment = cloneNode(n.getComment(), arg);
549        NameExpr r = new NameExpr(n.getTokenRange().orElse(null), name);
550        r.setComment(comment);
551        return r;
552    }
553
554    @Override
555    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
556    public Visitable visit(final ObjectCreationExpr n, final Object arg) {
557        NodeList<BodyDeclaration<?>> anonymousClassBody = cloneList(n.getAnonymousClassBody().orElse(null), arg);
558        NodeList<Expression> arguments = cloneList(n.getArguments(), arg);
559        Expression scope = cloneNode(n.getScope(), arg);
560        ClassOrInterfaceType type = cloneNode(n.getType(), arg);
561        NodeList<Type> typeArguments = cloneList(n.getTypeArguments().orElse(null), arg);
562        Comment comment = cloneNode(n.getComment(), arg);
563        ObjectCreationExpr r = new ObjectCreationExpr(n.getTokenRange().orElse(null), scope, type, typeArguments, arguments, anonymousClassBody);
564        r.setComment(comment);
565        return r;
566    }
567
568    @Override
569    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
570    public Visitable visit(final Name n, final Object arg) {
571        NodeList<AnnotationExpr> annotations = cloneList(n.getAnnotations(), arg);
572        Name qualifier = cloneNode(n.getQualifier(), arg);
573        Comment comment = cloneNode(n.getComment(), arg);
574        Name r = new Name(n.getTokenRange().orElse(null), qualifier, n.getIdentifier(), annotations);
575        r.setComment(comment);
576        return r;
577    }
578
579    @Override
580    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
581    public Visitable visit(final SimpleName n, final Object arg) {
582        Comment comment = cloneNode(n.getComment(), arg);
583        SimpleName r = new SimpleName(n.getTokenRange().orElse(null), n.getIdentifier());
584        r.setComment(comment);
585        return r;
586    }
587
588    @Override
589    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
590    public Visitable visit(final ThisExpr n, final Object arg) {
591        Expression classExpr = cloneNode(n.getClassExpr(), arg);
592        Comment comment = cloneNode(n.getComment(), arg);
593        ThisExpr r = new ThisExpr(n.getTokenRange().orElse(null), classExpr);
594        r.setComment(comment);
595        return r;
596    }
597
598    @Override
599    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
600    public Visitable visit(final SuperExpr n, final Object arg) {
601        Expression classExpr = cloneNode(n.getClassExpr(), arg);
602        Comment comment = cloneNode(n.getComment(), arg);
603        SuperExpr r = new SuperExpr(n.getTokenRange().orElse(null), classExpr);
604        r.setComment(comment);
605        return r;
606    }
607
608    @Override
609    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
610    public Visitable visit(final UnaryExpr n, final Object arg) {
611        Expression expression = cloneNode(n.getExpression(), arg);
612        Comment comment = cloneNode(n.getComment(), arg);
613        UnaryExpr r = new UnaryExpr(n.getTokenRange().orElse(null), expression, n.getOperator());
614        r.setComment(comment);
615        return r;
616    }
617
618    @Override
619    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
620    public Visitable visit(final VariableDeclarationExpr n, final Object arg) {
621        NodeList<AnnotationExpr> annotations = cloneList(n.getAnnotations(), arg);
622        NodeList<VariableDeclarator> variables = cloneList(n.getVariables(), arg);
623        Comment comment = cloneNode(n.getComment(), arg);
624        VariableDeclarationExpr r = new VariableDeclarationExpr(n.getTokenRange().orElse(null), n.getModifiers(), annotations, variables);
625        r.setComment(comment);
626        return r;
627    }
628
629    @Override
630    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
631    public Visitable visit(final MarkerAnnotationExpr n, final Object arg) {
632        Name name = cloneNode(n.getName(), arg);
633        Comment comment = cloneNode(n.getComment(), arg);
634        MarkerAnnotationExpr r = new MarkerAnnotationExpr(n.getTokenRange().orElse(null), name);
635        r.setComment(comment);
636        return r;
637    }
638
639    @Override
640    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
641    public Visitable visit(final SingleMemberAnnotationExpr n, final Object arg) {
642        Expression memberValue = cloneNode(n.getMemberValue(), arg);
643        Name name = cloneNode(n.getName(), arg);
644        Comment comment = cloneNode(n.getComment(), arg);
645        SingleMemberAnnotationExpr r = new SingleMemberAnnotationExpr(n.getTokenRange().orElse(null), name, memberValue);
646        r.setComment(comment);
647        return r;
648    }
649
650    @Override
651    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
652    public Visitable visit(final NormalAnnotationExpr n, final Object arg) {
653        NodeList<MemberValuePair> pairs = cloneList(n.getPairs(), arg);
654        Name name = cloneNode(n.getName(), arg);
655        Comment comment = cloneNode(n.getComment(), arg);
656        NormalAnnotationExpr r = new NormalAnnotationExpr(n.getTokenRange().orElse(null), name, pairs);
657        r.setComment(comment);
658        return r;
659    }
660
661    @Override
662    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
663    public Visitable visit(final MemberValuePair n, final Object arg) {
664        SimpleName name = cloneNode(n.getName(), arg);
665        Expression value = cloneNode(n.getValue(), arg);
666        Comment comment = cloneNode(n.getComment(), arg);
667        MemberValuePair r = new MemberValuePair(n.getTokenRange().orElse(null), name, value);
668        r.setComment(comment);
669        return r;
670    }
671
672    @Override
673    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
674    public Visitable visit(final ExplicitConstructorInvocationStmt n, final Object arg) {
675        NodeList<Expression> arguments = cloneList(n.getArguments(), arg);
676        Expression expression = cloneNode(n.getExpression(), arg);
677        NodeList<Type> typeArguments = cloneList(n.getTypeArguments().orElse(null), arg);
678        Comment comment = cloneNode(n.getComment(), arg);
679        ExplicitConstructorInvocationStmt r = new ExplicitConstructorInvocationStmt(n.getTokenRange().orElse(null), typeArguments, n.isThis(), expression, arguments);
680        r.setComment(comment);
681        return r;
682    }
683
684    @Override
685    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
686    public Visitable visit(final LocalClassDeclarationStmt n, final Object arg) {
687        ClassOrInterfaceDeclaration classDeclaration = cloneNode(n.getClassDeclaration(), arg);
688        Comment comment = cloneNode(n.getComment(), arg);
689        LocalClassDeclarationStmt r = new LocalClassDeclarationStmt(n.getTokenRange().orElse(null), classDeclaration);
690        r.setComment(comment);
691        return r;
692    }
693
694    @Override
695    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
696    public Visitable visit(final AssertStmt n, final Object arg) {
697        Expression check = cloneNode(n.getCheck(), arg);
698        Expression message = cloneNode(n.getMessage(), arg);
699        Comment comment = cloneNode(n.getComment(), arg);
700        AssertStmt r = new AssertStmt(n.getTokenRange().orElse(null), check, message);
701        r.setComment(comment);
702        return r;
703    }
704
705    @Override
706    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
707    public Visitable visit(final BlockStmt n, final Object arg) {
708        NodeList<Statement> statements = cloneList(n.getStatements(), arg);
709        Comment comment = cloneNode(n.getComment(), arg);
710        BlockStmt r = new BlockStmt(n.getTokenRange().orElse(null), statements);
711        r.setComment(comment);
712        return r;
713    }
714
715    @Override
716    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
717    public Visitable visit(final LabeledStmt n, final Object arg) {
718        SimpleName label = cloneNode(n.getLabel(), arg);
719        Statement statement = cloneNode(n.getStatement(), arg);
720        Comment comment = cloneNode(n.getComment(), arg);
721        LabeledStmt r = new LabeledStmt(n.getTokenRange().orElse(null), label, statement);
722        r.setComment(comment);
723        return r;
724    }
725
726    @Override
727    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
728    public Visitable visit(final EmptyStmt n, final Object arg) {
729        Comment comment = cloneNode(n.getComment(), arg);
730        EmptyStmt r = new EmptyStmt(n.getTokenRange().orElse(null));
731        r.setComment(comment);
732        return r;
733    }
734
735    @Override
736    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
737    public Visitable visit(final ExpressionStmt n, final Object arg) {
738        Expression expression = cloneNode(n.getExpression(), arg);
739        Comment comment = cloneNode(n.getComment(), arg);
740        ExpressionStmt r = new ExpressionStmt(n.getTokenRange().orElse(null), expression);
741        r.setComment(comment);
742        return r;
743    }
744
745    @Override
746    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
747    public Visitable visit(final SwitchStmt n, final Object arg) {
748        NodeList<SwitchEntryStmt> entries = cloneList(n.getEntries(), arg);
749        Expression selector = cloneNode(n.getSelector(), arg);
750        Comment comment = cloneNode(n.getComment(), arg);
751        SwitchStmt r = new SwitchStmt(n.getTokenRange().orElse(null), selector, entries);
752        r.setComment(comment);
753        return r;
754    }
755
756    @Override
757    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
758    public Visitable visit(final SwitchEntryStmt n, final Object arg) {
759        Expression label = cloneNode(n.getLabel(), arg);
760        NodeList<Statement> statements = cloneList(n.getStatements(), arg);
761        Comment comment = cloneNode(n.getComment(), arg);
762        SwitchEntryStmt r = new SwitchEntryStmt(n.getTokenRange().orElse(null), label, statements);
763        r.setComment(comment);
764        return r;
765    }
766
767    @Override
768    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
769    public Visitable visit(final BreakStmt n, final Object arg) {
770        SimpleName label = cloneNode(n.getLabel(), arg);
771        Comment comment = cloneNode(n.getComment(), arg);
772        BreakStmt r = new BreakStmt(n.getTokenRange().orElse(null), label);
773        r.setComment(comment);
774        return r;
775    }
776
777    @Override
778    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
779    public Visitable visit(final ReturnStmt n, final Object arg) {
780        Expression expression = cloneNode(n.getExpression(), arg);
781        Comment comment = cloneNode(n.getComment(), arg);
782        ReturnStmt r = new ReturnStmt(n.getTokenRange().orElse(null), expression);
783        r.setComment(comment);
784        return r;
785    }
786
787    @Override
788    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
789    public Visitable visit(final IfStmt n, final Object arg) {
790        Expression condition = cloneNode(n.getCondition(), arg);
791        Statement elseStmt = cloneNode(n.getElseStmt(), arg);
792        Statement thenStmt = cloneNode(n.getThenStmt(), arg);
793        Comment comment = cloneNode(n.getComment(), arg);
794        IfStmt r = new IfStmt(n.getTokenRange().orElse(null), condition, thenStmt, elseStmt);
795        r.setComment(comment);
796        return r;
797    }
798
799    @Override
800    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
801    public Visitable visit(final WhileStmt n, final Object arg) {
802        Statement body = cloneNode(n.getBody(), arg);
803        Expression condition = cloneNode(n.getCondition(), arg);
804        Comment comment = cloneNode(n.getComment(), arg);
805        WhileStmt r = new WhileStmt(n.getTokenRange().orElse(null), condition, body);
806        r.setComment(comment);
807        return r;
808    }
809
810    @Override
811    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
812    public Visitable visit(final ContinueStmt n, final Object arg) {
813        SimpleName label = cloneNode(n.getLabel(), arg);
814        Comment comment = cloneNode(n.getComment(), arg);
815        ContinueStmt r = new ContinueStmt(n.getTokenRange().orElse(null), label);
816        r.setComment(comment);
817        return r;
818    }
819
820    @Override
821    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
822    public Visitable visit(final DoStmt n, final Object arg) {
823        Statement body = cloneNode(n.getBody(), arg);
824        Expression condition = cloneNode(n.getCondition(), arg);
825        Comment comment = cloneNode(n.getComment(), arg);
826        DoStmt r = new DoStmt(n.getTokenRange().orElse(null), body, condition);
827        r.setComment(comment);
828        return r;
829    }
830
831    @Override
832    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
833    public Visitable visit(final ForeachStmt n, final Object arg) {
834        Statement body = cloneNode(n.getBody(), arg);
835        Expression iterable = cloneNode(n.getIterable(), arg);
836        VariableDeclarationExpr variable = cloneNode(n.getVariable(), arg);
837        Comment comment = cloneNode(n.getComment(), arg);
838        ForeachStmt r = new ForeachStmt(n.getTokenRange().orElse(null), variable, iterable, body);
839        r.setComment(comment);
840        return r;
841    }
842
843    @Override
844    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
845    public Visitable visit(final ForStmt n, final Object arg) {
846        Statement body = cloneNode(n.getBody(), arg);
847        Expression compare = cloneNode(n.getCompare(), arg);
848        NodeList<Expression> initialization = cloneList(n.getInitialization(), arg);
849        NodeList<Expression> update = cloneList(n.getUpdate(), arg);
850        Comment comment = cloneNode(n.getComment(), arg);
851        ForStmt r = new ForStmt(n.getTokenRange().orElse(null), initialization, compare, update, body);
852        r.setComment(comment);
853        return r;
854    }
855
856    @Override
857    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
858    public Visitable visit(final ThrowStmt n, final Object arg) {
859        Expression expression = cloneNode(n.getExpression(), arg);
860        Comment comment = cloneNode(n.getComment(), arg);
861        ThrowStmt r = new ThrowStmt(n.getTokenRange().orElse(null), expression);
862        r.setComment(comment);
863        return r;
864    }
865
866    @Override
867    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
868    public Visitable visit(final SynchronizedStmt n, final Object arg) {
869        BlockStmt body = cloneNode(n.getBody(), arg);
870        Expression expression = cloneNode(n.getExpression(), arg);
871        Comment comment = cloneNode(n.getComment(), arg);
872        SynchronizedStmt r = new SynchronizedStmt(n.getTokenRange().orElse(null), expression, body);
873        r.setComment(comment);
874        return r;
875    }
876
877    @Override
878    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
879    public Visitable visit(final TryStmt n, final Object arg) {
880        NodeList<CatchClause> catchClauses = cloneList(n.getCatchClauses(), arg);
881        BlockStmt finallyBlock = cloneNode(n.getFinallyBlock(), arg);
882        NodeList<Expression> resources = cloneList(n.getResources(), arg);
883        BlockStmt tryBlock = cloneNode(n.getTryBlock(), arg);
884        Comment comment = cloneNode(n.getComment(), arg);
885        TryStmt r = new TryStmt(n.getTokenRange().orElse(null), resources, tryBlock, catchClauses, finallyBlock);
886        r.setComment(comment);
887        return r;
888    }
889
890    @Override
891    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
892    public Visitable visit(final CatchClause n, final Object arg) {
893        BlockStmt body = cloneNode(n.getBody(), arg);
894        Parameter parameter = cloneNode(n.getParameter(), arg);
895        Comment comment = cloneNode(n.getComment(), arg);
896        CatchClause r = new CatchClause(n.getTokenRange().orElse(null), parameter, body);
897        r.setComment(comment);
898        return r;
899    }
900
901    @Override
902    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
903    public Visitable visit(final LambdaExpr n, final Object arg) {
904        Statement body = cloneNode(n.getBody(), arg);
905        NodeList<Parameter> parameters = cloneList(n.getParameters(), arg);
906        Comment comment = cloneNode(n.getComment(), arg);
907        LambdaExpr r = new LambdaExpr(n.getTokenRange().orElse(null), parameters, body, n.isEnclosingParameters());
908        r.setComment(comment);
909        return r;
910    }
911
912    @Override
913    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
914    public Visitable visit(final MethodReferenceExpr n, final Object arg) {
915        Expression scope = cloneNode(n.getScope(), arg);
916        NodeList<Type> typeArguments = cloneList(n.getTypeArguments().orElse(null), arg);
917        Comment comment = cloneNode(n.getComment(), arg);
918        MethodReferenceExpr r = new MethodReferenceExpr(n.getTokenRange().orElse(null), scope, typeArguments, n.getIdentifier());
919        r.setComment(comment);
920        return r;
921    }
922
923    @Override
924    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
925    public Visitable visit(final TypeExpr n, final Object arg) {
926        Type type = cloneNode(n.getType(), arg);
927        Comment comment = cloneNode(n.getComment(), arg);
928        TypeExpr r = new TypeExpr(n.getTokenRange().orElse(null), type);
929        r.setComment(comment);
930        return r;
931    }
932
933    @Override
934    public Visitable visit(NodeList n, Object arg) {
935        NodeList<Node> newNodes = new NodeList<>();
936        for (Object node : n) {
937            Node resultNode = (Node) ((Node) node).accept(this, arg);
938            if (resultNode != null) {
939                newNodes.add(resultNode);
940            }
941        }
942        return newNodes;
943    }
944
945    @Override
946    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
947    public Node visit(final ImportDeclaration n, final Object arg) {
948        Name name = cloneNode(n.getName(), arg);
949        Comment comment = cloneNode(n.getComment(), arg);
950        ImportDeclaration r = new ImportDeclaration(n.getTokenRange().orElse(null), name, n.isStatic(), n.isAsterisk());
951        r.setComment(comment);
952        return r;
953    }
954
955    @Override
956    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
957    public Visitable visit(final ModuleDeclaration n, final Object arg) {
958        NodeList<AnnotationExpr> annotations = cloneList(n.getAnnotations(), arg);
959        NodeList<ModuleStmt> moduleStmts = cloneList(n.getModuleStmts(), arg);
960        Name name = cloneNode(n.getName(), arg);
961        Comment comment = cloneNode(n.getComment(), arg);
962        ModuleDeclaration r = new ModuleDeclaration(n.getTokenRange().orElse(null), annotations, name, n.isOpen(), moduleStmts);
963        r.setComment(comment);
964        return r;
965    }
966
967    @Override
968    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
969    public Visitable visit(final ModuleRequiresStmt n, final Object arg) {
970        Name name = cloneNode(n.getName(), arg);
971        Comment comment = cloneNode(n.getComment(), arg);
972        ModuleRequiresStmt r = new ModuleRequiresStmt(n.getTokenRange().orElse(null), n.getModifiers(), name);
973        r.setComment(comment);
974        return r;
975    }
976
977    @SuppressWarnings("unchecked")
978    protected <T extends Node> T cloneNode(Optional<T> node, Object arg) {
979        if (!node.isPresent()) {
980            return null;
981        }
982        Node r = (Node) node.get().accept(this, arg);
983        if (r == null) {
984            return null;
985        }
986        return (T) r;
987    }
988
989    @SuppressWarnings("unchecked")
990    protected <T extends Node> T cloneNode(T node, Object arg) {
991        if (node == null) {
992            return null;
993        }
994        Node r = (Node) node.accept(this, arg);
995        if (r == null) {
996            return null;
997        }
998        return (T) r;
999    }
1000
1001    private <N extends Node> NodeList<N> cloneList(NodeList<N> list, Object arg) {
1002        if (list == null) {
1003            return null;
1004        }
1005        return (NodeList<N>) list.accept(this, arg);
1006    }
1007
1008    @Override
1009    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
1010    public Visitable visit(final ModuleExportsStmt n, final Object arg) {
1011        NodeList<Name> moduleNames = cloneList(n.getModuleNames(), arg);
1012        Name name = cloneNode(n.getName(), arg);
1013        Comment comment = cloneNode(n.getComment(), arg);
1014        ModuleExportsStmt r = new ModuleExportsStmt(n.getTokenRange().orElse(null), name, moduleNames);
1015        r.setComment(comment);
1016        return r;
1017    }
1018
1019    @Override
1020    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
1021    public Visitable visit(final ModuleProvidesStmt n, final Object arg) {
1022        Type type = cloneNode(n.getType(), arg);
1023        NodeList<Type> withTypes = cloneList(n.getWithTypes(), arg);
1024        Comment comment = cloneNode(n.getComment(), arg);
1025        ModuleProvidesStmt r = new ModuleProvidesStmt(n.getTokenRange().orElse(null), type, withTypes);
1026        r.setComment(comment);
1027        return r;
1028    }
1029
1030    @Override
1031    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
1032    public Visitable visit(final ModuleUsesStmt n, final Object arg) {
1033        Type type = cloneNode(n.getType(), arg);
1034        Comment comment = cloneNode(n.getComment(), arg);
1035        ModuleUsesStmt r = new ModuleUsesStmt(n.getTokenRange().orElse(null), type);
1036        r.setComment(comment);
1037        return r;
1038    }
1039
1040    @Override
1041    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
1042    public Visitable visit(final ModuleOpensStmt n, final Object arg) {
1043        NodeList<Name> moduleNames = cloneList(n.getModuleNames(), arg);
1044        Name name = cloneNode(n.getName(), arg);
1045        Comment comment = cloneNode(n.getComment(), arg);
1046        ModuleOpensStmt r = new ModuleOpensStmt(n.getTokenRange().orElse(null), name, moduleNames);
1047        r.setComment(comment);
1048        return r;
1049    }
1050
1051    @Override
1052    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
1053    public Visitable visit(final UnparsableStmt n, final Object arg) {
1054        Comment comment = cloneNode(n.getComment(), arg);
1055        UnparsableStmt r = new UnparsableStmt(n.getTokenRange().orElse(null));
1056        r.setComment(comment);
1057        return r;
1058    }
1059
1060    @Override
1061    @Generated("com.github.javaparser.generator.core.visitor.CloneVisitorGenerator")
1062    public Visitable visit(final ReceiverParameter n, final Object arg) {
1063        NodeList<AnnotationExpr> annotations = cloneList(n.getAnnotations(), arg);
1064        Name name = cloneNode(n.getName(), arg);
1065        Type type = cloneNode(n.getType(), arg);
1066        Comment comment = cloneNode(n.getComment(), arg);
1067        ReceiverParameter r = new ReceiverParameter(n.getTokenRange().orElse(null), annotations, type, name);
1068        r.setComment(comment);
1069        return r;
1070    }
1071
1072    @Override
1073    public Visitable visit(final VarType n, final Object arg) {
1074        NodeList<AnnotationExpr> annotations = cloneList(n.getAnnotations(), arg);
1075        Comment comment = cloneNode(n.getComment(), arg);
1076        VarType r = new VarType(n.getTokenRange().orElse(null));
1077        r.setComment(comment);
1078        return r;
1079    }
1080}
1081