From 0067fd9e02cb7cc701a375c00cea02469fc423b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Thu, 25 Mar 2021 11:20:47 -0400 Subject: [PATCH] Disallow await before exponential (#12441) * refactor: move unary exponential check to parseMaybeUnary * fix: disallow await before exponential * add test cases --- .../babel-parser/src/parser/expression.js | 34 +++++----- packages/babel-parser/src/types.js | 2 +- .../input.js | 1 + .../output.json | 56 +++++++++++++++++ .../await-before-exponential/input.js | 1 + .../await-before-exponential/output.json | 55 ++++++++++++++++ .../await-unary-before-exponential/input.js | 1 + .../output.json | 61 ++++++++++++++++++ .../nested-unary-before-exponential/input.js | 1 + .../output.json | 59 +++++++++++++++++ .../input.js | 1 + .../output.json | 56 +++++++++++++++++ .../input.ts | 1 + .../output.json | 61 ++++++++++++++++++ .../input.ts | 1 + .../output.json | 63 +++++++++++++++++++ .../input.ts | 1 + .../output.json | 62 ++++++++++++++++++ 18 files changed, 501 insertions(+), 16 deletions(-) create mode 100644 packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-parenthesized-await-before-exponential/input.js create mode 100644 packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-parenthesized-await-before-exponential/output.json create mode 100644 packages/babel-parser/test/fixtures/es2016/exponentiation-operator/await-before-exponential/input.js create mode 100644 packages/babel-parser/test/fixtures/es2016/exponentiation-operator/await-before-exponential/output.json create mode 100644 packages/babel-parser/test/fixtures/es2016/exponentiation-operator/await-unary-before-exponential/input.js create mode 100644 packages/babel-parser/test/fixtures/es2016/exponentiation-operator/await-unary-before-exponential/output.json create mode 100644 packages/babel-parser/test/fixtures/es2016/exponentiation-operator/nested-unary-before-exponential/input.js create mode 100644 packages/babel-parser/test/fixtures/es2016/exponentiation-operator/nested-unary-before-exponential/output.json create mode 100644 packages/babel-parser/test/fixtures/es2016/exponentiation-operator/valid-parenthesized-await-before-exponential/input.js create mode 100644 packages/babel-parser/test/fixtures/es2016/exponentiation-operator/valid-parenthesized-await-before-exponential/output.json create mode 100644 packages/babel-parser/test/fixtures/typescript/exponentiation/await-non-null-before-exponential/input.ts create mode 100644 packages/babel-parser/test/fixtures/typescript/exponentiation/await-non-null-before-exponential/output.json create mode 100644 packages/babel-parser/test/fixtures/typescript/exponentiation/unary-non-null-before-exponential/input.ts create mode 100644 packages/babel-parser/test/fixtures/typescript/exponentiation/unary-non-null-before-exponential/output.json create mode 100644 packages/babel-parser/test/fixtures/typescript/exponentiation/valid-parenthesized-await-non-null-before-exponential/input.ts create mode 100644 packages/babel-parser/test/fixtures/typescript/exponentiation/valid-parenthesized-await-non-null-before-exponential/output.json diff --git a/packages/babel-parser/src/parser/expression.js b/packages/babel-parser/src/parser/expression.js index e976098f92..9a3271a826 100644 --- a/packages/babel-parser/src/parser/expression.js +++ b/packages/babel-parser/src/parser/expression.js @@ -399,17 +399,6 @@ export default class ExpressionParser extends LValParser { const node = this.startNodeAt(leftStartPos, leftStartLoc); node.left = left; node.operator = this.state.value; - if ( - op === tt.exponent && - left.type === "UnaryExpression" && - (this.options.createParenthesizedExpressions || - !(left.extra && left.extra.parenthesized)) - ) { - this.raise( - left.argument.start, - Errors.UnexpectedTokenUnaryExponentiation, - ); - } const logical = op === tt.logicalOR || op === tt.logicalAND; const coalesce = op === tt.nullishCoalescing; @@ -506,16 +495,30 @@ export default class ExpressionParser extends LValParser { ); } + checkExponentialAfterUnary(node: N.AwaitExpression | N.UnaryExpression) { + if (this.match(tt.exponent)) { + this.raise( + node.argument.start, + Errors.UnexpectedTokenUnaryExponentiation, + ); + } + } + // Parse unary operators, both prefix and postfix. // https://tc39.es/ecma262/#prod-UnaryExpression - parseMaybeUnary(refExpressionErrors: ?ExpressionErrors): N.Expression { + parseMaybeUnary( + refExpressionErrors: ?ExpressionErrors, + sawUnary?: boolean, + ): N.Expression { const startPos = this.state.start; const startLoc = this.state.startLoc; const isAwait = this.isContextual("await"); if (isAwait && this.isAwaitAllowed()) { this.next(); - return this.parseAwait(startPos, startLoc); + const expr = this.parseAwait(startPos, startLoc); + if (!sawUnary) this.checkExponentialAfterUnary(expr); + return expr; } if ( this.isContextual("module") && @@ -536,7 +539,7 @@ export default class ExpressionParser extends LValParser { const isDelete = this.match(tt._delete); this.next(); - node.argument = this.parseMaybeUnary(); + node.argument = this.parseMaybeUnary(null, true); this.checkExpressionErrors(refExpressionErrors, true); @@ -551,6 +554,7 @@ export default class ExpressionParser extends LValParser { } if (!update) { + if (!sawUnary) this.checkExponentialAfterUnary(node); return this.finishNode(node, "UnaryExpression"); } } @@ -2412,7 +2416,7 @@ export default class ExpressionParser extends LValParser { } if (!this.state.soloAwait) { - node.argument = this.parseMaybeUnary(); + node.argument = this.parseMaybeUnary(null, true); } return this.finishNode(node, "AwaitExpression"); diff --git a/packages/babel-parser/src/types.js b/packages/babel-parser/src/types.js index 3217d45322..92f1c678a0 100644 --- a/packages/babel-parser/src/types.js +++ b/packages/babel-parser/src/types.js @@ -391,7 +391,7 @@ export type YieldExpression = NodeBase & { export type AwaitExpression = NodeBase & { type: "AwaitExpression", - argument: ?Expression, + argument: Expression, }; export type ArrayExpression = NodeBase & { diff --git a/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-parenthesized-await-before-exponential/input.js b/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-parenthesized-await-before-exponential/input.js new file mode 100644 index 0000000000..1125a4216f --- /dev/null +++ b/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-parenthesized-await-before-exponential/input.js @@ -0,0 +1 @@ +async () => (await 5) ** 6; diff --git a/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-parenthesized-await-before-exponential/output.json b/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-parenthesized-await-before-exponential/output.json new file mode 100644 index 0000000000..a206c0b864 --- /dev/null +++ b/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-parenthesized-await-before-exponential/output.json @@ -0,0 +1,56 @@ +{ + "type": "File", + "start":0,"end":27,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":27}}, + "program": { + "type": "Program", + "start":0,"end":27,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":27}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":27,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":27}}, + "expression": { + "type": "ArrowFunctionExpression", + "start":0,"end":26,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":26}}, + "id": null, + "generator": false, + "async": true, + "params": [], + "body": { + "type": "BinaryExpression", + "start":12,"end":26,"loc":{"start":{"line":1,"column":12},"end":{"line":1,"column":26}}, + "left": { + "type": "ParenthesizedExpression", + "start":12,"end":21,"loc":{"start":{"line":1,"column":12},"end":{"line":1,"column":21}}, + "expression": { + "type": "AwaitExpression", + "start":13,"end":20,"loc":{"start":{"line":1,"column":13},"end":{"line":1,"column":20}}, + "argument": { + "type": "NumericLiteral", + "start":19,"end":20,"loc":{"start":{"line":1,"column":19},"end":{"line":1,"column":20}}, + "extra": { + "rawValue": 5, + "raw": "5" + }, + "value": 5 + } + } + }, + "operator": "**", + "right": { + "type": "NumericLiteral", + "start":25,"end":26,"loc":{"start":{"line":1,"column":25},"end":{"line":1,"column":26}}, + "extra": { + "rawValue": 6, + "raw": "6" + }, + "value": 6 + } + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2016/exponentiation-operator/await-before-exponential/input.js b/packages/babel-parser/test/fixtures/es2016/exponentiation-operator/await-before-exponential/input.js new file mode 100644 index 0000000000..aea9136fbe --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2016/exponentiation-operator/await-before-exponential/input.js @@ -0,0 +1 @@ +async () => await 5 ** 6; diff --git a/packages/babel-parser/test/fixtures/es2016/exponentiation-operator/await-before-exponential/output.json b/packages/babel-parser/test/fixtures/es2016/exponentiation-operator/await-before-exponential/output.json new file mode 100644 index 0000000000..740d7d292a --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2016/exponentiation-operator/await-before-exponential/output.json @@ -0,0 +1,55 @@ +{ + "type": "File", + "start":0,"end":25,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":25}}, + "errors": [ + "SyntaxError: Illegal expression. Wrap left hand side or entire exponentiation in parentheses. (1:18)" + ], + "program": { + "type": "Program", + "start":0,"end":25,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":25}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":25,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":25}}, + "expression": { + "type": "ArrowFunctionExpression", + "start":0,"end":24,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":24}}, + "id": null, + "generator": false, + "async": true, + "params": [], + "body": { + "type": "BinaryExpression", + "start":12,"end":24,"loc":{"start":{"line":1,"column":12},"end":{"line":1,"column":24}}, + "left": { + "type": "AwaitExpression", + "start":12,"end":19,"loc":{"start":{"line":1,"column":12},"end":{"line":1,"column":19}}, + "argument": { + "type": "NumericLiteral", + "start":18,"end":19,"loc":{"start":{"line":1,"column":18},"end":{"line":1,"column":19}}, + "extra": { + "rawValue": 5, + "raw": "5" + }, + "value": 5 + } + }, + "operator": "**", + "right": { + "type": "NumericLiteral", + "start":23,"end":24,"loc":{"start":{"line":1,"column":23},"end":{"line":1,"column":24}}, + "extra": { + "rawValue": 6, + "raw": "6" + }, + "value": 6 + } + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2016/exponentiation-operator/await-unary-before-exponential/input.js b/packages/babel-parser/test/fixtures/es2016/exponentiation-operator/await-unary-before-exponential/input.js new file mode 100644 index 0000000000..b218381c14 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2016/exponentiation-operator/await-unary-before-exponential/input.js @@ -0,0 +1 @@ +async () => await -5 ** 6; diff --git a/packages/babel-parser/test/fixtures/es2016/exponentiation-operator/await-unary-before-exponential/output.json b/packages/babel-parser/test/fixtures/es2016/exponentiation-operator/await-unary-before-exponential/output.json new file mode 100644 index 0000000000..fa0b70d150 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2016/exponentiation-operator/await-unary-before-exponential/output.json @@ -0,0 +1,61 @@ +{ + "type": "File", + "start":0,"end":26,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":26}}, + "errors": [ + "SyntaxError: Illegal expression. Wrap left hand side or entire exponentiation in parentheses. (1:18)" + ], + "program": { + "type": "Program", + "start":0,"end":26,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":26}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":26,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":26}}, + "expression": { + "type": "ArrowFunctionExpression", + "start":0,"end":25,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":25}}, + "id": null, + "generator": false, + "async": true, + "params": [], + "body": { + "type": "BinaryExpression", + "start":12,"end":25,"loc":{"start":{"line":1,"column":12},"end":{"line":1,"column":25}}, + "left": { + "type": "AwaitExpression", + "start":12,"end":20,"loc":{"start":{"line":1,"column":12},"end":{"line":1,"column":20}}, + "argument": { + "type": "UnaryExpression", + "start":18,"end":20,"loc":{"start":{"line":1,"column":18},"end":{"line":1,"column":20}}, + "operator": "-", + "prefix": true, + "argument": { + "type": "NumericLiteral", + "start":19,"end":20,"loc":{"start":{"line":1,"column":19},"end":{"line":1,"column":20}}, + "extra": { + "rawValue": 5, + "raw": "5" + }, + "value": 5 + } + } + }, + "operator": "**", + "right": { + "type": "NumericLiteral", + "start":24,"end":25,"loc":{"start":{"line":1,"column":24},"end":{"line":1,"column":25}}, + "extra": { + "rawValue": 6, + "raw": "6" + }, + "value": 6 + } + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2016/exponentiation-operator/nested-unary-before-exponential/input.js b/packages/babel-parser/test/fixtures/es2016/exponentiation-operator/nested-unary-before-exponential/input.js new file mode 100644 index 0000000000..e9b6ba8559 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2016/exponentiation-operator/nested-unary-before-exponential/input.js @@ -0,0 +1 @@ +(-+5 ** 6); diff --git a/packages/babel-parser/test/fixtures/es2016/exponentiation-operator/nested-unary-before-exponential/output.json b/packages/babel-parser/test/fixtures/es2016/exponentiation-operator/nested-unary-before-exponential/output.json new file mode 100644 index 0000000000..39f1b200ca --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2016/exponentiation-operator/nested-unary-before-exponential/output.json @@ -0,0 +1,59 @@ +{ + "type": "File", + "start":0,"end":11,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":11}}, + "errors": [ + "SyntaxError: Illegal expression. Wrap left hand side or entire exponentiation in parentheses. (1:2)" + ], + "program": { + "type": "Program", + "start":0,"end":11,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":11}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":11,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":11}}, + "expression": { + "type": "BinaryExpression", + "start":1,"end":9,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":9}}, + "extra": { + "parenthesized": true, + "parenStart": 0 + }, + "left": { + "type": "UnaryExpression", + "start":1,"end":4,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":4}}, + "operator": "-", + "prefix": true, + "argument": { + "type": "UnaryExpression", + "start":2,"end":4,"loc":{"start":{"line":1,"column":2},"end":{"line":1,"column":4}}, + "operator": "+", + "prefix": true, + "argument": { + "type": "NumericLiteral", + "start":3,"end":4,"loc":{"start":{"line":1,"column":3},"end":{"line":1,"column":4}}, + "extra": { + "rawValue": 5, + "raw": "5" + }, + "value": 5 + } + } + }, + "operator": "**", + "right": { + "type": "NumericLiteral", + "start":8,"end":9,"loc":{"start":{"line":1,"column":8},"end":{"line":1,"column":9}}, + "extra": { + "rawValue": 6, + "raw": "6" + }, + "value": 6 + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2016/exponentiation-operator/valid-parenthesized-await-before-exponential/input.js b/packages/babel-parser/test/fixtures/es2016/exponentiation-operator/valid-parenthesized-await-before-exponential/input.js new file mode 100644 index 0000000000..1125a4216f --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2016/exponentiation-operator/valid-parenthesized-await-before-exponential/input.js @@ -0,0 +1 @@ +async () => (await 5) ** 6; diff --git a/packages/babel-parser/test/fixtures/es2016/exponentiation-operator/valid-parenthesized-await-before-exponential/output.json b/packages/babel-parser/test/fixtures/es2016/exponentiation-operator/valid-parenthesized-await-before-exponential/output.json new file mode 100644 index 0000000000..3ca3c92f70 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2016/exponentiation-operator/valid-parenthesized-await-before-exponential/output.json @@ -0,0 +1,56 @@ +{ + "type": "File", + "start":0,"end":27,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":27}}, + "program": { + "type": "Program", + "start":0,"end":27,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":27}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":27,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":27}}, + "expression": { + "type": "ArrowFunctionExpression", + "start":0,"end":26,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":26}}, + "id": null, + "generator": false, + "async": true, + "params": [], + "body": { + "type": "BinaryExpression", + "start":12,"end":26,"loc":{"start":{"line":1,"column":12},"end":{"line":1,"column":26}}, + "left": { + "type": "AwaitExpression", + "start":13,"end":20,"loc":{"start":{"line":1,"column":13},"end":{"line":1,"column":20}}, + "extra": { + "parenthesized": true, + "parenStart": 12 + }, + "argument": { + "type": "NumericLiteral", + "start":19,"end":20,"loc":{"start":{"line":1,"column":19},"end":{"line":1,"column":20}}, + "extra": { + "rawValue": 5, + "raw": "5" + }, + "value": 5 + } + }, + "operator": "**", + "right": { + "type": "NumericLiteral", + "start":25,"end":26,"loc":{"start":{"line":1,"column":25},"end":{"line":1,"column":26}}, + "extra": { + "rawValue": 6, + "raw": "6" + }, + "value": 6 + } + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/typescript/exponentiation/await-non-null-before-exponential/input.ts b/packages/babel-parser/test/fixtures/typescript/exponentiation/await-non-null-before-exponential/input.ts new file mode 100644 index 0000000000..50c23dd29d --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/exponentiation/await-non-null-before-exponential/input.ts @@ -0,0 +1 @@ +async (a) => await a! ** 6; diff --git a/packages/babel-parser/test/fixtures/typescript/exponentiation/await-non-null-before-exponential/output.json b/packages/babel-parser/test/fixtures/typescript/exponentiation/await-non-null-before-exponential/output.json new file mode 100644 index 0000000000..462ad82502 --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/exponentiation/await-non-null-before-exponential/output.json @@ -0,0 +1,61 @@ +{ + "type": "File", + "start":0,"end":27,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":27}}, + "errors": [ + "SyntaxError: Illegal expression. Wrap left hand side or entire exponentiation in parentheses. (1:19)" + ], + "program": { + "type": "Program", + "start":0,"end":27,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":27}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":27,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":27}}, + "expression": { + "type": "ArrowFunctionExpression", + "start":0,"end":26,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":26}}, + "id": null, + "generator": false, + "async": true, + "params": [ + { + "type": "Identifier", + "start":7,"end":8,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":8},"identifierName":"a"}, + "name": "a" + } + ], + "body": { + "type": "BinaryExpression", + "start":13,"end":26,"loc":{"start":{"line":1,"column":13},"end":{"line":1,"column":26}}, + "left": { + "type": "AwaitExpression", + "start":13,"end":21,"loc":{"start":{"line":1,"column":13},"end":{"line":1,"column":21}}, + "argument": { + "type": "TSNonNullExpression", + "start":19,"end":21,"loc":{"start":{"line":1,"column":19},"end":{"line":1,"column":21}}, + "expression": { + "type": "Identifier", + "start":19,"end":20,"loc":{"start":{"line":1,"column":19},"end":{"line":1,"column":20},"identifierName":"a"}, + "name": "a" + } + } + }, + "operator": "**", + "right": { + "type": "NumericLiteral", + "start":25,"end":26,"loc":{"start":{"line":1,"column":25},"end":{"line":1,"column":26}}, + "extra": { + "rawValue": 6, + "raw": "6" + }, + "value": 6 + } + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/typescript/exponentiation/unary-non-null-before-exponential/input.ts b/packages/babel-parser/test/fixtures/typescript/exponentiation/unary-non-null-before-exponential/input.ts new file mode 100644 index 0000000000..66393a4e9f --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/exponentiation/unary-non-null-before-exponential/input.ts @@ -0,0 +1 @@ +(a) => +a! ** 6; diff --git a/packages/babel-parser/test/fixtures/typescript/exponentiation/unary-non-null-before-exponential/output.json b/packages/babel-parser/test/fixtures/typescript/exponentiation/unary-non-null-before-exponential/output.json new file mode 100644 index 0000000000..9fbb34d30d --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/exponentiation/unary-non-null-before-exponential/output.json @@ -0,0 +1,63 @@ +{ + "type": "File", + "start":0,"end":16,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":16}}, + "errors": [ + "SyntaxError: Illegal expression. Wrap left hand side or entire exponentiation in parentheses. (1:8)" + ], + "program": { + "type": "Program", + "start":0,"end":16,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":16}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":16,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":16}}, + "expression": { + "type": "ArrowFunctionExpression", + "start":0,"end":15,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":15}}, + "id": null, + "generator": false, + "async": false, + "params": [ + { + "type": "Identifier", + "start":1,"end":2,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":2},"identifierName":"a"}, + "name": "a" + } + ], + "body": { + "type": "BinaryExpression", + "start":7,"end":15,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":15}}, + "left": { + "type": "UnaryExpression", + "start":7,"end":10,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":10}}, + "operator": "+", + "prefix": true, + "argument": { + "type": "TSNonNullExpression", + "start":8,"end":10,"loc":{"start":{"line":1,"column":8},"end":{"line":1,"column":10}}, + "expression": { + "type": "Identifier", + "start":8,"end":9,"loc":{"start":{"line":1,"column":8},"end":{"line":1,"column":9},"identifierName":"a"}, + "name": "a" + } + } + }, + "operator": "**", + "right": { + "type": "NumericLiteral", + "start":14,"end":15,"loc":{"start":{"line":1,"column":14},"end":{"line":1,"column":15}}, + "extra": { + "rawValue": 6, + "raw": "6" + }, + "value": 6 + } + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/typescript/exponentiation/valid-parenthesized-await-non-null-before-exponential/input.ts b/packages/babel-parser/test/fixtures/typescript/exponentiation/valid-parenthesized-await-non-null-before-exponential/input.ts new file mode 100644 index 0000000000..a09f2a6ddf --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/exponentiation/valid-parenthesized-await-non-null-before-exponential/input.ts @@ -0,0 +1 @@ +async (a) => (await a!) ** 6; diff --git a/packages/babel-parser/test/fixtures/typescript/exponentiation/valid-parenthesized-await-non-null-before-exponential/output.json b/packages/babel-parser/test/fixtures/typescript/exponentiation/valid-parenthesized-await-non-null-before-exponential/output.json new file mode 100644 index 0000000000..0c36f6fbe5 --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/exponentiation/valid-parenthesized-await-non-null-before-exponential/output.json @@ -0,0 +1,62 @@ +{ + "type": "File", + "start":0,"end":29,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":29}}, + "program": { + "type": "Program", + "start":0,"end":29,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":29}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":29,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":29}}, + "expression": { + "type": "ArrowFunctionExpression", + "start":0,"end":28,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":28}}, + "id": null, + "generator": false, + "async": true, + "params": [ + { + "type": "Identifier", + "start":7,"end":8,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":8},"identifierName":"a"}, + "name": "a" + } + ], + "body": { + "type": "BinaryExpression", + "start":13,"end":28,"loc":{"start":{"line":1,"column":13},"end":{"line":1,"column":28}}, + "left": { + "type": "AwaitExpression", + "start":14,"end":22,"loc":{"start":{"line":1,"column":14},"end":{"line":1,"column":22}}, + "extra": { + "parenthesized": true, + "parenStart": 13 + }, + "argument": { + "type": "TSNonNullExpression", + "start":20,"end":22,"loc":{"start":{"line":1,"column":20},"end":{"line":1,"column":22}}, + "expression": { + "type": "Identifier", + "start":20,"end":21,"loc":{"start":{"line":1,"column":20},"end":{"line":1,"column":21},"identifierName":"a"}, + "name": "a" + } + } + }, + "operator": "**", + "right": { + "type": "NumericLiteral", + "start":27,"end":28,"loc":{"start":{"line":1,"column":27},"end":{"line":1,"column":28}}, + "extra": { + "rawValue": 6, + "raw": "6" + }, + "value": 6 + } + } + } + } + ], + "directives": [] + } +} \ No newline at end of file