diff --git a/packages/babel-parser/src/parser/expression.js b/packages/babel-parser/src/parser/expression.js index b669d0e5b7..a7daba941f 100644 --- a/packages/babel-parser/src/parser/expression.js +++ b/packages/babel-parser/src/parser/expression.js @@ -701,6 +701,7 @@ export default class ExpressionParser extends LValParser { } let optional = false; + if (this.match(tt.questionDot)) { if (noCalls && this.lookaheadCharCode() === charCodes.leftParenthesis) { // stop at `?.` when parsing `new a?.()` @@ -719,11 +720,21 @@ export default class ExpressionParser extends LValParser { state, optional, ); - } else if (optional || this.match(tt.bracketL) || this.eat(tt.dot)) { - return this.parseMember(base, startPos, startLoc, state, optional); } else { - state.stop = true; - return base; + const computed = this.eat(tt.bracketL); + if (computed || optional || this.eat(tt.dot)) { + return this.parseMember( + base, + startPos, + startLoc, + state, + computed, + optional, + ); + } else { + state.stop = true; + return base; + } } } @@ -736,10 +747,10 @@ export default class ExpressionParser extends LValParser { startPos: number, startLoc: Position, state: N.ParseSubscriptState, + computed: boolean, optional: boolean, ): N.OptionalMemberExpression | N.MemberExpression { const node = this.startNodeAt(startPos, startLoc); - const computed = this.eat(tt.bracketL); node.object = base; node.computed = computed; const privateName = diff --git a/packages/babel-parser/test/fixtures/core/regression/13694-invalid-dot-bracketL-member/input.js b/packages/babel-parser/test/fixtures/core/regression/13694-invalid-dot-bracketL-member/input.js new file mode 100644 index 0000000000..98d5dd4c3b --- /dev/null +++ b/packages/babel-parser/test/fixtures/core/regression/13694-invalid-dot-bracketL-member/input.js @@ -0,0 +1 @@ +a.[b] diff --git a/packages/babel-parser/test/fixtures/core/regression/13694-invalid-dot-bracketL-member/options.json b/packages/babel-parser/test/fixtures/core/regression/13694-invalid-dot-bracketL-member/options.json new file mode 100644 index 0000000000..e68fbb6aec --- /dev/null +++ b/packages/babel-parser/test/fixtures/core/regression/13694-invalid-dot-bracketL-member/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Unexpected token (1:2)" +} \ No newline at end of file