diff --git a/packages/babel-generator/test/fixtures/edgecase/single-arg-async-arrow-with-retainlines/input.js b/packages/babel-generator/test/fixtures/edgecase/single-arg-async-arrow-with-retainlines/input.js index e409b79f57..b5a205cc36 100644 --- a/packages/babel-generator/test/fixtures/edgecase/single-arg-async-arrow-with-retainlines/input.js +++ b/packages/babel-generator/test/fixtures/edgecase/single-arg-async-arrow-with-retainlines/input.js @@ -2,8 +2,8 @@ var fn = async ( arg ) => {} -async (x) -=> {} +async (x) => +{} async x => {} diff --git a/packages/babel-parser/src/parser/expression.js b/packages/babel-parser/src/parser/expression.js index b9195c3a97..1483f90612 100644 --- a/packages/babel-parser/src/parser/expression.js +++ b/packages/babel-parser/src/parser/expression.js @@ -524,12 +524,21 @@ export default class ExpressionParser extends LValParser { startLoc: Position, noCalls?: ?boolean, ): N.Expression { + const maybeAsyncArrow = this.atPossibleAsync(base); + const state = { optionalChainMember: false, stop: false, }; do { - base = this.parseSubscript(base, startPos, startLoc, noCalls, state); + base = this.parseSubscript( + base, + startPos, + startLoc, + noCalls, + state, + maybeAsyncArrow, + ); } while (!state.stop); return base; } @@ -544,6 +553,7 @@ export default class ExpressionParser extends LValParser { startLoc: Position, noCalls: ?boolean, state: N.ParseSubscriptState, + maybeAsyncArrow: boolean, ): N.Expression { if (!noCalls && this.eat(tt.doubleColon)) { const node = this.startNodeAt(startPos, startLoc); @@ -575,13 +585,8 @@ export default class ExpressionParser extends LValParser { this.expect(tt.bracketR); return this.finishNode(node, "OptionalMemberExpression"); } else if (this.eat(tt.parenL)) { - const possibleAsync = this.atPossibleAsync(base); - node.callee = base; - node.arguments = this.parseCallExpressionArguments( - tt.parenR, - possibleAsync, - ); + node.arguments = this.parseCallExpressionArguments(tt.parenR, false); node.optional = true; return this.finishNode(node, "OptionalCallExpression"); } else { @@ -620,7 +625,6 @@ export default class ExpressionParser extends LValParser { this.state.yieldPos = 0; this.state.awaitPos = 0; - const possibleAsync = this.atPossibleAsync(base); this.next(); let node = this.startNodeAt(startPos, startLoc); @@ -631,7 +635,7 @@ export default class ExpressionParser extends LValParser { node.arguments = this.parseCallExpressionArguments( tt.parenR, - possibleAsync, + maybeAsyncArrow, base.type === "Import", base.type !== "Super", ); @@ -641,7 +645,7 @@ export default class ExpressionParser extends LValParser { this.finishOptionalCallExpression(node); } - if (possibleAsync && this.shouldParseAsyncArrow()) { + if (maybeAsyncArrow && this.shouldParseAsyncArrow()) { state.stop = true; this.checkCommaAfterRestFromSpread(); @@ -704,11 +708,11 @@ export default class ExpressionParser extends LValParser { atPossibleAsync(base: N.Expression): boolean { return ( - !this.state.containsEsc && - this.state.potentialArrowAt === base.start && base.type === "Identifier" && base.name === "async" && - !this.canInsertSemicolon() + this.state.lastTokEnd === base.end && + !this.canInsertSemicolon() && + this.state.input.slice(base.start, base.end) === "async" ); } @@ -791,7 +795,7 @@ export default class ExpressionParser extends LValParser { } shouldParseAsyncArrow(): boolean { - return this.match(tt.arrow); + return this.match(tt.arrow) && !this.canInsertSemicolon(); } parseAsyncArrowFromCallExpression( @@ -891,6 +895,7 @@ export default class ExpressionParser extends LValParser { return this.parseFunction(node, undefined, true); } else if ( canBeArrow && + !containsEsc && id.name === "async" && this.match(tt.name) && !this.canInsertSemicolon() diff --git a/packages/babel-parser/src/parser/statement.js b/packages/babel-parser/src/parser/statement.js index 47b3c9f2c7..d97d4986a0 100644 --- a/packages/babel-parser/src/parser/statement.js +++ b/packages/babel-parser/src/parser/statement.js @@ -1321,6 +1321,7 @@ export default class StatementParser extends ExpressionParser { return; } + const containsEsc = this.state.containsEsc; const key = this.parseClassPropertyName(member); const isPrivate = key.type === "PrivateName"; // Check the key is not a computed expression or string literal. @@ -1371,7 +1372,12 @@ export default class StatementParser extends ExpressionParser { } else { this.pushClassProperty(classBody, publicProp); } - } else if (isSimple && key.name === "async" && !this.isLineTerminator()) { + } else if ( + isSimple && + key.name === "async" && + !containsEsc && + !this.isLineTerminator() + ) { // an async method const isGenerator = this.eat(tt.star); @@ -1407,6 +1413,7 @@ export default class StatementParser extends ExpressionParser { } else if ( isSimple && (key.name === "get" || key.name === "set") && + !containsEsc && !(this.match(tt.star) && this.isLineTerminator()) ) { // `get\n*` is an uninitialized property named 'get' followed by a generator. diff --git a/packages/babel-parser/src/plugins/flow.js b/packages/babel-parser/src/plugins/flow.js index 80961e0938..725eea4957 100644 --- a/packages/babel-parser/src/plugins/flow.js +++ b/packages/babel-parser/src/plugins/flow.js @@ -2619,6 +2619,7 @@ export default (superClass: Class): Class => startLoc: Position, noCalls: ?boolean, subscriptState: N.ParseSubscriptState, + maybeAsyncArrow: boolean, ): N.Expression { if (this.match(tt.questionDot) && this.isLookaheadRelational("<")) { this.expectPlugin("optionalChaining"); @@ -2671,6 +2672,7 @@ export default (superClass: Class): Class => startLoc, noCalls, subscriptState, + maybeAsyncArrow, ); } diff --git a/packages/babel-parser/src/plugins/typescript.js b/packages/babel-parser/src/plugins/typescript.js index 7d1f81d1b8..0724db5570 100644 --- a/packages/babel-parser/src/plugins/typescript.js +++ b/packages/babel-parser/src/plugins/typescript.js @@ -1498,6 +1498,7 @@ export default (superClass: Class): Class => startLoc: Position, noCalls: ?boolean, state: N.ParseSubscriptState, + maybeAsyncArrow: boolean, ): N.Expression { if (!this.hasPrecedingLineBreak() && this.match(tt.bang)) { this.state.exprAllowed = false; @@ -1560,7 +1561,14 @@ export default (superClass: Class): Class => if (result) return result; } - return super.parseSubscript(base, startPos, startLoc, noCalls, state); + return super.parseSubscript( + base, + startPos, + startLoc, + noCalls, + state, + maybeAsyncArrow, + ); } parseNewArguments(node: N.NewExpression): void { diff --git a/packages/babel-parser/test/fixtures/core/object/invalid-escape-get/input.js b/packages/babel-parser/test/fixtures/core/object/invalid-escape-get/input.js new file mode 100644 index 0000000000..208cd4d559 --- /dev/null +++ b/packages/babel-parser/test/fixtures/core/object/invalid-escape-get/input.js @@ -0,0 +1 @@ +({ ge\u0074 x() {} }) diff --git a/packages/babel-parser/test/fixtures/core/object/invalid-escape-get/options.json b/packages/babel-parser/test/fixtures/core/object/invalid-escape-get/options.json new file mode 100644 index 0000000000..0cd8225707 --- /dev/null +++ b/packages/babel-parser/test/fixtures/core/object/invalid-escape-get/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Unexpected token, expected \",\" (1:12)" +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/core/valid-escape/async/input.js b/packages/babel-parser/test/fixtures/core/valid-escape/async/input.js new file mode 100644 index 0000000000..2e12a7c8d0 --- /dev/null +++ b/packages/babel-parser/test/fixtures/core/valid-escape/async/input.js @@ -0,0 +1 @@ +(\u0061sync ()) diff --git a/packages/babel-parser/test/fixtures/core/valid-escape/async/output.json b/packages/babel-parser/test/fixtures/core/valid-escape/async/output.json new file mode 100644 index 0000000000..e220d3207f --- /dev/null +++ b/packages/babel-parser/test/fixtures/core/valid-escape/async/output.json @@ -0,0 +1,87 @@ +{ + "type": "File", + "start": 0, + "end": 15, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 15 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 15, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 15 + } + }, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start": 0, + "end": 15, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 15 + } + }, + "expression": { + "type": "CallExpression", + "start": 1, + "end": 14, + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 14 + } + }, + "callee": { + "type": "Identifier", + "start": 1, + "end": 11, + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 11 + }, + "identifierName": "async" + }, + "name": "async" + }, + "arguments": [], + "extra": { + "parenthesized": true, + "parenStart": 0 + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2015/class/invalid-escape-get/input.js b/packages/babel-parser/test/fixtures/es2015/class/invalid-escape-get/input.js new file mode 100644 index 0000000000..dca801f8de --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/class/invalid-escape-get/input.js @@ -0,0 +1 @@ +class X { ge\u0074 x() {} } diff --git a/packages/babel-parser/test/fixtures/es2015/class/invalid-escape-get/options.json b/packages/babel-parser/test/fixtures/es2015/class/invalid-escape-get/options.json new file mode 100644 index 0000000000..1e730e1707 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/class/invalid-escape-get/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Unexpected token (1:19)" +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2015/class/invalid-escape-set/input.js b/packages/babel-parser/test/fixtures/es2015/class/invalid-escape-set/input.js new file mode 100644 index 0000000000..fafbe9ab9f --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/class/invalid-escape-set/input.js @@ -0,0 +1 @@ +class X { se\u0074 x(value) {} } diff --git a/packages/babel-parser/test/fixtures/es2015/class/invalid-escape-set/options.json b/packages/babel-parser/test/fixtures/es2015/class/invalid-escape-set/options.json new file mode 100644 index 0000000000..1e730e1707 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/class/invalid-escape-set/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Unexpected token (1:19)" +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2015/class/invalid-escape-static/input.js b/packages/babel-parser/test/fixtures/es2015/class/invalid-escape-static/input.js new file mode 100644 index 0000000000..a561f8c321 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/class/invalid-escape-static/input.js @@ -0,0 +1 @@ +class X { st\u0061tic y() {} } diff --git a/packages/babel-parser/test/fixtures/es2015/class/invalid-escape-static/options.json b/packages/babel-parser/test/fixtures/es2015/class/invalid-escape-static/options.json new file mode 100644 index 0000000000..b23f881870 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/class/invalid-escape-static/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Unexpected token (1:22)" +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2015/for-of/invalid-escape-of/input.js b/packages/babel-parser/test/fixtures/es2015/for-of/invalid-escape-of/input.js new file mode 100644 index 0000000000..7d84031832 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/for-of/invalid-escape-of/input.js @@ -0,0 +1 @@ +for (x \u006ff y) {} diff --git a/packages/babel-parser/test/fixtures/es2015/for-of/invalid-escape-of/options.json b/packages/babel-parser/test/fixtures/es2015/for-of/invalid-escape-of/options.json new file mode 100644 index 0000000000..6b9933a771 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/for-of/invalid-escape-of/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Unexpected token, expected \";\" (1:7)" +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2015/generators/invalid-escape-yield/input.js b/packages/babel-parser/test/fixtures/es2015/generators/invalid-escape-yield/input.js new file mode 100644 index 0000000000..521b91facb --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/generators/invalid-escape-yield/input.js @@ -0,0 +1 @@ +(function* () { y\u0069eld 10 }) diff --git a/packages/babel-parser/test/fixtures/es2015/generators/invalid-escape-yield/options.json b/packages/babel-parser/test/fixtures/es2015/generators/invalid-escape-yield/options.json new file mode 100644 index 0000000000..dcd45c9b97 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/generators/invalid-escape-yield/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Can not use 'yield' as identifier inside a generator (1:16)" +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2015/let/invalid-escape/input.js b/packages/babel-parser/test/fixtures/es2015/let/invalid-escape/input.js new file mode 100644 index 0000000000..b5cc585a2a --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/let/invalid-escape/input.js @@ -0,0 +1 @@ +le\u0074 x = 5 diff --git a/packages/babel-parser/test/fixtures/es2015/let/invalid-escape/options.json b/packages/babel-parser/test/fixtures/es2015/let/invalid-escape/options.json new file mode 100644 index 0000000000..410ecd16fd --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/let/invalid-escape/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Unexpected token, expected \";\" (1:9)" +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2015/meta-properties/new-target-invalid-escaped-target/input.js b/packages/babel-parser/test/fixtures/es2015/meta-properties/new-target-invalid-escaped-target/input.js new file mode 100644 index 0000000000..70a512c677 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/meta-properties/new-target-invalid-escaped-target/input.js @@ -0,0 +1 @@ +function f() { new.ta\u0072get; } diff --git a/packages/babel-parser/test/fixtures/es2015/meta-properties/new-target-invalid-escaped-target/options.json b/packages/babel-parser/test/fixtures/es2015/meta-properties/new-target-invalid-escaped-target/options.json new file mode 100644 index 0000000000..4f4b2be4c1 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/meta-properties/new-target-invalid-escaped-target/options.json @@ -0,0 +1,3 @@ +{ + "throws": "The only valid meta property for new is new.target (1:19)" +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2015/modules/invalid-escape-export-as/input.js b/packages/babel-parser/test/fixtures/es2015/modules/invalid-escape-export-as/input.js new file mode 100644 index 0000000000..bce2030589 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/modules/invalid-escape-export-as/input.js @@ -0,0 +1 @@ +export { X \u0061s Y } diff --git a/packages/babel-parser/test/fixtures/es2015/modules/invalid-escape-export-as/options.json b/packages/babel-parser/test/fixtures/es2015/modules/invalid-escape-export-as/options.json new file mode 100644 index 0000000000..16c061d4df --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/modules/invalid-escape-export-as/options.json @@ -0,0 +1,4 @@ +{ + "sourceType": "module", + "throws": "Unexpected token, expected \",\" (1:11)" +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2015/modules/invalid-escape-import-from/input.js b/packages/babel-parser/test/fixtures/es2015/modules/invalid-escape-import-from/input.js new file mode 100644 index 0000000000..3f4408ab6e --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/modules/invalid-escape-import-from/input.js @@ -0,0 +1 @@ +import X fro\u006d 'x' diff --git a/packages/babel-parser/test/fixtures/es2015/modules/invalid-escape-import-from/options.json b/packages/babel-parser/test/fixtures/es2015/modules/invalid-escape-import-from/options.json new file mode 100644 index 0000000000..6dab969b11 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/modules/invalid-escape-import-from/options.json @@ -0,0 +1,4 @@ +{ + "sourceType": "module", + "throws": "Unexpected token (1:9)" +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-async-class-method/input.js b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-async-class-method/input.js new file mode 100644 index 0000000000..4dd0cd76e3 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-async-class-method/input.js @@ -0,0 +1 @@ +class X { \u0061sync x() { await x } } diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-async-class-method/options.json b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-async-class-method/options.json new file mode 100644 index 0000000000..b81bee7fa2 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-async-class-method/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Unexpected token (1:21)" +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-async-obj-method/input.js b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-async-obj-method/input.js new file mode 100644 index 0000000000..0807ff1251 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-async-obj-method/input.js @@ -0,0 +1 @@ +({ \u0061sync x() { await x } }) diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-async-obj-method/options.json b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-async-obj-method/options.json new file mode 100644 index 0000000000..f0907a4484 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-async-obj-method/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Unexpected token, expected \",\" (1:14)" +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-async-static-class-method/input.js b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-async-static-class-method/input.js new file mode 100644 index 0000000000..a5b20dfebc --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-async-static-class-method/input.js @@ -0,0 +1 @@ +class X { static \u0061sync x() { await x } } diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-async-static-class-method/options.json b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-async-static-class-method/options.json new file mode 100644 index 0000000000..f55830c1c3 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-async-static-class-method/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Unexpected token (1:28)" +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-await/input.js b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-await/input.js new file mode 100644 index 0000000000..824b1c3772 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-await/input.js @@ -0,0 +1 @@ +(async function() { aw\u0061it x }) diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-await/options.json b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-await/options.json new file mode 100644 index 0000000000..ac6c5914ce --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-await/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Can not use 'await' as identifier inside an async function (1:20)" +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-export-async-function/input.js b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-export-async-function/input.js new file mode 100644 index 0000000000..0d2ad1b323 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-export-async-function/input.js @@ -0,0 +1 @@ +export \u0061sync function y() { await x } diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-export-async-function/options.json b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-export-async-function/options.json new file mode 100644 index 0000000000..9d60866b80 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-export-async-function/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Unexpected token, expected \"{\" (1:7)" +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-export-dflt-async-function/input.js b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-export-dflt-async-function/input.js new file mode 100644 index 0000000000..d14f4188a0 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-export-dflt-async-function/input.js @@ -0,0 +1 @@ +export default \u0061sync function y() { await x } diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-export-dflt-async-function/options.json b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-export-dflt-async-function/options.json new file mode 100644 index 0000000000..b0e5516212 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-export-dflt-async-function/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Unexpected token, expected \";\" (1:26)" +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-sequence-arrow-list/input.js b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-sequence-arrow-list/input.js new file mode 100644 index 0000000000..55506a8872 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-sequence-arrow-list/input.js @@ -0,0 +1 @@ +(\u0061sync x => { await x }) diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-sequence-arrow-list/options.json b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-sequence-arrow-list/options.json new file mode 100644 index 0000000000..0cd8225707 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-sequence-arrow-list/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Unexpected token, expected \",\" (1:12)" +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-sequence-arrow/input.js b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-sequence-arrow/input.js new file mode 100644 index 0000000000..1989072f30 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-sequence-arrow/input.js @@ -0,0 +1 @@ +\u0061sync x => { await x } diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-sequence-arrow/options.json b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-sequence-arrow/options.json new file mode 100644 index 0000000000..f6eb197b1d --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-sequence-arrow/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Unexpected token, expected \";\" (1:11)" +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-sequence-function-list/input.js b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-sequence-function-list/input.js new file mode 100644 index 0000000000..9786373930 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-sequence-function-list/input.js @@ -0,0 +1 @@ +(\u0061sync function() { await x }) diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-sequence-function-list/options.json b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-sequence-function-list/options.json new file mode 100644 index 0000000000..0cd8225707 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-sequence-function-list/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Unexpected token, expected \",\" (1:12)" +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-sequence-function/input.js b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-sequence-function/input.js new file mode 100644 index 0000000000..a44cfbb62d --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-sequence-function/input.js @@ -0,0 +1 @@ +\u0061sync function() { await x } diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-sequence-function/options.json b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-sequence-function/options.json new file mode 100644 index 0000000000..f6eb197b1d --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-escape-sequence-function/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Unexpected token, expected \";\" (1:11)" +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-newline-after-params/input.js b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-newline-after-params/input.js new file mode 100644 index 0000000000..52a0795cf0 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-newline-after-params/input.js @@ -0,0 +1,2 @@ +async (x) +=> {} diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-newline-after-params/options.json b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-newline-after-params/options.json new file mode 100644 index 0000000000..0361d7c7d2 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-newline-after-params/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Unexpected token (2:0)" +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-parens-async-arrow/input.js b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-parens-async-arrow/input.js new file mode 100644 index 0000000000..33dbaaa09e --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-parens-async-arrow/input.js @@ -0,0 +1 @@ +(async)(a) => {} diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-parens-async-arrow/options.json b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-parens-async-arrow/options.json new file mode 100644 index 0000000000..f6eb197b1d --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-parens-async-arrow/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Unexpected token, expected \";\" (1:11)" +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-parens-async-func/input.js b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-parens-async-func/input.js new file mode 100644 index 0000000000..0af564cef7 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-parens-async-func/input.js @@ -0,0 +1 @@ +(async) function x (a) {} diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-parens-async-func/options.json b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-parens-async-func/options.json new file mode 100644 index 0000000000..c2fcdb08cf --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/invalid-parens-async-func/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Unexpected token, expected \";\" (1:8)" +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/flow/regression/arrow-function-with-newline/input.js b/packages/babel-parser/test/fixtures/flow/regression/arrow-function-with-newline/input.js new file mode 100644 index 0000000000..5868c4e2fe --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/regression/arrow-function-with-newline/input.js @@ -0,0 +1,2 @@ +async (f) +: t => { } diff --git a/packages/babel-parser/test/fixtures/flow/regression/arrow-function-with-newline/output.json b/packages/babel-parser/test/fixtures/flow/regression/arrow-function-with-newline/output.json new file mode 100644 index 0000000000..acc286d064 --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/regression/arrow-function-with-newline/output.json @@ -0,0 +1,152 @@ +{ + "type": "File", + "start": 0, + "end": 20, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 2, + "column": 10 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 20, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 2, + "column": 10 + } + }, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start": 0, + "end": 20, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 2, + "column": 10 + } + }, + "expression": { + "type": "ArrowFunctionExpression", + "start": 0, + "end": 20, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 2, + "column": 10 + } + }, + "returnType": { + "type": "TypeAnnotation", + "start": 10, + "end": 13, + "loc": { + "start": { + "line": 2, + "column": 0 + }, + "end": { + "line": 2, + "column": 3 + } + }, + "typeAnnotation": { + "type": "GenericTypeAnnotation", + "start": 12, + "end": 13, + "loc": { + "start": { + "line": 2, + "column": 2 + }, + "end": { + "line": 2, + "column": 3 + } + }, + "typeParameters": null, + "id": { + "type": "Identifier", + "start": 12, + "end": 13, + "loc": { + "start": { + "line": 2, + "column": 2 + }, + "end": { + "line": 2, + "column": 3 + }, + "identifierName": "t" + }, + "name": "t" + } + } + }, + "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": "f" + }, + "name": "f" + } + ], + "body": { + "type": "BlockStatement", + "start": 17, + "end": 20, + "loc": { + "start": { + "line": 2, + "column": 7 + }, + "end": { + "line": 2, + "column": 10 + } + }, + "body": [], + "directives": [] + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/typescript/arrow-function/arrow-function-with-newline/input.js b/packages/babel-parser/test/fixtures/typescript/arrow-function/arrow-function-with-newline/input.js new file mode 100644 index 0000000000..5868c4e2fe --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/arrow-function/arrow-function-with-newline/input.js @@ -0,0 +1,2 @@ +async (f) +: t => { } diff --git a/packages/babel-parser/test/fixtures/typescript/arrow-function/arrow-function-with-newline/output.json b/packages/babel-parser/test/fixtures/typescript/arrow-function/arrow-function-with-newline/output.json new file mode 100644 index 0000000000..01a056dd18 --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/arrow-function/arrow-function-with-newline/output.json @@ -0,0 +1,151 @@ +{ + "type": "File", + "start": 0, + "end": 20, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 2, + "column": 10 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 20, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 2, + "column": 10 + } + }, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start": 0, + "end": 20, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 2, + "column": 10 + } + }, + "expression": { + "type": "ArrowFunctionExpression", + "start": 0, + "end": 20, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 2, + "column": 10 + } + }, + "returnType": { + "type": "TSTypeAnnotation", + "start": 10, + "end": 13, + "loc": { + "start": { + "line": 2, + "column": 0 + }, + "end": { + "line": 2, + "column": 3 + } + }, + "typeAnnotation": { + "type": "TSTypeReference", + "start": 12, + "end": 13, + "loc": { + "start": { + "line": 2, + "column": 2 + }, + "end": { + "line": 2, + "column": 3 + } + }, + "typeName": { + "type": "Identifier", + "start": 12, + "end": 13, + "loc": { + "start": { + "line": 2, + "column": 2 + }, + "end": { + "line": 2, + "column": 3 + }, + "identifierName": "t" + }, + "name": "t" + } + } + }, + "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": "f" + }, + "name": "f" + } + ], + "body": { + "type": "BlockStatement", + "start": 17, + "end": 20, + "loc": { + "start": { + "line": 2, + "column": 7 + }, + "end": { + "line": 2, + "column": 10 + } + }, + "body": [], + "directives": [] + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/scripts/tests/test262/test262_whitelist.txt b/scripts/tests/test262/test262_whitelist.txt index 03e75b2222..b936b9a595 100644 --- a/scripts/tests/test262/test262_whitelist.txt +++ b/scripts/tests/test262/test262_whitelist.txt @@ -601,10 +601,6 @@ language/module-code/privatename-not-valid-earlyerr-module-3.js(default) language/module-code/privatename-not-valid-earlyerr-module-3.js(strict mode) language/module-code/privatename-not-valid-earlyerr-module-4.js(default) language/module-code/privatename-not-valid-earlyerr-module-4.js(strict mode) -language/statements/class/async-gen-meth-escaped-async.js(default) -language/statements/class/async-gen-meth-escaped-async.js(strict mode) -language/statements/class/async-meth-escaped-async.js(default) -language/statements/class/async-meth-escaped-async.js(strict mode) language/statements/class/elements/fields-duplicate-privatenames.js(default) language/statements/class/elements/fields-duplicate-privatenames.js(strict mode) language/statements/class/elements/fields-literal-name-static-propname-constructor.js(default)