diff --git a/packages/babel-generator/src/node/parentheses.js b/packages/babel-generator/src/node/parentheses.js index 95c32050f7..40b43f9413 100644 --- a/packages/babel-generator/src/node/parentheses.js +++ b/packages/babel-generator/src/node/parentheses.js @@ -59,8 +59,12 @@ export function UpdateExpression(node: Object, parent: Object): boolean { return ( // (foo++).test(), (foo++)[0] t.isMemberExpression(parent, { object: node }) || + // (foo++)?.test(), (foo++)?.[0] + t.isOptionalMemberExpression(parent, { object: node }) || // (foo++)() t.isCallExpression(parent, { callee: node }) || + // (foo++)?.() + t.isOptionalCallExpression(parent, { callee: node }) || // new (foo++)() t.isNewExpression(parent, { callee: node }) || isClassExtendsClause(node, parent) @@ -96,10 +100,13 @@ export function Binary(node: Object, parent: Object): boolean { } if ( - ((t.isCallExpression(parent) || t.isNewExpression(parent)) && + ((t.isCallExpression(parent) || + t.isOptionalCallExpression(parent) || + t.isNewExpression(parent)) && parent.callee === node) || t.isUnaryLike(parent) || - (t.isMemberExpression(parent) && parent.object === node) || + ((t.isMemberExpression(parent) || t.isOptionalMemberExpression(parent)) && + parent.object === node) || t.isAwaitExpression(parent) ) { return true; @@ -196,7 +203,9 @@ export function YieldExpression(node: Object, parent: Object): boolean { t.isBinary(parent) || t.isUnaryLike(parent) || t.isCallExpression(parent) || + t.isOptionalCallExpression(parent) || t.isMemberExpression(parent) || + t.isOptionalMemberExpression(parent) || t.isNewExpression(parent) || (t.isAwaitExpression(parent) && t.isYieldExpression(node)) || (t.isConditionalExpression(parent) && node === parent.test) || @@ -216,9 +225,12 @@ export function ClassExpression( export function UnaryLike(node: Object, parent: Object): boolean { return ( - t.isMemberExpression(parent, { object: node }) || - t.isCallExpression(parent, { callee: node }) || - t.isNewExpression(parent, { callee: node }) || + ((t.isMemberExpression(parent) || t.isOptionalMemberExpression(parent)) && + parent.object === node) || + ((t.isCallExpression(parent) || + t.isOptionalCallExpression(parent) || + t.isNewExpression(parent)) && + parent.callee === node) || t.isBinaryExpression(parent, { operator: "**", left: node }) || isClassExtendsClause(node, parent) ); @@ -317,9 +329,11 @@ function isFirstInStatement( } if ( - t.isCallExpression(parent, { callee: node }) || + ((t.isCallExpression(parent) || t.isOptionalCallExpression(parent)) && + parent.callee === node) || (t.isSequenceExpression(parent) && parent.expressions[0] === node) || - t.isMemberExpression(parent, { object: node }) || + ((t.isMemberExpression(parent) || t.isOptionalMemberExpression(parent)) && + parent.object === node) || t.isConditional(parent, { test: node }) || t.isBinary(parent, { left: node }) || t.isAssignmentExpression(parent, { left: node }) diff --git a/packages/babel-generator/test/fixtures/parentheses/await-expression/input.js b/packages/babel-generator/test/fixtures/parentheses/await-expression/input.js index 8289263007..fc65d8c01b 100644 --- a/packages/babel-generator/test/fixtures/parentheses/await-expression/input.js +++ b/packages/babel-generator/test/fixtures/parentheses/await-expression/input.js @@ -1,6 +1,7 @@ -async function asdf() { +async function foo() { (await 1) || (await 2); (await b)(); + (await b)?.(); new (await b)(); true ? (await 1) : (await 2); await (1 ? 2 : 3); @@ -10,4 +11,5 @@ async function asdf() { async function a(b) { (await xhr({ url: "views/test.html" })).data; + (await replay())?.data; } diff --git a/packages/babel-generator/test/fixtures/parentheses/await-expression/output.js b/packages/babel-generator/test/fixtures/parentheses/await-expression/output.js index f717dddcbc..e864e99394 100644 --- a/packages/babel-generator/test/fixtures/parentheses/await-expression/output.js +++ b/packages/babel-generator/test/fixtures/parentheses/await-expression/output.js @@ -1,6 +1,7 @@ -async function asdf() { +async function foo() { (await 1) || (await 2); (await b)(); + (await b)?.(); new (await b)(); true ? await 1 : await 2; await (1 ? 2 : 3); @@ -12,4 +13,5 @@ async function a(b) { (await xhr({ url: "views/test.html" })).data; + (await replay())?.data; } \ No newline at end of file diff --git a/packages/babel-generator/test/fixtures/parentheses/binary/input.js b/packages/babel-generator/test/fixtures/parentheses/binary/input.js new file mode 100644 index 0000000000..02ea8d1d29 --- /dev/null +++ b/packages/babel-generator/test/fixtures/parentheses/binary/input.js @@ -0,0 +1,2 @@ +(a + b)[0]; +(a + b)?.[0]; diff --git a/packages/babel-generator/test/fixtures/parentheses/binary/output.js b/packages/babel-generator/test/fixtures/parentheses/binary/output.js new file mode 100644 index 0000000000..e520a37ec3 --- /dev/null +++ b/packages/babel-generator/test/fixtures/parentheses/binary/output.js @@ -0,0 +1,2 @@ +(a + b)[0]; +(a + b)?.[0]; \ No newline at end of file diff --git a/packages/babel-generator/test/fixtures/parentheses/object/input.js b/packages/babel-generator/test/fixtures/parentheses/object/input.js index 1675763aab..a798dd28cc 100644 --- a/packages/babel-generator/test/fixtures/parentheses/object/input.js +++ b/packages/babel-generator/test/fixtures/parentheses/object/input.js @@ -1,2 +1,6 @@ ({}) === foo; ({}) && foo; +({})(); +({})?.(); +({}).foo; +({})?.foo; diff --git a/packages/babel-generator/test/fixtures/parentheses/object/output.js b/packages/babel-generator/test/fixtures/parentheses/object/output.js index 6af6268b0c..5c5f910eb2 100644 --- a/packages/babel-generator/test/fixtures/parentheses/object/output.js +++ b/packages/babel-generator/test/fixtures/parentheses/object/output.js @@ -1,2 +1,6 @@ ({}) === foo; -({}) && foo; \ No newline at end of file +({}) && foo; +({})(); +({})?.(); +({}).foo; +({})?.foo; \ No newline at end of file diff --git a/packages/babel-generator/test/fixtures/parentheses/unary-like/input.js b/packages/babel-generator/test/fixtures/parentheses/unary-like/input.js new file mode 100644 index 0000000000..ccc6620254 --- /dev/null +++ b/packages/babel-generator/test/fixtures/parentheses/unary-like/input.js @@ -0,0 +1,4 @@ +(void 0)(); +(void 0)?.(); +(void 0)[0]; +(void 0)?.[0]; diff --git a/packages/babel-generator/test/fixtures/parentheses/unary-like/output.js b/packages/babel-generator/test/fixtures/parentheses/unary-like/output.js new file mode 100644 index 0000000000..9179708544 --- /dev/null +++ b/packages/babel-generator/test/fixtures/parentheses/unary-like/output.js @@ -0,0 +1,4 @@ +(void 0)(); +(void 0)?.(); +(void 0)[0]; +(void 0)?.[0]; \ No newline at end of file diff --git a/packages/babel-generator/test/fixtures/parentheses/update-expression/input.js b/packages/babel-generator/test/fixtures/parentheses/update-expression/input.js index f3d794c2c9..6dd4f1efd7 100644 --- a/packages/babel-generator/test/fixtures/parentheses/update-expression/input.js +++ b/packages/babel-generator/test/fixtures/parentheses/update-expression/input.js @@ -6,3 +6,9 @@ new (a++)(); new (++a); new (a++); + +(++a)?.(); +(a++)?.(); + +(++a)?.[0]; +(a++)?.[0]; diff --git a/packages/babel-generator/test/fixtures/parentheses/update-expression/output.js b/packages/babel-generator/test/fixtures/parentheses/update-expression/output.js index 0c30f7b869..8eb3ca9c5a 100644 --- a/packages/babel-generator/test/fixtures/parentheses/update-expression/output.js +++ b/packages/babel-generator/test/fixtures/parentheses/update-expression/output.js @@ -3,4 +3,8 @@ new (++a)(); new (a++)(); new (++a)(); -new (a++)(); \ No newline at end of file +new (a++)(); +(++a)?.(); +(a++)?.(); +(++a)?.[0]; +(a++)?.[0]; diff --git a/packages/babel-generator/test/fixtures/parentheses/yield-expression/input.js b/packages/babel-generator/test/fixtures/parentheses/yield-expression/input.js index 2d6b7957f1..ac2feefa40 100644 --- a/packages/babel-generator/test/fixtures/parentheses/yield-expression/input.js +++ b/packages/babel-generator/test/fixtures/parentheses/yield-expression/input.js @@ -1,6 +1,7 @@ -function* asdf() { +function* foo() { (yield 1) || (yield 2); (yield b)(); + (yield b)?.(); new (yield b)(); (yield 1) ? (yield 2) : (yield 3); yield (1 ? 2 : 3); @@ -9,6 +10,7 @@ function* asdf() { function* a(b) { (yield xhr({ url: "views/test.html" })).data; + (yield replay())?.data; } (async function* () { diff --git a/packages/babel-generator/test/fixtures/parentheses/yield-expression/output.js b/packages/babel-generator/test/fixtures/parentheses/yield-expression/output.js index e7c3bcd100..fbf1bce8e5 100644 --- a/packages/babel-generator/test/fixtures/parentheses/yield-expression/output.js +++ b/packages/babel-generator/test/fixtures/parentheses/yield-expression/output.js @@ -1,6 +1,7 @@ -function* asdf() { +function* foo() { (yield 1) || (yield 2); (yield b)(); + (yield b)?.(); new (yield b)(); (yield 1) ? yield 2 : yield 3; yield 1 ? 2 : 3; @@ -11,8 +12,9 @@ function* a(b) { (yield xhr({ url: "views/test.html" })).data; + (yield replay())?.data; } (async function* () { await (yield 1); -}); +}); \ No newline at end of file