(operator ast.Kind, parseConstituentType func(p *Parser) *ast.TypeNode)
| 2642 | } |
| 2643 | |
| 2644 | func (p *Parser) parseUnionOrIntersectionType(operator ast.Kind, parseConstituentType func(p *Parser) *ast.TypeNode) *ast.TypeNode { |
| 2645 | pos := p.nodePos() |
| 2646 | isUnionType := operator == ast.KindBarToken |
| 2647 | hasLeadingOperator := p.parseOptional(operator) |
| 2648 | var typeNode *ast.TypeNode |
| 2649 | if hasLeadingOperator { |
| 2650 | typeNode = p.parseFunctionOrConstructorTypeToError(isUnionType, parseConstituentType) |
| 2651 | } else { |
| 2652 | typeNode = parseConstituentType(p) |
| 2653 | } |
| 2654 | if p.token == operator || hasLeadingOperator { |
| 2655 | types := make([]*ast.Node, 1, 8) |
| 2656 | types[0] = typeNode |
| 2657 | for p.parseOptional(operator) { |
| 2658 | types = append(types, p.parseFunctionOrConstructorTypeToError(isUnionType, parseConstituentType)) |
| 2659 | } |
| 2660 | typeNode = p.createUnionOrIntersectionTypeNode(operator, p.newNodeList(core.NewTextRange(pos, p.nodePos()), p.nodeSliceArena.Clone(types))) |
| 2661 | p.finishNode(typeNode, pos) |
| 2662 | } |
| 2663 | return typeNode |
| 2664 | } |
| 2665 | |
| 2666 | func (p *Parser) createUnionOrIntersectionTypeNode(operator ast.Kind, types *ast.NodeList) *ast.Node { |
| 2667 | switch operator { |
no test coverage detected