go.ketch.com/lib/goja@v0.0.1/parser/expression.go (about)

     1  package parser
     2  
     3  import (
     4  	"strings"
     5  
     6  	"go.ketch.com/lib/goja/ast"
     7  	"go.ketch.com/lib/goja/file"
     8  	"go.ketch.com/lib/goja/token"
     9  	"go.ketch.com/lib/goja/unistring"
    10  )
    11  
    12  func (self *_parser) parseIdentifier() *ast.Identifier {
    13  	literal := self.parsedLiteral
    14  	idx := self.idx
    15  	self.next()
    16  	return &ast.Identifier{
    17  		Name: literal,
    18  		Idx:  idx,
    19  	}
    20  }
    21  
    22  func (self *_parser) parsePrimaryExpression() ast.Expression {
    23  	literal, parsedLiteral := self.literal, self.parsedLiteral
    24  	idx := self.idx
    25  	switch self.token {
    26  	case token.IDENTIFIER:
    27  		self.next()
    28  		return &ast.Identifier{
    29  			Name: parsedLiteral,
    30  			Idx:  idx,
    31  		}
    32  	case token.NULL:
    33  		self.next()
    34  		return &ast.NullLiteral{
    35  			Idx:     idx,
    36  			Literal: literal,
    37  		}
    38  	case token.BOOLEAN:
    39  		self.next()
    40  		value := false
    41  		switch parsedLiteral {
    42  		case "true":
    43  			value = true
    44  		case "false":
    45  			value = false
    46  		default:
    47  			self.error(idx, "Illegal boolean literal")
    48  		}
    49  		return &ast.BooleanLiteral{
    50  			Idx:     idx,
    51  			Literal: literal,
    52  			Value:   value,
    53  		}
    54  	case token.STRING:
    55  		self.next()
    56  		return &ast.StringLiteral{
    57  			Idx:     idx,
    58  			Literal: literal,
    59  			Value:   parsedLiteral,
    60  		}
    61  	case token.NUMBER:
    62  		self.next()
    63  		value, err := parseNumberLiteral(literal)
    64  		if err != nil {
    65  			self.error(idx, err.Error())
    66  			value = 0
    67  		}
    68  		return &ast.NumberLiteral{
    69  			Idx:     idx,
    70  			Literal: literal,
    71  			Value:   value,
    72  		}
    73  	case token.SLASH, token.QUOTIENT_ASSIGN:
    74  		return self.parseRegExpLiteral()
    75  	case token.LEFT_BRACE:
    76  		return self.parseObjectLiteral()
    77  	case token.LEFT_BRACKET:
    78  		return self.parseArrayLiteral()
    79  	case token.LEFT_PARENTHESIS:
    80  		return self.parseParenthesisedExpression()
    81  	case token.BACKTICK:
    82  		return self.parseTemplateLiteral(false)
    83  	case token.THIS:
    84  		self.next()
    85  		return &ast.ThisExpression{
    86  			Idx: idx,
    87  		}
    88  	case token.SUPER:
    89  		return self.parseSuperProperty()
    90  	case token.FUNCTION:
    91  		return self.parseFunction(false)
    92  	case token.CLASS:
    93  		return self.parseClass(false)
    94  	}
    95  
    96  	if isBindingId(self.token, parsedLiteral) {
    97  		self.next()
    98  		return &ast.Identifier{
    99  			Name: parsedLiteral,
   100  			Idx:  idx,
   101  		}
   102  	}
   103  
   104  	self.errorUnexpectedToken(self.token)
   105  	self.nextStatement()
   106  	return &ast.BadExpression{From: idx, To: self.idx}
   107  }
   108  
   109  func (self *_parser) parseSuperProperty() ast.Expression {
   110  	idx := self.idx
   111  	self.next()
   112  	switch self.token {
   113  	case token.PERIOD:
   114  		self.next()
   115  		if !token.IsId(self.token) {
   116  			self.expect(token.IDENTIFIER)
   117  			self.nextStatement()
   118  			return &ast.BadExpression{From: idx, To: self.idx}
   119  		}
   120  		idIdx := self.idx
   121  		parsedLiteral := self.parsedLiteral
   122  		self.next()
   123  		return &ast.DotExpression{
   124  			Left: &ast.SuperExpression{
   125  				Idx: idx,
   126  			},
   127  			Identifier: ast.Identifier{
   128  				Name: parsedLiteral,
   129  				Idx:  idIdx,
   130  			},
   131  		}
   132  	case token.LEFT_BRACKET:
   133  		return self.parseBracketMember(&ast.SuperExpression{
   134  			Idx: idx,
   135  		})
   136  	case token.LEFT_PARENTHESIS:
   137  		return self.parseCallExpression(&ast.SuperExpression{
   138  			Idx: idx,
   139  		})
   140  	default:
   141  		self.error(idx, "'super' keyword unexpected here")
   142  		self.nextStatement()
   143  		return &ast.BadExpression{From: idx, To: self.idx}
   144  	}
   145  }
   146  
   147  func (self *_parser) reinterpretSequenceAsArrowFuncParams(seq *ast.SequenceExpression) *ast.ParameterList {
   148  	firstRestIdx := -1
   149  	params := make([]*ast.Binding, 0, len(seq.Sequence))
   150  	for i, item := range seq.Sequence {
   151  		if _, ok := item.(*ast.SpreadElement); ok {
   152  			if firstRestIdx == -1 {
   153  				firstRestIdx = i
   154  				continue
   155  			}
   156  		}
   157  		if firstRestIdx != -1 {
   158  			self.error(seq.Sequence[firstRestIdx].Idx0(), "Rest parameter must be last formal parameter")
   159  			return &ast.ParameterList{}
   160  		}
   161  		params = append(params, self.reinterpretAsBinding(item))
   162  	}
   163  	var rest ast.Expression
   164  	if firstRestIdx != -1 {
   165  		rest = self.reinterpretAsBindingRestElement(seq.Sequence[firstRestIdx])
   166  	}
   167  	return &ast.ParameterList{
   168  		List: params,
   169  		Rest: rest,
   170  	}
   171  }
   172  
   173  func (self *_parser) parseParenthesisedExpression() ast.Expression {
   174  	opening := self.idx
   175  	self.expect(token.LEFT_PARENTHESIS)
   176  	var list []ast.Expression
   177  	if self.token != token.RIGHT_PARENTHESIS {
   178  		for {
   179  			if self.token == token.ELLIPSIS {
   180  				start := self.idx
   181  				self.errorUnexpectedToken(token.ELLIPSIS)
   182  				self.next()
   183  				expr := self.parseAssignmentExpression()
   184  				list = append(list, &ast.BadExpression{
   185  					From: start,
   186  					To:   expr.Idx1(),
   187  				})
   188  			} else {
   189  				list = append(list, self.parseAssignmentExpression())
   190  			}
   191  			if self.token != token.COMMA {
   192  				break
   193  			}
   194  			self.next()
   195  			if self.token == token.RIGHT_PARENTHESIS {
   196  				self.errorUnexpectedToken(token.RIGHT_PARENTHESIS)
   197  				break
   198  			}
   199  		}
   200  	}
   201  	self.expect(token.RIGHT_PARENTHESIS)
   202  	if len(list) == 1 && len(self.errors) == 0 {
   203  		return list[0]
   204  	}
   205  	if len(list) == 0 {
   206  		self.errorUnexpectedToken(token.RIGHT_PARENTHESIS)
   207  		return &ast.BadExpression{
   208  			From: opening,
   209  			To:   self.idx,
   210  		}
   211  	}
   212  	return &ast.SequenceExpression{
   213  		Sequence: list,
   214  	}
   215  }
   216  
   217  func (self *_parser) parseRegExpLiteral() *ast.RegExpLiteral {
   218  
   219  	offset := self.chrOffset - 1 // Opening slash already gotten
   220  	if self.token == token.QUOTIENT_ASSIGN {
   221  		offset -= 1 // =
   222  	}
   223  	idx := self.idxOf(offset)
   224  
   225  	pattern, _, err := self.scanString(offset, false)
   226  	endOffset := self.chrOffset
   227  
   228  	if err == "" {
   229  		pattern = pattern[1 : len(pattern)-1]
   230  	}
   231  
   232  	flags := ""
   233  	if !isLineTerminator(self.chr) && !isLineWhiteSpace(self.chr) {
   234  		self.next()
   235  
   236  		if self.token == token.IDENTIFIER { // gim
   237  
   238  			flags = self.literal
   239  			self.next()
   240  			endOffset = self.chrOffset - 1
   241  		}
   242  	} else {
   243  		self.next()
   244  	}
   245  
   246  	literal := self.str[offset:endOffset]
   247  
   248  	return &ast.RegExpLiteral{
   249  		Idx:     idx,
   250  		Literal: literal,
   251  		Pattern: pattern,
   252  		Flags:   flags,
   253  	}
   254  }
   255  
   256  func isBindingId(tok token.Token, parsedLiteral unistring.String) bool {
   257  	if tok == token.IDENTIFIER {
   258  		return true
   259  	}
   260  	if token.IsId(tok) {
   261  		switch parsedLiteral {
   262  		case "yield", "await":
   263  			return true
   264  		}
   265  		if token.IsUnreservedWord(tok) {
   266  			return true
   267  		}
   268  	}
   269  	return false
   270  }
   271  
   272  func (self *_parser) tokenToBindingId() {
   273  	if isBindingId(self.token, self.parsedLiteral) {
   274  		self.token = token.IDENTIFIER
   275  	}
   276  }
   277  
   278  func (self *_parser) parseBindingTarget() (target ast.BindingTarget) {
   279  	self.tokenToBindingId()
   280  	switch self.token {
   281  	case token.IDENTIFIER:
   282  		target = &ast.Identifier{
   283  			Name: self.parsedLiteral,
   284  			Idx:  self.idx,
   285  		}
   286  		self.next()
   287  	case token.LEFT_BRACKET:
   288  		target = self.parseArrayBindingPattern()
   289  	case token.LEFT_BRACE:
   290  		target = self.parseObjectBindingPattern()
   291  	default:
   292  		idx := self.expect(token.IDENTIFIER)
   293  		self.nextStatement()
   294  		target = &ast.BadExpression{From: idx, To: self.idx}
   295  	}
   296  
   297  	return
   298  }
   299  
   300  func (self *_parser) parseVariableDeclaration(declarationList *[]*ast.Binding) ast.Expression {
   301  	node := &ast.Binding{
   302  		Target: self.parseBindingTarget(),
   303  	}
   304  
   305  	if declarationList != nil {
   306  		*declarationList = append(*declarationList, node)
   307  	}
   308  
   309  	if self.token == token.ASSIGN {
   310  		self.next()
   311  		node.Initializer = self.parseAssignmentExpression()
   312  	}
   313  
   314  	return node
   315  }
   316  
   317  func (self *_parser) parseVariableDeclarationList() (declarationList []*ast.Binding) {
   318  	for {
   319  		self.parseVariableDeclaration(&declarationList)
   320  		if self.token != token.COMMA {
   321  			break
   322  		}
   323  		self.next()
   324  	}
   325  	return
   326  }
   327  
   328  func (self *_parser) parseVarDeclarationList(var_ file.Idx) []*ast.Binding {
   329  	declarationList := self.parseVariableDeclarationList()
   330  
   331  	self.scope.declare(&ast.VariableDeclaration{
   332  		Var:  var_,
   333  		List: declarationList,
   334  	})
   335  
   336  	return declarationList
   337  }
   338  
   339  func (self *_parser) parseObjectPropertyKey() (string, unistring.String, ast.Expression, token.Token) {
   340  	if self.token == token.LEFT_BRACKET {
   341  		self.next()
   342  		expr := self.parseAssignmentExpression()
   343  		self.expect(token.RIGHT_BRACKET)
   344  		return "", "", expr, token.ILLEGAL
   345  	}
   346  	idx, tkn, literal, parsedLiteral := self.idx, self.token, self.literal, self.parsedLiteral
   347  	var value ast.Expression
   348  	self.next()
   349  	switch tkn {
   350  	case token.IDENTIFIER, token.STRING, token.KEYWORD, token.ESCAPED_RESERVED_WORD:
   351  		value = &ast.StringLiteral{
   352  			Idx:     idx,
   353  			Literal: literal,
   354  			Value:   parsedLiteral,
   355  		}
   356  	case token.NUMBER:
   357  		num, err := parseNumberLiteral(literal)
   358  		if err != nil {
   359  			self.error(idx, err.Error())
   360  		} else {
   361  			value = &ast.NumberLiteral{
   362  				Idx:     idx,
   363  				Literal: literal,
   364  				Value:   num,
   365  			}
   366  		}
   367  	case token.PRIVATE_IDENTIFIER:
   368  		value = &ast.PrivateIdentifier{
   369  			Identifier: ast.Identifier{
   370  				Idx:  idx,
   371  				Name: parsedLiteral,
   372  			},
   373  		}
   374  	default:
   375  		// null, false, class, etc.
   376  		if token.IsId(tkn) {
   377  			value = &ast.StringLiteral{
   378  				Idx:     idx,
   379  				Literal: literal,
   380  				Value:   unistring.String(literal),
   381  			}
   382  		} else {
   383  			self.errorUnexpectedToken(tkn)
   384  		}
   385  	}
   386  	return literal, parsedLiteral, value, tkn
   387  }
   388  
   389  func (self *_parser) parseObjectProperty() ast.Property {
   390  	if self.token == token.ELLIPSIS {
   391  		self.next()
   392  		return &ast.SpreadElement{
   393  			Expression: self.parseAssignmentExpression(),
   394  		}
   395  	}
   396  	keyStartIdx := self.idx
   397  	literal, parsedLiteral, value, tkn := self.parseObjectPropertyKey()
   398  	if value == nil {
   399  		return nil
   400  	}
   401  	if token.IsId(tkn) || tkn == token.STRING || tkn == token.ILLEGAL {
   402  		switch {
   403  		case self.token == token.LEFT_PARENTHESIS:
   404  			parameterList := self.parseFunctionParameterList()
   405  
   406  			node := &ast.FunctionLiteral{
   407  				Function:      keyStartIdx,
   408  				ParameterList: parameterList,
   409  			}
   410  			node.Body, node.DeclarationList = self.parseFunctionBlock()
   411  			node.Source = self.slice(keyStartIdx, node.Body.Idx1())
   412  
   413  			return &ast.PropertyKeyed{
   414  				Key:   value,
   415  				Kind:  ast.PropertyKindMethod,
   416  				Value: node,
   417  			}
   418  		case self.token == token.COMMA || self.token == token.RIGHT_BRACE || self.token == token.ASSIGN: // shorthand property
   419  			if isBindingId(tkn, parsedLiteral) {
   420  				var initializer ast.Expression
   421  				if self.token == token.ASSIGN {
   422  					// allow the initializer syntax here in case the object literal
   423  					// needs to be reinterpreted as an assignment pattern, enforce later if it doesn't.
   424  					self.next()
   425  					initializer = self.parseAssignmentExpression()
   426  				}
   427  				return &ast.PropertyShort{
   428  					Name: ast.Identifier{
   429  						Name: parsedLiteral,
   430  						Idx:  value.Idx0(),
   431  					},
   432  					Initializer: initializer,
   433  				}
   434  			} else {
   435  				self.errorUnexpectedToken(self.token)
   436  			}
   437  		case (literal == "get" || literal == "set") && self.token != token.COLON:
   438  			_, _, keyValue, _ := self.parseObjectPropertyKey()
   439  			if keyValue == nil {
   440  				return nil
   441  			}
   442  
   443  			var kind ast.PropertyKind
   444  			if literal == "get" {
   445  				kind = ast.PropertyKindGet
   446  			} else {
   447  				kind = ast.PropertyKindSet
   448  			}
   449  
   450  			return &ast.PropertyKeyed{
   451  				Key:   keyValue,
   452  				Kind:  kind,
   453  				Value: self.parseMethodDefinition(keyStartIdx, kind),
   454  			}
   455  		}
   456  	}
   457  
   458  	self.expect(token.COLON)
   459  	return &ast.PropertyKeyed{
   460  		Key:      value,
   461  		Kind:     ast.PropertyKindValue,
   462  		Value:    self.parseAssignmentExpression(),
   463  		Computed: tkn == token.ILLEGAL,
   464  	}
   465  }
   466  
   467  func (self *_parser) parseMethodDefinition(keyStartIdx file.Idx, kind ast.PropertyKind) *ast.FunctionLiteral {
   468  	idx1 := self.idx
   469  	parameterList := self.parseFunctionParameterList()
   470  	switch kind {
   471  	case ast.PropertyKindGet:
   472  		if len(parameterList.List) > 0 || parameterList.Rest != nil {
   473  			self.error(idx1, "Getter must not have any formal parameters.")
   474  		}
   475  	case ast.PropertyKindSet:
   476  		if len(parameterList.List) != 1 || parameterList.Rest != nil {
   477  			self.error(idx1, "Setter must have exactly one formal parameter.")
   478  		}
   479  	}
   480  	node := &ast.FunctionLiteral{
   481  		Function:      keyStartIdx,
   482  		ParameterList: parameterList,
   483  	}
   484  	node.Body, node.DeclarationList = self.parseFunctionBlock()
   485  	node.Source = self.slice(keyStartIdx, node.Body.Idx1())
   486  	return node
   487  }
   488  
   489  func (self *_parser) parseObjectLiteral() *ast.ObjectLiteral {
   490  	var value []ast.Property
   491  	idx0 := self.expect(token.LEFT_BRACE)
   492  	for self.token != token.RIGHT_BRACE && self.token != token.EOF {
   493  		property := self.parseObjectProperty()
   494  		if property != nil {
   495  			value = append(value, property)
   496  		}
   497  		if self.token != token.RIGHT_BRACE {
   498  			self.expect(token.COMMA)
   499  		} else {
   500  			break
   501  		}
   502  	}
   503  	idx1 := self.expect(token.RIGHT_BRACE)
   504  
   505  	return &ast.ObjectLiteral{
   506  		LeftBrace:  idx0,
   507  		RightBrace: idx1,
   508  		Value:      value,
   509  	}
   510  }
   511  
   512  func (self *_parser) parseArrayLiteral() *ast.ArrayLiteral {
   513  
   514  	idx0 := self.expect(token.LEFT_BRACKET)
   515  	var value []ast.Expression
   516  	for self.token != token.RIGHT_BRACKET && self.token != token.EOF {
   517  		if self.token == token.COMMA {
   518  			self.next()
   519  			value = append(value, nil)
   520  			continue
   521  		}
   522  		if self.token == token.ELLIPSIS {
   523  			self.next()
   524  			value = append(value, &ast.SpreadElement{
   525  				Expression: self.parseAssignmentExpression(),
   526  			})
   527  		} else {
   528  			value = append(value, self.parseAssignmentExpression())
   529  		}
   530  		if self.token != token.RIGHT_BRACKET {
   531  			self.expect(token.COMMA)
   532  		}
   533  	}
   534  	idx1 := self.expect(token.RIGHT_BRACKET)
   535  
   536  	return &ast.ArrayLiteral{
   537  		LeftBracket:  idx0,
   538  		RightBracket: idx1,
   539  		Value:        value,
   540  	}
   541  }
   542  
   543  func (self *_parser) parseTemplateLiteral(tagged bool) *ast.TemplateLiteral {
   544  	res := &ast.TemplateLiteral{
   545  		OpenQuote: self.idx,
   546  	}
   547  	for {
   548  		start := self.offset
   549  		literal, parsed, finished, parseErr, err := self.parseTemplateCharacters()
   550  		if err != "" {
   551  			self.error(self.offset, err)
   552  		}
   553  		res.Elements = append(res.Elements, &ast.TemplateElement{
   554  			Idx:     self.idxOf(start),
   555  			Literal: literal,
   556  			Parsed:  parsed,
   557  			Valid:   parseErr == "",
   558  		})
   559  		if !tagged && parseErr != "" {
   560  			self.error(self.offset, parseErr)
   561  		}
   562  		end := self.chrOffset - 1
   563  		self.next()
   564  		if finished {
   565  			res.CloseQuote = self.idxOf(end)
   566  			break
   567  		}
   568  		expr := self.parseExpression()
   569  		res.Expressions = append(res.Expressions, expr)
   570  		if self.token != token.RIGHT_BRACE {
   571  			self.errorUnexpectedToken(self.token)
   572  		}
   573  	}
   574  	return res
   575  }
   576  
   577  func (self *_parser) parseTaggedTemplateLiteral(tag ast.Expression) *ast.TemplateLiteral {
   578  	l := self.parseTemplateLiteral(true)
   579  	l.Tag = tag
   580  	return l
   581  }
   582  
   583  func (self *_parser) parseArgumentList() (argumentList []ast.Expression, idx0, idx1 file.Idx) {
   584  	idx0 = self.expect(token.LEFT_PARENTHESIS)
   585  	for self.token != token.RIGHT_PARENTHESIS {
   586  		var item ast.Expression
   587  		if self.token == token.ELLIPSIS {
   588  			self.next()
   589  			item = &ast.SpreadElement{
   590  				Expression: self.parseAssignmentExpression(),
   591  			}
   592  		} else {
   593  			item = self.parseAssignmentExpression()
   594  		}
   595  		argumentList = append(argumentList, item)
   596  		if self.token != token.COMMA {
   597  			break
   598  		}
   599  		self.next()
   600  	}
   601  	idx1 = self.expect(token.RIGHT_PARENTHESIS)
   602  	return
   603  }
   604  
   605  func (self *_parser) parseCallExpression(left ast.Expression) ast.Expression {
   606  	argumentList, idx0, idx1 := self.parseArgumentList()
   607  	return &ast.CallExpression{
   608  		Callee:           left,
   609  		LeftParenthesis:  idx0,
   610  		ArgumentList:     argumentList,
   611  		RightParenthesis: idx1,
   612  	}
   613  }
   614  
   615  func (self *_parser) parseDotMember(left ast.Expression) ast.Expression {
   616  	period := self.idx
   617  	self.next()
   618  
   619  	literal := self.parsedLiteral
   620  	idx := self.idx
   621  
   622  	if self.token == token.PRIVATE_IDENTIFIER {
   623  		self.next()
   624  		return &ast.PrivateDotExpression{
   625  			Left: left,
   626  			Identifier: ast.PrivateIdentifier{
   627  				Identifier: ast.Identifier{
   628  					Idx:  idx,
   629  					Name: literal,
   630  				},
   631  			},
   632  		}
   633  	}
   634  
   635  	if !token.IsId(self.token) {
   636  		self.expect(token.IDENTIFIER)
   637  		self.nextStatement()
   638  		return &ast.BadExpression{From: period, To: self.idx}
   639  	}
   640  
   641  	self.next()
   642  
   643  	return &ast.DotExpression{
   644  		Left: left,
   645  		Identifier: ast.Identifier{
   646  			Idx:  idx,
   647  			Name: literal,
   648  		},
   649  	}
   650  }
   651  
   652  func (self *_parser) parseBracketMember(left ast.Expression) ast.Expression {
   653  	idx0 := self.expect(token.LEFT_BRACKET)
   654  	member := self.parseExpression()
   655  	idx1 := self.expect(token.RIGHT_BRACKET)
   656  	return &ast.BracketExpression{
   657  		LeftBracket:  idx0,
   658  		Left:         left,
   659  		Member:       member,
   660  		RightBracket: idx1,
   661  	}
   662  }
   663  
   664  func (self *_parser) parseNewExpression() ast.Expression {
   665  	idx := self.expect(token.NEW)
   666  	if self.token == token.PERIOD {
   667  		self.next()
   668  		if self.literal == "target" {
   669  			return &ast.MetaProperty{
   670  				Meta: &ast.Identifier{
   671  					Name: unistring.String(token.NEW.String()),
   672  					Idx:  idx,
   673  				},
   674  				Property: self.parseIdentifier(),
   675  			}
   676  		}
   677  		self.errorUnexpectedToken(token.IDENTIFIER)
   678  	}
   679  	callee := self.parseLeftHandSideExpression()
   680  	if bad, ok := callee.(*ast.BadExpression); ok {
   681  		bad.From = idx
   682  		return bad
   683  	}
   684  	node := &ast.NewExpression{
   685  		New:    idx,
   686  		Callee: callee,
   687  	}
   688  	if self.token == token.LEFT_PARENTHESIS {
   689  		argumentList, idx0, idx1 := self.parseArgumentList()
   690  		node.ArgumentList = argumentList
   691  		node.LeftParenthesis = idx0
   692  		node.RightParenthesis = idx1
   693  	}
   694  	return node
   695  }
   696  
   697  func (self *_parser) parseLeftHandSideExpression() ast.Expression {
   698  
   699  	var left ast.Expression
   700  	if self.token == token.NEW {
   701  		left = self.parseNewExpression()
   702  	} else {
   703  		left = self.parsePrimaryExpression()
   704  	}
   705  L:
   706  	for {
   707  		switch self.token {
   708  		case token.PERIOD:
   709  			left = self.parseDotMember(left)
   710  		case token.LEFT_BRACKET:
   711  			left = self.parseBracketMember(left)
   712  		case token.BACKTICK:
   713  			left = self.parseTaggedTemplateLiteral(left)
   714  		default:
   715  			break L
   716  		}
   717  	}
   718  
   719  	return left
   720  }
   721  
   722  func (self *_parser) parseLeftHandSideExpressionAllowCall() ast.Expression {
   723  
   724  	allowIn := self.scope.allowIn
   725  	self.scope.allowIn = true
   726  	defer func() {
   727  		self.scope.allowIn = allowIn
   728  	}()
   729  
   730  	var left ast.Expression
   731  	start := self.idx
   732  	if self.token == token.NEW {
   733  		left = self.parseNewExpression()
   734  	} else {
   735  		left = self.parsePrimaryExpression()
   736  	}
   737  
   738  	optionalChain := false
   739  L:
   740  	for {
   741  		switch self.token {
   742  		case token.PERIOD:
   743  			left = self.parseDotMember(left)
   744  		case token.LEFT_BRACKET:
   745  			left = self.parseBracketMember(left)
   746  		case token.LEFT_PARENTHESIS:
   747  			left = self.parseCallExpression(left)
   748  		case token.BACKTICK:
   749  			if optionalChain {
   750  				self.error(self.idx, "Invalid template literal on optional chain")
   751  				self.nextStatement()
   752  				return &ast.BadExpression{From: start, To: self.idx}
   753  			}
   754  			left = self.parseTaggedTemplateLiteral(left)
   755  		case token.QUESTION_DOT:
   756  			optionalChain = true
   757  			left = &ast.Optional{Expression: left}
   758  
   759  			switch self.peek() {
   760  			case token.LEFT_BRACKET, token.LEFT_PARENTHESIS, token.BACKTICK:
   761  				self.next()
   762  			default:
   763  				left = self.parseDotMember(left)
   764  			}
   765  		default:
   766  			break L
   767  		}
   768  	}
   769  
   770  	if optionalChain {
   771  		left = &ast.OptionalChain{Expression: left}
   772  	}
   773  	return left
   774  }
   775  
   776  func (self *_parser) parsePostfixExpression() ast.Expression {
   777  	operand := self.parseLeftHandSideExpressionAllowCall()
   778  
   779  	switch self.token {
   780  	case token.INCREMENT, token.DECREMENT:
   781  		// Make sure there is no line terminator here
   782  		if self.implicitSemicolon {
   783  			break
   784  		}
   785  		tkn := self.token
   786  		idx := self.idx
   787  		self.next()
   788  		switch operand.(type) {
   789  		case *ast.Identifier, *ast.DotExpression, *ast.PrivateDotExpression, *ast.BracketExpression:
   790  		default:
   791  			self.error(idx, "Invalid left-hand side in assignment")
   792  			self.nextStatement()
   793  			return &ast.BadExpression{From: idx, To: self.idx}
   794  		}
   795  		return &ast.UnaryExpression{
   796  			Operator: tkn,
   797  			Idx:      idx,
   798  			Operand:  operand,
   799  			Postfix:  true,
   800  		}
   801  	}
   802  
   803  	return operand
   804  }
   805  
   806  func (self *_parser) parseUnaryExpression() ast.Expression {
   807  
   808  	switch self.token {
   809  	case token.PLUS, token.MINUS, token.NOT, token.BITWISE_NOT:
   810  		fallthrough
   811  	case token.DELETE, token.VOID, token.TYPEOF:
   812  		tkn := self.token
   813  		idx := self.idx
   814  		self.next()
   815  		return &ast.UnaryExpression{
   816  			Operator: tkn,
   817  			Idx:      idx,
   818  			Operand:  self.parseUnaryExpression(),
   819  		}
   820  	case token.INCREMENT, token.DECREMENT:
   821  		tkn := self.token
   822  		idx := self.idx
   823  		self.next()
   824  		operand := self.parseUnaryExpression()
   825  		switch operand.(type) {
   826  		case *ast.Identifier, *ast.DotExpression, *ast.PrivateDotExpression, *ast.BracketExpression:
   827  		default:
   828  			self.error(idx, "Invalid left-hand side in assignment")
   829  			self.nextStatement()
   830  			return &ast.BadExpression{From: idx, To: self.idx}
   831  		}
   832  		return &ast.UnaryExpression{
   833  			Operator: tkn,
   834  			Idx:      idx,
   835  			Operand:  operand,
   836  		}
   837  	}
   838  
   839  	return self.parsePostfixExpression()
   840  }
   841  
   842  func isUpdateExpression(expr ast.Expression) bool {
   843  	if ux, ok := expr.(*ast.UnaryExpression); ok {
   844  		return ux.Operator == token.INCREMENT || ux.Operator == token.DECREMENT
   845  	}
   846  	return true
   847  }
   848  
   849  func (self *_parser) parseExponentiationExpression() ast.Expression {
   850  	left := self.parseUnaryExpression()
   851  
   852  	for self.token == token.EXPONENT && isUpdateExpression(left) {
   853  		self.next()
   854  		left = &ast.BinaryExpression{
   855  			Operator: token.EXPONENT,
   856  			Left:     left,
   857  			Right:    self.parseExponentiationExpression(),
   858  		}
   859  	}
   860  
   861  	return left
   862  }
   863  
   864  func (self *_parser) parseMultiplicativeExpression() ast.Expression {
   865  	left := self.parseExponentiationExpression()
   866  
   867  	for self.token == token.MULTIPLY || self.token == token.SLASH ||
   868  		self.token == token.REMAINDER {
   869  		tkn := self.token
   870  		self.next()
   871  		left = &ast.BinaryExpression{
   872  			Operator: tkn,
   873  			Left:     left,
   874  			Right:    self.parseExponentiationExpression(),
   875  		}
   876  	}
   877  
   878  	return left
   879  }
   880  
   881  func (self *_parser) parseAdditiveExpression() ast.Expression {
   882  	left := self.parseMultiplicativeExpression()
   883  
   884  	for self.token == token.PLUS || self.token == token.MINUS {
   885  		tkn := self.token
   886  		self.next()
   887  		left = &ast.BinaryExpression{
   888  			Operator: tkn,
   889  			Left:     left,
   890  			Right:    self.parseMultiplicativeExpression(),
   891  		}
   892  	}
   893  
   894  	return left
   895  }
   896  
   897  func (self *_parser) parseShiftExpression() ast.Expression {
   898  	left := self.parseAdditiveExpression()
   899  
   900  	for self.token == token.SHIFT_LEFT || self.token == token.SHIFT_RIGHT ||
   901  		self.token == token.UNSIGNED_SHIFT_RIGHT {
   902  		tkn := self.token
   903  		self.next()
   904  		left = &ast.BinaryExpression{
   905  			Operator: tkn,
   906  			Left:     left,
   907  			Right:    self.parseAdditiveExpression(),
   908  		}
   909  	}
   910  
   911  	return left
   912  }
   913  
   914  func (self *_parser) parseRelationalExpression() ast.Expression {
   915  	if self.scope.allowIn && self.token == token.PRIVATE_IDENTIFIER {
   916  		left := &ast.PrivateIdentifier{
   917  			Identifier: ast.Identifier{
   918  				Idx:  self.idx,
   919  				Name: self.parsedLiteral,
   920  			},
   921  		}
   922  		self.next()
   923  		if self.token == token.IN {
   924  			self.next()
   925  			return &ast.BinaryExpression{
   926  				Operator: self.token,
   927  				Left:     left,
   928  				Right:    self.parseShiftExpression(),
   929  			}
   930  		}
   931  		return left
   932  	}
   933  	left := self.parseShiftExpression()
   934  
   935  	allowIn := self.scope.allowIn
   936  	self.scope.allowIn = true
   937  	defer func() {
   938  		self.scope.allowIn = allowIn
   939  	}()
   940  
   941  	switch self.token {
   942  	case token.LESS, token.LESS_OR_EQUAL, token.GREATER, token.GREATER_OR_EQUAL:
   943  		tkn := self.token
   944  		self.next()
   945  		return &ast.BinaryExpression{
   946  			Operator:   tkn,
   947  			Left:       left,
   948  			Right:      self.parseRelationalExpression(),
   949  			Comparison: true,
   950  		}
   951  	case token.INSTANCEOF:
   952  		tkn := self.token
   953  		self.next()
   954  		return &ast.BinaryExpression{
   955  			Operator: tkn,
   956  			Left:     left,
   957  			Right:    self.parseRelationalExpression(),
   958  		}
   959  	case token.IN:
   960  		if !allowIn {
   961  			return left
   962  		}
   963  		tkn := self.token
   964  		self.next()
   965  		return &ast.BinaryExpression{
   966  			Operator: tkn,
   967  			Left:     left,
   968  			Right:    self.parseRelationalExpression(),
   969  		}
   970  	}
   971  
   972  	return left
   973  }
   974  
   975  func (self *_parser) parseEqualityExpression() ast.Expression {
   976  	left := self.parseRelationalExpression()
   977  
   978  	for self.token == token.EQUAL || self.token == token.NOT_EQUAL ||
   979  		self.token == token.STRICT_EQUAL || self.token == token.STRICT_NOT_EQUAL {
   980  		tkn := self.token
   981  		self.next()
   982  		left = &ast.BinaryExpression{
   983  			Operator:   tkn,
   984  			Left:       left,
   985  			Right:      self.parseRelationalExpression(),
   986  			Comparison: true,
   987  		}
   988  	}
   989  
   990  	return left
   991  }
   992  
   993  func (self *_parser) parseBitwiseAndExpression() ast.Expression {
   994  	left := self.parseEqualityExpression()
   995  
   996  	for self.token == token.AND {
   997  		tkn := self.token
   998  		self.next()
   999  		left = &ast.BinaryExpression{
  1000  			Operator: tkn,
  1001  			Left:     left,
  1002  			Right:    self.parseEqualityExpression(),
  1003  		}
  1004  	}
  1005  
  1006  	return left
  1007  }
  1008  
  1009  func (self *_parser) parseBitwiseExclusiveOrExpression() ast.Expression {
  1010  	left := self.parseBitwiseAndExpression()
  1011  
  1012  	for self.token == token.EXCLUSIVE_OR {
  1013  		tkn := self.token
  1014  		self.next()
  1015  		left = &ast.BinaryExpression{
  1016  			Operator: tkn,
  1017  			Left:     left,
  1018  			Right:    self.parseBitwiseAndExpression(),
  1019  		}
  1020  	}
  1021  
  1022  	return left
  1023  }
  1024  
  1025  func (self *_parser) parseBitwiseOrExpression() ast.Expression {
  1026  	left := self.parseBitwiseExclusiveOrExpression()
  1027  
  1028  	for self.token == token.OR {
  1029  		tkn := self.token
  1030  		self.next()
  1031  		left = &ast.BinaryExpression{
  1032  			Operator: tkn,
  1033  			Left:     left,
  1034  			Right:    self.parseBitwiseExclusiveOrExpression(),
  1035  		}
  1036  	}
  1037  
  1038  	return left
  1039  }
  1040  
  1041  func (self *_parser) parseLogicalAndExpression() ast.Expression {
  1042  	left := self.parseBitwiseOrExpression()
  1043  
  1044  	for self.token == token.LOGICAL_AND {
  1045  		tkn := self.token
  1046  		self.next()
  1047  		left = &ast.BinaryExpression{
  1048  			Operator: tkn,
  1049  			Left:     left,
  1050  			Right:    self.parseBitwiseOrExpression(),
  1051  		}
  1052  	}
  1053  
  1054  	return left
  1055  }
  1056  
  1057  func isLogicalAndExpr(expr ast.Expression) bool {
  1058  	if bexp, ok := expr.(*ast.BinaryExpression); ok && bexp.Operator == token.LOGICAL_AND {
  1059  		return true
  1060  	}
  1061  	return false
  1062  }
  1063  
  1064  func (self *_parser) parseLogicalOrExpression() ast.Expression {
  1065  	var idx file.Idx
  1066  	parenthesis := self.token == token.LEFT_PARENTHESIS
  1067  	left := self.parseLogicalAndExpression()
  1068  
  1069  	if self.token == token.LOGICAL_OR || !parenthesis && isLogicalAndExpr(left) {
  1070  		for {
  1071  			switch self.token {
  1072  			case token.LOGICAL_OR:
  1073  				self.next()
  1074  				left = &ast.BinaryExpression{
  1075  					Operator: token.LOGICAL_OR,
  1076  					Left:     left,
  1077  					Right:    self.parseLogicalAndExpression(),
  1078  				}
  1079  			case token.COALESCE:
  1080  				idx = self.idx
  1081  				goto mixed
  1082  			default:
  1083  				return left
  1084  			}
  1085  		}
  1086  	} else {
  1087  		for {
  1088  			switch self.token {
  1089  			case token.COALESCE:
  1090  				idx = self.idx
  1091  				self.next()
  1092  
  1093  				parenthesis := self.token == token.LEFT_PARENTHESIS
  1094  				right := self.parseLogicalAndExpression()
  1095  				if !parenthesis && isLogicalAndExpr(right) {
  1096  					goto mixed
  1097  				}
  1098  
  1099  				left = &ast.BinaryExpression{
  1100  					Operator: token.COALESCE,
  1101  					Left:     left,
  1102  					Right:    right,
  1103  				}
  1104  			case token.LOGICAL_OR:
  1105  				idx = self.idx
  1106  				goto mixed
  1107  			default:
  1108  				return left
  1109  			}
  1110  		}
  1111  	}
  1112  
  1113  mixed:
  1114  	self.error(idx, "Logical expressions and coalesce expressions cannot be mixed. Wrap either by parentheses")
  1115  	return left
  1116  }
  1117  
  1118  func (self *_parser) parseConditionalExpression() ast.Expression {
  1119  	left := self.parseLogicalOrExpression()
  1120  
  1121  	if self.token == token.QUESTION_MARK {
  1122  		self.next()
  1123  		consequent := self.parseAssignmentExpression()
  1124  		self.expect(token.COLON)
  1125  		return &ast.ConditionalExpression{
  1126  			Test:       left,
  1127  			Consequent: consequent,
  1128  			Alternate:  self.parseAssignmentExpression(),
  1129  		}
  1130  	}
  1131  
  1132  	return left
  1133  }
  1134  
  1135  func (self *_parser) parseAssignmentExpression() ast.Expression {
  1136  	start := self.idx
  1137  	parenthesis := false
  1138  	var state parserState
  1139  	if self.token == token.LEFT_PARENTHESIS {
  1140  		self.mark(&state)
  1141  		parenthesis = true
  1142  	} else {
  1143  		self.tokenToBindingId()
  1144  	}
  1145  	left := self.parseConditionalExpression()
  1146  	var operator token.Token
  1147  	switch self.token {
  1148  	case token.ASSIGN:
  1149  		operator = self.token
  1150  	case token.ADD_ASSIGN:
  1151  		operator = token.PLUS
  1152  	case token.SUBTRACT_ASSIGN:
  1153  		operator = token.MINUS
  1154  	case token.MULTIPLY_ASSIGN:
  1155  		operator = token.MULTIPLY
  1156  	case token.EXPONENT_ASSIGN:
  1157  		operator = token.EXPONENT
  1158  	case token.QUOTIENT_ASSIGN:
  1159  		operator = token.SLASH
  1160  	case token.REMAINDER_ASSIGN:
  1161  		operator = token.REMAINDER
  1162  	case token.AND_ASSIGN:
  1163  		operator = token.AND
  1164  	case token.OR_ASSIGN:
  1165  		operator = token.OR
  1166  	case token.EXCLUSIVE_OR_ASSIGN:
  1167  		operator = token.EXCLUSIVE_OR
  1168  	case token.SHIFT_LEFT_ASSIGN:
  1169  		operator = token.SHIFT_LEFT
  1170  	case token.SHIFT_RIGHT_ASSIGN:
  1171  		operator = token.SHIFT_RIGHT
  1172  	case token.UNSIGNED_SHIFT_RIGHT_ASSIGN:
  1173  		operator = token.UNSIGNED_SHIFT_RIGHT
  1174  	case token.ARROW:
  1175  		var paramList *ast.ParameterList
  1176  		if id, ok := left.(*ast.Identifier); ok {
  1177  			paramList = &ast.ParameterList{
  1178  				Opening: id.Idx,
  1179  				Closing: id.Idx1(),
  1180  				List: []*ast.Binding{{
  1181  					Target: id,
  1182  				}},
  1183  			}
  1184  		} else if parenthesis {
  1185  			if seq, ok := left.(*ast.SequenceExpression); ok && len(self.errors) == 0 {
  1186  				paramList = self.reinterpretSequenceAsArrowFuncParams(seq)
  1187  			} else {
  1188  				self.restore(&state)
  1189  				paramList = self.parseFunctionParameterList()
  1190  			}
  1191  		} else {
  1192  			self.error(left.Idx0(), "Malformed arrow function parameter list")
  1193  			return &ast.BadExpression{From: left.Idx0(), To: left.Idx1()}
  1194  		}
  1195  		self.expect(token.ARROW)
  1196  		node := &ast.ArrowFunctionLiteral{
  1197  			Start:         start,
  1198  			ParameterList: paramList,
  1199  		}
  1200  		node.Body, node.DeclarationList = self.parseArrowFunctionBody()
  1201  		node.Source = self.slice(node.Start, node.Body.Idx1())
  1202  		return node
  1203  	}
  1204  
  1205  	if operator != 0 {
  1206  		idx := self.idx
  1207  		self.next()
  1208  		ok := false
  1209  		switch l := left.(type) {
  1210  		case *ast.Identifier, *ast.DotExpression, *ast.PrivateDotExpression, *ast.BracketExpression:
  1211  			ok = true
  1212  		case *ast.ArrayLiteral:
  1213  			if !parenthesis && operator == token.ASSIGN {
  1214  				left = self.reinterpretAsArrayAssignmentPattern(l)
  1215  				ok = true
  1216  			}
  1217  		case *ast.ObjectLiteral:
  1218  			if !parenthesis && operator == token.ASSIGN {
  1219  				left = self.reinterpretAsObjectAssignmentPattern(l)
  1220  				ok = true
  1221  			}
  1222  		}
  1223  		if ok {
  1224  			return &ast.AssignExpression{
  1225  				Left:     left,
  1226  				Operator: operator,
  1227  				Right:    self.parseAssignmentExpression(),
  1228  			}
  1229  		}
  1230  		self.error(left.Idx0(), "Invalid left-hand side in assignment")
  1231  		self.nextStatement()
  1232  		return &ast.BadExpression{From: idx, To: self.idx}
  1233  	}
  1234  
  1235  	return left
  1236  }
  1237  
  1238  func (self *_parser) parseExpression() ast.Expression {
  1239  	left := self.parseAssignmentExpression()
  1240  
  1241  	if self.token == token.COMMA {
  1242  		sequence := []ast.Expression{left}
  1243  		for {
  1244  			if self.token != token.COMMA {
  1245  				break
  1246  			}
  1247  			self.next()
  1248  			sequence = append(sequence, self.parseAssignmentExpression())
  1249  		}
  1250  		return &ast.SequenceExpression{
  1251  			Sequence: sequence,
  1252  		}
  1253  	}
  1254  
  1255  	return left
  1256  }
  1257  
  1258  func (self *_parser) checkComma(from, to file.Idx) {
  1259  	if pos := strings.IndexByte(self.str[int(from)-self.base:int(to)-self.base], ','); pos >= 0 {
  1260  		self.error(from+file.Idx(pos), "Comma is not allowed here")
  1261  	}
  1262  }
  1263  
  1264  func (self *_parser) reinterpretAsArrayAssignmentPattern(left *ast.ArrayLiteral) ast.Expression {
  1265  	value := left.Value
  1266  	var rest ast.Expression
  1267  	for i, item := range value {
  1268  		if spread, ok := item.(*ast.SpreadElement); ok {
  1269  			if i != len(value)-1 {
  1270  				self.error(item.Idx0(), "Rest element must be last element")
  1271  				return &ast.BadExpression{From: left.Idx0(), To: left.Idx1()}
  1272  			}
  1273  			self.checkComma(spread.Expression.Idx1(), left.RightBracket)
  1274  			rest = self.reinterpretAsDestructAssignTarget(spread.Expression)
  1275  			value = value[:len(value)-1]
  1276  		} else {
  1277  			value[i] = self.reinterpretAsAssignmentElement(item)
  1278  		}
  1279  	}
  1280  	return &ast.ArrayPattern{
  1281  		LeftBracket:  left.LeftBracket,
  1282  		RightBracket: left.RightBracket,
  1283  		Elements:     value,
  1284  		Rest:         rest,
  1285  	}
  1286  }
  1287  
  1288  func (self *_parser) reinterpretArrayAssignPatternAsBinding(pattern *ast.ArrayPattern) *ast.ArrayPattern {
  1289  	for i, item := range pattern.Elements {
  1290  		pattern.Elements[i] = self.reinterpretAsDestructBindingTarget(item)
  1291  	}
  1292  	if pattern.Rest != nil {
  1293  		pattern.Rest = self.reinterpretAsDestructBindingTarget(pattern.Rest)
  1294  	}
  1295  	return pattern
  1296  }
  1297  
  1298  func (self *_parser) reinterpretAsArrayBindingPattern(left *ast.ArrayLiteral) ast.BindingTarget {
  1299  	value := left.Value
  1300  	var rest ast.Expression
  1301  	for i, item := range value {
  1302  		if spread, ok := item.(*ast.SpreadElement); ok {
  1303  			if i != len(value)-1 {
  1304  				self.error(item.Idx0(), "Rest element must be last element")
  1305  				return &ast.BadExpression{From: left.Idx0(), To: left.Idx1()}
  1306  			}
  1307  			self.checkComma(spread.Expression.Idx1(), left.RightBracket)
  1308  			rest = self.reinterpretAsDestructBindingTarget(spread.Expression)
  1309  			value = value[:len(value)-1]
  1310  		} else {
  1311  			value[i] = self.reinterpretAsBindingElement(item)
  1312  		}
  1313  	}
  1314  	return &ast.ArrayPattern{
  1315  		LeftBracket:  left.LeftBracket,
  1316  		RightBracket: left.RightBracket,
  1317  		Elements:     value,
  1318  		Rest:         rest,
  1319  	}
  1320  }
  1321  
  1322  func (self *_parser) parseArrayBindingPattern() ast.BindingTarget {
  1323  	return self.reinterpretAsArrayBindingPattern(self.parseArrayLiteral())
  1324  }
  1325  
  1326  func (self *_parser) parseObjectBindingPattern() ast.BindingTarget {
  1327  	return self.reinterpretAsObjectBindingPattern(self.parseObjectLiteral())
  1328  }
  1329  
  1330  func (self *_parser) reinterpretArrayObjectPatternAsBinding(pattern *ast.ObjectPattern) *ast.ObjectPattern {
  1331  	for _, prop := range pattern.Properties {
  1332  		if keyed, ok := prop.(*ast.PropertyKeyed); ok {
  1333  			keyed.Value = self.reinterpretAsBindingElement(keyed.Value)
  1334  		}
  1335  	}
  1336  	if pattern.Rest != nil {
  1337  		pattern.Rest = self.reinterpretAsBindingRestElement(pattern.Rest)
  1338  	}
  1339  	return pattern
  1340  }
  1341  
  1342  func (self *_parser) reinterpretAsObjectBindingPattern(expr *ast.ObjectLiteral) ast.BindingTarget {
  1343  	var rest ast.Expression
  1344  	value := expr.Value
  1345  	for i, prop := range value {
  1346  		ok := false
  1347  		switch prop := prop.(type) {
  1348  		case *ast.PropertyKeyed:
  1349  			if prop.Kind == ast.PropertyKindValue {
  1350  				prop.Value = self.reinterpretAsBindingElement(prop.Value)
  1351  				ok = true
  1352  			}
  1353  		case *ast.PropertyShort:
  1354  			ok = true
  1355  		case *ast.SpreadElement:
  1356  			if i != len(expr.Value)-1 {
  1357  				self.error(prop.Idx0(), "Rest element must be last element")
  1358  				return &ast.BadExpression{From: expr.Idx0(), To: expr.Idx1()}
  1359  			}
  1360  			// TODO make sure there is no trailing comma
  1361  			rest = self.reinterpretAsBindingRestElement(prop.Expression)
  1362  			value = value[:i]
  1363  			ok = true
  1364  		}
  1365  		if !ok {
  1366  			self.error(prop.Idx0(), "Invalid destructuring binding target")
  1367  			return &ast.BadExpression{From: expr.Idx0(), To: expr.Idx1()}
  1368  		}
  1369  	}
  1370  	return &ast.ObjectPattern{
  1371  		LeftBrace:  expr.LeftBrace,
  1372  		RightBrace: expr.RightBrace,
  1373  		Properties: value,
  1374  		Rest:       rest,
  1375  	}
  1376  }
  1377  
  1378  func (self *_parser) reinterpretAsObjectAssignmentPattern(l *ast.ObjectLiteral) ast.Expression {
  1379  	var rest ast.Expression
  1380  	value := l.Value
  1381  	for i, prop := range value {
  1382  		ok := false
  1383  		switch prop := prop.(type) {
  1384  		case *ast.PropertyKeyed:
  1385  			if prop.Kind == ast.PropertyKindValue {
  1386  				prop.Value = self.reinterpretAsAssignmentElement(prop.Value)
  1387  				ok = true
  1388  			}
  1389  		case *ast.PropertyShort:
  1390  			ok = true
  1391  		case *ast.SpreadElement:
  1392  			if i != len(l.Value)-1 {
  1393  				self.error(prop.Idx0(), "Rest element must be last element")
  1394  				return &ast.BadExpression{From: l.Idx0(), To: l.Idx1()}
  1395  			}
  1396  			// TODO make sure there is no trailing comma
  1397  			rest = prop.Expression
  1398  			value = value[:i]
  1399  			ok = true
  1400  		}
  1401  		if !ok {
  1402  			self.error(prop.Idx0(), "Invalid destructuring assignment target")
  1403  			return &ast.BadExpression{From: l.Idx0(), To: l.Idx1()}
  1404  		}
  1405  	}
  1406  	return &ast.ObjectPattern{
  1407  		LeftBrace:  l.LeftBrace,
  1408  		RightBrace: l.RightBrace,
  1409  		Properties: value,
  1410  		Rest:       rest,
  1411  	}
  1412  }
  1413  
  1414  func (self *_parser) reinterpretAsAssignmentElement(expr ast.Expression) ast.Expression {
  1415  	switch expr := expr.(type) {
  1416  	case *ast.AssignExpression:
  1417  		if expr.Operator == token.ASSIGN {
  1418  			expr.Left = self.reinterpretAsDestructAssignTarget(expr.Left)
  1419  			return expr
  1420  		} else {
  1421  			self.error(expr.Idx0(), "Invalid destructuring assignment target")
  1422  			return &ast.BadExpression{From: expr.Idx0(), To: expr.Idx1()}
  1423  		}
  1424  	default:
  1425  		return self.reinterpretAsDestructAssignTarget(expr)
  1426  	}
  1427  }
  1428  
  1429  func (self *_parser) reinterpretAsBindingElement(expr ast.Expression) ast.Expression {
  1430  	switch expr := expr.(type) {
  1431  	case *ast.AssignExpression:
  1432  		if expr.Operator == token.ASSIGN {
  1433  			expr.Left = self.reinterpretAsDestructBindingTarget(expr.Left)
  1434  			return expr
  1435  		} else {
  1436  			self.error(expr.Idx0(), "Invalid destructuring assignment target")
  1437  			return &ast.BadExpression{From: expr.Idx0(), To: expr.Idx1()}
  1438  		}
  1439  	default:
  1440  		return self.reinterpretAsDestructBindingTarget(expr)
  1441  	}
  1442  }
  1443  
  1444  func (self *_parser) reinterpretAsBinding(expr ast.Expression) *ast.Binding {
  1445  	switch expr := expr.(type) {
  1446  	case *ast.AssignExpression:
  1447  		if expr.Operator == token.ASSIGN {
  1448  			return &ast.Binding{
  1449  				Target:      self.reinterpretAsDestructBindingTarget(expr.Left),
  1450  				Initializer: expr.Right,
  1451  			}
  1452  		} else {
  1453  			self.error(expr.Idx0(), "Invalid destructuring assignment target")
  1454  			return &ast.Binding{
  1455  				Target: &ast.BadExpression{From: expr.Idx0(), To: expr.Idx1()},
  1456  			}
  1457  		}
  1458  	default:
  1459  		return &ast.Binding{
  1460  			Target: self.reinterpretAsDestructBindingTarget(expr),
  1461  		}
  1462  	}
  1463  }
  1464  
  1465  func (self *_parser) reinterpretAsDestructAssignTarget(item ast.Expression) ast.Expression {
  1466  	switch item := item.(type) {
  1467  	case nil:
  1468  		return nil
  1469  	case *ast.ArrayLiteral:
  1470  		return self.reinterpretAsArrayAssignmentPattern(item)
  1471  	case *ast.ObjectLiteral:
  1472  		return self.reinterpretAsObjectAssignmentPattern(item)
  1473  	case ast.Pattern, *ast.Identifier, *ast.DotExpression, *ast.PrivateDotExpression, *ast.BracketExpression:
  1474  		return item
  1475  	}
  1476  	self.error(item.Idx0(), "Invalid destructuring assignment target")
  1477  	return &ast.BadExpression{From: item.Idx0(), To: item.Idx1()}
  1478  }
  1479  
  1480  func (self *_parser) reinterpretAsDestructBindingTarget(item ast.Expression) ast.BindingTarget {
  1481  	switch item := item.(type) {
  1482  	case nil:
  1483  		return nil
  1484  	case *ast.ArrayPattern:
  1485  		return self.reinterpretArrayAssignPatternAsBinding(item)
  1486  	case *ast.ObjectPattern:
  1487  		return self.reinterpretArrayObjectPatternAsBinding(item)
  1488  	case *ast.ArrayLiteral:
  1489  		return self.reinterpretAsArrayBindingPattern(item)
  1490  	case *ast.ObjectLiteral:
  1491  		return self.reinterpretAsObjectBindingPattern(item)
  1492  	case *ast.Identifier:
  1493  		return item
  1494  	}
  1495  	self.error(item.Idx0(), "Invalid destructuring binding target")
  1496  	return &ast.BadExpression{From: item.Idx0(), To: item.Idx1()}
  1497  }
  1498  
  1499  func (self *_parser) reinterpretAsBindingRestElement(expr ast.Expression) ast.Expression {
  1500  	if _, ok := expr.(*ast.Identifier); ok {
  1501  		return expr
  1502  	}
  1503  	self.error(expr.Idx0(), "Invalid binding rest")
  1504  	return &ast.BadExpression{From: expr.Idx0(), To: expr.Idx1()}
  1505  }