From 40200fcf307fbd53b89f3eafa10384f2ed7ab291 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Mon, 10 Jun 2024 12:00:10 -0700 Subject: [PATCH 1/2] Only use resolutionStart when pushing resolution stack --- src/compiler/checker.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 5cefd7aa08717..e63d7d9f8e156 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -10933,7 +10933,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { * @param propertyName The property name that should be used to query the target for its type */ function pushTypeResolution(target: TypeSystemEntity, propertyName: TypeSystemPropertyName): boolean { - const resolutionCycleStartIndex = findResolutionCycleStartIndex(target, propertyName); + const resolutionCycleStartIndex = findResolutionCycleStartIndex(target, propertyName, resolutionStart); if (resolutionCycleStartIndex >= 0) { // A cycle was found const { length } = resolutionTargets; @@ -10948,8 +10948,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { return true; } - function findResolutionCycleStartIndex(target: TypeSystemEntity, propertyName: TypeSystemPropertyName): number { - for (let i = resolutionTargets.length - 1; i >= resolutionStart; i--) { + function findResolutionCycleStartIndex(target: TypeSystemEntity, propertyName: TypeSystemPropertyName, start = 0): number { + for (let i = resolutionTargets.length - 1; i >= start; i--) { if (resolutionTargetHasProperty(resolutionTargets[i], resolutionPropertyNames[i])) { return -1; } From 308769772150419331f4baeafec539d310860a9a Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Mon, 10 Jun 2024 12:05:58 -0700 Subject: [PATCH 2/2] Refactor into func for clarity --- src/compiler/checker.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index e63d7d9f8e156..118119c209bce 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -10948,7 +10948,11 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { return true; } - function findResolutionCycleStartIndex(target: TypeSystemEntity, propertyName: TypeSystemPropertyName, start = 0): number { + function isInResolutionStack(target: TypeSystemEntity, propertyName: TypeSystemPropertyName): boolean { + return findResolutionCycleStartIndex(target, propertyName, 0) >= 0; + } + + function findResolutionCycleStartIndex(target: TypeSystemEntity, propertyName: TypeSystemPropertyName, start: number): number { for (let i = resolutionTargets.length - 1; i >= start; i--) { if (resolutionTargetHasProperty(resolutionTargets[i], resolutionPropertyNames[i])) { return -1; @@ -15907,7 +15911,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { function isResolvingReturnTypeOfSignature(signature: Signature): boolean { return signature.compositeSignatures && some(signature.compositeSignatures, isResolvingReturnTypeOfSignature) || - !signature.resolvedReturnType && findResolutionCycleStartIndex(signature, TypeSystemPropertyName.ResolvedReturnType) >= 0; + !signature.resolvedReturnType && isInResolutionStack(signature, TypeSystemPropertyName.ResolvedReturnType); } function getRestTypeOfSignature(signature: Signature): Type { @@ -20184,7 +20188,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { if (!type.declaration.nameType) { let constraint; if ( - isArrayType(t) || t.flags & TypeFlags.Any && findResolutionCycleStartIndex(typeVariable!, TypeSystemPropertyName.ImmediateBaseConstraint) < 0 && + isArrayType(t) || t.flags & TypeFlags.Any && !isInResolutionStack(typeVariable!, TypeSystemPropertyName.ImmediateBaseConstraint) && (constraint = getConstraintOfTypeParameter(typeVariable!)) && everyType(constraint, isArrayOrTupleType) ) { return instantiateMappedArrayType(t, type, prependTypeMapping(typeVariable!, t, mapper)); @@ -31482,7 +31486,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { } function isCircularMappedProperty(symbol: Symbol) { - return !!(getCheckFlags(symbol) & CheckFlags.Mapped && !(symbol as MappedSymbol).links.type && findResolutionCycleStartIndex(symbol, TypeSystemPropertyName.Type) >= 0); + return !!(getCheckFlags(symbol) & CheckFlags.Mapped && !(symbol as MappedSymbol).links.type && isInResolutionStack(symbol, TypeSystemPropertyName.Type)); } function getTypeOfPropertyOfContextualType(type: Type, name: __String, nameType?: Type) {