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 }