We represent tuple types as type references to synthesized generic interface types created by this function. The types are of the form: interface Tuple extends Array { 0: T0, 1: T1, 2: T2, ... } Note that the generic type created by this function has no symbol
(elementInfos []TupleElementInfo, readonly bool)
| 24681 | // Note that the generic type created by this function has no symbol associated with it. The same |
| 24682 | // is true for each of the synthesized type parameters. |
| 24683 | func (c *Checker) createTupleTargetType(elementInfos []TupleElementInfo, readonly bool) *Type { |
| 24684 | arity := len(elementInfos) |
| 24685 | minLength := core.CountWhere(elementInfos, func(e TupleElementInfo) bool { |
| 24686 | return e.flags&(ElementFlagsRequired|ElementFlagsVariadic) != 0 |
| 24687 | }) |
| 24688 | var typeParameters []*Type |
| 24689 | members := make(ast.SymbolTable) |
| 24690 | combinedFlags := ElementFlagsNone |
| 24691 | if arity != 0 { |
| 24692 | typeParameters = make([]*Type, 0, arity) |
| 24693 | for i := range arity { |
| 24694 | typeParameter := c.newTypeParameter(nil) |
| 24695 | typeParameters = append(typeParameters, typeParameter) |
| 24696 | flags := elementInfos[i].flags |
| 24697 | combinedFlags |= flags |
| 24698 | if combinedFlags&ElementFlagsVariable == 0 { |
| 24699 | property := c.newSymbolEx(ast.SymbolFlagsProperty|core.IfElse(flags&ElementFlagsOptional != 0, ast.SymbolFlagsOptional, 0), strconv.Itoa(i), core.IfElse(readonly, ast.CheckFlagsReadonly, 0)) |
| 24700 | c.valueSymbolLinks.Get(property).resolvedType = typeParameter |
| 24701 | // c.valueSymbolLinks.get(property).tupleLabelDeclaration = elementInfos[i].labeledDeclaration |
| 24702 | members[property.Name] = property |
| 24703 | } |
| 24704 | } |
| 24705 | } |
| 24706 | fixedLength := len(members) |
| 24707 | lengthSymbol := c.newSymbolEx(ast.SymbolFlagsProperty, "length", core.IfElse(readonly, ast.CheckFlagsReadonly, 0)) |
| 24708 | if combinedFlags&ElementFlagsVariable != 0 { |
| 24709 | c.valueSymbolLinks.Get(lengthSymbol).resolvedType = c.numberType |
| 24710 | } else { |
| 24711 | var literalTypes []*Type |
| 24712 | for i := minLength; i <= arity; i++ { |
| 24713 | literalTypes = append(literalTypes, c.getNumberLiteralType(jsnum.Number(i))) |
| 24714 | } |
| 24715 | c.valueSymbolLinks.Get(lengthSymbol).resolvedType = c.getUnionType(literalTypes) |
| 24716 | } |
| 24717 | members[lengthSymbol.Name] = lengthSymbol |
| 24718 | t := c.newObjectType(ObjectFlagsTuple|ObjectFlagsReference, nil) |
| 24719 | d := t.AsTupleType() |
| 24720 | d.thisType = c.newTypeParameter(nil) |
| 24721 | d.thisType.AsTypeParameter().isThisType = true |
| 24722 | d.thisType.AsTypeParameter().constraint = t |
| 24723 | d.allTypeParameters = append(typeParameters, d.thisType) |
| 24724 | d.instantiations = make(map[CacheHashKey]*Type) |
| 24725 | d.instantiations[getTypeListKey(d.TypeParameters())] = t |
| 24726 | d.target = t |
| 24727 | d.resolvedTypeArguments = d.TypeParameters() |
| 24728 | d.declaredMembersResolved = true |
| 24729 | d.declaredMembers = members |
| 24730 | d.elementInfos = elementInfos |
| 24731 | d.minLength = minLength |
| 24732 | d.fixedLength = fixedLength |
| 24733 | d.combinedFlags = combinedFlags |
| 24734 | d.readonly = readonly |
| 24735 | return t |
| 24736 | } |
| 24737 | |
| 24738 | func (c *Checker) getElementTypeOfSliceOfTupleType(t *Type, index int, endSkipCount int, writing bool, noReductions bool) *Type { |
| 24739 | length := c.getTypeReferenceArity(t) - endSkipCount |
no test coverage detected