()
| 750 | } |
| 751 | |
| 752 | func (self *_parser) parseLeftHandSideExpressionAllowCall() ast.Expression { |
| 753 | |
| 754 | allowIn := self.scope.allowIn |
| 755 | self.scope.allowIn = true |
| 756 | defer func() { |
| 757 | self.scope.allowIn = allowIn |
| 758 | }() |
| 759 | |
| 760 | var left ast.Expression |
| 761 | start := self.idx |
| 762 | if self.token == token.NEW { |
| 763 | left = self.parseNewExpression() |
| 764 | } else { |
| 765 | left = self.parsePrimaryExpression() |
| 766 | } |
| 767 | |
| 768 | optionalChain := false |
| 769 | L: |
| 770 | for { |
| 771 | switch self.token { |
| 772 | case token.PERIOD: |
| 773 | left = self.parseDotMember(left) |
| 774 | case token.LEFT_BRACKET: |
| 775 | left = self.parseBracketMember(left) |
| 776 | case token.LEFT_PARENTHESIS: |
| 777 | left = self.parseCallExpression(left) |
| 778 | case token.BACKTICK: |
| 779 | if optionalChain { |
| 780 | self.error(self.idx, "Invalid template literal on optional chain") |
| 781 | self.nextStatement() |
| 782 | return &ast.BadExpression{From: start, To: self.idx} |
| 783 | } |
| 784 | left = self.parseTaggedTemplateLiteral(left) |
| 785 | case token.QUESTION_DOT: |
| 786 | optionalChain = true |
| 787 | left = &ast.Optional{Expression: left} |
| 788 | |
| 789 | switch self.peek() { |
| 790 | case token.LEFT_BRACKET, token.LEFT_PARENTHESIS, token.BACKTICK: |
| 791 | self.next() |
| 792 | default: |
| 793 | left = self.parseDotMember(left) |
| 794 | } |
| 795 | default: |
| 796 | break L |
| 797 | } |
| 798 | } |
| 799 | |
| 800 | if optionalChain { |
| 801 | left = &ast.OptionalChain{Expression: left} |
| 802 | } |
| 803 | return left |
| 804 | } |
| 805 | |
| 806 | func (self *_parser) parseUpdateExpression() ast.Expression { |
| 807 | switch self.token { |
no test coverage detected