From fee52c36eb49263879ef4502e5bad57165e7d531 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Sun, 5 Apr 2020 21:45:02 +0200 Subject: [PATCH 1/4] Unify parens printing for postfix exprs: (), [...], ! --- .../babel-generator/src/node/parentheses.js | 55 +++++-------------- .../typescript/non-null-parentheses/input.js | 16 ++++++ .../typescript/non-null-parentheses/output.js | 14 +++++ .../transformation/extends-await/output.js | 2 +- .../transformation/extends-yield/output.js | 2 +- .../fixtures/minimal/async-arrow/output.js | 2 +- .../await-in-argument/output.js | 2 +- .../yield-in-argument/output.js | 2 +- .../test/fixtures/regression/8783/output.js | 2 +- 9 files changed, 51 insertions(+), 46 deletions(-) create mode 100644 packages/babel-generator/test/fixtures/typescript/non-null-parentheses/input.js create mode 100644 packages/babel-generator/test/fixtures/typescript/non-null-parentheses/output.js diff --git a/packages/babel-generator/src/node/parentheses.js b/packages/babel-generator/src/node/parentheses.js index 40b43f9413eb..c1f1c8e6da1f 100644 --- a/packages/babel-generator/src/node/parentheses.js +++ b/packages/babel-generator/src/node/parentheses.js @@ -32,6 +32,15 @@ const isClassExtendsClause = (node: Object, parent: Object): boolean => (t.isClassDeclaration(parent) || t.isClassExpression(parent)) && parent.superClass === node; +const isPostfixExpression = (node: Object, parent: Object) => + ((t.isMemberExpression(parent) || t.isOptionalMemberExpression(parent)) && + parent.object === node) || + ((t.isCallExpression(parent) || + t.isOptionalCallExpression(parent) || + t.isNewExpression(parent)) && + parent.callee === node) || + t.isTSNonNullExpression(parent); + export function NullableTypeAnnotation(node: Object, parent: Object): boolean { return t.isArrayTypeAnnotation(parent); } @@ -57,17 +66,7 @@ export function FunctionTypeAnnotation( 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) + isPostfixExpression(node, parent) || isClassExtendsClause(node, parent) ); } @@ -100,13 +99,8 @@ export function Binary(node: Object, parent: Object): boolean { } if ( - ((t.isCallExpression(parent) || - t.isOptionalCallExpression(parent) || - t.isNewExpression(parent)) && - parent.callee === node) || + isPostfixExpression(node, parent) || t.isUnaryLike(parent) || - ((t.isMemberExpression(parent) || t.isOptionalMemberExpression(parent)) && - parent.object === node) || t.isAwaitExpression(parent) ) { return true; @@ -202,11 +196,7 @@ export function YieldExpression(node: Object, parent: Object): boolean { return ( t.isBinary(parent) || t.isUnaryLike(parent) || - t.isCallExpression(parent) || - t.isOptionalCallExpression(parent) || - t.isMemberExpression(parent) || - t.isOptionalMemberExpression(parent) || - t.isNewExpression(parent) || + isPostfixExpression(node, parent) || (t.isAwaitExpression(parent) && t.isYieldExpression(node)) || (t.isConditionalExpression(parent) && node === parent.test) || isClassExtendsClause(node, parent) @@ -225,12 +215,7 @@ export function ClassExpression( export function UnaryLike(node: Object, parent: Object): boolean { return ( - ((t.isMemberExpression(parent) || t.isOptionalMemberExpression(parent)) && - parent.object === node) || - ((t.isCallExpression(parent) || - t.isOptionalCallExpression(parent) || - t.isNewExpression(parent)) && - parent.callee === node) || + isPostfixExpression(node, parent) || t.isBinaryExpression(parent, { operator: "**", left: node }) || isClassExtendsClause(node, parent) ); @@ -254,8 +239,6 @@ export function ConditionalExpression(node: Object, parent: Object): boolean { t.isBinary(parent) || t.isConditionalExpression(parent, { test: node }) || t.isAwaitExpression(parent) || - t.isOptionalMemberExpression(parent, { object: node }) || - t.isOptionalCallExpression(parent, { callee: node }) || t.isTaggedTemplateExpression(parent) || t.isTSTypeAssertion(parent) || t.isTSAsExpression(parent) @@ -276,12 +259,7 @@ export function OptionalMemberExpression( ); } -export function OptionalCallExpression(node: Object, parent: Object): boolean { - return ( - t.isCallExpression(parent, { callee: node }) || - t.isMemberExpression(parent, { object: node }) - ); -} +export { OptionalMemberExpression as OptionalCallExpression }; export function AssignmentExpression( node: Object, @@ -329,11 +307,8 @@ function isFirstInStatement( } if ( - ((t.isCallExpression(parent) || t.isOptionalCallExpression(parent)) && - parent.callee === node) || + (isPostfixExpression(node, parent) && !t.isNewExpression(parent)) || (t.isSequenceExpression(parent) && parent.expressions[0] === 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/typescript/non-null-parentheses/input.js b/packages/babel-generator/test/fixtures/typescript/non-null-parentheses/input.js new file mode 100644 index 000000000000..76a1cb8b73e4 --- /dev/null +++ b/packages/babel-generator/test/fixtures/typescript/non-null-parentheses/input.js @@ -0,0 +1,16 @@ +(a ? b : c)!; +(a ? b : c)!.d; +(a ? b : c!); +(a ? b : c!).d; + +foo!(); +foo()!; + +async function* f() { + (yield x)!; + yield x!; + (yield)!; + + (await x)!; + (await x!); +} diff --git a/packages/babel-generator/test/fixtures/typescript/non-null-parentheses/output.js b/packages/babel-generator/test/fixtures/typescript/non-null-parentheses/output.js new file mode 100644 index 000000000000..d31e4d1cb7a9 --- /dev/null +++ b/packages/babel-generator/test/fixtures/typescript/non-null-parentheses/output.js @@ -0,0 +1,14 @@ +(a ? b : c)!; +(a ? b : c)!.d; +a ? b : c!; +(a ? b : c!).d; +foo!(); +foo()!; + +async function* f() { + (yield x)!; + yield x!; + (yield)!; + (await x)!; + await x!; +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-decorators/test/fixtures/transformation/extends-await/output.js b/packages/babel-plugin-proposal-decorators/test/fixtures/transformation/extends-await/output.js index 8745c2d63feb..298e8ae7e58a 100644 --- a/packages/babel-plugin-proposal-decorators/test/fixtures/transformation/extends-await/output.js +++ b/packages/babel-plugin-proposal-decorators/test/fixtures/transformation/extends-await/output.js @@ -15,5 +15,5 @@ async function g() { F: A, d: [] }; - }, (await B)); + }, await B); } diff --git a/packages/babel-plugin-proposal-decorators/test/fixtures/transformation/extends-yield/output.js b/packages/babel-plugin-proposal-decorators/test/fixtures/transformation/extends-yield/output.js index 9edec11c4f62..70ef16da8901 100644 --- a/packages/babel-plugin-proposal-decorators/test/fixtures/transformation/extends-yield/output.js +++ b/packages/babel-plugin-proposal-decorators/test/fixtures/transformation/extends-yield/output.js @@ -15,5 +15,5 @@ function* g() { F: A, d: [] }; - }, (yield B)); + }, yield B); } diff --git a/packages/babel-plugin-proposal-pipeline-operator/test/fixtures/minimal/async-arrow/output.js b/packages/babel-plugin-proposal-pipeline-operator/test/fixtures/minimal/async-arrow/output.js index ca8e5ed0c54d..3f39b0e539df 100644 --- a/packages/babel-plugin-proposal-pipeline-operator/test/fixtures/minimal/async-arrow/output.js +++ b/packages/babel-plugin-proposal-pipeline-operator/test/fixtures/minimal/async-arrow/output.js @@ -2,7 +2,7 @@ var _ref, _; function then(fn) { return async value => { - return fn((await value)); + return fn(await value); }; } diff --git a/packages/babel-plugin-proposal-throw-expressions/test/fixtures/stupid-fixture-nesting-folder/await-in-argument/output.js b/packages/babel-plugin-proposal-throw-expressions/test/fixtures/stupid-fixture-nesting-folder/await-in-argument/output.js index f0d7fa4b5e76..489e10add99a 100644 --- a/packages/babel-plugin-proposal-throw-expressions/test/fixtures/stupid-fixture-nesting-folder/await-in-argument/output.js +++ b/packages/babel-plugin-proposal-throw-expressions/test/fixtures/stupid-fixture-nesting-folder/await-in-argument/output.js @@ -1,5 +1,5 @@ async function test() { (function (e) { throw e; - })(new Error((await 'test'))); + })(new Error(await 'test')); } diff --git a/packages/babel-plugin-proposal-throw-expressions/test/fixtures/stupid-fixture-nesting-folder/yield-in-argument/output.js b/packages/babel-plugin-proposal-throw-expressions/test/fixtures/stupid-fixture-nesting-folder/yield-in-argument/output.js index f8739d12fbb4..5fbea228f860 100644 --- a/packages/babel-plugin-proposal-throw-expressions/test/fixtures/stupid-fixture-nesting-folder/yield-in-argument/output.js +++ b/packages/babel-plugin-proposal-throw-expressions/test/fixtures/stupid-fixture-nesting-folder/yield-in-argument/output.js @@ -1,5 +1,5 @@ function* test() { (function (e) { throw e; - })(new Error((yield 'test'))); + })(new Error(yield 'test')); } diff --git a/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/8783/output.js b/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/8783/output.js index 39a8061003c9..819b9a4b22a9 100644 --- a/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/8783/output.js +++ b/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/8783/output.js @@ -4,7 +4,7 @@ function _asyncToGenerator(fn) { return function () { var self = this, args = ar (function () { var _poll = _asyncToGenerator(function* () { - console.log((yield Promise.resolve('Hello'))); + console.log(yield Promise.resolve('Hello')); setTimeout(poll, 1000); }); From 5b1c6b6aa39d8d8669e010e4523352738b0fa25c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Tue, 7 Apr 2020 17:53:11 +0200 Subject: [PATCH 2/4] Also move template tags handling --- packages/babel-generator/src/node/parentheses.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/babel-generator/src/node/parentheses.js b/packages/babel-generator/src/node/parentheses.js index c1f1c8e6da1f..fbcebf388e69 100644 --- a/packages/babel-generator/src/node/parentheses.js +++ b/packages/babel-generator/src/node/parentheses.js @@ -39,6 +39,7 @@ const isPostfixExpression = (node: Object, parent: Object) => t.isOptionalCallExpression(parent) || t.isNewExpression(parent)) && parent.callee === node) || + (t.isTaggedTemplateExpression(parent) && parent.tag === node) || t.isTSNonNullExpression(parent); export function NullableTypeAnnotation(node: Object, parent: Object): boolean { @@ -239,7 +240,6 @@ export function ConditionalExpression(node: Object, parent: Object): boolean { t.isBinary(parent) || t.isConditionalExpression(parent, { test: node }) || t.isAwaitExpression(parent) || - t.isTaggedTemplateExpression(parent) || t.isTSTypeAssertion(parent) || t.isTSAsExpression(parent) ) { @@ -298,7 +298,6 @@ function isFirstInStatement( while (i > 0) { if ( t.isExpressionStatement(parent, { expression: node }) || - t.isTaggedTemplateExpression(parent) || (considerDefaultExports && t.isExportDefaultDeclaration(parent, { declaration: node })) || (considerArrow && t.isArrowFunctionExpression(parent, { body: node })) From a50fdabbd962e03647b86e414cdaecda3777bcb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Tue, 7 Apr 2020 17:57:59 +0200 Subject: [PATCH 3/4] Add tagged template test --- .../parentheses/tagged-template-expression/input.js | 7 ++++++- .../parentheses/tagged-template-expression/output.js | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/babel-generator/test/fixtures/parentheses/tagged-template-expression/input.js b/packages/babel-generator/test/fixtures/parentheses/tagged-template-expression/input.js index a2b14afaa872..c91ad40db835 100644 --- a/packages/babel-generator/test/fixtures/parentheses/tagged-template-expression/input.js +++ b/packages/babel-generator/test/fixtures/parentheses/tagged-template-expression/input.js @@ -1,3 +1,8 @@ (() => {})``; (function(){}``); -(a ? b : c)``; \ No newline at end of file +(a ? b : c)``; + +function* fn() { + (yield)`foo`; + (yield f)`foo`; +} diff --git a/packages/babel-generator/test/fixtures/parentheses/tagged-template-expression/output.js b/packages/babel-generator/test/fixtures/parentheses/tagged-template-expression/output.js index 6ddf8f48ab8e..bc4371fbdf61 100644 --- a/packages/babel-generator/test/fixtures/parentheses/tagged-template-expression/output.js +++ b/packages/babel-generator/test/fixtures/parentheses/tagged-template-expression/output.js @@ -1,3 +1,8 @@ (() => {})``; (function () {})``; -(a ? b : c)``; \ No newline at end of file +(a ? b : c)``; + +function* fn() { + (yield)`foo`; + (yield f)`foo`; +} \ No newline at end of file From 700103d71e7bcaafac10a26b2bda1343456edc02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Tue, 7 Apr 2020 17:58:51 +0200 Subject: [PATCH 4/4] isPostfixExpression -> hasPostfixPart --- packages/babel-generator/src/node/parentheses.js | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/packages/babel-generator/src/node/parentheses.js b/packages/babel-generator/src/node/parentheses.js index fbcebf388e69..cd3dc0943a12 100644 --- a/packages/babel-generator/src/node/parentheses.js +++ b/packages/babel-generator/src/node/parentheses.js @@ -32,7 +32,7 @@ const isClassExtendsClause = (node: Object, parent: Object): boolean => (t.isClassDeclaration(parent) || t.isClassExpression(parent)) && parent.superClass === node; -const isPostfixExpression = (node: Object, parent: Object) => +const hasPostfixPart = (node: Object, parent: Object) => ((t.isMemberExpression(parent) || t.isOptionalMemberExpression(parent)) && parent.object === node) || ((t.isCallExpression(parent) || @@ -66,9 +66,7 @@ export function FunctionTypeAnnotation( } export function UpdateExpression(node: Object, parent: Object): boolean { - return ( - isPostfixExpression(node, parent) || isClassExtendsClause(node, parent) - ); + return hasPostfixPart(node, parent) || isClassExtendsClause(node, parent); } export function ObjectExpression( @@ -100,7 +98,7 @@ export function Binary(node: Object, parent: Object): boolean { } if ( - isPostfixExpression(node, parent) || + hasPostfixPart(node, parent) || t.isUnaryLike(parent) || t.isAwaitExpression(parent) ) { @@ -197,7 +195,7 @@ export function YieldExpression(node: Object, parent: Object): boolean { return ( t.isBinary(parent) || t.isUnaryLike(parent) || - isPostfixExpression(node, parent) || + hasPostfixPart(node, parent) || (t.isAwaitExpression(parent) && t.isYieldExpression(node)) || (t.isConditionalExpression(parent) && node === parent.test) || isClassExtendsClause(node, parent) @@ -216,7 +214,7 @@ export function ClassExpression( export function UnaryLike(node: Object, parent: Object): boolean { return ( - isPostfixExpression(node, parent) || + hasPostfixPart(node, parent) || t.isBinaryExpression(parent, { operator: "**", left: node }) || isClassExtendsClause(node, parent) ); @@ -306,7 +304,7 @@ function isFirstInStatement( } if ( - (isPostfixExpression(node, parent) && !t.isNewExpression(parent)) || + (hasPostfixPart(node, parent) && !t.isNewExpression(parent)) || (t.isSequenceExpression(parent) && parent.expressions[0] === node) || t.isConditional(parent, { test: node }) || t.isBinary(parent, { left: node }) ||