()
| 2717 | } |
| 2718 | |
| 2719 | func (p *Parser) parsePostfixTypeOrHigher() *ast.Node { |
| 2720 | pos := p.nodePos() |
| 2721 | typeNode := p.parseNonArrayType() |
| 2722 | for !p.hasPrecedingLineBreak() { |
| 2723 | switch p.token { |
| 2724 | case ast.KindExclamationToken: |
| 2725 | p.nextToken() |
| 2726 | typeNode = p.finishNode(p.factory.NewJSDocNonNullableType(typeNode), pos) |
| 2727 | case ast.KindQuestionToken: |
| 2728 | // If next token is start of a type we have a conditional type |
| 2729 | if p.lookAhead((*Parser).nextIsStartOfType) { |
| 2730 | return typeNode |
| 2731 | } |
| 2732 | p.nextToken() |
| 2733 | typeNode = p.finishNode(p.factory.NewJSDocNullableType(typeNode), pos) |
| 2734 | case ast.KindOpenBracketToken: |
| 2735 | p.parseExpected(ast.KindOpenBracketToken) |
| 2736 | if p.isStartOfType(false /*isStartOfParameter*/) { |
| 2737 | indexType := p.parseType() |
| 2738 | p.parseExpected(ast.KindCloseBracketToken) |
| 2739 | typeNode = p.finishNode(p.factory.NewIndexedAccessTypeNode(typeNode, indexType), pos) |
| 2740 | } else { |
| 2741 | p.parseExpected(ast.KindCloseBracketToken) |
| 2742 | typeNode = p.finishNode(p.factory.NewArrayTypeNode(typeNode), pos) |
| 2743 | } |
| 2744 | default: |
| 2745 | return typeNode |
| 2746 | } |
| 2747 | } |
| 2748 | return typeNode |
| 2749 | } |
| 2750 | |
| 2751 | func (p *Parser) nextIsStartOfType() bool { |
| 2752 | p.nextToken() |
nothing calls this directly
no test coverage detected