Assumes that the leading '[' has already been consumed and passed as tok. Should read up to and consume the trailing ']'
(tok *token)
| 731 | // Assumes that the leading '[' has already been consumed and passed as tok. |
| 732 | // Should read up to and consume the trailing ']' |
| 733 | func (p *parser) parseArray(tok *token) (ast.Node, errors.StaticError) { |
| 734 | if p.peek().kind == tokenBracketR { |
| 735 | bracketR := p.pop() |
| 736 | return &ast.Array{ |
| 737 | NodeBase: ast.NewNodeBaseLoc(locFromTokens(tok, bracketR), tok.fodder), |
| 738 | CloseFodder: bracketR.fodder, |
| 739 | }, nil |
| 740 | } |
| 741 | |
| 742 | first, err := p.parse(iast.MaxPrecedence) |
| 743 | if err != nil { |
| 744 | return nil, err |
| 745 | } |
| 746 | var gotComma bool |
| 747 | var commaFodder ast.Fodder |
| 748 | if p.peek().kind == tokenComma { |
| 749 | comma := p.pop() |
| 750 | gotComma = true |
| 751 | commaFodder = comma.fodder |
| 752 | } |
| 753 | |
| 754 | if p.peek().kind == tokenFor { |
| 755 | // It's a comprehension |
| 756 | forToken := p.pop() |
| 757 | spec, last, err := p.parseComprehensionSpecs(forToken, tokenBracketR) |
| 758 | if err != nil { |
| 759 | return nil, err |
| 760 | } |
| 761 | return &ast.ArrayComp{ |
| 762 | NodeBase: ast.NewNodeBaseLoc(locFromTokens(tok, last), tok.fodder), |
| 763 | Body: first, |
| 764 | TrailingComma: gotComma, |
| 765 | TrailingCommaFodder: commaFodder, |
| 766 | Spec: *spec, |
| 767 | CloseFodder: last.fodder, |
| 768 | }, nil |
| 769 | } |
| 770 | |
| 771 | // Not a comprehension: It can have more elements. |
| 772 | elements := []ast.CommaSeparatedExpr{{ |
| 773 | Expr: first, |
| 774 | CommaFodder: commaFodder, |
| 775 | }} |
| 776 | |
| 777 | var bracketR *token |
| 778 | for { |
| 779 | next := p.peek() |
| 780 | |
| 781 | if next.kind == tokenBracketR { |
| 782 | bracketR = p.pop() |
| 783 | break |
| 784 | } |
| 785 | if !gotComma { |
| 786 | return nil, errors.MakeStaticError("Expected a comma before next array element", next.loc) |
| 787 | } |
| 788 | nextElem, err := p.parse(iast.MaxPrecedence) |
| 789 | if err != nil { |
| 790 | return nil, err |
no test coverage detected