()
| 1665 | // subscript: test | [test] ':' [test] [sliceop] |
| 1666 | // sliceop: ':' [test] |
| 1667 | private _parseSubscript(): ExpressionNode { |
| 1668 | let firstToken = this._peekToken(); |
| 1669 | let sliceExpressions: (ExpressionNode | undefined)[] = [undefined, undefined, undefined]; |
| 1670 | let sliceIndex = 0; |
| 1671 | let sawColon = false; |
| 1672 | |
| 1673 | while (true) { |
| 1674 | let nextTokenType = this._peekTokenType(); |
| 1675 | if (nextTokenType === TokenType.CloseBracket || |
| 1676 | nextTokenType === TokenType.Comma) { |
| 1677 | break; |
| 1678 | } |
| 1679 | |
| 1680 | if (nextTokenType !== TokenType.Colon) { |
| 1681 | sliceExpressions[sliceIndex] = this._parseTestExpression(); |
| 1682 | } |
| 1683 | sliceIndex++; |
| 1684 | |
| 1685 | if (sliceIndex >= 3 || !this._consumeTokenIfType(TokenType.Colon)) { |
| 1686 | break; |
| 1687 | } |
| 1688 | sawColon = true; |
| 1689 | } |
| 1690 | |
| 1691 | // If this was a simple expression with no colons return it. |
| 1692 | if (!sawColon) { |
| 1693 | return sliceExpressions[0]!; |
| 1694 | } |
| 1695 | |
| 1696 | let sliceNode = new SliceExpressionNode(firstToken); |
| 1697 | sliceNode.startValue = sliceExpressions[0]; |
| 1698 | sliceNode.endValue = sliceExpressions[1]; |
| 1699 | sliceNode.stepValue = sliceExpressions[2]; |
| 1700 | sliceNode.extend(sliceExpressions[2] || sliceExpressions[1] || sliceExpressions[0]); |
| 1701 | |
| 1702 | return sliceNode; |
| 1703 | } |
| 1704 | |
| 1705 | // arglist: argument (',' argument)* [','] |
| 1706 | private _parseArgList(): ArgumentNode[] { |
no test coverage detected