From 19e9e6432eea923fdf4a9d2bc91ab91100cde046 Mon Sep 17 00:00:00 2001 From: evilebottnawi Date: Fri, 26 Apr 2019 21:26:46 +0300 Subject: [PATCH] fix(javascript): correctly handle comments in empty arrow function expressions --- CHANGELOG.unreleased.md | 20 +++++++++++++++++++ src/language-js/needs-parens.js | 4 ++++ .../__snapshots__/jsfmt.spec.js.snap | 8 ++++++++ tests/optional_chaining/chaining.js | 4 ++++ 4 files changed, 36 insertions(+) diff --git a/CHANGELOG.unreleased.md b/CHANGELOG.unreleased.md index a89a80824180..6622236d8fe3 100644 --- a/CHANGELOG.unreleased.md +++ b/CHANGELOG.unreleased.md @@ -60,3 +60,23 @@ Examples: test(/** @type {!Array} */ (arrOrString).length); test(/** @type {!Array} */ (arrOrString).length + 1); ``` + +- JavaScript: respect parenthesis around optional chaining before await ([#6087] by [@evilebottnawi]) + + + ```js + // Input + async function myFunction() { + var x = (await foo.bar.blah)?.hi; + } + + // Output (Prettier stable) + async function myFunction() { + var x = await foo.bar.blah?.hi; + } + + // Output (Prettier master) + async function myFunction() { + var x = (await foo.bar.blah)?.hi; + } + ``` diff --git a/src/language-js/needs-parens.js b/src/language-js/needs-parens.js index 51135fcae3e5..107e703277b3 100644 --- a/src/language-js/needs-parens.js +++ b/src/language-js/needs-parens.js @@ -660,6 +660,10 @@ function needsParens(path, options) { return parent.type === "MemberExpression"; case "MemberExpression": + if (parent.type === "AwaitExpression" && parent.argument === node) { + return true; + } + if ( parent.type === "BindExpression" && name === "callee" && diff --git a/tests/optional_chaining/__snapshots__/jsfmt.spec.js.snap b/tests/optional_chaining/__snapshots__/jsfmt.spec.js.snap index c8b7782e10c1..ba551bccb439 100644 --- a/tests/optional_chaining/__snapshots__/jsfmt.spec.js.snap +++ b/tests/optional_chaining/__snapshots__/jsfmt.spec.js.snap @@ -33,6 +33,10 @@ a?.b[3].c?.(x).d.e?.f[3].g?.(y).h; (list || list2)?.length; (list || list2)?.[(list || list2)]; +async function HelloWorld() { + var x = (await foo.bar.blah)?.hi; +} + =====================================output===================================== var street = user.address?.street; var fooValue = myForm.querySelector("input[name=foo]")?.value; @@ -61,5 +65,9 @@ a?.b?.c.d?.e; (list || list2)?.length; (list || list2)?.[list || list2]; +async function HelloWorld() { + var x = await (foo.bar.blah)?.hi; +} + ================================================================================ `; diff --git a/tests/optional_chaining/chaining.js b/tests/optional_chaining/chaining.js index 33b4f0e00735..eb30e5663227 100644 --- a/tests/optional_chaining/chaining.js +++ b/tests/optional_chaining/chaining.js @@ -24,3 +24,7 @@ a?.b[3].c?.(x).d.e?.f[3].g?.(y).h; (list || list2)?.length; (list || list2)?.[(list || list2)]; + +async function HelloWorld() { + var x = (await foo.bar.blah)?.hi; +}