diff --git a/changelog_unreleased/javascript/10693.md b/changelog_unreleased/javascript/10693.md new file mode 100644 index 000000000..562aad667 --- /dev/null +++ b/changelog_unreleased/javascript/10693.md @@ -0,0 +1,24 @@ +#### Improve formatting for do expression (#10693 by @sosukesuzuki) + + +```js +// Input +expect(do { + var bar = "foo"; + bar; +}).toBe("foo"); + +// Prettier stable +expect( + do { + var bar = "foo"; + bar; + } +).toBe("foo"); + +// Prettier main +expect(do { + var bar = "foo"; + bar; +}).toBe("foo"); +``` diff --git a/src/language-js/print/call-arguments.js b/src/language-js/print/call-arguments.js index d87bf8b1b..bb19861d0 100644 --- a/src/language-js/print/call-arguments.js +++ b/src/language-js/print/call-arguments.js @@ -247,7 +247,8 @@ function couldGroupArg(arg, arrowChainRecursion = false) { (!arrowChainRecursion && (isCallExpression(arg.body) || arg.body.type === "ConditionalExpression")) || - isJsxNode(arg.body))) + isJsxNode(arg.body))) || + arg.type === "DoExpression" ); } diff --git a/tests/js/do/__snapshots__/jsfmt.spec.js.snap b/tests/js/do/__snapshots__/jsfmt.spec.js.snap index a82e84eba..454b5bb47 100644 --- a/tests/js/do/__snapshots__/jsfmt.spec.js.snap +++ b/tests/js/do/__snapshots__/jsfmt.spec.js.snap @@ -1,5 +1,113 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`call-arguments.js [espree] format 1`] = ` +"Unexpected token do (3:3) + 1 | // from https://github.com/babel/babel/pull/13122/ + 2 | expect( +> 3 | do { + | ^ + 4 | var bar = \\"foo\\"; + 5 | if (!bar) throw new Error( + 6 | \\"unreachable\\"" +`; + +exports[`call-arguments.js [meriyah] format 1`] = ` +"[3:4]: Unexpected token: 'do' (3:4) + 1 | // from https://github.com/babel/babel/pull/13122/ + 2 | expect( +> 3 | do { + | ^ + 4 | var bar = \\"foo\\"; + 5 | if (!bar) throw new Error( + 6 | \\"unreachable\\"" +`; + +exports[`call-arguments.js format 1`] = ` +====================================options===================================== +parsers: ["babel"] +printWidth: 80 + | printWidth +=====================================input====================================== +// from https://github.com/babel/babel/pull/13122/ +expect( + do { + var bar = "foo"; + if (!bar) throw new Error( + "unreachable" + ) + bar; + } +).toBe("foo"); +expect(bar).toBe("foo"); + +var x = do { + var bar = "foo"; + if (!bar) throw new Error( + "unreachable" + ) + bar; +}; + +expect( + do { + var bar = "foo"; + bar; + } +).toBe("foo"); +expect(bar).toBe("foo"); + +var x = do { + var bar = "foo"; + bar; +}; + +expect( + () => do { + () => { + var bar = "foo"; + }; + bar; + } +).toThrow(ReferenceError); + +=====================================output===================================== +// from https://github.com/babel/babel/pull/13122/ +expect(do { + var bar = "foo"; + if (!bar) throw new Error("unreachable"); + bar; +}).toBe("foo"); +expect(bar).toBe("foo"); + +var x = do { + var bar = "foo"; + if (!bar) throw new Error("unreachable"); + bar; +}; + +expect(do { + var bar = "foo"; + bar; +}).toBe("foo"); +expect(bar).toBe("foo"); + +var x = do { + var bar = "foo"; + bar; +}; + +expect( + () => do { + () => { + var bar = "foo"; + }; + bar; + } +).toThrow(ReferenceError); + +================================================================================ +`; + exports[`do.js [espree] format 1`] = ` "Unexpected token do (3:5) 1 | const envSpecific = { diff --git a/tests/js/do/call-arguments.js b/tests/js/do/call-arguments.js new file mode 100644 index 000000000..485d81744 --- /dev/null +++ b/tests/js/do/call-arguments.js @@ -0,0 +1,41 @@ +// from https://github.com/babel/babel/pull/13122/ +expect( + do { + var bar = "foo"; + if (!bar) throw new Error( + "unreachable" + ) + bar; + } +).toBe("foo"); +expect(bar).toBe("foo"); + +var x = do { + var bar = "foo"; + if (!bar) throw new Error( + "unreachable" + ) + bar; +}; + +expect( + do { + var bar = "foo"; + bar; + } +).toBe("foo"); +expect(bar).toBe("foo"); + +var x = do { + var bar = "foo"; + bar; +}; + +expect( + () => do { + () => { + var bar = "foo"; + }; + bar; + } +).toThrow(ReferenceError);