From d930fc01db421bf11244f34dd2e87a277f247ce2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Mon, 16 May 2022 16:44:17 -0400 Subject: [PATCH 1/2] fix: manipulate state.canStartJSXElement before eating braceR --- .../babel-parser/src/plugins/jsx/index.js | 9 ++--- packages/babel-parser/src/tokenizer/types.js | 2 +- .../output.json | 2 +- .../output.json | 2 +- .../jsx/regression/issue-14552/input.js | 1 + .../jsx/regression/issue-14552/options.json | 3 ++ .../jsx/regression/issue-14552/output.json | 36 +++++++++++++++++++ .../brace-hash/output.json | 2 +- .../template-string-babel-7/basic/output.json | 4 +-- .../invalid-octal/output.json | 4 +-- .../output.json | 4 +-- .../output.json | 2 +- 12 files changed, 56 insertions(+), 15 deletions(-) create mode 100644 packages/babel-parser/test/fixtures/jsx/regression/issue-14552/input.js create mode 100644 packages/babel-parser/test/fixtures/jsx/regression/issue-14552/options.json create mode 100644 packages/babel-parser/test/fixtures/jsx/regression/issue-14552/output.json diff --git a/packages/babel-parser/src/plugins/jsx/index.js b/packages/babel-parser/src/plugins/jsx/index.js index 41e0a761b378..f9c2bf9d6c62 100644 --- a/packages/babel-parser/src/plugins/jsx/index.js +++ b/packages/babel-parser/src/plugins/jsx/index.js @@ -353,6 +353,7 @@ export default (superClass: Class): Class => this.next(); // ellipsis node.expression = this.parseExpression(); this.setContext(tc.j_oTag); + this.state.canStartJSXElement = true; this.expect(tt.braceR); return this.finishNode(node, "JSXSpreadChild"); @@ -383,6 +384,7 @@ export default (superClass: Class): Class => node.expression = expression; } this.setContext(previousContext); + this.state.canStartJSXElement = true; this.expect(tt.braceR); return this.finishNode(node, "JSXExpressionContainer"); @@ -398,6 +400,7 @@ export default (superClass: Class): Class => this.expect(tt.ellipsis); node.argument = this.parseMaybeAssignAllowIn(); this.setContext(tc.j_oTag); + this.state.canStartJSXElement = true; this.expect(tt.braceR); return this.finishNode(node, "JSXSpreadAttribute"); } @@ -413,8 +416,7 @@ export default (superClass: Class): Class => startLoc: Position, ): N.JSXOpeningElement { const node = this.startNodeAt(startPos, startLoc); - if (this.match(tt.jsxTagEnd)) { - this.expect(tt.jsxTagEnd); + if (this.eat(tt.jsxTagEnd)) { return this.finishNode(node, "JSXOpeningFragment"); } node.name = this.jsxParseElementName(); @@ -441,8 +443,7 @@ export default (superClass: Class): Class => startLoc: Position, ): N.JSXClosingElement { const node = this.startNodeAt(startPos, startLoc); - if (this.match(tt.jsxTagEnd)) { - this.expect(tt.jsxTagEnd); + if (this.eat(tt.jsxTagEnd)) { return this.finishNode(node, "JSXClosingFragment"); } node.name = this.jsxParseElementName(); diff --git a/packages/babel-parser/src/tokenizer/types.js b/packages/babel-parser/src/tokenizer/types.js index a2c68b54ca14..b328c4709424 100644 --- a/packages/babel-parser/src/tokenizer/types.js +++ b/packages/babel-parser/src/tokenizer/types.js @@ -142,7 +142,7 @@ export const tt: { [name: string]: TokenType } = { braceL: createToken("{", { beforeExpr, startsExpr }), braceBarL: createToken("{|", { beforeExpr, startsExpr }), braceHashL: createToken("#{", { beforeExpr, startsExpr }), - braceR: createToken("}", { beforeExpr }), + braceR: createToken("}"), braceBarR: createToken("|}"), parenL: createToken("(", { beforeExpr, startsExpr }), parenR: createToken(")"), diff --git a/packages/babel-parser/test/fixtures/core/opts/private-name-tokens-true-babel-7/output.json b/packages/babel-parser/test/fixtures/core/opts/private-name-tokens-true-babel-7/output.json index 39473fe06fc6..3d4c309fbd01 100644 --- a/packages/babel-parser/test/fixtures/core/opts/private-name-tokens-true-babel-7/output.json +++ b/packages/babel-parser/test/fixtures/core/opts/private-name-tokens-true-babel-7/output.json @@ -124,7 +124,7 @@ { "type": { "label": "}", - "beforeExpr": true, + "beforeExpr": false, "startsExpr": false, "rightAssociative": false, "isLoop": false, diff --git a/packages/babel-parser/test/fixtures/flow/typecasts/fail-without-parens-jsx-tokens-true-babel-7/output.json b/packages/babel-parser/test/fixtures/flow/typecasts/fail-without-parens-jsx-tokens-true-babel-7/output.json index e7ecb1e507c9..5be812738465 100644 --- a/packages/babel-parser/test/fixtures/flow/typecasts/fail-without-parens-jsx-tokens-true-babel-7/output.json +++ b/packages/babel-parser/test/fixtures/flow/typecasts/fail-without-parens-jsx-tokens-true-babel-7/output.json @@ -234,7 +234,7 @@ { "type": { "label": "}", - "beforeExpr": true, + "beforeExpr": false, "startsExpr": false, "rightAssociative": false, "isLoop": false, diff --git a/packages/babel-parser/test/fixtures/jsx/regression/issue-14552/input.js b/packages/babel-parser/test/fixtures/jsx/regression/issue-14552/input.js new file mode 100644 index 000000000000..6d4fa7c34eb6 --- /dev/null +++ b/packages/babel-parser/test/fixtures/jsx/regression/issue-14552/input.js @@ -0,0 +1 @@ +({} Date: Mon, 16 May 2022 18:53:10 -0400 Subject: [PATCH 2/2] update Babel 8 test fixtures --- .../fixtures/core/opts/private-name-tokens-true/output.json | 2 +- .../typecasts/fail-without-parens-jsx-tokens-true/output.json | 2 +- .../fixtures/tokens/record-and-tuple/brace-hash/output.json | 2 +- .../type-alias/generic-complex-tokens-true/output.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/babel-parser/test/fixtures/core/opts/private-name-tokens-true/output.json b/packages/babel-parser/test/fixtures/core/opts/private-name-tokens-true/output.json index b46c31c26050..5713814e6cd8 100644 --- a/packages/babel-parser/test/fixtures/core/opts/private-name-tokens-true/output.json +++ b/packages/babel-parser/test/fixtures/core/opts/private-name-tokens-true/output.json @@ -105,7 +105,7 @@ { "type": { "label": "}", - "beforeExpr": true, + "beforeExpr": false, "startsExpr": false, "rightAssociative": false, "isLoop": false, diff --git a/packages/babel-parser/test/fixtures/flow/typecasts/fail-without-parens-jsx-tokens-true/output.json b/packages/babel-parser/test/fixtures/flow/typecasts/fail-without-parens-jsx-tokens-true/output.json index 87e07a4ad202..70e4e9ed4e06 100644 --- a/packages/babel-parser/test/fixtures/flow/typecasts/fail-without-parens-jsx-tokens-true/output.json +++ b/packages/babel-parser/test/fixtures/flow/typecasts/fail-without-parens-jsx-tokens-true/output.json @@ -226,7 +226,7 @@ { "type": { "label": "}", - "beforeExpr": true, + "beforeExpr": false, "startsExpr": false, "rightAssociative": false, "isLoop": false, diff --git a/packages/babel-parser/test/fixtures/tokens/record-and-tuple/brace-hash/output.json b/packages/babel-parser/test/fixtures/tokens/record-and-tuple/brace-hash/output.json index b391a88f98c3..5f41304434be 100644 --- a/packages/babel-parser/test/fixtures/tokens/record-and-tuple/brace-hash/output.json +++ b/packages/babel-parser/test/fixtures/tokens/record-and-tuple/brace-hash/output.json @@ -37,7 +37,7 @@ { "type": { "label": "}", - "beforeExpr": true, + "beforeExpr": false, "startsExpr": false, "rightAssociative": false, "isLoop": false, diff --git a/packages/babel-parser/test/fixtures/typescript/type-alias/generic-complex-tokens-true/output.json b/packages/babel-parser/test/fixtures/typescript/type-alias/generic-complex-tokens-true/output.json index 1cc110cde743..aa781374a70a 100644 --- a/packages/babel-parser/test/fixtures/typescript/type-alias/generic-complex-tokens-true/output.json +++ b/packages/babel-parser/test/fixtures/typescript/type-alias/generic-complex-tokens-true/output.json @@ -254,7 +254,7 @@ { "type": { "label": "}", - "beforeExpr": true, + "beforeExpr": false, "startsExpr": false, "rightAssociative": false, "isLoop": false,