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/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-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/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/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 @@ +({}