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 48be783f3..aab06c5ec 100644 --- a/packages/prettier-plugin-java/src/printers/blocks-and-statements.js +++ b/packages/prettier-plugin-java/src/printers/blocks-and-statements.js @@ -94,7 +94,9 @@ class BlocksAndStatementPrettierVisitor { delete newStatement.leadingComments; } - newLabelStatement.leadingComments = labeledStatementLeadingComments; + if (labeledStatementLeadingComments.length !== 0) { + newLabelStatement.leadingComments = labeledStatementLeadingComments; + } newLabelStatement.children.Colon[0] = newColon; newLabelStatement.children.statement[0] = newStatement; diff --git a/packages/prettier-plugin-java/src/printers/comments.js b/packages/prettier-plugin-java/src/printers/comments.js index 8437907a5..3207128b6 100644 --- a/packages/prettier-plugin-java/src/printers/comments.js +++ b/packages/prettier-plugin-java/src/printers/comments.js @@ -77,18 +77,34 @@ function getNodeLeadingComments(node) { function getLeadingComments(nodeOrToken, location) { const arr = []; if (Object.prototype.hasOwnProperty.call(nodeOrToken, "leadingComments")) { - nodeOrToken.leadingComments.forEach(comment => { + let previousEndLine = nodeOrToken.leadingComments[0].endLine; + let step; + arr.push(concat(formatComment(nodeOrToken.leadingComments[0]))); + for (let i = 1; i < nodeOrToken.leadingComments.length; i++) { + step = nodeOrToken.leadingComments[i].startLine - previousEndLine; if ( - comment.tokenType.name === "LineComment" || - comment.endLine !== location.startLine || - comment.startOffset > location.startOffset + step === 1 || + nodeOrToken.leadingComments[i].startOffset > location.startOffset ) { - arr.push(concat(formatComment(comment))); arr.push(hardline); - } else { - arr.push(concat(formatComment(comment))); + } else if (step > 1) { + arr.push(hardline, hardline); } - }); + + arr.push(concat(formatComment(nodeOrToken.leadingComments[i]))); + previousEndLine = nodeOrToken.leadingComments[i].endLine; + } + + step = location.startLine - previousEndLine; + if ( + step === 1 || + nodeOrToken.leadingComments[nodeOrToken.leadingComments.length - 1] + .startOffset > location.startOffset + ) { + arr.push(hardline); + } else if (step > 1) { + arr.push(hardline, hardline); + } } return arr; diff --git a/packages/prettier-plugin-java/src/printers/packages-and-modules.js b/packages/prettier-plugin-java/src/printers/packages-and-modules.js index 2f4e56718..7386f663b 100644 --- a/packages/prettier-plugin-java/src/printers/packages-and-modules.js +++ b/packages/prettier-plugin-java/src/printers/packages-and-modules.js @@ -19,12 +19,7 @@ class PackagesAndModulesPrettierVisitor { const compilationUnit = ctx.ordinaryCompilationUnit || ctx.modularCompilationUnit; - // Do not add additional line if only comments in file - const additionalLine = isNaN(compilationUnit[0].location.startOffset) - ? "" - : line; - - return concat([this.visit(compilationUnit[0]), additionalLine]); + return concat([this.visit(compilationUnit[0]), line]); } ordinaryCompilationUnit(ctx) { diff --git a/packages/prettier-plugin-java/src/printers/printer-utils.js b/packages/prettier-plugin-java/src/printers/printer-utils.js index 4365e5806..88401ff0c 100644 --- a/packages/prettier-plugin-java/src/printers/printer-utils.js +++ b/packages/prettier-plugin-java/src/printers/printer-utils.js @@ -276,10 +276,17 @@ function getBlankLinesSeparator(ctx) { const separators = []; for (let i = 0; i < ctx.length - 1; i++) { - const previousRuleEndLine = ctx[i].location.endLine; - const nextRuleStartLine = ctx[i + 1].location.startLine; + const previousRuleEndLineWithComment = + ctx[i].trailingComments !== undefined + ? ctx[i].trailingComments[ctx[i].trailingComments.length - 1].endLine + : ctx[i].location.endLine; - if (nextRuleStartLine > previousRuleEndLine + 1) { + const nextRuleStartLineWithComment = + ctx[i + 1].leadingComments !== undefined + ? ctx[i + 1].leadingComments[0].startLine + : ctx[i + 1].location.startLine; + + if (nextRuleStartLineWithComment - previousRuleEndLineWithComment > 1) { separators.push(concat([hardline, hardline])); } else { separators.push(hardline); diff --git a/packages/prettier-plugin-java/test/unit-test/blank_lines/_output.java b/packages/prettier-plugin-java/test/unit-test/blank_lines/_output.java index 8b3dae747..622d32862 100644 --- a/packages/prettier-plugin-java/test/unit-test/blank_lines/_output.java +++ b/packages/prettier-plugin-java/test/unit-test/blank_lines/_output.java @@ -38,7 +38,6 @@ public void shouldHandleBlankLinesInBlock() { int l = 4; int m = 4; - // Add a line before comment int n = 4; for (int p = 0; p < 3; p++); 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 e7a470495..2222d4dd9 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 @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.google.common.collect; import static com.google.common.base.Preconditions.checkArgument; @@ -113,6 +114,7 @@ public static ArrayTable create( * custom serialization logic is needed to support different enum sizes during * serialization and deserialization. */ + /** * Creates an {@code ArrayTable} with the mappings in the provided table. * @@ -174,7 +176,6 @@ private ArrayTable( ) V[][] tmpArray = (V[][]) new Object[rowList.size()][columnList.size()]; array = tmpArray; - // Necessary because in GWT the arrays are initialized with "undefined" instead of null. eraseAll(); } @@ -272,6 +273,7 @@ Spliterator> entrySpliterator() { } // TODO(lowasser): consider an optimized values() implementation + @Override public boolean containsKey(@Nullable Object key) { return keyIndex.containsKey(key); @@ -492,6 +494,7 @@ public V put(R rowKey, C columnKey, @Nullable V value) { * TODO(jlevy): Consider creating a merge() method, similar to putAll() but * copying non-null values only. */ + /** * {@inheritDoc} * @@ -544,6 +547,7 @@ public V erase(@Nullable Object rowKey, @Nullable Object columnKey) { } // TODO(jlevy): Add eraseRow and eraseColumn methods? + @Override public int size() { return rowList.size() * columnList.size(); diff --git a/packages/prettier-plugin-java/test/unit-test/formatter-on-off/inside_block/_output.java b/packages/prettier-plugin-java/test/unit-test/formatter-on-off/inside_block/_output.java index 590760a36..a597a0c38 100644 --- a/packages/prettier-plugin-java/test/unit-test/formatter-on-off/inside_block/_output.java +++ b/packages/prettier-plugin-java/test/unit-test/formatter-on-off/inside_block/_output.java @@ -14,7 +14,6 @@ public void myMethod( ) { // @formatter:off System.out.println("This operation with two very long string should not break because the formatter is off"); - // @formatter:on System.out.println( "This operation with two very long string should break because the formatter is on"