diff --git a/changelog_unreleased/javascript/15204.md b/changelog_unreleased/javascript/15204.md new file mode 100644 index 000000000000..b0bd8339e732 --- /dev/null +++ b/changelog_unreleased/javascript/15204.md @@ -0,0 +1,16 @@ +#### Break after `=` of assignment if RHS is poorly breakable AwaitExpression or YieldExpression (#15204 by @seiyab) + + +```js +// Input +const { section, rubric, authors, tags } = await utils.upsertCommonData(mainData); + +// Prettier stable +const { section, rubric, authors, tags } = await utils.upsertCommonData( + mainData, +); + +// Prettier main +const { section, rubric, authors, tags } = + await utils.upsertCommonData(mainData); +``` diff --git a/src/language-js/print/assignment.js b/src/language-js/print/assignment.js index 8e8d032dd75a..b775194889cb 100644 --- a/src/language-js/print/assignment.js +++ b/src/language-js/print/assignment.js @@ -205,7 +205,11 @@ function shouldBreakAfterOperator(path, options, print, hasShortKey) { let node = rightNode; const propertiesForPath = []; for (;;) { - if (node.type === "UnaryExpression") { + if ( + node.type === "UnaryExpression" || + node.type === "AwaitExpression" || + (node.type === "YieldExpression" && node.argument !== null) + ) { node = node.argument; propertiesForPath.push("argument"); } else if (node.type === "TSNonNullExpression") { diff --git a/tests/format/js/assignment/__snapshots__/jsfmt.spec.js.snap b/tests/format/js/assignment/__snapshots__/jsfmt.spec.js.snap index 0ff1d7b4c1e6..90ce454a1b6b 100644 --- a/tests/format/js/assignment/__snapshots__/jsfmt.spec.js.snap +++ b/tests/format/js/assignment/__snapshots__/jsfmt.spec.js.snap @@ -278,6 +278,104 @@ printWidth: 80 ================================================================================ `; +exports[`discussion-15196.js format 1`] = ` +====================================options===================================== +parsers: ["babel", "flow", "typescript"] +printWidth: 80 + | printWidth +=====================================input====================================== +async function f() { + const { section, rubric, authors, tags } = await utils.upsertCommonData(mainData); + + const loooooooooooooooooooooooooong1 = await looooooooooooooong.looooooooooooooong.loooooong; + const loooooooooooooooooooooooooong2 = await looooooooooooooong.looooooooooooooong.loooooong(); + const loooooooooooooooooooooooooong3 = await looooooooooooooooooooooooooooooooooooooooooooog(); + const loooooooooooooooooooooooooong4 = !await looooooooooooooong.looooooooooooooong.loooooong; + const loooooooooooooooooooooooooong5 = void !!await looooooooooooooong.looooooooooooooong.loooooong; + + const longlonglonglonglonglonglong1 = await new Promise((resolve, reject) => { setTimeout(() => { resolve('foo'); }, 300); }) + const longlonglonglonglonglonglong2 = await { then(onFulfilled, onRejected) { onFulfilled(1234567890) } }; +} + +function* g() { + const { section, rubric, authors, tags } = yield utils.upsertCommonData(mainData); + + const loooooooooooooooooooooooooong1 = yield looooooooooooooong.looooooooooooooong.loooooong; + const loooooooooooooooooooooooooong2 = yield looooooooooooooong.looooooooooooooong.loooooong(); + const loooooooooooooooooooooooooong3 = yield looooooooooooooooooooooooooooooooooooooooooooog(); + const loooooooooooooooooooooooooong4 = !(yield looooooooooooooong.looooooooooooooong.loooooong); + const loooooooooooooooooooooooooong5 = void !!(yield looooooooooooooong.looooooooooooooong.loooooong); + const loooooooooooooooooooooooooong6 = yield* looooooooooooooong.looooooooooooooong.loooooong; + + const longlonglonglonglonglonglong1 = yield qwertyuiop(asdfghjkl, zxcvbnm, qwertyuiop, asdfghjkl); + const longlonglonglonglonglonglong2 = yield { qwertyuiop: 1234567890, asdfghjkl: 1234567890, zxcvbnm: 123456789 }; + + const x = yield; +} + +=====================================output===================================== +async function f() { + const { section, rubric, authors, tags } = + await utils.upsertCommonData(mainData); + + const loooooooooooooooooooooooooong1 = + await looooooooooooooong.looooooooooooooong.loooooong; + const loooooooooooooooooooooooooong2 = + await looooooooooooooong.looooooooooooooong.loooooong(); + const loooooooooooooooooooooooooong3 = + await looooooooooooooooooooooooooooooooooooooooooooog(); + const loooooooooooooooooooooooooong4 = + !(await looooooooooooooong.looooooooooooooong.loooooong); + const loooooooooooooooooooooooooong5 = + void !!(await looooooooooooooong.looooooooooooooong.loooooong); + + const longlonglonglonglonglonglong1 = await new Promise((resolve, reject) => { + setTimeout(() => { + resolve("foo"); + }, 300); + }); + const longlonglonglonglonglonglong2 = await { + then(onFulfilled, onRejected) { + onFulfilled(1234567890); + }, + }; +} + +function* g() { + const { section, rubric, authors, tags } = + yield utils.upsertCommonData(mainData); + + const loooooooooooooooooooooooooong1 = + yield looooooooooooooong.looooooooooooooong.loooooong; + const loooooooooooooooooooooooooong2 = + yield looooooooooooooong.looooooooooooooong.loooooong(); + const loooooooooooooooooooooooooong3 = + yield looooooooooooooooooooooooooooooooooooooooooooog(); + const loooooooooooooooooooooooooong4 = + !(yield looooooooooooooong.looooooooooooooong.loooooong); + const loooooooooooooooooooooooooong5 = + void !!(yield looooooooooooooong.looooooooooooooong.loooooong); + const loooooooooooooooooooooooooong6 = + yield* looooooooooooooong.looooooooooooooong.loooooong; + + const longlonglonglonglonglonglong1 = yield qwertyuiop( + asdfghjkl, + zxcvbnm, + qwertyuiop, + asdfghjkl, + ); + const longlonglonglonglonglonglong2 = yield { + qwertyuiop: 1234567890, + asdfghjkl: 1234567890, + zxcvbnm: 123456789, + }; + + const x = yield; +} + +================================================================================ +`; + exports[`issue-1419.js format 1`] = ` ====================================options===================================== parsers: ["babel", "flow", "typescript"] diff --git a/tests/format/js/assignment/discussion-15196.js b/tests/format/js/assignment/discussion-15196.js new file mode 100644 index 000000000000..b6836faaa239 --- /dev/null +++ b/tests/format/js/assignment/discussion-15196.js @@ -0,0 +1,28 @@ +async function f() { + const { section, rubric, authors, tags } = await utils.upsertCommonData(mainData); + + const loooooooooooooooooooooooooong1 = await looooooooooooooong.looooooooooooooong.loooooong; + const loooooooooooooooooooooooooong2 = await looooooooooooooong.looooooooooooooong.loooooong(); + const loooooooooooooooooooooooooong3 = await looooooooooooooooooooooooooooooooooooooooooooog(); + const loooooooooooooooooooooooooong4 = !await looooooooooooooong.looooooooooooooong.loooooong; + const loooooooooooooooooooooooooong5 = void !!await looooooooooooooong.looooooooooooooong.loooooong; + + const longlonglonglonglonglonglong1 = await new Promise((resolve, reject) => { setTimeout(() => { resolve('foo'); }, 300); }) + const longlonglonglonglonglonglong2 = await { then(onFulfilled, onRejected) { onFulfilled(1234567890) } }; +} + +function* g() { + const { section, rubric, authors, tags } = yield utils.upsertCommonData(mainData); + + const loooooooooooooooooooooooooong1 = yield looooooooooooooong.looooooooooooooong.loooooong; + const loooooooooooooooooooooooooong2 = yield looooooooooooooong.looooooooooooooong.loooooong(); + const loooooooooooooooooooooooooong3 = yield looooooooooooooooooooooooooooooooooooooooooooog(); + const loooooooooooooooooooooooooong4 = !(yield looooooooooooooong.looooooooooooooong.loooooong); + const loooooooooooooooooooooooooong5 = void !!(yield looooooooooooooong.looooooooooooooong.loooooong); + const loooooooooooooooooooooooooong6 = yield* looooooooooooooong.looooooooooooooong.loooooong; + + const longlonglonglonglonglonglong1 = yield qwertyuiop(asdfghjkl, zxcvbnm, qwertyuiop, asdfghjkl); + const longlonglonglonglonglonglong2 = yield { qwertyuiop: 1234567890, asdfghjkl: 1234567890, zxcvbnm: 123456789 }; + + const x = yield; +}