From 5a627651ff648edd38bd0b5e667210a8a1f4e4a1 Mon Sep 17 00:00:00 2001 From: Gleb Dolzhikov Date: Tue, 23 Aug 2022 15:56:52 +0300 Subject: [PATCH] fix: line breaks in multiline strings, issue 13157 (#13274) Co-authored-by: Georgii Dolzhykov Co-authored-by: Gleb Dolzhikov Co-authored-by: fisker Cheung --- changelog_unreleased/javascript/13274.md | 34 ++++++++++ src/language-js/print/flow.js | 3 +- src/language-js/print/literal.js | 5 +- .../literal/__snapshots__/jsfmt.spec.js.snap | 27 ++++++++ tests/format/flow/literal/jsfmt.spec.js | 1 + tests/format/flow/literal/multiline.js | 6 ++ .../strings/__snapshots__/jsfmt.spec.js.snap | 65 +++++++++++++++++++ tests/format/js/strings/multiline-literal.js | 9 +++ .../literal/__snapshots__/jsfmt.spec.js.snap | 25 +++++++ tests/format/typescript/literal/jsfmt.spec.js | 1 + tests/format/typescript/literal/multiline.ts | 6 ++ 11 files changed, 179 insertions(+), 3 deletions(-) create mode 100644 changelog_unreleased/javascript/13274.md create mode 100644 tests/format/flow/literal/__snapshots__/jsfmt.spec.js.snap create mode 100644 tests/format/flow/literal/jsfmt.spec.js create mode 100644 tests/format/flow/literal/multiline.js create mode 100644 tests/format/js/strings/multiline-literal.js create mode 100644 tests/format/typescript/literal/__snapshots__/jsfmt.spec.js.snap create mode 100644 tests/format/typescript/literal/jsfmt.spec.js create mode 100644 tests/format/typescript/literal/multiline.ts diff --git a/changelog_unreleased/javascript/13274.md b/changelog_unreleased/javascript/13274.md new file mode 100644 index 000000000..26466f984 --- /dev/null +++ b/changelog_unreleased/javascript/13274.md @@ -0,0 +1,34 @@ +#### Fix inconsistent formatting for multiline strings (#13274 by @GlebDolzhikov) + + +```jsx +// Input +const loremIpsumFooBazBar1 = 'Multiline string\ + Multiline string\ +' + +const loremIpsumFooBazBar2 = 'Multiline string\ + Multiline string\ + Multiline string' + +// Prettier stable +const loremIpsumFooBazBar1 = "Multiline string\ + Multiline string\ +"; + +const loremIpsumFooBazBar2 = + "Multiline string\ + Multiline string\ + Multiline string"; + +// Prettier main +const loremIpsumFooBazBar1 = + "Multiline string\ + Multiline string\ +"; + +const loremIpsumFooBazBar2 = + "Multiline string\ + Multiline string\ + Multiline string"; +``` diff --git a/src/language-js/print/flow.js b/src/language-js/print/flow.js index 47ffce034..22bf76583 100644 --- a/src/language-js/print/flow.js +++ b/src/language-js/print/flow.js @@ -16,6 +16,7 @@ const { shouldPrintComma, } = require("../utils/index.js"); const { locStart, locEnd } = require("../loc.js"); +const { replaceTextEndOfLine } = require("../../document/doc-utils.js"); const { printClass } = require("./class.js"); const { printOpaqueType, @@ -278,7 +279,7 @@ function printFlow(path, options, print) { case "QualifiedTypeIdentifier": return [print("qualification"), ".", print("id")]; case "StringLiteralTypeAnnotation": - return printString(rawText(node), options); + return replaceTextEndOfLine(printString(rawText(node), options)); case "NumberLiteralTypeAnnotation": assert.strictEqual(typeof node.value, "number"); // fall through diff --git a/src/language-js/print/literal.js b/src/language-js/print/literal.js index a61a65eb3..a614bd5f4 100644 --- a/src/language-js/print/literal.js +++ b/src/language-js/print/literal.js @@ -1,5 +1,6 @@ "use strict"; const { printString, printNumber } = require("../../common/util.js"); +const { replaceTextEndOfLine } = require("../../document/doc-utils.js"); function printLiteral(path, options /*, print*/) { const node = path.getNode(); @@ -13,7 +14,7 @@ function printLiteral(path, options /*, print*/) { case "NumericLiteral": // Babel 6 Literal split return printNumber(node.extra.raw); case "StringLiteral": // Babel 6 Literal split - return printString(node.extra.raw, options); + return replaceTextEndOfLine(printString(node.extra.raw, options)); case "NullLiteral": // Babel 6 Literal split return "null"; case "BooleanLiteral": // Babel 6 Literal split @@ -40,7 +41,7 @@ function printLiteral(path, options /*, print*/) { } if (typeof value === "string") { - return printString(node.raw, options); + return replaceTextEndOfLine(printString(node.raw, options)); } return String(value); diff --git a/tests/format/flow/literal/__snapshots__/jsfmt.spec.js.snap b/tests/format/flow/literal/__snapshots__/jsfmt.spec.js.snap new file mode 100644 index 000000000..bafcf8a56 --- /dev/null +++ b/tests/format/flow/literal/__snapshots__/jsfmt.spec.js.snap @@ -0,0 +1,27 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`multiline.js format 1`] = ` +====================================options===================================== +parsers: ["flow", "babel"] +printWidth: 80 + | printWidth +=====================================input====================================== +type loremIpsumFooBazBar1 = 'Multiline string\\ + Multiline string' + +type loremIpsumFooBazBar2 = 'Multiline string\\ + Multiline string\\ + Multiline string' + +=====================================output===================================== +type loremIpsumFooBazBar1 = + "Multiline string\\ + Multiline string"; + +type loremIpsumFooBazBar2 = + "Multiline string\\ + Multiline string\\ + Multiline string"; + +================================================================================ +`; diff --git a/tests/format/flow/literal/jsfmt.spec.js b/tests/format/flow/literal/jsfmt.spec.js new file mode 100644 index 000000000..fbfa6501a --- /dev/null +++ b/tests/format/flow/literal/jsfmt.spec.js @@ -0,0 +1 @@ +run_spec(__dirname, ["flow", "babel"]); diff --git a/tests/format/flow/literal/multiline.js b/tests/format/flow/literal/multiline.js new file mode 100644 index 000000000..22648828e --- /dev/null +++ b/tests/format/flow/literal/multiline.js @@ -0,0 +1,6 @@ +type loremIpsumFooBazBar1 = 'Multiline string\ + Multiline string' + +type loremIpsumFooBazBar2 = 'Multiline string\ + Multiline string\ + Multiline string' diff --git a/tests/format/js/strings/__snapshots__/jsfmt.spec.js.snap b/tests/format/js/strings/__snapshots__/jsfmt.spec.js.snap index dc97633de..9dead4456 100644 --- a/tests/format/js/strings/__snapshots__/jsfmt.spec.js.snap +++ b/tests/format/js/strings/__snapshots__/jsfmt.spec.js.snap @@ -1,5 +1,70 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`multiline-literal.js - {"trailingComma":"all"} format 1`] = ` +====================================options===================================== +parsers: ["babel", "flow"] +printWidth: 80 +trailingComma: "all" + | printWidth +=====================================input====================================== +// https://github.com/prettier/prettier/pull/13274 + +const loremIpsumFooBazBar1 = 'Multiline string\\ + Multiline string\\ +' + +const loremIpsumFooBazBar2 = 'Multiline string\\ + Multiline string\\ + Multiline string' + +=====================================output===================================== +// https://github.com/prettier/prettier/pull/13274 + +const loremIpsumFooBazBar1 = + "Multiline string\\ + Multiline string\\ +"; + +const loremIpsumFooBazBar2 = + "Multiline string\\ + Multiline string\\ + Multiline string"; + +================================================================================ +`; + +exports[`multiline-literal.js format 1`] = ` +====================================options===================================== +parsers: ["babel", "flow"] +printWidth: 80 + | printWidth +=====================================input====================================== +// https://github.com/prettier/prettier/pull/13274 + +const loremIpsumFooBazBar1 = 'Multiline string\\ + Multiline string\\ +' + +const loremIpsumFooBazBar2 = 'Multiline string\\ + Multiline string\\ + Multiline string' + +=====================================output===================================== +// https://github.com/prettier/prettier/pull/13274 + +const loremIpsumFooBazBar1 = + "Multiline string\\ + Multiline string\\ +"; + +const loremIpsumFooBazBar2 = + "Multiline string\\ + Multiline string\\ + Multiline string"; + +================================================================================ +`; + exports[`non-octal-eight-and-nine.js [acorn] format 1`] = ` "Invalid escape sequence (3:3) 1 | // https://github.com/babel/babel/pull/11852 diff --git a/tests/format/js/strings/multiline-literal.js b/tests/format/js/strings/multiline-literal.js new file mode 100644 index 000000000..fcecf64f3 --- /dev/null +++ b/tests/format/js/strings/multiline-literal.js @@ -0,0 +1,9 @@ +// https://github.com/prettier/prettier/pull/13274 + +const loremIpsumFooBazBar1 = 'Multiline string\ + Multiline string\ +' + +const loremIpsumFooBazBar2 = 'Multiline string\ + Multiline string\ + Multiline string' diff --git a/tests/format/typescript/literal/__snapshots__/jsfmt.spec.js.snap b/tests/format/typescript/literal/__snapshots__/jsfmt.spec.js.snap new file mode 100644 index 000000000..cb42c67fc --- /dev/null +++ b/tests/format/typescript/literal/__snapshots__/jsfmt.spec.js.snap @@ -0,0 +1,25 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`multiline.ts format 1`] = ` +====================================options===================================== +parsers: ["typescript"] +printWidth: 80 + | printWidth +=====================================input====================================== +type loremIpsumFooBazBar1 = 'Multiline string\\ + Multiline string' + +type loremIpsumFooBazBar2 = 'Multiline string\\ + Multiline string\\ + Multiline string' + +=====================================output===================================== +type loremIpsumFooBazBar1 = "Multiline string\\ + Multiline string"; + +type loremIpsumFooBazBar2 = "Multiline string\\ + Multiline string\\ + Multiline string"; + +================================================================================ +`; diff --git a/tests/format/typescript/literal/jsfmt.spec.js b/tests/format/typescript/literal/jsfmt.spec.js new file mode 100644 index 000000000..2ea3bb6eb --- /dev/null +++ b/tests/format/typescript/literal/jsfmt.spec.js @@ -0,0 +1 @@ +run_spec(__dirname, ["typescript"]); diff --git a/tests/format/typescript/literal/multiline.ts b/tests/format/typescript/literal/multiline.ts new file mode 100644 index 000000000..22648828e --- /dev/null +++ b/tests/format/typescript/literal/multiline.ts @@ -0,0 +1,6 @@ +type loremIpsumFooBazBar1 = 'Multiline string\ + Multiline string' + +type loremIpsumFooBazBar2 = 'Multiline string\ + Multiline string\ + Multiline string'