From 9b506ff628b312e5ba627dbf383f5e66899df456 Mon Sep 17 00:00:00 2001 From: Ling-Chun SO Date: Wed, 19 Jun 2019 17:29:02 +0200 Subject: [PATCH 01/10] fix expression print --- .../src/printers/expressions.js | 8 +++++- .../unit-test/binary_expressions/_output.java | 3 +-- .../test/unit-test/expressions/_input.java | 21 ++++++++++++++++ .../test/unit-test/expressions/_output.java | 25 +++++++++++++++++++ 4 files changed, 54 insertions(+), 3 deletions(-) diff --git a/packages/prettier-plugin-java/src/printers/expressions.js b/packages/prettier-plugin-java/src/printers/expressions.js index c41226d2c..8dd743e39 100644 --- a/packages/prettier-plugin-java/src/printers/expressions.js +++ b/packages/prettier-plugin-java/src/printers/expressions.js @@ -210,10 +210,16 @@ class ExpressionsPrettierVisitor { } i++; } else if (matchCategory(token, "'BinaryOperator'")) { + let separator = ""; + if (token.image === "&&" || token.image === "||") { + separator = softline; + } else { + separator = " "; + } segment.push( indent( rejectAndConcat([ - softline, + separator, rejectAndJoin(" ", [token, unaryExpression.shift()]) ]) ) diff --git a/packages/prettier-plugin-java/test/unit-test/binary_expressions/_output.java b/packages/prettier-plugin-java/test/unit-test/binary_expressions/_output.java index e2c7bc945..46d2e0fbf 100644 --- a/packages/prettier-plugin-java/test/unit-test/binary_expressions/_output.java +++ b/packages/prettier-plugin-java/test/unit-test/binary_expressions/_output.java @@ -2,8 +2,7 @@ public class BinaryOperations { public void binaryOperationThatShouldBreak() { System.out.println( - "This operation with two very long string should break" - + "in a very nice way" + "This operation with two very long string should break" + "in a very nice way" ); } diff --git a/packages/prettier-plugin-java/test/unit-test/expressions/_input.java b/packages/prettier-plugin-java/test/unit-test/expressions/_input.java index f6decb6ab..28c8f49c2 100644 --- a/packages/prettier-plugin-java/test/unit-test/expressions/_input.java +++ b/packages/prettier-plugin-java/test/unit-test/expressions/_input.java @@ -72,5 +72,26 @@ public void instanceOf() { } } + public void printSimple() { + if(myValue == 42) { + } + + if(myValue != 42) { + System.out.println("Why not 42 !"); + } + } + + public void printLine() { + if(myValue == 42 || myValue == 42 && myValue == 42 && myValue == 42 || myValue == 42 && myValue == 42) { + + } + } + + public void printLineMix() { + if(myValue != 42 && 42/42 || myValue & 42 && myValue > 42 || myValue < 42) { + + } + } + } diff --git a/packages/prettier-plugin-java/test/unit-test/expressions/_output.java b/packages/prettier-plugin-java/test/unit-test/expressions/_output.java index ef1587255..ef8d68e82 100644 --- a/packages/prettier-plugin-java/test/unit-test/expressions/_output.java +++ b/packages/prettier-plugin-java/test/unit-test/expressions/_output.java @@ -71,4 +71,29 @@ public void instanceOf() { System.out.println("instanceOf"); } } + + public void printSimple() { + if (myValue == 42) {} + + if (myValue != 42) { + System.out.println("Why not 42 !"); + } + } + + public void printLine() { + if (myValue == 42 + || myValue == 42 + && myValue == 42 + && myValue == 42 + || myValue == 42 + && myValue == 42) {} + } + + public void printLineMix() { + if (myValue != 42 + && 42 / 42 + || myValue & 42 + && myValue > 42 + || myValue < 42) {} + } } From 81ae82731157aaa2365e13159b3374ed06d24938 Mon Sep 17 00:00:00 2001 From: Ling-Chun SO Date: Wed, 19 Jun 2019 17:51:53 +0200 Subject: [PATCH 02/10] line return when breaking expression --- packages/prettier-plugin-java/src/printers/expressions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/prettier-plugin-java/src/printers/expressions.js b/packages/prettier-plugin-java/src/printers/expressions.js index 8dd743e39..4250eab23 100644 --- a/packages/prettier-plugin-java/src/printers/expressions.js +++ b/packages/prettier-plugin-java/src/printers/expressions.js @@ -226,7 +226,7 @@ class ExpressionsPrettierVisitor { ); } } - return group(rejectAndJoin(" ", segment)); + return group(concat([softline, rejectAndJoin(" ", segment), softline])); } unaryExpression(ctx) { From 56f23b6fa97c1e763e787373692a5b8b63ab006e Mon Sep 17 00:00:00 2001 From: Ling-Chun SO Date: Thu, 20 Jun 2019 11:59:20 +0200 Subject: [PATCH 03/10] fix indent expressions --- .../src/printers/blocks-and-statements.js | 28 ++-- .../src/printers/expressions.js | 12 +- .../_input.java | 2 +- .../_output.java | 2 +- .../test/unit-test/expressions/_input.java | 71 +++++++++- .../test/unit-test/expressions/_output.java | 126 +++++++++++++++++- 6 files changed, 212 insertions(+), 29 deletions(-) diff --git a/packages/prettier-plugin-java/src/printers/blocks-and-statements.js b/packages/prettier-plugin-java/src/printers/blocks-and-statements.js index c41275621..1df79c3fd 100644 --- a/packages/prettier-plugin-java/src/printers/blocks-and-statements.js +++ b/packages/prettier-plugin-java/src/printers/blocks-and-statements.js @@ -130,9 +130,13 @@ class BlocksAndStatementPrettierVisitor { } return rejectAndConcat([ - rejectAndJoin(" ", [ctx.If[0], ctx.LBrace[0]]), - expression, - concat([ctx.RBrace[0], ifSeparator]), + rejectAndJoin(" ", [ + ctx.If[0], + concat([ + putIntoBraces(expression, softline, ctx.LBrace[0], ctx.RBrace[0]), + ifSeparator + ]) + ]), ifStatement, elsePart ]); @@ -154,7 +158,7 @@ class BlocksAndStatementPrettierVisitor { return rejectAndJoin(" ", [ ctx.Switch[0], - rejectAndConcat([ctx.LBrace[0], expression, ctx.RBrace[0]]), + putIntoBraces(expression, softline, ctx.LBrace[0], ctx.RBrace[0]), switchBlock ]); } @@ -207,7 +211,7 @@ class BlocksAndStatementPrettierVisitor { return rejectAndJoin(" ", [ ctx.While[0], rejectAndJoin(statementSeparator, [ - rejectAndConcat([ctx.LBrace[0], expression, ctx.RBrace[0]]), + putIntoBraces(expression, softline, ctx.LBrace[0], ctx.RBrace[0]), statement ]) ]); @@ -228,9 +232,7 @@ class BlocksAndStatementPrettierVisitor { rejectAndJoin(statementSeparator, [ctx.Do[0], statement]), ctx.While[0], rejectAndConcat([ - ctx.LBrace[0], - expression, - ctx.RBrace[0], + putIntoBraces(expression, softline, ctx.LBrace[0], ctx.RBrace[0]), ctx.Semicolon[0] ]) ]); @@ -363,9 +365,13 @@ class BlocksAndStatementPrettierVisitor { const block = this.visit(ctx.block); return rejectAndConcat([ - join(" ", [ctx.Synchronized[0], ctx.LBrace[0]]), - expression, - concat([ctx.RBrace[0], " "]), + join(" ", [ + ctx.Synchronized[0], + concat([ + putIntoBraces(expression, softline, ctx.LBrace[0], ctx.RBrace[0]), + " " + ]) + ]), block ]); } diff --git a/packages/prettier-plugin-java/src/printers/expressions.js b/packages/prettier-plugin-java/src/printers/expressions.js index 4250eab23..a4a3bc67f 100644 --- a/packages/prettier-plugin-java/src/printers/expressions.js +++ b/packages/prettier-plugin-java/src/printers/expressions.js @@ -217,16 +217,14 @@ class ExpressionsPrettierVisitor { separator = " "; } segment.push( - indent( - rejectAndConcat([ - separator, - rejectAndJoin(" ", [token, unaryExpression.shift()]) - ]) - ) + rejectAndConcat([ + separator, + rejectAndJoin(" ", [token, unaryExpression.shift()]) + ]) ); } } - return group(concat([softline, rejectAndJoin(" ", segment), softline])); + return group(rejectAndJoin(" ", segment)); } unaryExpression(ctx) { diff --git a/packages/prettier-plugin-java/test/unit-test/comments/comments-blocks-and-statements/_input.java b/packages/prettier-plugin-java/test/unit-test/comments/comments-blocks-and-statements/_input.java index 026e11ae8..d5e9082e5 100644 --- a/packages/prettier-plugin-java/test/unit-test/comments/comments-blocks-and-statements/_input.java +++ b/packages/prettier-plugin-java/test/unit-test/comments/comments-blocks-and-statements/_input.java @@ -68,7 +68,7 @@ private synchronized void myFunction(int arg1, int arg2 /*overloading*/){ return/*dead code*/ ; } /*at least one iteration !*/while (false); synchronized/*declares synchronizd statement*/ (this){ - while/*infinite loop*/ (true) + while/*infinite*/ (true) /*stop the program*/throw new RuntimeException(); } diff --git a/packages/prettier-plugin-java/test/unit-test/comments/comments-blocks-and-statements/_output.java b/packages/prettier-plugin-java/test/unit-test/comments/comments-blocks-and-statements/_output.java index a6f2cda0d..c0fb225af 100644 --- a/packages/prettier-plugin-java/test/unit-test/comments/comments-blocks-and-statements/_output.java +++ b/packages/prettier-plugin-java/test/unit-test/comments/comments-blocks-and-statements/_output.java @@ -73,7 +73,7 @@ private synchronized void myFunction(int arg1, int arg2/*overloading*/) { return/*dead code*/; } /*at least one iteration !*/while (false); synchronized/*declares synchronizd statement*/ (this) { - while/*infinite loop*/ (true) /*stop the program*/throw new RuntimeException(); + while/*infinite*/ (true) /*stop the program*/throw new RuntimeException(); } } } diff --git a/packages/prettier-plugin-java/test/unit-test/expressions/_input.java b/packages/prettier-plugin-java/test/unit-test/expressions/_input.java index 28c8f49c2..f7056546b 100644 --- a/packages/prettier-plugin-java/test/unit-test/expressions/_input.java +++ b/packages/prettier-plugin-java/test/unit-test/expressions/_input.java @@ -81,17 +81,82 @@ public void printSimple() { } } - public void printLine() { + public void printIf() { + Object myObject = new PrettierObject().getSingleton().getAuthentication().getCredentials().getRights().getName(); + if(myValue == 42 || myValue == 42 && myValue == 42 && myValue == 42 || myValue == 42 && myValue == 42) { } + + if(myValue != 42 && 42/42 || myValue & 42 && myValue > 42 || myValue < 42 && myValue == 42) { + + } + + if(myValue != 42) { + + } } - public void printLineMix() { - if(myValue != 42 && 42/42 || myValue & 42 && myValue > 42 || myValue < 42) { + public void printSwitch() { + switch(myValue == 42 || myValue == 42 && myValue == 42 && myValue == 42 || myValue == 42 && myValue == 42) { + + } + + switch(myValue != 42 && 42/42 || myValue & 42 && myValue > 42 || myValue < 42 && myValue == 42) { + + } + + switch(myValue != 42) { + + } + } + + public void printWhile() { + while/*infinite*/ (true) /*stop the program*/throw new RuntimeException(); + + while(myValue == 42 || myValue == 42 && myValue == 42 && myValue == 42 || myValue == 42 && myValue == 42) { + + } + + while(myValue != 42 && 42/42 || myValue & 42 && myValue > 42 || myValue < 42 && myValue == 42) { + + } + + while(myValue != 42) { } } + public void printDoWhile() { + do{ + System.out.println("Prettier-java is cool !"); + } + while(myValue == 42 || myValue == 42 && myValue == 42 && myValue == 42 || myValue == 42 && myValue == 42); + + do { + System.out.println("Prettier-java is cool !"); + } + while(myValue != 42 && 42/42 || myValue & 42 && myValue > 42 || myValue < 42 && myValue == 42); + + do { + System.out.println("Prettier-java is cool !"); + } + while(myValue != 42); + } + + public void printSynchronized() { + synchronized(myValue == 42 || myValue == 42 && myValue == 42 && myValue == 42 || myValue == 42 && myValue == 42) { + System.out.println("Prettier-java is cool !"); + } + + synchronized(myValue != 42 && 42/42 || myValue & 42 && myValue > 42 || myValue < 42 && myValue == 42) { + System.out.println("Prettier-java is cool !"); + } + + synchronized(myValue == 42) { + System.out.println("Prettier-java is cool !"); + } + } + } diff --git a/packages/prettier-plugin-java/test/unit-test/expressions/_output.java b/packages/prettier-plugin-java/test/unit-test/expressions/_output.java index ef8d68e82..799932dc3 100644 --- a/packages/prettier-plugin-java/test/unit-test/expressions/_output.java +++ b/packages/prettier-plugin-java/test/unit-test/expressions/_output.java @@ -80,20 +80,134 @@ public void printSimple() { } } - public void printLine() { - if (myValue == 42 + public void printIf() { + Object myObject = new PrettierObject() + .getSingleton() + .getAuthentication() + .getCredentials() + .getRights() + .getName(); + + if ( + myValue == 42 || myValue == 42 && myValue == 42 && myValue == 42 || myValue == 42 - && myValue == 42) {} + && myValue == 42 + ) {} + + if ( + myValue != 42 + && 42 / 42 + || myValue & 42 + && myValue > 42 + || myValue < 42 + && myValue == 42 + ) {} + + if (myValue != 42) {} + } + + public void printSwitch() { + switch ( + myValue == 42 + || myValue == 42 + && myValue == 42 + && myValue == 42 + || myValue == 42 + && myValue == 42 + ) {} + + switch ( + myValue != 42 + && 42 / 42 + || myValue & 42 + && myValue > 42 + || myValue < 42 + && myValue == 42 + ) {} + + switch (myValue != 42) {} + } + + public void printWhile() { + while/*infinite*/ (true) /*stop the program*/throw new RuntimeException(); + + while ( + myValue == 42 + || myValue == 42 + && myValue == 42 + && myValue == 42 + || myValue == 42 + && myValue == 42 + ) {} + + while ( + myValue != 42 + && 42 / 42 + || myValue & 42 + && myValue > 42 + || myValue < 42 + && myValue == 42 + ) {} + + while (myValue != 42) {} } - public void printLineMix() { - if (myValue != 42 + public void printDoWhile() { + do { + System.out.println("Prettier-java is cool !"); + } while ( + myValue == 42 + || myValue == 42 + && myValue == 42 + && myValue == 42 + || myValue == 42 + && myValue == 42 + ); + + do { + System.out.println("Prettier-java is cool !"); + } while ( + myValue != 42 && 42 / 42 || myValue & 42 && myValue > 42 - || myValue < 42) {} + || myValue < 42 + && myValue == 42 + ); + + do { + System.out.println("Prettier-java is cool !"); + } while (myValue != 42); + } + + public void printSynchronized() { + synchronized ( + myValue == 42 + || myValue == 42 + && myValue == 42 + && myValue == 42 + || myValue == 42 + && myValue == 42 + ) { + System.out.println("Prettier-java is cool !"); + } + + synchronized ( + myValue != 42 + && 42 / 42 + || myValue & 42 + && myValue > 42 + || myValue < 42 + && myValue == 42 + ) { + System.out.println("Prettier-java is cool !"); + } + + synchronized (myValue == 42) { + System.out.println("Prettier-java is cool !"); + } } } From 60b6d1dc223ae744889e8227d7b205b7dd5c7b48 Mon Sep 17 00:00:00 2001 From: Ling-Chun SO Date: Thu, 20 Jun 2019 13:42:21 +0200 Subject: [PATCH 04/10] move return line expression to end of line --- .../src/printers/expressions.js | 8 +- .../test/unit-test/expressions/_output.java | 110 +++++++++--------- 2 files changed, 59 insertions(+), 59 deletions(-) diff --git a/packages/prettier-plugin-java/src/printers/expressions.js b/packages/prettier-plugin-java/src/printers/expressions.js index a4a3bc67f..71018c784 100644 --- a/packages/prettier-plugin-java/src/printers/expressions.js +++ b/packages/prettier-plugin-java/src/printers/expressions.js @@ -210,16 +210,16 @@ class ExpressionsPrettierVisitor { } i++; } else if (matchCategory(token, "'BinaryOperator'")) { - let separator = ""; + let separator = " "; if (token.image === "&&" || token.image === "||") { - separator = softline; + separator = line; } else { separator = " "; } segment.push( rejectAndConcat([ - separator, - rejectAndJoin(" ", [token, unaryExpression.shift()]) + " ", + rejectAndJoin(separator, [token, unaryExpression.shift()]) ]) ); } diff --git a/packages/prettier-plugin-java/test/unit-test/expressions/_output.java b/packages/prettier-plugin-java/test/unit-test/expressions/_output.java index 799932dc3..5d59b71da 100644 --- a/packages/prettier-plugin-java/test/unit-test/expressions/_output.java +++ b/packages/prettier-plugin-java/test/unit-test/expressions/_output.java @@ -89,21 +89,21 @@ public void printIf() { .getName(); if ( + myValue == 42 || + myValue == 42 && + myValue == 42 && + myValue == 42 || + myValue == 42 && myValue == 42 - || myValue == 42 - && myValue == 42 - && myValue == 42 - || myValue == 42 - && myValue == 42 ) {} if ( - myValue != 42 - && 42 / 42 - || myValue & 42 - && myValue > 42 - || myValue < 42 - && myValue == 42 + myValue != 42 && + 42 / 42 || + myValue & 42 && + myValue > 42 || + myValue < 42 && + myValue == 42 ) {} if (myValue != 42) {} @@ -111,21 +111,21 @@ public void printIf() { public void printSwitch() { switch ( + myValue == 42 || + myValue == 42 && + myValue == 42 && + myValue == 42 || + myValue == 42 && myValue == 42 - || myValue == 42 - && myValue == 42 - && myValue == 42 - || myValue == 42 - && myValue == 42 ) {} switch ( - myValue != 42 - && 42 / 42 - || myValue & 42 - && myValue > 42 - || myValue < 42 - && myValue == 42 + myValue != 42 && + 42 / 42 || + myValue & 42 && + myValue > 42 || + myValue < 42 && + myValue == 42 ) {} switch (myValue != 42) {} @@ -135,21 +135,21 @@ public void printWhile() { while/*infinite*/ (true) /*stop the program*/throw new RuntimeException(); while ( + myValue == 42 || + myValue == 42 && + myValue == 42 && + myValue == 42 || + myValue == 42 && myValue == 42 - || myValue == 42 - && myValue == 42 - && myValue == 42 - || myValue == 42 - && myValue == 42 ) {} while ( - myValue != 42 - && 42 / 42 - || myValue & 42 - && myValue > 42 - || myValue < 42 - && myValue == 42 + myValue != 42 && + 42 / 42 || + myValue & 42 && + myValue > 42 || + myValue < 42 && + myValue == 42 ) {} while (myValue != 42) {} @@ -159,23 +159,23 @@ public void printDoWhile() { do { System.out.println("Prettier-java is cool !"); } while ( + myValue == 42 || + myValue == 42 && + myValue == 42 && + myValue == 42 || + myValue == 42 && myValue == 42 - || myValue == 42 - && myValue == 42 - && myValue == 42 - || myValue == 42 - && myValue == 42 ); do { System.out.println("Prettier-java is cool !"); } while ( - myValue != 42 - && 42 / 42 - || myValue & 42 - && myValue > 42 - || myValue < 42 - && myValue == 42 + myValue != 42 && + 42 / 42 || + myValue & 42 && + myValue > 42 || + myValue < 42 && + myValue == 42 ); do { @@ -185,23 +185,23 @@ public void printDoWhile() { public void printSynchronized() { synchronized ( + myValue == 42 || + myValue == 42 && + myValue == 42 && + myValue == 42 || + myValue == 42 && myValue == 42 - || myValue == 42 - && myValue == 42 - && myValue == 42 - || myValue == 42 - && myValue == 42 ) { System.out.println("Prettier-java is cool !"); } synchronized ( - myValue != 42 - && 42 / 42 - || myValue & 42 - && myValue > 42 - || myValue < 42 - && myValue == 42 + myValue != 42 && + 42 / 42 || + myValue & 42 && + myValue > 42 || + myValue < 42 && + myValue == 42 ) { System.out.println("Prettier-java is cool !"); } From a34a483f8d5f52ea090ec3deddd4a5233e3646e1 Mon Sep 17 00:00:00 2001 From: Ling-Chun SO Date: Thu, 20 Jun 2019 14:23:23 +0200 Subject: [PATCH 05/10] remove useless alternative --- packages/prettier-plugin-java/src/printers/expressions.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/prettier-plugin-java/src/printers/expressions.js b/packages/prettier-plugin-java/src/printers/expressions.js index 71018c784..b608e7afc 100644 --- a/packages/prettier-plugin-java/src/printers/expressions.js +++ b/packages/prettier-plugin-java/src/printers/expressions.js @@ -213,8 +213,6 @@ class ExpressionsPrettierVisitor { let separator = " "; if (token.image === "&&" || token.image === "||") { separator = line; - } else { - separator = " "; } segment.push( rejectAndConcat([ From 485d4a5e27be151e5246aa4f4ff8e3698bd9fea7 Mon Sep 17 00:00:00 2001 From: Ling-Chun SO Date: Thu, 20 Jun 2019 14:47:42 +0200 Subject: [PATCH 06/10] add tests --- .../test/unit-test/expressions/_input.java | 18 +++++++++++++++++- .../test/unit-test/expressions/_output.java | 14 +++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/packages/prettier-plugin-java/test/unit-test/expressions/_input.java b/packages/prettier-plugin-java/test/unit-test/expressions/_input.java index f7056546b..98684828c 100644 --- a/packages/prettier-plugin-java/test/unit-test/expressions/_input.java +++ b/packages/prettier-plugin-java/test/unit-test/expressions/_input.java @@ -92,7 +92,7 @@ public void printIf() { } - if(myValue != 42) { + if(myValue != 42 && myValue == 42) { } } @@ -109,6 +109,10 @@ public void printSwitch() { switch(myValue != 42) { } + + switch(myValue != 42 && myValue == 42) { + + } } public void printWhile() { @@ -125,6 +129,10 @@ public void printWhile() { while(myValue != 42) { } + + while(myValue != 42 && myValue == 42) { + + } } public void printDoWhile() { @@ -142,6 +150,10 @@ public void printDoWhile() { System.out.println("Prettier-java is cool !"); } while(myValue != 42); + + do { + System.out.println("Prettier-java is cool !"); + }while(myValue != 42 && myValue == 42); } public void printSynchronized() { @@ -156,6 +168,10 @@ public void printSynchronized() { synchronized(myValue == 42) { System.out.println("Prettier-java is cool !"); } + + synchronized(myValue != 42 && myValue == 42) { + System.out.println("Prettier-java is cool !"); + } } } diff --git a/packages/prettier-plugin-java/test/unit-test/expressions/_output.java b/packages/prettier-plugin-java/test/unit-test/expressions/_output.java index 5d59b71da..98fc16eb5 100644 --- a/packages/prettier-plugin-java/test/unit-test/expressions/_output.java +++ b/packages/prettier-plugin-java/test/unit-test/expressions/_output.java @@ -106,7 +106,7 @@ public void printIf() { myValue == 42 ) {} - if (myValue != 42) {} + if (myValue != 42 && myValue == 42) {} } public void printSwitch() { @@ -129,6 +129,8 @@ public void printSwitch() { ) {} switch (myValue != 42) {} + + switch (myValue != 42 && myValue == 42) {} } public void printWhile() { @@ -153,6 +155,8 @@ public void printWhile() { ) {} while (myValue != 42) {} + + while (myValue != 42 && myValue == 42) {} } public void printDoWhile() { @@ -181,6 +185,10 @@ public void printDoWhile() { do { System.out.println("Prettier-java is cool !"); } while (myValue != 42); + + do { + System.out.println("Prettier-java is cool !"); + } while (myValue != 42 && myValue == 42); } public void printSynchronized() { @@ -209,5 +217,9 @@ public void printSynchronized() { synchronized (myValue == 42) { System.out.println("Prettier-java is cool !"); } + + synchronized (myValue != 42 && myValue == 42) { + System.out.println("Prettier-java is cool !"); + } } } From 84d68b5145d1e801c2d05e2b84eeae90ed7b2ba5 Mon Sep 17 00:00:00 2001 From: Ling-Chun SO Date: Thu, 20 Jun 2019 16:20:40 +0200 Subject: [PATCH 07/10] WIP expression fix print --- .../src/printers/expressions.js | 63 ++++++++++++++--- .../src/printers/printer-utils.js | 67 ++++++++++++++++++- 2 files changed, 119 insertions(+), 11 deletions(-) diff --git a/packages/prettier-plugin-java/src/printers/expressions.js b/packages/prettier-plugin-java/src/printers/expressions.js index b608e7afc..39492f7b7 100644 --- a/packages/prettier-plugin-java/src/printers/expressions.js +++ b/packages/prettier-plugin-java/src/printers/expressions.js @@ -14,11 +14,12 @@ const { rejectAndJoin, rejectAndConcat, sortAnnotationIdentifier, - sortTokens, rejectAndJoinSeps, findDeepElementInPartsArray, isExplicitLambdaParameter, - putIntoBraces + putIntoBraces, + sortGroupTokens, + isShiftOperator } = require("./printer-utils"); class ExpressionsPrettierVisitor { @@ -153,16 +154,58 @@ class ExpressionsPrettierVisitor { } binaryExpression(ctx) { - const sortedTokens = sortTokens( - ctx.Instanceof, - ctx.AssignmentOperator, - ctx.Less, - ctx.Greater, - ctx.BinaryOperator - ); const referenceType = this.mapVisit(ctx.referenceType); const expression = this.mapVisit(ctx.expression); const unaryExpression = this.mapVisit(ctx.unaryExpression); + + const { groups, sortedBinOps } = sortGroupTokens(ctx); + const allSegment = []; + let tmpSegment = []; + + groups.forEach(gp => { + tmpSegment = []; + for (let i = 0; i < gp.length; i++) { + const token = gp[i]; + const shiftOperator = isShiftOperator(gp, i); + if (token.tokenType.tokenName === "Instanceof") { + tmpSegment.push( + rejectAndJoin(" ", [ctx.Instanceof[0], referenceType.shift()]) + ); + } else if (matchCategory(token, "'AssignmentOperator'")) { + tmpSegment.push(rejectAndJoin(line, [token, expression.shift()])); + } else if ( + shiftOperator === "shiftLeft" || + shiftOperator === "shiftRight" + ) { + tmpSegment.push( + rejectAndJoin(" ", [ + rejectAndConcat([token, gp[i + 1]]), + unaryExpression.shift() + ]) + ); + i++; + } else if (shiftOperator === "doubleShiftRight") { + tmpSegment.push( + rejectAndJoin(" ", [ + rejectAndConcat([token, gp[i + 1], gp[i + 2]]), + unaryExpression.shift() + ]) + ); + i += 2; + } else if (matchCategory(token, "'BinaryOperator'")) { + tmpSegment.push( + rejectAndConcat([ + " ", + rejectAndJoin(line, [token, unaryExpression.shift()]) + ]) + ); + } + } + allSegment.push(group(concat(tmpSegment))); + }); + return group(rejectAndJoinSeps(sortedBinOps, allSegment)); + + /* const segment = [unaryExpression.shift()]; for (let i = 0; i < sortedTokens.length; i++) { const token = sortedTokens[i]; @@ -222,7 +265,7 @@ class ExpressionsPrettierVisitor { ); } } - return group(rejectAndJoin(" ", segment)); + return group(rejectAndJoin(" ", segment));*/ } unaryExpression(ctx) { diff --git a/packages/prettier-plugin-java/src/printers/printer-utils.js b/packages/prettier-plugin-java/src/printers/printer-utils.js index c13eb0aa8..e73afba12 100644 --- a/packages/prettier-plugin-java/src/printers/printer-utils.js +++ b/packages/prettier-plugin-java/src/printers/printer-utils.js @@ -294,6 +294,69 @@ function putIntoCurlyBraces(argument, separator, LBrace, RBrace) { return concat([LBrace, RBrace]); } +const andOrBinaryOperators = new Set(["&&", "||", "&", "|", "^"]); +function sortGroupTokens(ctx) { + // separate tokens into groups by andOrBinaryOperators ("&&", "||", "&", "|", "^") + const tokens = sortTokens( + ctx.Instanceof, + ctx.AssignmentOperator, + ctx.Less, + ctx.Greater, + ctx.BinaryOperator + ); + + const groups = []; + const sortedBinOps = []; + let tmpGroup = []; + tokens.forEach(token => { + if (matchCategory(token, "'BinaryOperator'")) { + if (andOrBinaryOperators.has(token.image)) { + sortedBinOps.push(token); + groups.push(tmpGroup); + tmpGroup = []; + } else { + tmpGroup.push(token); + } + } else { + tmpGroup.push(token); + } + }); + + return { + groups, + sortedBinOps + }; +} + +function isShiftOperator(tokens, index) { + if (tokens.length < index + 1) { + return "none"; + } + if ( + tokens[index].image === "<" && + tokens[index + 1].image === "<" && + tokens[index].startOffset === tokens[index + 1].startOffset - 1 + ) { + return "shiftLeft"; + } + if ( + tokens[index].image === ">" && + tokens[index + 1].image === ">" && + tokens[index].startOffset === tokens[index + 1].startOffset - 1 + ) { + if ( + tokens.length > index + 2 && + tokens[index + 2].image === ">" && + tokens[index + 1].startOffset === tokens[index + 2].startOffset - 1 + ) { + return "doubleShiftRight"; + } + return "shiftRight"; + } + + return "none"; +} + module.exports = { buildFqn, reject, @@ -315,5 +378,7 @@ module.exports = { rejectSeparators, handleClassBodyDeclaration, putIntoBraces, - putIntoCurlyBraces + putIntoCurlyBraces, + sortGroupTokens, + isShiftOperator }; From 7c1734134ba9993001cae02a9924c237783fd91a Mon Sep 17 00:00:00 2001 From: Ling-Chun SO Date: Thu, 20 Jun 2019 17:03:11 +0200 Subject: [PATCH 08/10] refactor expression print --- .../src/printers/expressions.js | 23 ++++++++++++------- .../src/printers/printer-utils.js | 5 +++- .../unit-test/binary_expressions/_output.java | 3 ++- .../unit-test/comments/class/_output.java | 3 ++- .../test/unit-test/expressions/_output.java | 15 ++++++++---- 5 files changed, 33 insertions(+), 16 deletions(-) diff --git a/packages/prettier-plugin-java/src/printers/expressions.js b/packages/prettier-plugin-java/src/printers/expressions.js index 39492f7b7..50a6baf3f 100644 --- a/packages/prettier-plugin-java/src/printers/expressions.js +++ b/packages/prettier-plugin-java/src/printers/expressions.js @@ -163,7 +163,7 @@ class ExpressionsPrettierVisitor { let tmpSegment = []; groups.forEach(gp => { - tmpSegment = []; + tmpSegment = [unaryExpression.shift()]; for (let i = 0; i < gp.length; i++) { const token = gp[i]; const shiftOperator = isShiftOperator(gp, i); @@ -172,7 +172,9 @@ class ExpressionsPrettierVisitor { rejectAndJoin(" ", [ctx.Instanceof[0], referenceType.shift()]) ); } else if (matchCategory(token, "'AssignmentOperator'")) { - tmpSegment.push(rejectAndJoin(line, [token, expression.shift()])); + tmpSegment.push( + indent(rejectAndJoin(line, [token, expression.shift()])) + ); } else if ( shiftOperator === "shiftLeft" || shiftOperator === "shiftRight" @@ -194,16 +196,21 @@ class ExpressionsPrettierVisitor { i += 2; } else if (matchCategory(token, "'BinaryOperator'")) { tmpSegment.push( - rejectAndConcat([ - " ", - rejectAndJoin(line, [token, unaryExpression.shift()]) - ]) + indent(rejectAndJoin(line, [token, unaryExpression.shift()])) ); } } - allSegment.push(group(concat(tmpSegment))); + allSegment.push(group(rejectAndJoin(" ", tmpSegment))); }); - return group(rejectAndJoinSeps(sortedBinOps, allSegment)); + if (groups.length === 0) { + return unaryExpression.shift(); + } + return group( + rejectAndJoinSeps( + sortedBinOps.map(elt => concat([" ", elt, line])), + allSegment + ) + ); /* const segment = [unaryExpression.shift()]; diff --git a/packages/prettier-plugin-java/src/printers/printer-utils.js b/packages/prettier-plugin-java/src/printers/printer-utils.js index e73afba12..d3bcd18a9 100644 --- a/packages/prettier-plugin-java/src/printers/printer-utils.js +++ b/packages/prettier-plugin-java/src/printers/printer-utils.js @@ -322,6 +322,8 @@ function sortGroupTokens(ctx) { } }); + groups.push(tmpGroup); + return { groups, sortedBinOps @@ -329,9 +331,10 @@ function sortGroupTokens(ctx) { } function isShiftOperator(tokens, index) { - if (tokens.length < index + 1) { + if (tokens.length <= index + 1) { return "none"; } + if ( tokens[index].image === "<" && tokens[index + 1].image === "<" && diff --git a/packages/prettier-plugin-java/test/unit-test/binary_expressions/_output.java b/packages/prettier-plugin-java/test/unit-test/binary_expressions/_output.java index 46d2e0fbf..dfde4da16 100644 --- a/packages/prettier-plugin-java/test/unit-test/binary_expressions/_output.java +++ b/packages/prettier-plugin-java/test/unit-test/binary_expressions/_output.java @@ -2,7 +2,8 @@ public class BinaryOperations { public void binaryOperationThatShouldBreak() { System.out.println( - "This operation with two very long string should break" + "in a very nice way" + "This operation with two very long string should break" + + "in a very nice way" ); } diff --git a/packages/prettier-plugin-java/test/unit-test/comments/class/_output.java b/packages/prettier-plugin-java/test/unit-test/comments/class/_output.java index 20317f7af..770e9c87f 100644 --- a/packages/prettier-plugin-java/test/unit-test/comments/class/_output.java +++ b/packages/prettier-plugin-java/test/unit-test/comments/class/_output.java @@ -148,7 +148,8 @@ private ArrayTable( * elements but rowKeySet() will be empty and containsRow() won't * acknolwedge them. */ - rowKeyToIndex = Maps.indexMap(rowList); + rowKeyToIndex = + Maps.indexMap(rowList); columnKeyToIndex = Maps.indexMap(columnList); @SuppressWarnings( diff --git a/packages/prettier-plugin-java/test/unit-test/expressions/_output.java b/packages/prettier-plugin-java/test/unit-test/expressions/_output.java index 98fc16eb5..8b3c769fe 100644 --- a/packages/prettier-plugin-java/test/unit-test/expressions/_output.java +++ b/packages/prettier-plugin-java/test/unit-test/expressions/_output.java @@ -100,7 +100,8 @@ public void printIf() { if ( myValue != 42 && 42 / 42 || - myValue & 42 && + myValue & + 42 && myValue > 42 || myValue < 42 && myValue == 42 @@ -122,7 +123,8 @@ public void printSwitch() { switch ( myValue != 42 && 42 / 42 || - myValue & 42 && + myValue & + 42 && myValue > 42 || myValue < 42 && myValue == 42 @@ -148,7 +150,8 @@ public void printWhile() { while ( myValue != 42 && 42 / 42 || - myValue & 42 && + myValue & + 42 && myValue > 42 || myValue < 42 && myValue == 42 @@ -176,7 +179,8 @@ public void printDoWhile() { } while ( myValue != 42 && 42 / 42 || - myValue & 42 && + myValue & + 42 && myValue > 42 || myValue < 42 && myValue == 42 @@ -206,7 +210,8 @@ public void printSynchronized() { synchronized ( myValue != 42 && 42 / 42 || - myValue & 42 && + myValue & + 42 && myValue > 42 || myValue < 42 && myValue == 42 From 8fd2e69664a884f5dec1745684848c9ae1e5b4f8 Mon Sep 17 00:00:00 2001 From: Ling-Chun SO Date: Thu, 20 Jun 2019 17:49:27 +0200 Subject: [PATCH 09/10] cleanup --- .../src/printers/expressions.js | 84 +++---------------- .../src/printers/printer-utils.js | 30 +++---- 2 files changed, 27 insertions(+), 87 deletions(-) diff --git a/packages/prettier-plugin-java/src/printers/expressions.js b/packages/prettier-plugin-java/src/printers/expressions.js index 50a6baf3f..1c8a9ada3 100644 --- a/packages/prettier-plugin-java/src/printers/expressions.js +++ b/packages/prettier-plugin-java/src/printers/expressions.js @@ -18,7 +18,7 @@ const { findDeepElementInPartsArray, isExplicitLambdaParameter, putIntoBraces, - sortGroupTokens, + separateTokensIntoGroups, isShiftOperator } = require("./printer-utils"); @@ -158,15 +158,15 @@ class ExpressionsPrettierVisitor { const expression = this.mapVisit(ctx.expression); const unaryExpression = this.mapVisit(ctx.unaryExpression); - const { groups, sortedBinOps } = sortGroupTokens(ctx); + const { groups, sortedBinOps } = separateTokensIntoGroups(ctx); const allSegment = []; let tmpSegment = []; - groups.forEach(gp => { + groups.forEach(subgroup => { tmpSegment = [unaryExpression.shift()]; - for (let i = 0; i < gp.length; i++) { - const token = gp[i]; - const shiftOperator = isShiftOperator(gp, i); + for (let i = 0; i < subgroup.length; i++) { + const token = subgroup[i]; + const shiftOperator = isShiftOperator(subgroup, i); if (token.tokenType.tokenName === "Instanceof") { tmpSegment.push( rejectAndJoin(" ", [ctx.Instanceof[0], referenceType.shift()]) @@ -176,20 +176,20 @@ class ExpressionsPrettierVisitor { indent(rejectAndJoin(line, [token, expression.shift()])) ); } else if ( - shiftOperator === "shiftLeft" || - shiftOperator === "shiftRight" + shiftOperator === "leftShift" || + shiftOperator === "rightShift" ) { tmpSegment.push( rejectAndJoin(" ", [ - rejectAndConcat([token, gp[i + 1]]), + rejectAndConcat([token, subgroup[i + 1]]), unaryExpression.shift() ]) ); i++; - } else if (shiftOperator === "doubleShiftRight") { + } else if (shiftOperator === "doubleRightShift") { tmpSegment.push( rejectAndJoin(" ", [ - rejectAndConcat([token, gp[i + 1], gp[i + 2]]), + rejectAndConcat([token, subgroup[i + 1], subgroup[i + 2]]), unaryExpression.shift() ]) ); @@ -211,68 +211,6 @@ class ExpressionsPrettierVisitor { allSegment ) ); - - /* - const segment = [unaryExpression.shift()]; - for (let i = 0; i < sortedTokens.length; i++) { - const token = sortedTokens[i]; - if (token.tokenType.tokenName === "Instanceof") { - segment.push( - rejectAndJoin(" ", [ctx.Instanceof[0], referenceType.shift()]) - ); - } else if (matchCategory(token, "'AssignmentOperator'")) { - segment.push(rejectAndJoin(" ", [token, expression.shift()])); - } else if ( - i + 1 < sortedTokens.length && - ((sortedTokens[i].image === ">" && - sortedTokens[i + 1].image === ">" && - sortedTokens[i].startOffset === - sortedTokens[i + 1].startOffset - 1) || - (sortedTokens[i].image === "<" && - sortedTokens[i + 1].image === "<" && - sortedTokens[i].startOffset === - sortedTokens[i + 1].startOffset - 1)) - ) { - if ( - sortedTokens[i + 2] && - sortedTokens[i + 2].image === ">" && - sortedTokens[i + 1].startOffset === - sortedTokens[i + 2].startOffset - 1 - ) { - segment.push( - rejectAndJoin(" ", [ - rejectAndConcat([ - token, - sortedTokens[i + 1], - sortedTokens[i + 2] - ]), - unaryExpression.shift() - ]) - ); - i++; - } else { - segment.push( - rejectAndJoin(" ", [ - rejectAndConcat([token, sortedTokens[i + 1]]), - unaryExpression.shift() - ]) - ); - } - i++; - } else if (matchCategory(token, "'BinaryOperator'")) { - let separator = " "; - if (token.image === "&&" || token.image === "||") { - separator = line; - } - segment.push( - rejectAndConcat([ - " ", - rejectAndJoin(separator, [token, unaryExpression.shift()]) - ]) - ); - } - } - return group(rejectAndJoin(" ", segment));*/ } unaryExpression(ctx) { diff --git a/packages/prettier-plugin-java/src/printers/printer-utils.js b/packages/prettier-plugin-java/src/printers/printer-utils.js index d3bcd18a9..b95b87a72 100644 --- a/packages/prettier-plugin-java/src/printers/printer-utils.js +++ b/packages/prettier-plugin-java/src/printers/printer-utils.js @@ -295,8 +295,11 @@ function putIntoCurlyBraces(argument, separator, LBrace, RBrace) { } const andOrBinaryOperators = new Set(["&&", "||", "&", "|", "^"]); -function sortGroupTokens(ctx) { - // separate tokens into groups by andOrBinaryOperators ("&&", "||", "&", "|", "^") +function separateTokensIntoGroups(ctx) { + /** + * separate tokens into groups by andOrBinaryOperators ("&&", "||", "&", "|", "^") + * in order to break those operators in priority. + */ const tokens = sortTokens( ctx.Instanceof, ctx.AssignmentOperator, @@ -309,14 +312,13 @@ function sortGroupTokens(ctx) { const sortedBinOps = []; let tmpGroup = []; tokens.forEach(token => { - if (matchCategory(token, "'BinaryOperator'")) { - if (andOrBinaryOperators.has(token.image)) { - sortedBinOps.push(token); - groups.push(tmpGroup); - tmpGroup = []; - } else { - tmpGroup.push(token); - } + if ( + matchCategory(token, "'BinaryOperator'") && + andOrBinaryOperators.has(token.image) + ) { + sortedBinOps.push(token); + groups.push(tmpGroup); + tmpGroup = []; } else { tmpGroup.push(token); } @@ -340,7 +342,7 @@ function isShiftOperator(tokens, index) { tokens[index + 1].image === "<" && tokens[index].startOffset === tokens[index + 1].startOffset - 1 ) { - return "shiftLeft"; + return "leftShift"; } if ( tokens[index].image === ">" && @@ -352,9 +354,9 @@ function isShiftOperator(tokens, index) { tokens[index + 2].image === ">" && tokens[index + 1].startOffset === tokens[index + 2].startOffset - 1 ) { - return "doubleShiftRight"; + return "doubleRightShift"; } - return "shiftRight"; + return "rightShift"; } return "none"; @@ -382,6 +384,6 @@ module.exports = { handleClassBodyDeclaration, putIntoBraces, putIntoCurlyBraces, - sortGroupTokens, + separateTokensIntoGroups, isShiftOperator }; From 129dc28d86db11e240ac3b31a7e7b610ec65d1fe Mon Sep 17 00:00:00 2001 From: Ling-Chun SO Date: Fri, 21 Jun 2019 12:02:12 +0200 Subject: [PATCH 10/10] renaming variables --- .../src/printers/expressions.js | 33 +++++++++++-------- .../src/printers/printer-utils.js | 14 ++++---- 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/packages/prettier-plugin-java/src/printers/expressions.js b/packages/prettier-plugin-java/src/printers/expressions.js index 1c8a9ada3..07c03b567 100644 --- a/packages/prettier-plugin-java/src/printers/expressions.js +++ b/packages/prettier-plugin-java/src/printers/expressions.js @@ -158,28 +158,31 @@ class ExpressionsPrettierVisitor { const expression = this.mapVisit(ctx.expression); const unaryExpression = this.mapVisit(ctx.unaryExpression); - const { groups, sortedBinOps } = separateTokensIntoGroups(ctx); - const allSegment = []; - let tmpSegment = []; + const { + groupsOfOperator, + sortedBinaryOperators + } = separateTokensIntoGroups(ctx); + const segmentsSplittedByBinaryOperator = []; + let currentSegment = []; - groups.forEach(subgroup => { - tmpSegment = [unaryExpression.shift()]; + groupsOfOperator.forEach(subgroup => { + currentSegment = [unaryExpression.shift()]; for (let i = 0; i < subgroup.length; i++) { const token = subgroup[i]; const shiftOperator = isShiftOperator(subgroup, i); if (token.tokenType.tokenName === "Instanceof") { - tmpSegment.push( + currentSegment.push( rejectAndJoin(" ", [ctx.Instanceof[0], referenceType.shift()]) ); } else if (matchCategory(token, "'AssignmentOperator'")) { - tmpSegment.push( + currentSegment.push( indent(rejectAndJoin(line, [token, expression.shift()])) ); } else if ( shiftOperator === "leftShift" || shiftOperator === "rightShift" ) { - tmpSegment.push( + currentSegment.push( rejectAndJoin(" ", [ rejectAndConcat([token, subgroup[i + 1]]), unaryExpression.shift() @@ -187,7 +190,7 @@ class ExpressionsPrettierVisitor { ); i++; } else if (shiftOperator === "doubleRightShift") { - tmpSegment.push( + currentSegment.push( rejectAndJoin(" ", [ rejectAndConcat([token, subgroup[i + 1], subgroup[i + 2]]), unaryExpression.shift() @@ -195,20 +198,22 @@ class ExpressionsPrettierVisitor { ); i += 2; } else if (matchCategory(token, "'BinaryOperator'")) { - tmpSegment.push( + currentSegment.push( indent(rejectAndJoin(line, [token, unaryExpression.shift()])) ); } } - allSegment.push(group(rejectAndJoin(" ", tmpSegment))); + segmentsSplittedByBinaryOperator.push( + group(rejectAndJoin(" ", currentSegment)) + ); }); - if (groups.length === 0) { + if (groupsOfOperator.length === 0) { return unaryExpression.shift(); } return group( rejectAndJoinSeps( - sortedBinOps.map(elt => concat([" ", elt, line])), - allSegment + sortedBinaryOperators.map(elt => concat([" ", elt, line])), + segmentsSplittedByBinaryOperator ) ); } diff --git a/packages/prettier-plugin-java/src/printers/printer-utils.js b/packages/prettier-plugin-java/src/printers/printer-utils.js index b95b87a72..bb4331d56 100644 --- a/packages/prettier-plugin-java/src/printers/printer-utils.js +++ b/packages/prettier-plugin-java/src/printers/printer-utils.js @@ -308,27 +308,27 @@ function separateTokensIntoGroups(ctx) { ctx.BinaryOperator ); - const groups = []; - const sortedBinOps = []; + const groupsOfOperator = []; + const sortedBinaryOperators = []; let tmpGroup = []; tokens.forEach(token => { if ( matchCategory(token, "'BinaryOperator'") && andOrBinaryOperators.has(token.image) ) { - sortedBinOps.push(token); - groups.push(tmpGroup); + sortedBinaryOperators.push(token); + groupsOfOperator.push(tmpGroup); tmpGroup = []; } else { tmpGroup.push(token); } }); - groups.push(tmpGroup); + groupsOfOperator.push(tmpGroup); return { - groups, - sortedBinOps + groupsOfOperator, + sortedBinaryOperators }; }