May return an ArrayLiteral or ArrayComprehension.
()
| 3761 | |
| 3762 | /** May return an {@link ArrayLiteral} or {@link ArrayComprehension}. */ |
| 3763 | private AstNode arrayLiteral() throws IOException { |
| 3764 | if (currentToken != Token.LB) codeBug(); |
| 3765 | int pos = ts.tokenBeg, end = ts.tokenEnd, lineno = lineNumber(), column = columnNumber(); |
| 3766 | List<AstNode> elements = new ArrayList<>(); |
| 3767 | ArrayLiteral pn = new ArrayLiteral(pos); |
| 3768 | boolean after_lb_or_comma = true; |
| 3769 | int afterComma = -1; |
| 3770 | int skipCount = 0; |
| 3771 | for (; ; ) { |
| 3772 | int tt = peekToken(); |
| 3773 | if (tt == Token.COMMA) { |
| 3774 | consumeToken(); |
| 3775 | afterComma = ts.tokenEnd; |
| 3776 | if (!after_lb_or_comma) { |
| 3777 | after_lb_or_comma = true; |
| 3778 | } else { |
| 3779 | elements.add(new EmptyExpression(ts.tokenBeg, 1)); |
| 3780 | skipCount++; |
| 3781 | } |
| 3782 | } else if (tt == Token.COMMENT) { |
| 3783 | consumeToken(); |
| 3784 | } else if (tt == Token.RB) { |
| 3785 | consumeToken(); |
| 3786 | // for ([a,] in obj) is legal, but for ([a] in obj) is |
| 3787 | // not since we have both key and value supplied. The |
| 3788 | // trick is that [a,] and [a] are equivalent in other |
| 3789 | // array literal contexts. So we calculate a special |
| 3790 | // length value just for destructuring assignment. |
| 3791 | end = ts.tokenEnd; |
| 3792 | pn.setDestructuringLength(elements.size() + (after_lb_or_comma ? 1 : 0)); |
| 3793 | pn.setSkipCount(skipCount); |
| 3794 | if (afterComma != -1) warnTrailingComma(pos, elements, afterComma); |
| 3795 | break; |
| 3796 | } else if (tt == Token.FOR && !after_lb_or_comma && elements.size() == 1) { |
| 3797 | return arrayComprehension(elements.get(0), pos); |
| 3798 | } else if (tt == Token.EOF) { |
| 3799 | reportError("msg.no.bracket.arg"); |
| 3800 | break; |
| 3801 | } else { |
| 3802 | if (!after_lb_or_comma) { |
| 3803 | reportError("msg.no.bracket.arg"); |
| 3804 | } |
| 3805 | AstNode element; |
| 3806 | if (tt == Token.DOTDOTDOT |
| 3807 | && compilerEnv.getLanguageVersion() >= Context.VERSION_ES6) { |
| 3808 | consumeToken(); |
| 3809 | int spreadPos = ts.tokenBeg; |
| 3810 | int spreadLineno = lineNumber(); |
| 3811 | int spreadColumn = columnNumber(); |
| 3812 | AstNode exprNode = assignExpr(); |
| 3813 | element = new Spread(spreadPos, ts.tokenEnd - spreadPos); |
| 3814 | element.setLineColumnNumber(spreadLineno, spreadColumn); |
| 3815 | ((Spread) element).setExpression(exprNode); |
| 3816 | } else { |
| 3817 | element = assignExpr(); |
| 3818 | } |
| 3819 | elements.add(element); |
| 3820 | after_lb_or_comma = false; |
no test coverage detected