diff --git a/changelog_unreleased/yaml/pr-9143.md b/changelog_unreleased/yaml/pr-9143.md new file mode 100644 index 000000000000..9ddb644727ee --- /dev/null +++ b/changelog_unreleased/yaml/pr-9143.md @@ -0,0 +1,27 @@ +#### Fix printing doubles a blank line before a comment (#9143 by @sosukesuzuki) + + +```yaml +# Input +- foo: 0 + bar: 1 + + # baz: 2 +- quux: 3 + +# Prettier stable +- foo: 0 + bar: 1 + + + # baz: 2 +- quux: 3 + +# Prettier master +- foo: 0 + bar: 1 + + # baz: 2 +- quux: 3 + +``` diff --git a/src/language-yaml/printer-yaml.js b/src/language-yaml/printer-yaml.js index 42a51a471506..460bd0d3d1b1 100644 --- a/src/language-yaml/printer-yaml.js +++ b/src/language-yaml/printer-yaml.js @@ -127,8 +127,7 @@ function genericPrint(path, options, print) { ]) ) : "", - nextEmptyLine, - hasEndComments(node) && !isNode(node, ["documentHead", "documentBody"]) + shouldPrintEndComments(node) ? align( node.type === "sequenceItem" ? 2 : 0, concat([ @@ -153,6 +152,7 @@ function genericPrint(path, options, print) { ]) ) : "", + nextEmptyLine, ]); } @@ -703,6 +703,12 @@ function needsSpaceInFrontOfMappingValue(node) { return node.key.content && node.key.content.type === "alias"; } +function shouldPrintEndComments(node) { + return ( + hasEndComments(node) && !isNode(node, ["documentHead", "documentBody"]) + ); +} + function printNextEmptyLine(path, originalText) { const node = path.getValue(); const root = path.stack[0]; @@ -713,7 +719,9 @@ function printNextEmptyLine(path, originalText) { if (!root.isNextEmptyLinePrintedChecklist[node.position.end.line]) { if (isNextLineEmpty(node, originalText)) { root.isNextEmptyLinePrintedChecklist[node.position.end.line] = true; - return softline; + if (!shouldPrintEndComments(path.getParentNode())) { + return softline; + } } } diff --git a/tests/yaml/comment/__snapshots__/jsfmt.spec.js.snap b/tests/yaml/comment/__snapshots__/jsfmt.spec.js.snap index 3a14d8b4ccb3..2217ba604a6d 100644 --- a/tests/yaml/comment/__snapshots__/jsfmt.spec.js.snap +++ b/tests/yaml/comment/__snapshots__/jsfmt.spec.js.snap @@ -137,6 +137,44 @@ printWidth: 80 ================================================================================ `; +exports[`issue-9130.yml format 1`] = ` +====================================options===================================== +parsers: ["yaml"] +printWidth: 80 + | printWidth +=====================================input====================================== +- foo: 0 + bar: 1 + + # baz: 2 +- quux: 3 + +- foo: 0 + bar: 1 + + # baz: 2 + + # baz: 3 +- quux: 3 + +=====================================output===================================== +- foo: 0 + bar: 1 + + # baz: 2 +- quux: 3 + +- foo: 0 + bar: 1 + + # baz: 2 + + # baz: 3 +- quux: 3 + +================================================================================ +`; + exports[`map.yml format 1`] = ` ====================================options===================================== parsers: ["yaml"] @@ -282,6 +320,69 @@ foo2: ================================================================================ `; +exports[`map-4.yml format 1`] = ` +====================================options===================================== +parsers: ["yaml"] +printWidth: 80 + | printWidth +=====================================input====================================== +before: + + # before.comment +after: + # after.comment + +before-after: + + # before-after.comment + +none: + # none.comment +before(2 line): + + + # before.comment +after(2 line): + # after.comment + + +before-after(2 line): + + + # before-after.comment + + +none(2): + # none.comment +=====================================output===================================== +before: + +# before.comment +after: + # after.comment + +before-after: + + # before-after.comment + +none: + # none.comment +before(2 line): + + # before.comment +after(2 line): + # after.comment + +before-after(2 line): + + # before-after.comment + +none(2): + # none.comment + +================================================================================ +`; + exports[`object.yml format 1`] = ` ====================================options===================================== parsers: ["yaml"] @@ -336,6 +437,107 @@ printWidth: 80 ================================================================================ `; +exports[`sequence.yml format 1`] = ` +====================================options===================================== +parsers: ["yaml"] +printWidth: 80 + | printWidth +=====================================input====================================== +- - a + + # - b + + # - c + + - e + +- - a + + # - b + + # - c + +=====================================output===================================== +- - a + + # - b + + # - c + + - e + +- - a + + # - b + + # - c + +================================================================================ +`; + +exports[`sequence-2.yml format 1`] = ` +====================================options===================================== +parsers: ["yaml"] +printWidth: 80 + | printWidth +=====================================input====================================== +- before + + # before.comment +- after + # after.comment + +- before-after + + # before-after.comment + +- none: + # none.comment +- before(2 line) + + + # before.comment +- after(2 line) + # after.comment + + +- before-after(2 line) + + + # before-after.comment + + +- none(2) + # none.comment +=====================================output===================================== +- before + +# before.comment +- after + # after.comment + +- before-after + + # before-after.comment + +- none: + # none.comment +- before(2 line) + + # before.comment +- after(2 line) + # after.comment + +- before-after(2 line) + + # before-after.comment + +- none(2) + # none.comment + +================================================================================ +`; + exports[`set.yml format 1`] = ` ====================================options===================================== parsers: ["yaml"] diff --git a/tests/yaml/comment/issue-9130.yml b/tests/yaml/comment/issue-9130.yml new file mode 100644 index 000000000000..ba54265aa622 --- /dev/null +++ b/tests/yaml/comment/issue-9130.yml @@ -0,0 +1,13 @@ +- foo: 0 + bar: 1 + + # baz: 2 +- quux: 3 + +- foo: 0 + bar: 1 + + # baz: 2 + + # baz: 3 +- quux: 3 diff --git a/tests/yaml/comment/map-4.yml b/tests/yaml/comment/map-4.yml new file mode 100644 index 000000000000..2f80f700b134 --- /dev/null +++ b/tests/yaml/comment/map-4.yml @@ -0,0 +1,28 @@ +before: + + # before.comment +after: + # after.comment + +before-after: + + # before-after.comment + +none: + # none.comment +before(2 line): + + + # before.comment +after(2 line): + # after.comment + + +before-after(2 line): + + + # before-after.comment + + +none(2): + # none.comment \ No newline at end of file diff --git a/tests/yaml/comment/sequence-2.yml b/tests/yaml/comment/sequence-2.yml new file mode 100644 index 000000000000..24be5d59579c --- /dev/null +++ b/tests/yaml/comment/sequence-2.yml @@ -0,0 +1,28 @@ +- before + + # before.comment +- after + # after.comment + +- before-after + + # before-after.comment + +- none: + # none.comment +- before(2 line) + + + # before.comment +- after(2 line) + # after.comment + + +- before-after(2 line) + + + # before-after.comment + + +- none(2) + # none.comment \ No newline at end of file diff --git a/tests/yaml/comment/sequence.yml b/tests/yaml/comment/sequence.yml new file mode 100644 index 000000000000..950714151751 --- /dev/null +++ b/tests/yaml/comment/sequence.yml @@ -0,0 +1,13 @@ +- - a + + # - b + + # - c + + - e + +- - a + + # - b + + # - c