aboutsummaryrefslogtreecommitdiffstats
path: root/javaparser-symbol-solver-testing/src/test/test_sourcecode/javaparser_src/proper_source/com/github/javaparser/ast/visitor/DumpVisitor.java
diff options
context:
space:
mode:
Diffstat (limited to 'javaparser-symbol-solver-testing/src/test/test_sourcecode/javaparser_src/proper_source/com/github/javaparser/ast/visitor/DumpVisitor.java')
-rw-r--r--javaparser-symbol-solver-testing/src/test/test_sourcecode/javaparser_src/proper_source/com/github/javaparser/ast/visitor/DumpVisitor.java1657
1 files changed, 1657 insertions, 0 deletions
diff --git a/javaparser-symbol-solver-testing/src/test/test_sourcecode/javaparser_src/proper_source/com/github/javaparser/ast/visitor/DumpVisitor.java b/javaparser-symbol-solver-testing/src/test/test_sourcecode/javaparser_src/proper_source/com/github/javaparser/ast/visitor/DumpVisitor.java
new file mode 100644
index 000000000..8b04afe0a
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/test_sourcecode/javaparser_src/proper_source/com/github/javaparser/ast/visitor/DumpVisitor.java
@@ -0,0 +1,1657 @@
+/*
+ * Copyright (C) 2007-2010 JĂșlio Vilmar Gesser.
+ * Copyright (C) 2011, 2013-2015 The JavaParser Team.
+ *
+ * This file is part of JavaParser.
+ *
+ * JavaParser can be used either under the terms of
+ * a) the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * b) the terms of the Apache License
+ *
+ * You should have received a copy of both licenses in LICENCE.LGPL and
+ * LICENCE.APACHE. Please refer to those files for details.
+ *
+ * JavaParser is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ */
+
+package com.github.javaparser.ast.visitor;
+
+import static com.github.javaparser.PositionUtils.sortByBeginPosition;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.ImportDeclaration;
+import com.github.javaparser.ast.Node;
+import com.github.javaparser.ast.PackageDeclaration;
+import com.github.javaparser.ast.TypeParameter;
+import com.github.javaparser.ast.body.AnnotationDeclaration;
+import com.github.javaparser.ast.body.AnnotationMemberDeclaration;
+import com.github.javaparser.ast.body.BodyDeclaration;
+import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
+import com.github.javaparser.ast.body.ConstructorDeclaration;
+import com.github.javaparser.ast.body.EmptyMemberDeclaration;
+import com.github.javaparser.ast.body.EmptyTypeDeclaration;
+import com.github.javaparser.ast.body.EnumConstantDeclaration;
+import com.github.javaparser.ast.body.EnumDeclaration;
+import com.github.javaparser.ast.body.FieldDeclaration;
+import com.github.javaparser.ast.body.InitializerDeclaration;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.ast.body.ModifierSet;
+import com.github.javaparser.ast.body.MultiTypeParameter;
+import com.github.javaparser.ast.body.Parameter;
+import com.github.javaparser.ast.body.TypeDeclaration;
+import com.github.javaparser.ast.body.VariableDeclarator;
+import com.github.javaparser.ast.body.VariableDeclaratorId;
+import com.github.javaparser.ast.comments.BlockComment;
+import com.github.javaparser.ast.comments.Comment;
+import com.github.javaparser.ast.comments.JavadocComment;
+import com.github.javaparser.ast.comments.LineComment;
+import com.github.javaparser.ast.expr.*;
+import com.github.javaparser.ast.stmt.AssertStmt;
+import com.github.javaparser.ast.stmt.BlockStmt;
+import com.github.javaparser.ast.stmt.BreakStmt;
+import com.github.javaparser.ast.stmt.CatchClause;
+import com.github.javaparser.ast.stmt.ContinueStmt;
+import com.github.javaparser.ast.stmt.DoStmt;
+import com.github.javaparser.ast.stmt.EmptyStmt;
+import com.github.javaparser.ast.stmt.ExplicitConstructorInvocationStmt;
+import com.github.javaparser.ast.stmt.ExpressionStmt;
+import com.github.javaparser.ast.stmt.ForStmt;
+import com.github.javaparser.ast.stmt.ForeachStmt;
+import com.github.javaparser.ast.stmt.IfStmt;
+import com.github.javaparser.ast.stmt.LabeledStmt;
+import com.github.javaparser.ast.stmt.ReturnStmt;
+import com.github.javaparser.ast.stmt.Statement;
+import com.github.javaparser.ast.stmt.SwitchEntryStmt;
+import com.github.javaparser.ast.stmt.SwitchStmt;
+import com.github.javaparser.ast.stmt.SynchronizedStmt;
+import com.github.javaparser.ast.stmt.ThrowStmt;
+import com.github.javaparser.ast.stmt.TryStmt;
+import com.github.javaparser.ast.stmt.TypeDeclarationStmt;
+import com.github.javaparser.ast.stmt.WhileStmt;
+import com.github.javaparser.ast.type.*;
+
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+import static com.github.javaparser.ast.internal.Utils.isNullOrEmpty;
+
+/**
+ * Dumps the AST to formatted Java source code.
+ *
+ * @author Julio Vilmar Gesser
+ */
+public final class DumpVisitor implements VoidVisitor<Object> {
+
+ private boolean printComments;
+
+ public DumpVisitor() {
+ this(true);
+ }
+
+ public DumpVisitor(boolean printComments) {
+ this.printComments = printComments;
+ }
+
+ private static class SourcePrinter {
+
+ private int level = 0;
+
+ private boolean indented = false;
+
+ private final StringBuilder buf = new StringBuilder();
+
+ public void indent() {
+ level++;
+ }
+
+ public void unindent() {
+ level--;
+ }
+
+ private void makeIndent() {
+ for (int i = 0; i < level; i++) {
+ buf.append(" ");
+ }
+ }
+
+ public void print(final String arg) {
+ if (!indented) {
+ makeIndent();
+ indented = true;
+ }
+ buf.append(arg);
+ }
+
+ public void printLn(final String arg) {
+ print(arg);
+ printLn();
+ }
+
+ public void printLn() {
+ buf.append(System.getProperty("line.separator"));
+ indented = false;
+ }
+
+ public String getSource() {
+ return buf.toString();
+ }
+
+ @Override public String toString() {
+ return getSource();
+ }
+ }
+
+ private final SourcePrinter printer = new SourcePrinter();
+
+ public String getSource() {
+ return printer.getSource();
+ }
+
+ private void printModifiers(final int modifiers) {
+ if (ModifierSet.isPrivate(modifiers)) {
+ printer.print("private ");
+ }
+ if (ModifierSet.isProtected(modifiers)) {
+ printer.print("protected ");
+ }
+ if (ModifierSet.isPublic(modifiers)) {
+ printer.print("public ");
+ }
+ if (ModifierSet.isAbstract(modifiers)) {
+ printer.print("abstract ");
+ }
+ if (ModifierSet.isStatic(modifiers)) {
+ printer.print("static ");
+ }
+ if (ModifierSet.isFinal(modifiers)) {
+ printer.print("final ");
+ }
+ if (ModifierSet.isNative(modifiers)) {
+ printer.print("native ");
+ }
+ if (ModifierSet.isStrictfp(modifiers)) {
+ printer.print("strictfp ");
+ }
+ if (ModifierSet.isSynchronized(modifiers)) {
+ printer.print("synchronized ");
+ }
+ if (ModifierSet.isTransient(modifiers)) {
+ printer.print("transient ");
+ }
+ if (ModifierSet.isVolatile(modifiers)) {
+ printer.print("volatile ");
+ }
+ }
+
+ private void printMembers(final List<BodyDeclaration> members, final Object arg) {
+ for (final BodyDeclaration member : members) {
+ printer.printLn();
+ member.accept(this, arg);
+ printer.printLn();
+ }
+ }
+
+ private void printMemberAnnotations(final List<AnnotationExpr> annotations, final Object arg) {
+ if (!isNullOrEmpty(annotations)) {
+ for (final AnnotationExpr a : annotations) {
+ a.accept(this, arg);
+ printer.printLn();
+ }
+ }
+ }
+
+ private void printAnnotations(final List<AnnotationExpr> annotations, final Object arg) {
+ if (!isNullOrEmpty(annotations)) {
+ for (final AnnotationExpr a : annotations) {
+ a.accept(this, arg);
+ printer.print(" ");
+ }
+ }
+ }
+
+ private void printTypeArgs(final List<Type> args, final Object arg) {
+ if (!isNullOrEmpty(args)) {
+ printer.print("<");
+ for (final Iterator<Type> i = args.iterator(); i.hasNext();) {
+ final Type t = i.next();
+ t.accept(this, arg);
+ if (i.hasNext()) {
+ printer.print(", ");
+ }
+ }
+ printer.print(">");
+ }
+ }
+
+ private void printTypeParameters(final List<TypeParameter> args, final Object arg) {
+ if (!isNullOrEmpty(args)) {
+ printer.print("<");
+ for (final Iterator<TypeParameter> i = args.iterator(); i.hasNext();) {
+ final TypeParameter t = i.next();
+ t.accept(this, arg);
+ if (i.hasNext()) {
+ printer.print(", ");
+ }
+ }
+ printer.print(">");
+ }
+ }
+
+ private void printArguments(final List<Expression> args, final Object arg) {
+ printer.print("(");
+ if (!isNullOrEmpty(args)) {
+ for (final Iterator<Expression> i = args.iterator(); i.hasNext();) {
+ final Expression e = i.next();
+ e.accept(this, arg);
+ if (i.hasNext()) {
+ printer.print(", ");
+ }
+ }
+ }
+ printer.print(")");
+ }
+
+ private void printJavadoc(final JavadocComment javadoc, final Object arg) {
+ if (javadoc != null) {
+ javadoc.accept(this, arg);
+ }
+ }
+
+ private void printJavaComment(final Comment javacomment, final Object arg) {
+ if (javacomment != null) {
+ javacomment.accept(this, arg);
+ }
+ }
+
+ @Override public void visit(final CompilationUnit n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+
+ if (n.getPackage() != null) {
+ n.getPackage().accept(this, arg);
+ }
+
+ if (n.getImports() != null) {
+ for (final ImportDeclaration i : n.getImports()) {
+ i.accept(this, arg);
+ }
+ printer.printLn();
+ }
+
+ if (n.getTypes() != null) {
+ for (final Iterator<TypeDeclaration> i = n.getTypes().iterator(); i.hasNext();) {
+ i.next().accept(this, arg);
+ printer.printLn();
+ if (i.hasNext()) {
+ printer.printLn();
+ }
+ }
+ }
+
+ printOrphanCommentsEnding(n);
+ }
+
+ @Override public void visit(final PackageDeclaration n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printAnnotations(n.getAnnotations(), arg);
+ printer.print("package ");
+ n.getName().accept(this, arg);
+ printer.printLn(";");
+ printer.printLn();
+
+ printOrphanCommentsEnding(n);
+ }
+
+ @Override public void visit(final NameExpr n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printer.print(n.getName());
+
+ printOrphanCommentsEnding(n);
+ }
+
+ @Override public void visit(final QualifiedNameExpr n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ n.getQualifier().accept(this, arg);
+ printer.print(".");
+ printer.print(n.getName());
+
+ printOrphanCommentsEnding(n);
+ }
+
+ @Override public void visit(final ImportDeclaration n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printer.print("import ");
+ if (n.isStatic()) {
+ printer.print("static ");
+ }
+ n.getName().accept(this, arg);
+ if (n.isAsterisk()) {
+ printer.print(".*");
+ }
+ printer.printLn(";");
+
+ printOrphanCommentsEnding(n);
+ }
+
+ @Override public void visit(final ClassOrInterfaceDeclaration n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printJavadoc(n.getJavaDoc(), arg);
+ printMemberAnnotations(n.getAnnotations(), arg);
+ printModifiers(n.getModifiers());
+
+ if (n.isInterface()) {
+ printer.print("interface ");
+ } else {
+ printer.print("class ");
+ }
+
+ printer.print(n.getName());
+
+ printTypeParameters(n.getTypeParameters(), arg);
+
+ if (!isNullOrEmpty(n.getExtends())) {
+ printer.print(" extends ");
+ for (final Iterator<ClassOrInterfaceType> i = n.getExtends().iterator(); i.hasNext();) {
+ final ClassOrInterfaceType c = i.next();
+ c.accept(this, arg);
+ if (i.hasNext()) {
+ printer.print(", ");
+ }
+ }
+ }
+
+ if (!isNullOrEmpty(n.getImplements())) {
+ printer.print(" implements ");
+ for (final Iterator<ClassOrInterfaceType> i = n.getImplements().iterator(); i.hasNext();) {
+ final ClassOrInterfaceType c = i.next();
+ c.accept(this, arg);
+ if (i.hasNext()) {
+ printer.print(", ");
+ }
+ }
+ }
+
+ printer.printLn(" {");
+ printer.indent();
+ if (!isNullOrEmpty(n.getMembers())) {
+ printMembers(n.getMembers(), arg);
+ }
+
+ printOrphanCommentsEnding(n);
+
+ printer.unindent();
+ printer.print("}");
+ }
+
+ @Override public void visit(final EmptyTypeDeclaration n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printJavadoc(n.getJavaDoc(), arg);
+ printer.print(";");
+
+ printOrphanCommentsEnding(n);
+ }
+
+ @Override public void visit(final JavadocComment n, final Object arg) {
+ printer.print("/**");
+ printer.print(n.getContent());
+ printer.printLn("*/");
+ }
+
+ @Override public void visit(final ClassOrInterfaceType n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+
+ if (n.getAnnotations() != null) {
+ for (AnnotationExpr ae : n.getAnnotations()) {
+ ae.accept(this, arg);
+ printer.print(" ");
+ }
+ }
+
+ if (n.getScope() != null) {
+ n.getScope().accept(this, arg);
+ printer.print(".");
+ }
+ printer.print(n.getName());
+ printTypeArgs(n.getTypeArgs(), arg);
+ }
+
+ @Override public void visit(final TypeParameter n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ if (n.getAnnotations() != null) {
+ for (AnnotationExpr ann : n.getAnnotations()) {
+ ann.accept(this, arg);
+ printer.print(" ");
+ }
+ }
+ printer.print(n.getName());
+ if (n.getTypeBound() != null) {
+ printer.print(" extends ");
+ for (final Iterator<ClassOrInterfaceType> i = n.getTypeBound().iterator(); i.hasNext();) {
+ final ClassOrInterfaceType c = i.next();
+ c.accept(this, arg);
+ if (i.hasNext()) {
+ printer.print(" & ");
+ }
+ }
+ }
+ }
+
+ @Override public void visit(final PrimitiveType n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ if (n.getAnnotations() != null) {
+ for (AnnotationExpr ae : n.getAnnotations()) {
+ ae.accept(this, arg);
+ printer.print(" ");
+ }
+ }
+ switch (n.getType()) {
+ case Boolean:
+ printer.print("boolean");
+ break;
+ case Byte:
+ printer.print("byte");
+ break;
+ case Char:
+ printer.print("char");
+ break;
+ case Double:
+ printer.print("double");
+ break;
+ case Float:
+ printer.print("float");
+ break;
+ case Int:
+ printer.print("int");
+ break;
+ case Long:
+ printer.print("long");
+ break;
+ case Short:
+ printer.print("short");
+ break;
+ }
+ }
+
+ @Override public void visit(final ReferenceType n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ if (n.getAnnotations() != null) {
+ for (AnnotationExpr ae : n.getAnnotations()) {
+ ae.accept(this, arg);
+ printer.print(" ");
+ }
+ }
+ n.getType().accept(this, arg);
+ List<List<AnnotationExpr>> arraysAnnotations = n.getArraysAnnotations();
+ for (int i = 0; i < n.getArrayCount(); i++) {
+ if (arraysAnnotations != null && i < arraysAnnotations.size()) {
+ List<AnnotationExpr> annotations = arraysAnnotations.get(i);
+ if (annotations != null) {
+ for (AnnotationExpr ae : annotations) {
+ printer.print(" ");
+ ae.accept(this, arg);
+
+ }
+ }
+ }
+ printer.print("[]");
+ }
+ }
+
+ @Override public void visit(final WildcardType n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ if (n.getAnnotations() != null) {
+ for (AnnotationExpr ae : n.getAnnotations()) {
+ printer.print(" ");
+ ae.accept(this, arg);
+ }
+ }
+ printer.print("?");
+ if (n.getExtends() != null) {
+ printer.print(" extends ");
+ n.getExtends().accept(this, arg);
+ }
+ if (n.getSuper() != null) {
+ printer.print(" super ");
+ n.getSuper().accept(this, arg);
+ }
+ }
+
+ @Override public void visit(final UnknownType n, final Object arg) {
+ // Nothing to dump
+ }
+
+ @Override public void visit(final FieldDeclaration n, final Object arg) {
+ printOrphanCommentsBeforeThisChildNode(n);
+
+ printJavaComment(n.getComment(), arg);
+ printJavadoc(n.getJavaDoc(), arg);
+ printMemberAnnotations(n.getAnnotations(), arg);
+ printModifiers(n.getModifiers());
+ n.getType().accept(this, arg);
+
+ printer.print(" ");
+ for (final Iterator<VariableDeclarator> i = n.getVariables().iterator(); i.hasNext();) {
+ final VariableDeclarator var = i.next();
+ var.accept(this, arg);
+ if (i.hasNext()) {
+ printer.print(", ");
+ }
+ }
+
+ printer.print(";");
+ }
+
+ @Override public void visit(final VariableDeclarator n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ n.getId().accept(this, arg);
+ if (n.getInit() != null) {
+ printer.print(" = ");
+ n.getInit().accept(this, arg);
+ }
+ }
+
+ @Override public void visit(final VariableDeclaratorId n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printer.print(n.getName());
+ for (int i = 0; i < n.getArrayCount(); i++) {
+ printer.print("[]");
+ }
+ }
+
+ @Override public void visit(final ArrayInitializerExpr n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printer.print("{");
+ if (n.getValues() != null) {
+ printer.print(" ");
+ for (final Iterator<Expression> i = n.getValues().iterator(); i.hasNext();) {
+ final Expression expr = i.next();
+ expr.accept(this, arg);
+ if (i.hasNext()) {
+ printer.print(", ");
+ }
+ }
+ printer.print(" ");
+ }
+ printer.print("}");
+ }
+
+ @Override public void visit(final VoidType n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printer.print("void");
+ }
+
+ @Override public void visit(final ArrayAccessExpr n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ n.getName().accept(this, arg);
+ printer.print("[");
+ n.getIndex().accept(this, arg);
+ printer.print("]");
+ }
+
+ @Override public void visit(final ArrayCreationExpr n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printer.print("new ");
+ n.getType().accept(this, arg);
+ List<List<AnnotationExpr>> arraysAnnotations = n.getArraysAnnotations();
+ if (n.getDimensions() != null) {
+ int j = 0;
+ for (final Expression dim : n.getDimensions()) {
+
+ if (arraysAnnotations != null && j < arraysAnnotations.size()) {
+ List<AnnotationExpr> annotations = arraysAnnotations.get(j);
+ if (annotations != null) {
+ for (AnnotationExpr ae : annotations) {
+ printer.print(" ");
+ ae.accept(this, arg);
+ }
+ }
+ }
+ printer.print("[");
+ dim.accept(this, arg);
+ printer.print("]");
+ j++;
+ }
+ for (int i = 0; i < n.getArrayCount(); i++) {
+ if (arraysAnnotations != null && i < arraysAnnotations.size()) {
+
+ List<AnnotationExpr> annotations = arraysAnnotations.get(i);
+ if (annotations != null) {
+ for (AnnotationExpr ae : annotations) {
+ printer.print(" ");
+ ae.accept(this, arg);
+
+ }
+ }
+ }
+ printer.print("[]");
+ }
+
+ } else {
+ for (int i = 0; i < n.getArrayCount(); i++) {
+ if (arraysAnnotations != null && i < arraysAnnotations.size()) {
+ List<AnnotationExpr> annotations = arraysAnnotations.get(i);
+ if (annotations != null) {
+ for (AnnotationExpr ae : annotations) {
+ ae.accept(this, arg);
+ printer.print(" ");
+ }
+ }
+ }
+ printer.print("[]");
+ }
+ printer.print(" ");
+ n.getInitializer().accept(this, arg);
+ }
+ }
+
+ @Override public void visit(final AssignExpr n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ n.getTarget().accept(this, arg);
+ printer.print(" ");
+ switch (n.getOperator()) {
+ case assign:
+ printer.print("=");
+ break;
+ case and:
+ printer.print("&=");
+ break;
+ case or:
+ printer.print("|=");
+ break;
+ case xor:
+ printer.print("^=");
+ break;
+ case plus:
+ printer.print("+=");
+ break;
+ case minus:
+ printer.print("-=");
+ break;
+ case rem:
+ printer.print("%=");
+ break;
+ case slash:
+ printer.print("/=");
+ break;
+ case star:
+ printer.print("*=");
+ break;
+ case lShift:
+ printer.print("<<=");
+ break;
+ case rSignedShift:
+ printer.print(">>=");
+ break;
+ case rUnsignedShift:
+ printer.print(">>>=");
+ break;
+ }
+ printer.print(" ");
+ n.getValue().accept(this, arg);
+ }
+
+ @Override public void visit(final BinaryExpr n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ n.getLeft().accept(this, arg);
+ printer.print(" ");
+ switch (n.getOperator()) {
+ case or:
+ printer.print("||");
+ break;
+ case and:
+ printer.print("&&");
+ break;
+ case binOr:
+ printer.print("|");
+ break;
+ case binAnd:
+ printer.print("&");
+ break;
+ case xor:
+ printer.print("^");
+ break;
+ case equals:
+ printer.print("==");
+ break;
+ case notEquals:
+ printer.print("!=");
+ break;
+ case less:
+ printer.print("<");
+ break;
+ case greater:
+ printer.print(">");
+ break;
+ case lessEquals:
+ printer.print("<=");
+ break;
+ case greaterEquals:
+ printer.print(">=");
+ break;
+ case lShift:
+ printer.print("<<");
+ break;
+ case rSignedShift:
+ printer.print(">>");
+ break;
+ case rUnsignedShift:
+ printer.print(">>>");
+ break;
+ case plus:
+ printer.print("+");
+ break;
+ case minus:
+ printer.print("-");
+ break;
+ case times:
+ printer.print("*");
+ break;
+ case divide:
+ printer.print("/");
+ break;
+ case remainder:
+ printer.print("%");
+ break;
+ }
+ printer.print(" ");
+ n.getRight().accept(this, arg);
+ }
+
+ @Override public void visit(final CastExpr n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printer.print("(");
+ n.getType().accept(this, arg);
+ printer.print(") ");
+ n.getExpr().accept(this, arg);
+ }
+
+ @Override public void visit(final ClassExpr n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ n.getType().accept(this, arg);
+ printer.print(".class");
+ }
+
+ @Override public void visit(final ConditionalExpr n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ n.getCondition().accept(this, arg);
+ printer.print(" ? ");
+ n.getThenExpr().accept(this, arg);
+ printer.print(" : ");
+ n.getElseExpr().accept(this, arg);
+ }
+
+ @Override public void visit(final EnclosedExpr n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printer.print("(");
+ if (n.getInner() != null) {
+ n.getInner().accept(this, arg);
+ }
+ printer.print(")");
+ }
+
+ @Override public void visit(final FieldAccessExpr n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ n.getScope().accept(this, arg);
+ printer.print(".");
+ printer.print(n.getField());
+ }
+
+ @Override public void visit(final InstanceOfExpr n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ n.getExpr().accept(this, arg);
+ printer.print(" instanceof ");
+ n.getType().accept(this, arg);
+ }
+
+ @Override public void visit(final CharLiteralExpr n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printer.print("'");
+ printer.print(n.getValue());
+ printer.print("'");
+ }
+
+ @Override public void visit(final DoubleLiteralExpr n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printer.print(n.getValue());
+ }
+
+ @Override public void visit(final IntegerLiteralExpr n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printer.print(n.getValue());
+ }
+
+ @Override public void visit(final LongLiteralExpr n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printer.print(n.getValue());
+ }
+
+ @Override public void visit(final IntegerLiteralMinValueExpr n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printer.print(n.getValue());
+ }
+
+ @Override public void visit(final LongLiteralMinValueExpr n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printer.print(n.getValue());
+ }
+
+ @Override public void visit(final StringLiteralExpr n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printer.print("\"");
+ printer.print(n.getValue());
+ printer.print("\"");
+ }
+
+ @Override public void visit(final BooleanLiteralExpr n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printer.print(String.valueOf(n.getValue()));
+ }
+
+ @Override public void visit(final NullLiteralExpr n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printer.print("null");
+ }
+
+ @Override public void visit(final ThisExpr n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ if (n.getClassExpr() != null) {
+ n.getClassExpr().accept(this, arg);
+ printer.print(".");
+ }
+ printer.print("this");
+ }
+
+ @Override public void visit(final SuperExpr n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ if (n.getClassExpr() != null) {
+ n.getClassExpr().accept(this, arg);
+ printer.print(".");
+ }
+ printer.print("super");
+ }
+
+ @Override public void visit(final MethodCallExpr n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ if (n.getScope() != null) {
+ n.getScope().accept(this, arg);
+ printer.print(".");
+ }
+ printTypeArgs(n.getTypeArgs(), arg);
+ printer.print(n.getName());
+ printArguments(n.getArgs(), arg);
+ }
+
+ @Override public void visit(final ObjectCreationExpr n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ if (n.getScope() != null) {
+ n.getScope().accept(this, arg);
+ printer.print(".");
+ }
+
+ printer.print("new ");
+
+ printTypeArgs(n.getTypeArgs(), arg);
+ if (!isNullOrEmpty(n.getTypeArgs())) {
+ printer.print(" ");
+ }
+
+ n.getType().accept(this, arg);
+
+ printArguments(n.getArgs(), arg);
+
+ if (n.getAnonymousClassBody() != null) {
+ printer.printLn(" {");
+ printer.indent();
+ printMembers(n.getAnonymousClassBody(), arg);
+ printer.unindent();
+ printer.print("}");
+ }
+ }
+
+ @Override public void visit(final UnaryExpr n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ switch (n.getOperator()) {
+ case positive:
+ printer.print("+");
+ break;
+ case negative:
+ printer.print("-");
+ break;
+ case inverse:
+ printer.print("~");
+ break;
+ case not:
+ printer.print("!");
+ break;
+ case preIncrement:
+ printer.print("++");
+ break;
+ case preDecrement:
+ printer.print("--");
+ break;
+ default:
+ }
+
+ n.getExpr().accept(this, arg);
+
+ switch (n.getOperator()) {
+ case posIncrement:
+ printer.print("++");
+ break;
+ case posDecrement:
+ printer.print("--");
+ break;
+ default:
+ }
+ }
+
+ @Override public void visit(final ConstructorDeclaration n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printJavadoc(n.getJavaDoc(), arg);
+ printMemberAnnotations(n.getAnnotations(), arg);
+ printModifiers(n.getModifiers());
+
+ printTypeParameters(n.getTypeParameters(), arg);
+ if (n.getTypeParameters() != null) {
+ printer.print(" ");
+ }
+ printer.print(n.getName());
+
+ printer.print("(");
+ if (n.getParameters() != null) {
+ for (final Iterator<Parameter> i = n.getParameters().iterator(); i.hasNext();) {
+ final Parameter p = i.next();
+ p.accept(this, arg);
+ if (i.hasNext()) {
+ printer.print(", ");
+ }
+ }
+ }
+ printer.print(")");
+
+ if (!isNullOrEmpty(n.getThrows())) {
+ printer.print(" throws ");
+ for (final Iterator<NameExpr> i = n.getThrows().iterator(); i.hasNext();) {
+ final NameExpr name = i.next();
+ name.accept(this, arg);
+ if (i.hasNext()) {
+ printer.print(", ");
+ }
+ }
+ }
+ printer.print(" ");
+ n.getBlock().accept(this, arg);
+ }
+
+ @Override public void visit(final MethodDeclaration n, final Object arg) {
+ printOrphanCommentsBeforeThisChildNode(n);
+
+ printJavaComment(n.getComment(), arg);
+ printJavadoc(n.getJavaDoc(), arg);
+ printMemberAnnotations(n.getAnnotations(), arg);
+ printModifiers(n.getModifiers());
+ if (n.isDefault()) {
+ printer.print("default ");
+ }
+ printTypeParameters(n.getTypeParameters(), arg);
+ if (n.getTypeParameters() != null) {
+ printer.print(" ");
+ }
+
+ n.getType().accept(this, arg);
+ printer.print(" ");
+ printer.print(n.getName());
+
+ printer.print("(");
+ if (n.getParameters() != null) {
+ for (final Iterator<Parameter> i = n.getParameters().iterator(); i.hasNext();) {
+ final Parameter p = i.next();
+ p.accept(this, arg);
+ if (i.hasNext()) {
+ printer.print(", ");
+ }
+ }
+ }
+ printer.print(")");
+
+ for (int i = 0; i < n.getArrayCount(); i++) {
+ printer.print("[]");
+ }
+
+ if (!isNullOrEmpty(n.getThrows())) {
+ printer.print(" throws ");
+ for (final Iterator<NameExpr> i = n.getThrows().iterator(); i.hasNext();) {
+ final NameExpr name = i.next();
+ name.accept(this, arg);
+ if (i.hasNext()) {
+ printer.print(", ");
+ }
+ }
+ }
+ if (n.getBody() == null) {
+ printer.print(";");
+ } else {
+ printer.print(" ");
+ n.getBody().accept(this, arg);
+ }
+ }
+
+ @Override public void visit(final Parameter n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printAnnotations(n.getAnnotations(), arg);
+ printModifiers(n.getModifiers());
+ if (n.getType() != null) {
+ n.getType().accept(this, arg);
+ }
+ if (n.isVarArgs()) {
+ printer.print("...");
+ }
+ printer.print(" ");
+ n.getId().accept(this, arg);
+ }
+
+ @Override public void visit(MultiTypeParameter n, Object arg) {
+ printAnnotations(n.getAnnotations(), arg);
+ printModifiers(n.getModifiers());
+
+ Iterator<Type> types = n.getTypes().iterator();
+ types.next().accept(this, arg);
+ while (types.hasNext()) {
+ printer.print(" | ");
+ types.next().accept(this, arg);
+ }
+
+ printer.print(" ");
+ n.getId().accept(this, arg);
+ }
+
+ @Override public void visit(final ExplicitConstructorInvocationStmt n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ if (n.isThis()) {
+ printTypeArgs(n.getTypeArgs(), arg);
+ printer.print("this");
+ } else {
+ if (n.getExpr() != null) {
+ n.getExpr().accept(this, arg);
+ printer.print(".");
+ }
+ printTypeArgs(n.getTypeArgs(), arg);
+ printer.print("super");
+ }
+ printArguments(n.getArgs(), arg);
+ printer.print(";");
+ }
+
+ @Override public void visit(final VariableDeclarationExpr n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printAnnotations(n.getAnnotations(), arg);
+ printModifiers(n.getModifiers());
+
+ n.getType().accept(this, arg);
+ printer.print(" ");
+
+ for (final Iterator<VariableDeclarator> i = n.getVars().iterator(); i.hasNext();) {
+ final VariableDeclarator v = i.next();
+ v.accept(this, arg);
+ if (i.hasNext()) {
+ printer.print(", ");
+ }
+ }
+ }
+
+ @Override public void visit(final TypeDeclarationStmt n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ n.getTypeDeclaration().accept(this, arg);
+ }
+
+ @Override public void visit(final AssertStmt n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printer.print("assert ");
+ n.getCheck().accept(this, arg);
+ if (n.getMessage() != null) {
+ printer.print(" : ");
+ n.getMessage().accept(this, arg);
+ }
+ printer.print(";");
+ }
+
+ @Override public void visit(final BlockStmt n, final Object arg) {
+ printOrphanCommentsBeforeThisChildNode(n);
+ printJavaComment(n.getComment(), arg);
+ printer.printLn("{");
+ if (n.getStmts() != null) {
+ printer.indent();
+ for (final Statement s : n.getStmts()) {
+ s.accept(this, arg);
+ printer.printLn();
+ }
+ printer.unindent();
+ }
+ printOrphanCommentsEnding(n);
+ printer.print("}");
+
+ }
+
+ @Override public void visit(final LabeledStmt n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printer.print(n.getLabel());
+ printer.print(": ");
+ n.getStmt().accept(this, arg);
+ }
+
+ @Override public void visit(final EmptyStmt n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printer.print(";");
+ }
+
+ @Override public void visit(final ExpressionStmt n, final Object arg) {
+ printOrphanCommentsBeforeThisChildNode(n);
+ printJavaComment(n.getComment(), arg);
+ n.getExpression().accept(this, arg);
+ printer.print(";");
+ }
+
+ @Override public void visit(final SwitchStmt n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printer.print("switch(");
+ n.getSelector().accept(this, arg);
+ printer.printLn(") {");
+ if (n.getEntries() != null) {
+ printer.indent();
+ for (final SwitchEntryStmt e : n.getEntries()) {
+ e.accept(this, arg);
+ }
+ printer.unindent();
+ }
+ printer.print("}");
+
+ }
+
+ @Override public void visit(final SwitchEntryStmt n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ if (n.getLabel() != null) {
+ printer.print("case ");
+ n.getLabel().accept(this, arg);
+ printer.print(":");
+ } else {
+ printer.print("default:");
+ }
+ printer.printLn();
+ printer.indent();
+ if (n.getStmts() != null) {
+ for (final Statement s : n.getStmts()) {
+ s.accept(this, arg);
+ printer.printLn();
+ }
+ }
+ printer.unindent();
+ }
+
+ @Override public void visit(final BreakStmt n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printer.print("break");
+ if (n.getId() != null) {
+ printer.print(" ");
+ printer.print(n.getId());
+ }
+ printer.print(";");
+ }
+
+ @Override public void visit(final ReturnStmt n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printer.print("return");
+ if (n.getExpr() != null) {
+ printer.print(" ");
+ n.getExpr().accept(this, arg);
+ }
+ printer.print(";");
+ }
+
+ @Override public void visit(final EnumDeclaration n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printJavadoc(n.getJavaDoc(), arg);
+ printMemberAnnotations(n.getAnnotations(), arg);
+ printModifiers(n.getModifiers());
+
+ printer.print("enum ");
+ printer.print(n.getName());
+
+ if (n.getImplements() != null) {
+ printer.print(" implements ");
+ for (final Iterator<ClassOrInterfaceType> i = n.getImplements().iterator(); i.hasNext();) {
+ final ClassOrInterfaceType c = i.next();
+ c.accept(this, arg);
+ if (i.hasNext()) {
+ printer.print(", ");
+ }
+ }
+ }
+
+ printer.printLn(" {");
+ printer.indent();
+ if (n.getEntries() != null) {
+ printer.printLn();
+ for (final Iterator<EnumConstantDeclaration> i = n.getEntries().iterator(); i.hasNext();) {
+ final EnumConstantDeclaration e = i.next();
+ e.accept(this, arg);
+ if (i.hasNext()) {
+ printer.print(", ");
+ }
+ }
+ }
+ if (n.getMembers() != null) {
+ printer.printLn(";");
+ printMembers(n.getMembers(), arg);
+ } else {
+ if (n.getEntries() != null) {
+ printer.printLn();
+ }
+ }
+ printer.unindent();
+ printer.print("}");
+ }
+
+ @Override public void visit(final EnumConstantDeclaration n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printJavadoc(n.getJavaDoc(), arg);
+ printMemberAnnotations(n.getAnnotations(), arg);
+ printer.print(n.getName());
+
+ if (n.getArgs() != null) {
+ printArguments(n.getArgs(), arg);
+ }
+
+ if (n.getClassBody() != null) {
+ printer.printLn(" {");
+ printer.indent();
+ printMembers(n.getClassBody(), arg);
+ printer.unindent();
+ printer.printLn("}");
+ }
+ }
+
+ @Override public void visit(final EmptyMemberDeclaration n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printJavadoc(n.getJavaDoc(), arg);
+ printer.print(";");
+ }
+
+ @Override public void visit(final InitializerDeclaration n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printJavadoc(n.getJavaDoc(), arg);
+ if (n.isStatic()) {
+ printer.print("static ");
+ }
+ n.getBlock().accept(this, arg);
+ }
+
+ @Override public void visit(final IfStmt n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printer.print("if (");
+ n.getCondition().accept(this, arg);
+ final boolean thenBlock = n.getThenStmt() instanceof BlockStmt;
+ if (thenBlock) // block statement should start on the same line
+ printer.print(") ");
+ else {
+ printer.printLn(")");
+ printer.indent();
+ }
+ n.getThenStmt().accept(this, arg);
+ if (!thenBlock)
+ printer.unindent();
+ if (n.getElseStmt() != null) {
+ if (thenBlock)
+ printer.print(" ");
+ else
+ printer.printLn();
+ final boolean elseIf = n.getElseStmt() instanceof IfStmt;
+ final boolean elseBlock = n.getElseStmt() instanceof BlockStmt;
+ if (elseIf || elseBlock) // put chained if and start of block statement on a same level
+ printer.print("else ");
+ else {
+ printer.printLn("else");
+ printer.indent();
+ }
+ n.getElseStmt().accept(this, arg);
+ if (!(elseIf || elseBlock))
+ printer.unindent();
+ }
+ }
+
+ @Override public void visit(final WhileStmt n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printer.print("while (");
+ n.getCondition().accept(this, arg);
+ printer.print(") ");
+ n.getBody().accept(this, arg);
+ }
+
+ @Override public void visit(final ContinueStmt n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printer.print("continue");
+ if (n.getId() != null) {
+ printer.print(" ");
+ printer.print(n.getId());
+ }
+ printer.print(";");
+ }
+
+ @Override public void visit(final DoStmt n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printer.print("do ");
+ n.getBody().accept(this, arg);
+ printer.print(" while (");
+ n.getCondition().accept(this, arg);
+ printer.print(");");
+ }
+
+ @Override public void visit(final ForeachStmt n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printer.print("for (");
+ n.getVariable().accept(this, arg);
+ printer.print(" : ");
+ n.getIterable().accept(this, arg);
+ printer.print(") ");
+ n.getBody().accept(this, arg);
+ }
+
+ @Override public void visit(final ForStmt n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printer.print("for (");
+ if (n.getInit() != null) {
+ for (final Iterator<Expression> i = n.getInit().iterator(); i.hasNext();) {
+ final Expression e = i.next();
+ e.accept(this, arg);
+ if (i.hasNext()) {
+ printer.print(", ");
+ }
+ }
+ }
+ printer.print("; ");
+ if (n.getCompare() != null) {
+ n.getCompare().accept(this, arg);
+ }
+ printer.print("; ");
+ if (n.getUpdate() != null) {
+ for (final Iterator<Expression> i = n.getUpdate().iterator(); i.hasNext();) {
+ final Expression e = i.next();
+ e.accept(this, arg);
+ if (i.hasNext()) {
+ printer.print(", ");
+ }
+ }
+ }
+ printer.print(") ");
+ n.getBody().accept(this, arg);
+ }
+
+ @Override public void visit(final ThrowStmt n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printer.print("throw ");
+ n.getExpr().accept(this, arg);
+ printer.print(";");
+ }
+
+ @Override public void visit(final SynchronizedStmt n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printer.print("synchronized (");
+ n.getExpr().accept(this, arg);
+ printer.print(") ");
+ n.getBlock().accept(this, arg);
+ }
+
+ @Override public void visit(final TryStmt n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printer.print("try ");
+ if (!n.getResources().isEmpty()) {
+ printer.print("(");
+ Iterator<VariableDeclarationExpr> resources = n.getResources().iterator();
+ boolean first = true;
+ while (resources.hasNext()) {
+ visit(resources.next(), arg);
+ if (resources.hasNext()) {
+ printer.print(";");
+ printer.printLn();
+ if (first) {
+ printer.indent();
+ }
+ }
+ first = false;
+ }
+ if (n.getResources().size() > 1) {
+ printer.unindent();
+ }
+ printer.print(") ");
+ }
+ n.getTryBlock().accept(this, arg);
+ if (n.getCatchs() != null) {
+ for (final CatchClause c : n.getCatchs()) {
+ c.accept(this, arg);
+ }
+ }
+ if (n.getFinallyBlock() != null) {
+ printer.print(" finally ");
+ n.getFinallyBlock().accept(this, arg);
+ }
+ }
+
+ @Override public void visit(final CatchClause n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printer.print(" catch (");
+ n.getExcept().accept(this, arg);
+ printer.print(") ");
+ n.getCatchBlock().accept(this, arg);
+
+ }
+
+ @Override public void visit(final AnnotationDeclaration n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printJavadoc(n.getJavaDoc(), arg);
+ printMemberAnnotations(n.getAnnotations(), arg);
+ printModifiers(n.getModifiers());
+
+ printer.print("@interface ");
+ printer.print(n.getName());
+ printer.printLn(" {");
+ printer.indent();
+ if (n.getMembers() != null) {
+ printMembers(n.getMembers(), arg);
+ }
+ printer.unindent();
+ printer.print("}");
+ }
+
+ @Override public void visit(final AnnotationMemberDeclaration n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printJavadoc(n.getJavaDoc(), arg);
+ printMemberAnnotations(n.getAnnotations(), arg);
+ printModifiers(n.getModifiers());
+
+ n.getType().accept(this, arg);
+ printer.print(" ");
+ printer.print(n.getName());
+ printer.print("()");
+ if (n.getDefaultValue() != null) {
+ printer.print(" default ");
+ n.getDefaultValue().accept(this, arg);
+ }
+ printer.print(";");
+ }
+
+ @Override public void visit(final MarkerAnnotationExpr n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printer.print("@");
+ n.getName().accept(this, arg);
+ }
+
+ @Override public void visit(final SingleMemberAnnotationExpr n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printer.print("@");
+ n.getName().accept(this, arg);
+ printer.print("(");
+ n.getMemberValue().accept(this, arg);
+ printer.print(")");
+ }
+
+ @Override public void visit(final NormalAnnotationExpr n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printer.print("@");
+ n.getName().accept(this, arg);
+ printer.print("(");
+ if (n.getPairs() != null) {
+ for (final Iterator<MemberValuePair> i = n.getPairs().iterator(); i.hasNext();) {
+ final MemberValuePair m = i.next();
+ m.accept(this, arg);
+ if (i.hasNext()) {
+ printer.print(", ");
+ }
+ }
+ }
+ printer.print(")");
+ }
+
+ @Override public void visit(final MemberValuePair n, final Object arg) {
+ printJavaComment(n.getComment(), arg);
+ printer.print(n.getName());
+ printer.print(" = ");
+ n.getValue().accept(this, arg);
+ }
+
+ @Override public void visit(final LineComment n, final Object arg) {
+ if (!this.printComments) {
+ return;
+ }
+ printer.print("//");
+ String tmp = n.getContent();
+ tmp = tmp.replace('\r', ' ');
+ tmp = tmp.replace('\n', ' ');
+ printer.printLn(tmp);
+ }
+
+ @Override public void visit(final BlockComment n, final Object arg) {
+ if (!this.printComments) {
+ return;
+ }
+ printer.print("/*");
+ printer.print(n.getContent());
+ printer.printLn("*/");
+ }
+
+ @Override
+ public void visit(LambdaExpr n, Object arg) {
+ printJavaComment(n.getComment(), arg);
+
+ List<Parameter> parameters = n.getParameters();
+ boolean printPar = false;
+ printPar = n.isParametersEnclosed();
+
+ if (printPar) {
+ printer.print("(");
+ }
+ if (parameters != null) {
+ for (Iterator<Parameter> i = parameters.iterator(); i.hasNext();) {
+ Parameter p = i.next();
+ p.accept(this, arg);
+ if (i.hasNext()) {
+ printer.print(", ");
+ }
+ }
+ }
+ if (printPar) {
+ printer.print(")");
+ }
+
+ printer.print(" -> ");
+ Statement body = n.getBody();
+ if (body instanceof ExpressionStmt) {
+ // Print the expression directly
+ ((ExpressionStmt) body).getExpression().accept(this, arg);
+ } else {
+ body.accept(this, arg);
+ }
+ }
+
+
+ @Override
+ public void visit(MethodReferenceExpr n, Object arg) {
+ printJavaComment(n.getComment(), arg);
+ Expression scope = n.getScope();
+ String identifier = n.getIdentifier();
+ if (scope != null) {
+ n.getScope().accept(this, arg);
+ }
+
+ printer.print("::");
+ if (n.getTypeParameters() != null) {
+ printer.print("<");
+ for (Iterator<TypeParameter> i = n.getTypeParameters().iterator(); i
+ .hasNext();) {
+ TypeParameter p = i.next();
+ p.accept(this, arg);
+ if (i.hasNext()) {
+ printer.print(", ");
+ }
+ }
+ printer.print(">");
+ }
+ if (identifier != null) {
+ printer.print(identifier);
+ }
+
+ }
+
+ @Override
+ public void visit(TypeExpr n, Object arg) {
+ printJavaComment(n.getComment(), arg);
+ if (n.getType() != null) {
+ n.getType().accept(this, arg);
+ }
+ }
+
+ private void printOrphanCommentsBeforeThisChildNode(final Node node){
+ if (node instanceof Comment) return;
+
+ Node parent = node.getParentNode();
+ if (parent==null) return;
+ List<Node> everything = new LinkedList<Node>();
+ everything.addAll(parent.getChildrenNodes());
+ sortByBeginPosition(everything);
+ int positionOfTheChild = -1;
+ for (int i=0;i<everything.size();i++){
+ if (everything.get(i)==node) positionOfTheChild=i;
+ }
+ if (positionOfTheChild==-1) throw new RuntimeException("My index not found!!! "+node);
+ int positionOfPreviousChild = -1;
+ for (int i=positionOfTheChild-1;i>=0 && positionOfPreviousChild==-1;i--){
+ if (!(everything.get(i) instanceof Comment)) positionOfPreviousChild = i;
+ }
+ for (int i=positionOfPreviousChild+1;i<positionOfTheChild;i++){
+ Node nodeToPrint = everything.get(i);
+ if (!(nodeToPrint instanceof Comment)) throw new RuntimeException("Expected comment, instead "+nodeToPrint.getClass()+". Position of previous child: "+positionOfPreviousChild+", position of child "+positionOfTheChild);
+ nodeToPrint.accept(this,null);
+ }
+ }
+
+
+ private void printOrphanCommentsEnding(final Node node){
+ List<Node> everything = new LinkedList<Node>();
+ everything.addAll(node.getChildrenNodes());
+ sortByBeginPosition(everything);
+ if (everything.size()==0) return;
+
+ int commentsAtEnd = 0;
+ boolean findingComments = true;
+ while (findingComments&&commentsAtEnd<everything.size()){
+ Node last = everything.get(everything.size()-1-commentsAtEnd);
+ findingComments = (last instanceof Comment);
+ if (findingComments) commentsAtEnd++;
+ }
+ for (int i=0;i<commentsAtEnd;i++){
+ everything.get(everything.size()-commentsAtEnd+i).accept(this,null);
+ }
+ }
+}