@@ -6713,50 +6713,60 @@ func (p *parser) parseDecorator() js_ast.Expr {
67136713
67146714 memberExpr := js_ast.Expr{Loc: nameRange.Loc, Data: &js_ast.EIdentifier{Ref: p.storeNameInRef(name)}}
67156715
6716- // "@x<y>() class{}"
6717- if p.options.ts.Parse {
6718- p.skipTypeScriptTypeArguments(skipTypeScriptTypeArgumentsOpts{})
6719- }
6720-
6721- for p.lexer.Token == js_lexer.TDot {
6722- p.lexer.Next()
6723-
6724- if p.lexer.Token == js_lexer.TPrivateIdentifier {
6725- name := p.lexer.Identifier
6726- memberExpr.Data = &js_ast.EIndex{
6727- Target: memberExpr,
6728- Index: js_ast.Expr{Loc: p.lexer.Loc(), Data: &js_ast.EPrivateIdentifier{Ref: p.storeNameInRef(name)}},
6716+ loop:
6717+ for {
6718+ switch p.lexer.Token {
6719+ case js_lexer.TExclamation:
6720+ // Skip over TypeScript non-null assertions
6721+ if p.lexer.HasNewlineBefore {
6722+ break loop
6723+ }
6724+ if !p.options.ts.Parse {
6725+ p.lexer.Unexpected()
67296726 }
6730- p.reportPrivateNameUsage(name.String)
67316727 p.lexer.Next()
6732- } else {
6733- memberExpr.Data = &js_ast.EDot{
6734- Target: memberExpr,
6735- Name: p.lexer.Identifier.String,
6736- NameLoc: p.lexer.Loc(),
6728+
6729+ case js_lexer.TDot:
6730+ p.lexer.Next()
6731+
6732+ if p.lexer.Token == js_lexer.TPrivateIdentifier {
6733+ name := p.lexer.Identifier
6734+ memberExpr.Data = &js_ast.EIndex{
6735+ Target: memberExpr,
6736+ Index: js_ast.Expr{Loc: p.lexer.Loc(), Data: &js_ast.EPrivateIdentifier{Ref: p.storeNameInRef(name)}},
6737+ }
6738+ p.reportPrivateNameUsage(name.String)
6739+ p.lexer.Next()
6740+ } else {
6741+ memberExpr.Data = &js_ast.EDot{
6742+ Target: memberExpr,
6743+ Name: p.lexer.Identifier.String,
6744+ NameLoc: p.lexer.Loc(),
6745+ }
6746+ p.lexer.Expect(js_lexer.TIdentifier)
67376747 }
6738- p.lexer.Expect(js_lexer.TIdentifier)
6739- }
67406748
6741- // "@x.y<z>() class{}"
6742- if p.options.ts.Parse {
6743- p.skipTypeScriptTypeArguments(skipTypeScriptTypeArgumentsOpts{})
6744- }
6745- }
6749+ case js_lexer.TQuestionDot:
6750+ // The grammar for "DecoratorMemberExpression" currently forbids "?."
6751+ p.lexer.Expect(js_lexer.TDot)
67466752
6747- // The grammar for "DecoratorMemberExpression" currently forbids "?."
6748- if p.lexer.Token == js_lexer.TQuestionDot {
6749- p.lexer.Expect(js_lexer.TDot)
6750- }
6753+ case js_lexer.TOpenParen:
6754+ args, closeParenLoc, isMultiLine := p.parseCallArgs()
6755+ memberExpr.Data = &js_ast.ECall{
6756+ Target: memberExpr,
6757+ Args: args,
6758+ CloseParenLoc: closeParenLoc,
6759+ IsMultiLine: isMultiLine,
6760+ Kind: js_ast.TargetWasOriginallyPropertyAccess,
6761+ }
6762+ break loop
67516763
6752- if p.lexer.Token == js_lexer.TOpenParen {
6753- args, closeParenLoc, isMultiLine := p.parseCallArgs()
6754- memberExpr.Data = &js_ast.ECall{
6755- Target: memberExpr,
6756- Args: args,
6757- CloseParenLoc: closeParenLoc,
6758- IsMultiLine: isMultiLine,
6759- Kind: js_ast.TargetWasOriginallyPropertyAccess,
6764+ default:
6765+ // "@x<y>"
6766+ // "@x.y<z>"
6767+ if !p.skipTypeScriptTypeArguments(skipTypeScriptTypeArgumentsOpts{}) {
6768+ break loop
6769+ }
67606770 }
67616771 }
67626772
0 commit comments