TYPES
()
| 2609 | // TYPES |
| 2610 | |
| 2611 | func (p *Parser) parseType() *ast.TypeNode { |
| 2612 | saveContextFlags := p.contextFlags |
| 2613 | p.setContextFlags(ast.NodeFlagsTypeExcludesFlags, false) |
| 2614 | var typeNode *ast.TypeNode |
| 2615 | if p.isStartOfFunctionTypeOrConstructorType() { |
| 2616 | typeNode = p.parseFunctionOrConstructorType() |
| 2617 | } else { |
| 2618 | pos := p.nodePos() |
| 2619 | typeNode = p.parseUnionTypeOrHigher() |
| 2620 | if !p.inDisallowConditionalTypesContext() && !p.hasPrecedingLineBreak() && p.parseOptional(ast.KindExtendsKeyword) { |
| 2621 | // The type following 'extends' is not permitted to be another conditional type |
| 2622 | extendsType := doInContext(p, ast.NodeFlagsDisallowConditionalTypesContext, true, (*Parser).parseType) |
| 2623 | p.parseExpected(ast.KindQuestionToken) |
| 2624 | trueType := doInContext(p, ast.NodeFlagsDisallowConditionalTypesContext, false, (*Parser).parseType) |
| 2625 | p.parseExpected(ast.KindColonToken) |
| 2626 | falseType := doInContext(p, ast.NodeFlagsDisallowConditionalTypesContext, false, (*Parser).parseType) |
| 2627 | conditionalType := p.factory.NewConditionalTypeNode(typeNode, extendsType, trueType, falseType) |
| 2628 | p.finishNode(conditionalType, pos) |
| 2629 | typeNode = conditionalType |
| 2630 | } |
| 2631 | } |
| 2632 | p.contextFlags = saveContextFlags |
| 2633 | return typeNode |
| 2634 | } |
| 2635 | |
| 2636 | func (p *Parser) parseUnionTypeOrHigher() *ast.TypeNode { |
| 2637 | return p.parseUnionOrIntersectionType(ast.KindBarToken, (*Parser).parseIntersectionTypeOrHigher) |
no test coverage detected