Skip to content

Commit

Permalink
prettyAlignMethodCallChainsIndentsArgumentsWithBlocksCorrectly
Browse files Browse the repository at this point in the history
  • Loading branch information
matozoid committed May 9, 2018
1 parent ad192e5 commit d4ab49f
Show file tree
Hide file tree
Showing 4 changed files with 111 additions and 99 deletions.
Expand Up @@ -21,6 +21,7 @@


package com.github.javaparser.printer; package com.github.javaparser.printer;


import com.github.javaparser.JavaParser;
import com.github.javaparser.ast.CompilationUnit; import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
import com.github.javaparser.ast.body.FieldDeclaration; import com.github.javaparser.ast.body.FieldDeclaration;
Expand Down Expand Up @@ -98,21 +99,20 @@ public void printUseTestVisitor() {
@Test @Test
public void prettyColumnAlignParameters_enabled() { public void prettyColumnAlignParameters_enabled() {
PrettyPrinterConfiguration config = new PrettyPrinterConfiguration() PrettyPrinterConfiguration config = new PrettyPrinterConfiguration()
.setIndent("\t")
.setColumnAlignParameters(true); .setColumnAlignParameters(true);


final String EOL = config.getEndOfLineCharacter(); final String EOL = config.getEndOfLineCharacter();


String code = "class Example { void foo(Object arg0,Object arg1){ myMethod(1, 2, 3, 5, Object.class); } }"; String code = "class Example { void foo(Object arg0,Object arg1){ myMethod(1, 2, 3, 5, Object.class); } }";
String expected = "class Example {" + EOL + String expected = "class Example {" + EOL +
"" + EOL + "" + EOL +
"\tvoid foo(Object arg0, Object arg1) {" + EOL + " void foo(Object arg0, Object arg1) {" + EOL +
"\t\tmyMethod(1," + EOL + " myMethod(1," + EOL +
"\t\t 2," + EOL + " 2," + EOL +
"\t\t 3," + EOL + " 3," + EOL +
"\t\t 5," + EOL + " 5," + EOL +
"\t\t Object.class);" + EOL + " Object.class);" + EOL +
"\t}" + EOL + " }" + EOL +
"}" + EOL + "}" + EOL +
""; "";


Expand All @@ -139,21 +139,20 @@ public void prettyColumnAlignParameters_disabled() {
@Test @Test
public void prettyAlignMethodCallChains_enabled() { public void prettyAlignMethodCallChains_enabled() {
PrettyPrinterConfiguration config = new PrettyPrinterConfiguration() PrettyPrinterConfiguration config = new PrettyPrinterConfiguration()
.setIndent("\t")
.setColumnAlignFirstMethodChain(true); .setColumnAlignFirstMethodChain(true);


final String EOL = config.getEndOfLineCharacter(); final String EOL = config.getEndOfLineCharacter();


String code = "class Example { void foo() { IntStream.range(0, 10).filter(x -> x % 2 == 0).map(x -> x * IntStream.of(1,3,5,1).sum()).forEach(System.out::println); } }"; String code = "class Example { void foo() { IntStream.range(0, 10).filter(x -> x % 2 == 0).map(x -> x * IntStream.of(1,3,5,1).sum()).forEach(System.out::println); } }";
String expected = "class Example {" + EOL + String expected = "class Example {" + EOL +
"" + EOL + "" + EOL +
"\tvoid foo() {" + EOL + " void foo() {" + EOL +
"\t\tIntStream.range(0, 10)" + EOL + " IntStream.range(0, 10)" + EOL +
"\t\t .filter(x -> x % 2 == 0)" + EOL + " .filter(x -> x % 2 == 0)" + EOL +
"\t\t .map(x -> x * IntStream.of(1, 3, 5, 1)" + EOL + " .map(x -> x * IntStream.of(1, 3, 5, 1)" + EOL +
"\t\t .sum())" + EOL + " .sum())" + EOL +
"\t\t .forEach(System.out::println);" + EOL + " .forEach(System.out::println);" + EOL +
"\t}" + EOL + " }" + EOL +
"}" + EOL + "}" + EOL +
""; "";


Expand Down Expand Up @@ -203,4 +202,24 @@ public void printingInconsistentVariables() {


assertEquals("double a, b;", fieldDeclaration.toString()); assertEquals("double a, b;", fieldDeclaration.toString());
} }

@Test
public void prettyAlignMethodCallChainsIndentsArgumentsWithBlocksCorrectly() {

CompilationUnit cu = JavaParser.parse("class Foo { void bar() { foo().bar().baz(() -> { boo().baa().bee(); }).bam(); } }");
String printed = new PrettyPrinter(new PrettyPrinterConfiguration().setColumnAlignFirstMethodChain(true))
.print(cu);

assertEqualsNoEol("class Foo {\n" +
"\n" +
" void bar() {\n" +
" foo().bar()\n" +
" .baz(() -> {\n" +
" boo().baa()\n" +
" .bee();\n" +
" })\n" +
" .bam();\n" +
" }\n" +
"}\n", printed);
}
} }
Expand Up @@ -21,7 +21,6 @@


package com.github.javaparser.printer; package com.github.javaparser.printer;


import com.github.javaparser.Position;
import com.github.javaparser.ast.*; import com.github.javaparser.ast.*;
import com.github.javaparser.ast.body.*; import com.github.javaparser.ast.body.*;
import com.github.javaparser.ast.comments.BlockComment; import com.github.javaparser.ast.comments.BlockComment;
Expand All @@ -30,6 +29,7 @@
import com.github.javaparser.ast.comments.LineComment; import com.github.javaparser.ast.comments.LineComment;
import com.github.javaparser.ast.expr.*; import com.github.javaparser.ast.expr.*;
import com.github.javaparser.ast.modules.*; import com.github.javaparser.ast.modules.*;
import com.github.javaparser.ast.nodeTypes.NodeWithName;
import com.github.javaparser.ast.nodeTypes.NodeWithTypeArguments; import com.github.javaparser.ast.nodeTypes.NodeWithTypeArguments;
import com.github.javaparser.ast.nodeTypes.NodeWithVariables; import com.github.javaparser.ast.nodeTypes.NodeWithVariables;
import com.github.javaparser.ast.stmt.*; import com.github.javaparser.ast.stmt.*;
Expand All @@ -42,9 +42,8 @@


import static com.github.javaparser.ast.Node.Parsedness.UNPARSABLE; import static com.github.javaparser.ast.Node.Parsedness.UNPARSABLE;
import static com.github.javaparser.utils.PositionUtils.sortByBeginPosition; import static com.github.javaparser.utils.PositionUtils.sortByBeginPosition;
import static com.github.javaparser.utils.Utils.isNullOrEmpty; import static com.github.javaparser.utils.Utils.*;
import static com.github.javaparser.utils.Utils.normalizeEolInTextBlock; import static java.util.Comparator.comparingInt;
import static com.github.javaparser.utils.Utils.trimTrailingSpaces;


/** /**
* Outputs the AST as formatted Java source code. * Outputs the AST as formatted Java source code.
Expand All @@ -54,35 +53,16 @@
public class PrettyPrintVisitor implements VoidVisitor<Void> { public class PrettyPrintVisitor implements VoidVisitor<Void> {
protected final PrettyPrinterConfiguration configuration; protected final PrettyPrinterConfiguration configuration;
protected final SourcePrinter printer; protected final SourcePrinter printer;
private Deque<Position> methodChainPositions = new LinkedList<>();


public PrettyPrintVisitor(PrettyPrinterConfiguration prettyPrinterConfiguration) { public PrettyPrintVisitor(PrettyPrinterConfiguration prettyPrinterConfiguration) {
configuration = prettyPrinterConfiguration; configuration = prettyPrinterConfiguration;
printer = new SourcePrinter(configuration.getIndent(), configuration.getEndOfLineCharacter()); printer = new SourcePrinter(configuration.getIndent(), configuration.getEndOfLineCharacter());
pushMethodChainPosition(printer.getCursor()); // initialize a default position for methodChainPositions, it is expected by method #resetMethodChainPosition()
} }


public String getSource() { public String getSource() {
return printer.getSource(); return printer.getSource();
} }


public void resetMethodChainPosition(Position position) {
this.methodChainPositions.pop();
this.methodChainPositions.push(position);
}

public void pushMethodChainPosition(Position position) {
this.methodChainPositions.push(position);
}

public Position peekMethodChainPosition() {
return this.methodChainPositions.peek();
}

public Position popMethodChainPosition() {
return this.methodChainPositions.pop();
}

private void printModifiers(final EnumSet<Modifier> modifiers) { private void printModifiers(final EnumSet<Modifier> modifiers) {
if (modifiers.size() > 0) { if (modifiers.size() > 0) {
printer.print(modifiers.stream().map(Modifier::asString).collect(Collectors.joining(" ")) + " "); printer.print(modifiers.stream().map(Modifier::asString).collect(Collectors.joining(" ")) + " ");
Expand Down Expand Up @@ -152,22 +132,27 @@ private void printTypeParameters(final NodeList<TypeParameter> args, final Void


private void printArguments(final NodeList<Expression> args, final Void arg) { private void printArguments(final NodeList<Expression> args, final Void arg) {
printer.print("("); printer.print("(");
Position cursorRef = printer.getCursor(); if (configuration.isColumnAlignParameters()) {
printer.indentTo(printer.getCursor().column);
}
if (!isNullOrEmpty(args)) { if (!isNullOrEmpty(args)) {
for (final Iterator<Expression> i = args.iterator(); i.hasNext(); ) { for (final Iterator<Expression> i = args.iterator(); i.hasNext(); ) {
final Expression e = i.next(); final Expression e = i.next();
e.accept(this, arg); e.accept(this, arg);
if (i.hasNext()) { if (i.hasNext()) {
printer.print(","); printer.print(",");
if (configuration.isColumnAlignParameters()) { if (configuration.isColumnAlignParameters()) {
printer.wrapToColumn(cursorRef.column); printer.println();
} else { } else {
printer.print(" "); printer.print(" ");
} }
} }
} }
} }
printer.print(")"); printer.print(")");
if (configuration.isColumnAlignParameters()) {
printer.unindent();
}
} }


private void printPrePostFixOptionalList(final NodeList<? extends Visitable> args, final Void arg, String prefix, String separator, String postfix) { private void printPrePostFixOptionalList(final NodeList<? extends Visitable> args, final Void arg, String prefix, String separator, String postfix) {
Expand Down Expand Up @@ -728,22 +713,23 @@ public void visit(final SuperExpr n, final Void arg) {
@Override @Override
public void visit(final MethodCallExpr n, final Void arg) { public void visit(final MethodCallExpr n, final Void arg) {
printComment(n.getComment(), arg); printComment(n.getComment(), arg);
if (n.getScope().isPresent()) { n.getScope().ifPresent(scope -> {
n.getScope().get().accept(this, arg); scope.accept(this, arg);
if (configuration.isColumnAlignFirstMethodChain()) { if (configuration.isColumnAlignFirstMethodChain()) {
if (!(n.getScope().get() instanceof MethodCallExpr) || (!((MethodCallExpr) n.getScope().get()).getScope().isPresent())) { if (!(scope instanceof MethodCallExpr) || !((MethodCallExpr) scope).getScope().isPresent()) {
resetMethodChainPosition(printer.getCursor()); printer.unindent();
printer.indentToCursor();
} else { } else {
printer.wrapToColumn(peekMethodChainPosition().column); printer.println();
} }
} }
printer.print("."); printer.print(".");
} });
printTypeArgs(n, arg); printTypeArgs(n, arg);
n.getName().accept(this, arg); n.getName().accept(this, arg);
pushMethodChainPosition(printer.getCursor()); printer.duplicateIndent();
printArguments(n.getArguments(), arg); printArguments(n.getArguments(), arg);
popMethodChainPosition(); printer.unindent();
} }


@Override @Override
Expand Down Expand Up @@ -1460,13 +1446,9 @@ public void visit(NodeList n, Void arg) {
if (configuration.isOrderImports() && n.size() > 0 && n.get(0) instanceof ImportDeclaration) { if (configuration.isOrderImports() && n.size() > 0 && n.get(0) instanceof ImportDeclaration) {
//noinspection unchecked //noinspection unchecked
NodeList<ImportDeclaration> modifiableList = new NodeList<>(n); NodeList<ImportDeclaration> modifiableList = new NodeList<>(n);
modifiableList.sort((left, right) -> { modifiableList.sort(
int sort = Integer.compare(left.isStatic() ? 0 : 1, right.isStatic() ? 0 : 1); comparingInt((ImportDeclaration left) -> left.isStatic() ? 0 : 1)
if (sort == 0) { .thenComparing(NodeWithName::getNameAsString));
sort = left.getNameAsString().compareTo(right.getNameAsString());
}
return sort;
});
for (Object node : modifiableList) { for (Object node : modifiableList) {
((Node) node).accept(this, arg); ((Node) node).accept(this, arg);
} }
Expand Down
Expand Up @@ -37,19 +37,23 @@ public class PrettyPrinterConfiguration {
private boolean printJavadoc = true; private boolean printJavadoc = true;
private boolean columnAlignParameters = false; private boolean columnAlignParameters = false;
private boolean columnAlignFirstMethodChain = false; private boolean columnAlignFirstMethodChain = false;
private String indent = " "; private int indent = 4;
private String endOfLineCharacter = EOL; private String endOfLineCharacter = EOL;
private Function<PrettyPrinterConfiguration, PrettyPrintVisitor> visitorFactory = PrettyPrintVisitor::new; private Function<PrettyPrinterConfiguration, PrettyPrintVisitor> visitorFactory = PrettyPrintVisitor::new;
private int maxEnumConstantsToAlignHorizontally = DEFAULT_MAX_ENUM_CONSTANTS_TO_ALIGN_HORIZONTALLY; private int maxEnumConstantsToAlignHorizontally = DEFAULT_MAX_ENUM_CONSTANTS_TO_ALIGN_HORIZONTALLY;


public String getIndent() { public String getIndent() {
return indent; StringBuilder indentString = new StringBuilder();
for(int i=0; i<indent; i++){
indentString.append(" ");
}
return indentString.toString();
} }


/** /**
* Set the string to use for indenting. For example: "\t", " ", "". * Set the size of the indent in spaces.
*/ */
public PrettyPrinterConfiguration setIndent(String indent) { public PrettyPrinterConfiguration setIndent(int indent) {
this.indent = assertNotNull(indent); this.indent = assertNotNull(indent);
return this; return this;
} }
Expand Down

0 comments on commit d4ab49f

Please sign in to comment.