@@ -18567,7 +18567,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1856718567 }
1856818568 if (everyType(objectType, isTupleType) && isNumericLiteralName(propName)) {
1856918569 const index = +propName;
18570- if (accessNode && everyType(objectType, t => !(t as TupleTypeReference).target.hasRestElement ) && !(accessFlags & AccessFlags.NoTupleBoundsCheck)) {
18570+ if (accessNode && everyType(objectType, t => !(( t as TupleTypeReference).target.combinedFlags & ElementFlags.Variable) ) && !(accessFlags & AccessFlags.NoTupleBoundsCheck)) {
1857118571 const indexNode = getIndexNodeForAccessExpression(accessNode);
1857218572 if (isTupleType(objectType)) {
1857318573 if (index < 0) {
@@ -25755,7 +25755,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2575525755
2575625756 function tupleTypesDefinitelyUnrelated(source: TupleTypeReference, target: TupleTypeReference) {
2575725757 return !(target.target.combinedFlags & ElementFlags.Variadic) && target.target.minLength > source.target.minLength ||
25758- !target.target.hasRestElement && ( source.target.hasRestElement || target.target.fixedLength < source.target.fixedLength);
25758+ !( target.target.combinedFlags & ElementFlags.Variable) && (!!( source.target.combinedFlags & ElementFlags.Variable) || target.target.fixedLength < source.target.fixedLength);
2575925759 }
2576025760
2576125761 function typesDefinitelyUnrelated(source: Type, target: Type) {
@@ -26586,7 +26586,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2658626586 return;
2658726587 }
2658826588 const startLength = isTupleType(source) ? Math.min(source.target.fixedLength, target.target.fixedLength) : 0;
26589- const endLength = Math.min(isTupleType(source) ? getEndElementCount(source.target, ElementFlags.Fixed) : 0, target.target.hasRestElement ? getEndElementCount(target.target, ElementFlags.Fixed) : 0);
26589+ const endLength = Math.min(isTupleType(source) ? getEndElementCount(source.target, ElementFlags.Fixed) : 0, target.target.combinedFlags & ElementFlags.Variable ? getEndElementCount(target.target, ElementFlags.Fixed) : 0);
2659026590 // Infer between starting fixed elements.
2659126591 for (let i = 0; i < startLength; i++) {
2659226592 inferFromTypes(getTypeArguments(source)[i], elementTypes[i]);
@@ -26615,7 +26615,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2661526615 // if T is constrained by a fixed-size tuple we might be able to use its arity to infer T
2661626616 const param = getInferenceInfoForType(elementTypes[startLength])?.typeParameter;
2661726617 const constraint = param && getBaseConstraintOfType(param);
26618- if (constraint && isTupleType(constraint) && !constraint.target.hasRestElement ) {
26618+ if (constraint && isTupleType(constraint) && !( constraint.target.combinedFlags & ElementFlags.Variable) ) {
2661926619 const impliedArity = constraint.target.fixedLength;
2662026620 inferFromTypes(sliceTupleType(source, startLength, sourceArity - (startLength + impliedArity)), elementTypes[startLength]);
2662126621 inferFromTypes(getElementTypeOfSliceOfTupleType(source, startLength + impliedArity, endLength)!, elementTypes[startLength + 1]);
@@ -26626,7 +26626,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2662626626 // if T is constrained by a fixed-size tuple we might be able to use its arity to infer T
2662726627 const param = getInferenceInfoForType(elementTypes[startLength + 1])?.typeParameter;
2662826628 const constraint = param && getBaseConstraintOfType(param);
26629- if (constraint && isTupleType(constraint) && !constraint.target.hasRestElement ) {
26629+ if (constraint && isTupleType(constraint) && !( constraint.target.combinedFlags & ElementFlags.Variable) ) {
2663026630 const impliedArity = constraint.target.fixedLength;
2663126631 const endIndex = sourceArity - getEndElementCount(target.target, ElementFlags.Fixed);
2663226632 const startIndex = endIndex - impliedArity;
@@ -31583,7 +31583,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3158331583 // When the length is known and the index is after all spread elements we compute the offset from the element
3158431584 // to the end and the number of ending fixed elements in the contextual tuple type.
3158531585 const offset = length !== undefined && (lastSpreadIndex === undefined || index > lastSpreadIndex) ? length - index : 0;
31586- const fixedEndLength = offset > 0 && t.target.hasRestElement ? getEndElementCount(t.target, ElementFlags.Fixed) : 0;
31586+ const fixedEndLength = offset > 0 && ( t.target.combinedFlags & ElementFlags.Variable) ? getEndElementCount(t.target, ElementFlags.Fixed) : 0;
3158731587 // If the offset is within the ending fixed part of the contextual tuple type, return the type of the contextual
3158831588 // tuple element.
3158931589 if (offset > 0 && offset <= fixedEndLength) {
@@ -37367,7 +37367,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3736737367 // otherwise would return the type 'undefined').
3736837368 const restType = getTypeOfSymbol(signature.parameters[paramCount]);
3736937369 const index = pos - paramCount;
37370- if (!isTupleType(restType) || restType.target.hasRestElement || index < restType.target.fixedLength) {
37370+ if (!isTupleType(restType) || restType.target.combinedFlags & ElementFlags.Variable || index < restType.target.fixedLength) {
3737137371 return getIndexedAccessType(restType, getNumberLiteralType(index));
3737237372 }
3737337373 }
@@ -37416,7 +37416,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3741637416 if (signatureHasRestParameter(signature)) {
3741737417 const restType = getTypeOfSymbol(signature.parameters[length - 1]);
3741837418 if (isTupleType(restType)) {
37419- return length + restType.target.fixedLength - (restType.target.hasRestElement ? 0 : 1);
37419+ return length + restType.target.fixedLength - (restType.target.combinedFlags & ElementFlags.Variable ? 0 : 1);
3742037420 }
3742137421 }
3742237422 return length;
@@ -37461,7 +37461,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3746137461 function hasEffectiveRestParameter(signature: Signature) {
3746237462 if (signatureHasRestParameter(signature)) {
3746337463 const restType = getTypeOfSymbol(signature.parameters[signature.parameters.length - 1]);
37464- return !isTupleType(restType) || restType.target.hasRestElement ;
37464+ return !isTupleType(restType) || !!( restType.target.combinedFlags & ElementFlags.Variable) ;
3746537465 }
3746637466 return false;
3746737467 }
@@ -37472,7 +37472,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3747237472 if (!isTupleType(restType)) {
3747337473 return isTypeAny(restType) ? anyArrayType : restType;
3747437474 }
37475- if (restType.target.hasRestElement ) {
37475+ if (restType.target.combinedFlags & ElementFlags.Variable ) {
3747637476 return sliceTupleType(restType, restType.target.fixedLength);
3747737477 }
3747837478 }
@@ -40147,7 +40147,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4014740147 checkExpressionWithContextualType(initializer, contextualType, /*inferenceContext*/ undefined, checkMode || CheckMode.Normal)
4014840148 : checkExpressionCached(initializer, checkMode));
4014940149 return isParameter(declaration) && declaration.name.kind === SyntaxKind.ArrayBindingPattern &&
40150- isTupleType(type) && !type.target.hasRestElement && getTypeReferenceArity(type) < declaration.name.elements.length ?
40150+ isTupleType(type) && !( type.target.combinedFlags & ElementFlags.Variable) && getTypeReferenceArity(type) < declaration.name.elements.length ?
4015140151 padTupleType(type, declaration.name) : type;
4015240152 }
4015340153
0 commit comments