From ee7a83cfc96d246a4958421c3107682071040cec Mon Sep 17 00:00:00 2001 From: Alexis Delrieu Date: Tue, 29 Sep 2026 11:45:24 +0200 Subject: [PATCH 1/2] Skip combined-constraint check while measuring variances The combined-constraint comparison in `structuredTypeRelatedTo` hoists the constraints of the instantiable constituents of an intersection source into a combined constraint and compares that constraint against the target. While measuring variances, the hoisted constraint may itself be an intersection with instantiable constituents (e.g. deferred conditional types, as produced by heavily overloaded generic builder types), so a failed comparison re-enters the same logic with a structurally new and ever larger source that neither the relation cache nor the deeply-nested-type guards recognize as recursive, and the chase grows without bound until the process runs out of memory. Skip the check while the variance stack is non-empty; it never contributes to the measured relation between the marker types. Fixes #64423 --- tsc/internal/checker/relater.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tsc/internal/checker/relater.go b/tsc/internal/checker/relater.go index 007fba2511a13..cbc9eed1aca17 100644 --- a/tsc/internal/checker/relater.go +++ b/tsc/internal/checker/relater.go @@ -3241,7 +3241,15 @@ func (r *Relater) structuredTypeRelatedTo(source *Type, target *Type, reportErro // needs to have its constraint hoisted into an intersection with said type parameter, this way // the type param can be compared with itself in the target (with the influence of its constraint to match other parts) // For example, if `T extends 1 | 2` and `U extends 2 | 3` and we compare `T & U` to `T & U & (1 | 2 | 3)` - if result == TernaryFalse && (source.flags&TypeFlagsIntersection != 0 || source.flags&TypeFlagsTypeParameter != 0 && target.flags&TypeFlagsUnion != 0) { + // We skip the combined-constraint check while measuring variances. Variance + // measurement compares marker instantiations, and there the hoisted constraint may + // itself be an intersection with instantiable constituents (e.g. deferred conditional + // types, as produced by heavily overloaded generic builder types), so a failed + // comparison re-enters this logic with a structurally new and ever larger source + // that the relation cache and the deeply-nested-type guards never recognize as + // recursive, and the chase grows without bound (see microsoft/TypeScript#64423). + // The check never contributes to the measured relation between the marker types. + if result == TernaryFalse && len(r.c.varianceStack) == 0 && (source.flags&TypeFlagsIntersection != 0 || source.flags&TypeFlagsTypeParameter != 0 && target.flags&TypeFlagsUnion != 0) { var sourceTypes []*Type if source.flags&TypeFlagsIntersection != 0 { sourceTypes = source.Types() From ee6b93d3415273eac06a187d0fe3a54fb45d5c85 Mon Sep 17 00:00:00 2001 From: Alexis Delrieu Date: Mon, 5 Oct 2026 11:46:37 +0200 Subject: [PATCH 2/2] Add regression test for the effective-constraint chase during variance measurement Adds a minimized compiler fixture distilled from the three.js TSL node types (microsoft/TypeScript#64423). Resolving `uv().div(vec2())` measures the variances of generic extension interfaces whose hoisted constraints form deferred conditional intersections; without the variance-stack guard in `structuredTypeRelatedTo` the combined-constraint comparison re-enters itself with structurally new, ever larger sources and the chase grows without bound until the process exhausts memory. With the guard the file checks to completion with no diagnostics, and the checked-in baselines pin that result so the guard cannot be removed or weakened unnoticed. Verified against the pre-fix revision that this fixture grows the relation chase until the runtime runs out of memory, and that the fixed revision terminates cleanly. --- ...aintChaseDuringVarianceMeasurement.symbols | 495 ++++++++++++++++++ ...traintChaseDuringVarianceMeasurement.types | 241 +++++++++ ...onstraintChaseDuringVarianceMeasurement.ts | 192 +++++++ 3 files changed, 928 insertions(+) create mode 100644 tsc/testdata/baselines/reference/compiler/effectiveConstraintChaseDuringVarianceMeasurement.symbols create mode 100644 tsc/testdata/baselines/reference/compiler/effectiveConstraintChaseDuringVarianceMeasurement.types create mode 100644 tsc/testdata/tests/cases/compiler/effectiveConstraintChaseDuringVarianceMeasurement.ts diff --git a/tsc/testdata/baselines/reference/compiler/effectiveConstraintChaseDuringVarianceMeasurement.symbols b/tsc/testdata/baselines/reference/compiler/effectiveConstraintChaseDuringVarianceMeasurement.symbols new file mode 100644 index 0000000000000..a4aad24efbf07 --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/effectiveConstraintChaseDuringVarianceMeasurement.symbols @@ -0,0 +1,495 @@ +//// [tests/cases/compiler/effectiveConstraintChaseDuringVarianceMeasurement.ts] //// + +=== effectiveConstraintChaseDuringVarianceMeasurement.ts === +// Regression test for microsoft/TypeScript#64423. +// +// Distilled from the three.js TSL node types. `Node` is a generic type +// alias that resolves to an intersection whose constituents include deferred +// conditional types selecting between sets of generic "extension" interfaces. +// Resolving `uv().div(vec2())` measures the variances of those extension +// interfaces, and while the variance stack is non-empty the combined-constraint +// comparison in `structuredTypeRelatedTo` repeatedly hoists the constraints of +// the intersection source into a structurally new and ever larger intersection +// (each round peels a branch off the deferred conditional chain, producing new +// type identities the relation cache never recognizes as recursive). Without a +// guard this chase grows without bound until the process runs out of memory; +// checking this file must terminate with no diagnostics instead. + +export type NumType = "float" | "int" | "uint"; +>NumType : Symbol(NumType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 0, 0)) + +export type IntegerType = "int" | "uint"; +>IntegerType : Symbol(IntegerType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 14, 47)) + +export type NumOrBoolType = NumType | "bool"; +>NumOrBoolType : Symbol(NumOrBoolType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 15, 41)) +>NumType : Symbol(NumType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 0, 0)) + +export type FloatVecType = "vec2" | "vec3" | "vec4"; +>FloatVecType : Symbol(FloatVecType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 16, 45)) + +export type MatType = "mat2" | "mat3" | "mat4"; +>MatType : Symbol(MatType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 17, 52)) + +interface NumberToVec { +>NumberToVec : Symbol(NumberToVec, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 18, 47)) + + float: "vec"; +>float : Symbol(NumberToVec.float, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 20, 23)) + + int: "ivec"; +>int : Symbol(NumberToVec.int, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 21, 17)) + + uint: "uvec"; +>uint : Symbol(NumberToVec.uint, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 22, 16)) +} + +type NumberToVec2 = `${NumberToVec[TNum]}2`; +>NumberToVec2 : Symbol(NumberToVec2, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 24, 1)) +>TNum : Symbol(TNum, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 26, 18)) +>NumType : Symbol(NumType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 0, 0)) +>NumberToVec : Symbol(NumberToVec, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 18, 47)) +>TNum : Symbol(TNum, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 26, 18)) + +type Number = Node | number; +>Number : Symbol(Number, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 26, 66)) +>TNum : Symbol(TNum, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 28, 12)) +>NumType : Symbol(NumType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 0, 0)) +>Node : Symbol(Node, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 111, 1)) +>TNum : Symbol(TNum, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 28, 12)) + +type Vec2OrLessOrNumber = Number | Node>; +>Vec2OrLessOrNumber : Symbol(Vec2OrLessOrNumber, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 28, 56)) +>TNum : Symbol(TNum, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 30, 24)) +>NumType : Symbol(NumType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 0, 0)) +>Number : Symbol(Number, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 26, 66)) +>TNum : Symbol(TNum, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 30, 24)) +>Node : Symbol(Node, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 111, 1)) +>NumberToVec2 : Symbol(NumberToVec2, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 24, 1)) +>TNum : Symbol(TNum, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 30, 24)) + +declare class NodeClass { +>NodeClass : Symbol(NodeClass, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 30, 88)) +} + +interface NodeExtensions { +>NodeExtensions : Symbol(NodeExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 33, 1), Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 179, 62)) +>TNodeType : Symbol(TNodeType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 35, 25), Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 181, 25)) +} + +interface FloatExtensions { +>FloatExtensions : Symbol(FloatExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 36, 1)) +} + +interface IntExtensions { +>IntExtensions : Symbol(IntExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 39, 1)) +} + +interface UintExtensions { +>UintExtensions : Symbol(UintExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 42, 1)) +} + +interface BoolExtensions { +>BoolExtensions : Symbol(BoolExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 45, 1)) +} + +interface NumExtensions { +>NumExtensions : Symbol(NumExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 48, 1), Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 165, 23)) +>TNum : Symbol(TNum, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 50, 24), Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 167, 24)) +>NumType : Symbol(NumType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 0, 0)) +} + +interface IntegerExtensions { +>IntegerExtensions : Symbol(IntegerExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 51, 1)) +>TInteger : Symbol(TInteger, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 53, 28)) +>IntegerType : Symbol(IntegerType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 14, 47)) +} + +interface NumOrBoolExtensions { +>NumOrBoolExtensions : Symbol(NumOrBoolExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 54, 1)) +>TNumOrBool : Symbol(TNumOrBool, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 56, 30)) +>NumOrBoolType : Symbol(NumOrBoolType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 15, 41)) +} + +interface NumVec2Extensions { +>NumVec2Extensions : Symbol(NumVec2Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 57, 1), Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 169, 1)) +>TNum : Symbol(TNum, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 59, 28), Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 171, 28)) +>NumType : Symbol(NumType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 0, 0)) +} + +interface NumVec3Extensions { +>NumVec3Extensions : Symbol(NumVec3Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 60, 1)) +>TNum : Symbol(TNum, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 62, 28)) +>NumType : Symbol(NumType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 0, 0)) +} + +interface NumVec4Extensions { +>NumVec4Extensions : Symbol(NumVec4Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 63, 1)) +>TNum : Symbol(TNum, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 65, 28)) +>NumType : Symbol(NumType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 0, 0)) +} + +interface NumOrBoolVec2Extensions { +>NumOrBoolVec2Extensions : Symbol(NumOrBoolVec2Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 66, 1)) +>TNumOrBool : Symbol(TNumOrBool, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 68, 34)) +>NumOrBoolType : Symbol(NumOrBoolType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 15, 41)) +} + +interface NumOrBoolVec3Extensions { +>NumOrBoolVec3Extensions : Symbol(NumOrBoolVec3Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 69, 1)) +>TNumOrBool : Symbol(TNumOrBool, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 71, 34)) +>NumOrBoolType : Symbol(NumOrBoolType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 15, 41)) +} + +interface NumOrBoolVec4Extensions { +>NumOrBoolVec4Extensions : Symbol(NumOrBoolVec4Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 72, 1)) +>TNumOrBool : Symbol(TNumOrBool, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 74, 34)) +>NumOrBoolType : Symbol(NumOrBoolType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 15, 41)) +} + +interface Vec2Extensions { +>Vec2Extensions : Symbol(Vec2Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 75, 1)) +} + +interface Vec3Extensions { +>Vec3Extensions : Symbol(Vec3Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 78, 1)) +} + +interface Vec4Extensions { +>Vec4Extensions : Symbol(Vec4Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 81, 1)) +} + +interface ColorExtensions { +>ColorExtensions : Symbol(ColorExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 84, 1)) +} + +interface FloatVecExtensions { +>FloatVecExtensions : Symbol(FloatVecExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 87, 1)) +>TVec : Symbol(TVec, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 89, 29)) +>FloatVecType : Symbol(FloatVecType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 16, 45)) +} + +interface FloatOrVecExtensions { +>FloatOrVecExtensions : Symbol(FloatOrVecExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 90, 1)) +>TNodeType : Symbol(TNodeType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 92, 31)) +} + +interface IntOrVecExtensions { +>IntOrVecExtensions : Symbol(IntOrVecExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 93, 1)) +>TNodeType : Symbol(TNodeType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 95, 29)) +} + +interface BoolOrVecExtensions { +>BoolOrVecExtensions : Symbol(BoolOrVecExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 96, 1)) +>TNodeType : Symbol(TNodeType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 98, 30)) +} + +interface Mat2Extensions { +>Mat2Extensions : Symbol(Mat2Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 99, 1)) +} + +interface Mat3Extensions { +>Mat3Extensions : Symbol(Mat3Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 102, 1)) +} + +interface Mat4Extensions { +>Mat4Extensions : Symbol(Mat4Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 105, 1)) +} + +interface MatExtensions { +>MatExtensions : Symbol(MatExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 108, 1)) +>TMat : Symbol(TMat, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 110, 24)) +>MatType : Symbol(MatType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 17, 52)) +} + +type Node = +>Node : Symbol(Node, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 111, 1)) +>TNodeType : Symbol(TNodeType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 113, 10)) + + & NodeClass +>NodeClass : Symbol(NodeClass, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 30, 88)) + + & (unknown extends TNodeType ? {} : NodeExtensions) +>TNodeType : Symbol(TNodeType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 113, 10)) +>NodeExtensions : Symbol(NodeExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 33, 1), Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 179, 62)) +>TNodeType : Symbol(TNodeType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 113, 10)) + + & (TNodeType extends "float" +>TNodeType : Symbol(TNodeType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 113, 10)) + + ? NumOrBoolExtensions<"float"> & FloatExtensions & NumExtensions<"float"> & FloatOrVecExtensions<"float"> +>NumOrBoolExtensions : Symbol(NumOrBoolExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 54, 1)) +>FloatExtensions : Symbol(FloatExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 36, 1)) +>NumExtensions : Symbol(NumExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 48, 1), Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 165, 23)) +>FloatOrVecExtensions : Symbol(FloatOrVecExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 90, 1)) + + : TNodeType extends "int" +>TNodeType : Symbol(TNodeType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 113, 10)) + + ? NumOrBoolExtensions<"int"> & IntExtensions & NumExtensions<"int"> & IntegerExtensions<"int"> & IntOrVecExtensions<"int"> +>NumOrBoolExtensions : Symbol(NumOrBoolExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 54, 1)) +>IntExtensions : Symbol(IntExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 39, 1)) +>NumExtensions : Symbol(NumExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 48, 1), Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 165, 23)) +>IntegerExtensions : Symbol(IntegerExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 51, 1)) +>IntOrVecExtensions : Symbol(IntOrVecExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 93, 1)) + + : TNodeType extends "uint" +>TNodeType : Symbol(TNodeType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 113, 10)) + + ? NumOrBoolExtensions<"uint"> & UintExtensions & NumExtensions<"uint"> & IntegerExtensions<"uint"> & IntOrVecExtensions<"uint"> +>NumOrBoolExtensions : Symbol(NumOrBoolExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 54, 1)) +>UintExtensions : Symbol(UintExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 42, 1)) +>NumExtensions : Symbol(NumExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 48, 1), Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 165, 23)) +>IntegerExtensions : Symbol(IntegerExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 51, 1)) +>IntOrVecExtensions : Symbol(IntOrVecExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 93, 1)) + + : TNodeType extends "bool" ? NumOrBoolExtensions<"bool"> & BoolExtensions & BoolOrVecExtensions<"bool"> +>TNodeType : Symbol(TNodeType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 113, 10)) +>NumOrBoolExtensions : Symbol(NumOrBoolExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 54, 1)) +>BoolExtensions : Symbol(BoolExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 45, 1)) +>BoolOrVecExtensions : Symbol(BoolOrVecExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 96, 1)) + + : TNodeType extends "vec2" +>TNodeType : Symbol(TNodeType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 113, 10)) + + ? NumOrBoolVec2Extensions<"float"> & Vec2Extensions & NumVec2Extensions<"float"> & FloatVecExtensions<"vec2"> & FloatOrVecExtensions<"vec2"> +>NumOrBoolVec2Extensions : Symbol(NumOrBoolVec2Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 66, 1)) +>Vec2Extensions : Symbol(Vec2Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 75, 1)) +>NumVec2Extensions : Symbol(NumVec2Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 57, 1), Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 169, 1)) +>FloatVecExtensions : Symbol(FloatVecExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 87, 1)) +>FloatOrVecExtensions : Symbol(FloatOrVecExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 90, 1)) + + : TNodeType extends "ivec2" +>TNodeType : Symbol(TNodeType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 113, 10)) + + ? NumOrBoolVec2Extensions<"int"> & NumVec2Extensions<"int"> & IntOrVecExtensions<"ivec2"> +>NumOrBoolVec2Extensions : Symbol(NumOrBoolVec2Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 66, 1)) +>NumVec2Extensions : Symbol(NumVec2Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 57, 1), Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 169, 1)) +>IntOrVecExtensions : Symbol(IntOrVecExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 93, 1)) + + : TNodeType extends "uvec2" +>TNodeType : Symbol(TNodeType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 113, 10)) + + ? NumOrBoolVec2Extensions<"uint"> & NumVec2Extensions<"uint"> & IntOrVecExtensions<"uvec2"> +>NumOrBoolVec2Extensions : Symbol(NumOrBoolVec2Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 66, 1)) +>NumVec2Extensions : Symbol(NumVec2Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 57, 1), Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 169, 1)) +>IntOrVecExtensions : Symbol(IntOrVecExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 93, 1)) + + : TNodeType extends "bvec2" ? NumOrBoolVec2Extensions<"bool"> & BoolOrVecExtensions<"bvec2"> +>TNodeType : Symbol(TNodeType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 113, 10)) +>NumOrBoolVec2Extensions : Symbol(NumOrBoolVec2Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 66, 1)) +>BoolOrVecExtensions : Symbol(BoolOrVecExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 96, 1)) + + : TNodeType extends "vec3" +>TNodeType : Symbol(TNodeType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 113, 10)) + + ? NumOrBoolVec3Extensions<"float"> & Vec3Extensions & NumVec3Extensions<"float"> & FloatVecExtensions<"vec3"> & FloatOrVecExtensions<"vec3"> +>NumOrBoolVec3Extensions : Symbol(NumOrBoolVec3Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 69, 1)) +>Vec3Extensions : Symbol(Vec3Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 78, 1)) +>NumVec3Extensions : Symbol(NumVec3Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 60, 1)) +>FloatVecExtensions : Symbol(FloatVecExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 87, 1)) +>FloatOrVecExtensions : Symbol(FloatOrVecExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 90, 1)) + + : TNodeType extends "ivec3" +>TNodeType : Symbol(TNodeType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 113, 10)) + + ? NumOrBoolVec3Extensions<"int"> & NumVec3Extensions<"int"> & IntOrVecExtensions<"ivec3"> +>NumOrBoolVec3Extensions : Symbol(NumOrBoolVec3Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 69, 1)) +>NumVec3Extensions : Symbol(NumVec3Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 60, 1)) +>IntOrVecExtensions : Symbol(IntOrVecExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 93, 1)) + + : TNodeType extends "uvec3" +>TNodeType : Symbol(TNodeType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 113, 10)) + + ? NumOrBoolVec3Extensions<"uint"> & NumVec3Extensions<"uint"> & IntOrVecExtensions<"uvec3"> +>NumOrBoolVec3Extensions : Symbol(NumOrBoolVec3Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 69, 1)) +>NumVec3Extensions : Symbol(NumVec3Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 60, 1)) +>IntOrVecExtensions : Symbol(IntOrVecExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 93, 1)) + + : TNodeType extends "bvec3" ? NumOrBoolVec3Extensions<"bool"> & BoolOrVecExtensions<"bvec3"> +>TNodeType : Symbol(TNodeType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 113, 10)) +>NumOrBoolVec3Extensions : Symbol(NumOrBoolVec3Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 69, 1)) +>BoolOrVecExtensions : Symbol(BoolOrVecExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 96, 1)) + + : TNodeType extends "vec4" +>TNodeType : Symbol(TNodeType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 113, 10)) + + ? NumOrBoolVec4Extensions<"float"> & Vec4Extensions & NumVec4Extensions<"float"> & FloatVecExtensions<"vec4"> & FloatOrVecExtensions<"vec4"> +>NumOrBoolVec4Extensions : Symbol(NumOrBoolVec4Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 72, 1)) +>Vec4Extensions : Symbol(Vec4Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 81, 1)) +>NumVec4Extensions : Symbol(NumVec4Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 63, 1)) +>FloatVecExtensions : Symbol(FloatVecExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 87, 1)) +>FloatOrVecExtensions : Symbol(FloatOrVecExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 90, 1)) + + : TNodeType extends "ivec4" +>TNodeType : Symbol(TNodeType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 113, 10)) + + ? NumOrBoolVec4Extensions<"int"> & NumVec4Extensions<"int"> & IntOrVecExtensions<"ivec4"> +>NumOrBoolVec4Extensions : Symbol(NumOrBoolVec4Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 72, 1)) +>NumVec4Extensions : Symbol(NumVec4Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 63, 1)) +>IntOrVecExtensions : Symbol(IntOrVecExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 93, 1)) + + : TNodeType extends "uvec4" +>TNodeType : Symbol(TNodeType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 113, 10)) + + ? NumOrBoolVec4Extensions<"uint"> & NumVec4Extensions<"uint"> & IntOrVecExtensions<"uvec4"> +>NumOrBoolVec4Extensions : Symbol(NumOrBoolVec4Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 72, 1)) +>NumVec4Extensions : Symbol(NumVec4Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 63, 1)) +>IntOrVecExtensions : Symbol(IntOrVecExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 93, 1)) + + : TNodeType extends "bvec4" ? NumOrBoolVec4Extensions<"bool"> & BoolOrVecExtensions<"bvec4"> +>TNodeType : Symbol(TNodeType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 113, 10)) +>NumOrBoolVec4Extensions : Symbol(NumOrBoolVec4Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 72, 1)) +>BoolOrVecExtensions : Symbol(BoolOrVecExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 96, 1)) + + : TNodeType extends "color" ? ColorExtensions +>TNodeType : Symbol(TNodeType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 113, 10)) +>ColorExtensions : Symbol(ColorExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 84, 1)) + + : TNodeType extends "mat2" ? Mat2Extensions & MatExtensions<"mat2"> +>TNodeType : Symbol(TNodeType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 113, 10)) +>Mat2Extensions : Symbol(Mat2Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 99, 1)) +>MatExtensions : Symbol(MatExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 108, 1)) + + : TNodeType extends "mat3" ? Mat3Extensions & MatExtensions<"mat3"> +>TNodeType : Symbol(TNodeType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 113, 10)) +>Mat3Extensions : Symbol(Mat3Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 102, 1)) +>MatExtensions : Symbol(MatExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 108, 1)) + + : TNodeType extends "mat4" ? Mat4Extensions & MatExtensions<"mat4"> +>TNodeType : Symbol(TNodeType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 113, 10)) +>Mat4Extensions : Symbol(Mat4Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 105, 1)) +>MatExtensions : Symbol(MatExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 108, 1)) + + : {}); + +interface AddSubMulDivNumberVec { +>AddSubMulDivNumberVec : Symbol(AddSubMulDivNumberVec, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 148, 14)) +>TNum : Symbol(TNum, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 150, 32)) +>NumType : Symbol(NumType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 0, 0)) + + (a: Vec2OrLessOrNumber, b: Vec2OrLessOrNumber, ...params: Vec2OrLessOrNumber[]): Node>; +>a : Symbol(a, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 151, 5)) +>Vec2OrLessOrNumber : Symbol(Vec2OrLessOrNumber, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 28, 56)) +>TNum : Symbol(TNum, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 150, 32)) +>b : Symbol(b, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 151, 33)) +>Vec2OrLessOrNumber : Symbol(Vec2OrLessOrNumber, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 28, 56)) +>TNum : Symbol(TNum, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 150, 32)) +>params : Symbol(params, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 151, 62)) +>Vec2OrLessOrNumber : Symbol(Vec2OrLessOrNumber, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 28, 56)) +>TNum : Symbol(TNum, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 150, 32)) +>Node : Symbol(Node, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 111, 1)) +>NumberToVec2 : Symbol(NumberToVec2, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 24, 1)) +>TNum : Symbol(TNum, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 150, 32)) +} + +interface AddSubMulDivNumberVecNumExtensions { +>AddSubMulDivNumberVecNumExtensions : Symbol(AddSubMulDivNumberVecNumExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 152, 1)) +>TNum : Symbol(TNum, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 154, 45)) +>NumType : Symbol(NumType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 0, 0)) + + (b: Vec2OrLessOrNumber, ...params: Vec2OrLessOrNumber[]): Node>; +>b : Symbol(b, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 155, 5)) +>Vec2OrLessOrNumber : Symbol(Vec2OrLessOrNumber, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 28, 56)) +>TNum : Symbol(TNum, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 154, 45)) +>params : Symbol(params, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 155, 33)) +>Vec2OrLessOrNumber : Symbol(Vec2OrLessOrNumber, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 28, 56)) +>TNum : Symbol(TNum, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 154, 45)) +>Node : Symbol(Node, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 111, 1)) +>NumberToVec2 : Symbol(NumberToVec2, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 24, 1)) +>TNum : Symbol(TNum, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 154, 45)) +} + +interface AddSubMulDivNumberVecVec2Extensions { +>AddSubMulDivNumberVecVec2Extensions : Symbol(AddSubMulDivNumberVecVec2Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 156, 1)) +>TNum : Symbol(TNum, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 158, 46)) +>NumType : Symbol(NumType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 0, 0)) + + (b: Vec2OrLessOrNumber, ...params: Vec2OrLessOrNumber[]): Node>; +>b : Symbol(b, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 159, 5)) +>Vec2OrLessOrNumber : Symbol(Vec2OrLessOrNumber, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 28, 56)) +>TNum : Symbol(TNum, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 158, 46)) +>params : Symbol(params, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 159, 33)) +>Vec2OrLessOrNumber : Symbol(Vec2OrLessOrNumber, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 28, 56)) +>TNum : Symbol(TNum, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 158, 46)) +>Node : Symbol(Node, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 111, 1)) +>NumberToVec2 : Symbol(NumberToVec2, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 24, 1)) +>TNum : Symbol(TNum, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 158, 46)) +} + +interface Div extends AddSubMulDivNumberVec<"float">, AddSubMulDivNumberVec<"int">, AddSubMulDivNumberVec<"uint"> { +>Div : Symbol(Div, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 160, 1)) +>AddSubMulDivNumberVec : Symbol(AddSubMulDivNumberVec, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 148, 14)) +>AddSubMulDivNumberVec : Symbol(AddSubMulDivNumberVec, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 148, 14)) +>AddSubMulDivNumberVec : Symbol(AddSubMulDivNumberVec, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 148, 14)) +} + +declare const div: Div; +>div : Symbol(div, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 165, 13)) +>Div : Symbol(Div, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 160, 1)) + +interface NumExtensions { +>NumExtensions : Symbol(NumExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 48, 1), Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 165, 23)) +>TNum : Symbol(TNum, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 50, 24), Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 167, 24)) +>NumType : Symbol(NumType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 0, 0)) + + div: AddSubMulDivNumberVecNumExtensions; +>div : Symbol(NumExtensions.div, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 167, 47)) +>AddSubMulDivNumberVecNumExtensions : Symbol(AddSubMulDivNumberVecNumExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 152, 1)) +>TNum : Symbol(TNum, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 50, 24), Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 167, 24)) +} + +interface NumVec2Extensions { +>NumVec2Extensions : Symbol(NumVec2Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 57, 1), Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 169, 1)) +>TNum : Symbol(TNum, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 59, 28), Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 171, 28)) +>NumType : Symbol(NumType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 0, 0)) + + div: AddSubMulDivNumberVecVec2Extensions; +>div : Symbol(NumVec2Extensions.div, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 171, 51)) +>AddSubMulDivNumberVecVec2Extensions : Symbol(AddSubMulDivNumberVecVec2Extensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 156, 1)) +>TNum : Symbol(TNum, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 59, 28), Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 171, 28)) +} + +declare class ContextNodeInterface extends NodeClass { +>ContextNodeInterface : Symbol(ContextNodeInterface, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 173, 1)) +>TNodeType : Symbol(TNodeType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 175, 35)) +>NodeClass : Symbol(NodeClass, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 30, 88)) + + node: Node | null; +>node : Symbol(ContextNodeInterface.node, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 175, 65)) +>Node : Symbol(Node, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 111, 1)) +>TNodeType : Symbol(TNodeType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 175, 35)) +} + +type ContextNode = ContextNodeInterface; +>ContextNode : Symbol(ContextNode, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 177, 1)) +>TNodeType : Symbol(TNodeType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 179, 17)) +>ContextNodeInterface : Symbol(ContextNodeInterface, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 173, 1)) +>TNodeType : Symbol(TNodeType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 179, 17)) + +interface NodeExtensions { +>NodeExtensions : Symbol(NodeExtensions, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 33, 1), Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 179, 62)) +>TNodeType : Symbol(TNodeType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 35, 25), Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 181, 25)) + + context: (context?: unknown) => ContextNode; +>context : Symbol(NodeExtensions.context, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 181, 37)) +>context : Symbol(context, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 182, 14)) +>ContextNode : Symbol(ContextNode, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 177, 1)) +>TNodeType : Symbol(TNodeType, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 35, 25), Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 181, 25)) +} + +declare const uv: () => Node<"vec2">; +>uv : Symbol(uv, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 185, 13)) +>Node : Symbol(Node, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 111, 1)) + +declare const vec2: () => Node<"vec2">; +>vec2 : Symbol(vec2, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 187, 13)) +>Node : Symbol(Node, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 111, 1)) + +export const x = uv().div(vec2()); +>x : Symbol(x, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 189, 12)) +>uv().div : Symbol(NumVec2Extensions.div, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 171, 51)) +>uv : Symbol(uv, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 185, 13)) +>div : Symbol(NumVec2Extensions.div, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 171, 51)) +>vec2 : Symbol(vec2, Decl(effectiveConstraintChaseDuringVarianceMeasurement.ts, 187, 13)) + diff --git a/tsc/testdata/baselines/reference/compiler/effectiveConstraintChaseDuringVarianceMeasurement.types b/tsc/testdata/baselines/reference/compiler/effectiveConstraintChaseDuringVarianceMeasurement.types new file mode 100644 index 0000000000000..0872abe2e8e34 --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/effectiveConstraintChaseDuringVarianceMeasurement.types @@ -0,0 +1,241 @@ +//// [tests/cases/compiler/effectiveConstraintChaseDuringVarianceMeasurement.ts] //// + +=== effectiveConstraintChaseDuringVarianceMeasurement.ts === +// Regression test for microsoft/TypeScript#64423. +// +// Distilled from the three.js TSL node types. `Node` is a generic type +// alias that resolves to an intersection whose constituents include deferred +// conditional types selecting between sets of generic "extension" interfaces. +// Resolving `uv().div(vec2())` measures the variances of those extension +// interfaces, and while the variance stack is non-empty the combined-constraint +// comparison in `structuredTypeRelatedTo` repeatedly hoists the constraints of +// the intersection source into a structurally new and ever larger intersection +// (each round peels a branch off the deferred conditional chain, producing new +// type identities the relation cache never recognizes as recursive). Without a +// guard this chase grows without bound until the process runs out of memory; +// checking this file must terminate with no diagnostics instead. + +export type NumType = "float" | "int" | "uint"; +>NumType : NumType + +export type IntegerType = "int" | "uint"; +>IntegerType : IntegerType + +export type NumOrBoolType = NumType | "bool"; +>NumOrBoolType : NumOrBoolType + +export type FloatVecType = "vec2" | "vec3" | "vec4"; +>FloatVecType : FloatVecType + +export type MatType = "mat2" | "mat3" | "mat4"; +>MatType : MatType + +interface NumberToVec { + float: "vec"; +>float : "vec" + + int: "ivec"; +>int : "ivec" + + uint: "uvec"; +>uint : "uvec" +} + +type NumberToVec2 = `${NumberToVec[TNum]}2`; +>NumberToVec2 : `${NumberToVec[TNum]}2` + +type Number = Node | number; +>Number : Number + +type Vec2OrLessOrNumber = Number | Node>; +>Vec2OrLessOrNumber : Vec2OrLessOrNumber + +declare class NodeClass { +>NodeClass : NodeClass +} + +interface NodeExtensions { +} + +interface FloatExtensions { +} + +interface IntExtensions { +} + +interface UintExtensions { +} + +interface BoolExtensions { +} + +interface NumExtensions { +} + +interface IntegerExtensions { +} + +interface NumOrBoolExtensions { +} + +interface NumVec2Extensions { +} + +interface NumVec3Extensions { +} + +interface NumVec4Extensions { +} + +interface NumOrBoolVec2Extensions { +} + +interface NumOrBoolVec3Extensions { +} + +interface NumOrBoolVec4Extensions { +} + +interface Vec2Extensions { +} + +interface Vec3Extensions { +} + +interface Vec4Extensions { +} + +interface ColorExtensions { +} + +interface FloatVecExtensions { +} + +interface FloatOrVecExtensions { +} + +interface IntOrVecExtensions { +} + +interface BoolOrVecExtensions { +} + +interface Mat2Extensions { +} + +interface Mat3Extensions { +} + +interface Mat4Extensions { +} + +interface MatExtensions { +} + +type Node = +>Node : Node + + & NodeClass + & (unknown extends TNodeType ? {} : NodeExtensions) + & (TNodeType extends "float" + ? NumOrBoolExtensions<"float"> & FloatExtensions & NumExtensions<"float"> & FloatOrVecExtensions<"float"> + : TNodeType extends "int" + ? NumOrBoolExtensions<"int"> & IntExtensions & NumExtensions<"int"> & IntegerExtensions<"int"> & IntOrVecExtensions<"int"> + : TNodeType extends "uint" + ? NumOrBoolExtensions<"uint"> & UintExtensions & NumExtensions<"uint"> & IntegerExtensions<"uint"> & IntOrVecExtensions<"uint"> + : TNodeType extends "bool" ? NumOrBoolExtensions<"bool"> & BoolExtensions & BoolOrVecExtensions<"bool"> + : TNodeType extends "vec2" + ? NumOrBoolVec2Extensions<"float"> & Vec2Extensions & NumVec2Extensions<"float"> & FloatVecExtensions<"vec2"> & FloatOrVecExtensions<"vec2"> + : TNodeType extends "ivec2" + ? NumOrBoolVec2Extensions<"int"> & NumVec2Extensions<"int"> & IntOrVecExtensions<"ivec2"> + : TNodeType extends "uvec2" + ? NumOrBoolVec2Extensions<"uint"> & NumVec2Extensions<"uint"> & IntOrVecExtensions<"uvec2"> + : TNodeType extends "bvec2" ? NumOrBoolVec2Extensions<"bool"> & BoolOrVecExtensions<"bvec2"> + : TNodeType extends "vec3" + ? NumOrBoolVec3Extensions<"float"> & Vec3Extensions & NumVec3Extensions<"float"> & FloatVecExtensions<"vec3"> & FloatOrVecExtensions<"vec3"> + : TNodeType extends "ivec3" + ? NumOrBoolVec3Extensions<"int"> & NumVec3Extensions<"int"> & IntOrVecExtensions<"ivec3"> + : TNodeType extends "uvec3" + ? NumOrBoolVec3Extensions<"uint"> & NumVec3Extensions<"uint"> & IntOrVecExtensions<"uvec3"> + : TNodeType extends "bvec3" ? NumOrBoolVec3Extensions<"bool"> & BoolOrVecExtensions<"bvec3"> + : TNodeType extends "vec4" + ? NumOrBoolVec4Extensions<"float"> & Vec4Extensions & NumVec4Extensions<"float"> & FloatVecExtensions<"vec4"> & FloatOrVecExtensions<"vec4"> + : TNodeType extends "ivec4" + ? NumOrBoolVec4Extensions<"int"> & NumVec4Extensions<"int"> & IntOrVecExtensions<"ivec4"> + : TNodeType extends "uvec4" + ? NumOrBoolVec4Extensions<"uint"> & NumVec4Extensions<"uint"> & IntOrVecExtensions<"uvec4"> + : TNodeType extends "bvec4" ? NumOrBoolVec4Extensions<"bool"> & BoolOrVecExtensions<"bvec4"> + : TNodeType extends "color" ? ColorExtensions + : TNodeType extends "mat2" ? Mat2Extensions & MatExtensions<"mat2"> + : TNodeType extends "mat3" ? Mat3Extensions & MatExtensions<"mat3"> + : TNodeType extends "mat4" ? Mat4Extensions & MatExtensions<"mat4"> + : {}); + +interface AddSubMulDivNumberVec { + (a: Vec2OrLessOrNumber, b: Vec2OrLessOrNumber, ...params: Vec2OrLessOrNumber[]): Node>; +>a : Vec2OrLessOrNumber +>b : Vec2OrLessOrNumber +>params : Vec2OrLessOrNumber[] +} + +interface AddSubMulDivNumberVecNumExtensions { + (b: Vec2OrLessOrNumber, ...params: Vec2OrLessOrNumber[]): Node>; +>b : Vec2OrLessOrNumber +>params : Vec2OrLessOrNumber[] +} + +interface AddSubMulDivNumberVecVec2Extensions { + (b: Vec2OrLessOrNumber, ...params: Vec2OrLessOrNumber[]): Node>; +>b : Vec2OrLessOrNumber +>params : Vec2OrLessOrNumber[] +} + +interface Div extends AddSubMulDivNumberVec<"float">, AddSubMulDivNumberVec<"int">, AddSubMulDivNumberVec<"uint"> { +} + +declare const div: Div; +>div : Div + +interface NumExtensions { + div: AddSubMulDivNumberVecNumExtensions; +>div : AddSubMulDivNumberVecNumExtensions +} + +interface NumVec2Extensions { + div: AddSubMulDivNumberVecVec2Extensions; +>div : AddSubMulDivNumberVecVec2Extensions +} + +declare class ContextNodeInterface extends NodeClass { +>ContextNodeInterface : ContextNodeInterface +>NodeClass : NodeClass + + node: Node | null; +>node : Node | null +} + +type ContextNode = ContextNodeInterface; +>ContextNode : ContextNode + +interface NodeExtensions { + context: (context?: unknown) => ContextNode; +>context : (context?: unknown) => ContextNode +>context : unknown +} + +declare const uv: () => Node<"vec2">; +>uv : () => Node<"vec2"> + +declare const vec2: () => Node<"vec2">; +>vec2 : () => Node<"vec2"> + +export const x = uv().div(vec2()); +>x : Node<"vec2"> +>uv().div(vec2()) : Node<"vec2"> +>uv().div : AddSubMulDivNumberVecVec2Extensions<"float"> +>uv() : Node<"vec2"> +>uv : () => Node<"vec2"> +>div : AddSubMulDivNumberVecVec2Extensions<"float"> +>vec2() : Node<"vec2"> +>vec2 : () => Node<"vec2"> + diff --git a/tsc/testdata/tests/cases/compiler/effectiveConstraintChaseDuringVarianceMeasurement.ts b/tsc/testdata/tests/cases/compiler/effectiveConstraintChaseDuringVarianceMeasurement.ts new file mode 100644 index 0000000000000..1292b8c8ea596 --- /dev/null +++ b/tsc/testdata/tests/cases/compiler/effectiveConstraintChaseDuringVarianceMeasurement.ts @@ -0,0 +1,192 @@ +// @noEmit: true + +// Regression test for microsoft/TypeScript#64423. +// +// Distilled from the three.js TSL node types. `Node` is a generic type +// alias that resolves to an intersection whose constituents include deferred +// conditional types selecting between sets of generic "extension" interfaces. +// Resolving `uv().div(vec2())` measures the variances of those extension +// interfaces, and while the variance stack is non-empty the combined-constraint +// comparison in `structuredTypeRelatedTo` repeatedly hoists the constraints of +// the intersection source into a structurally new and ever larger intersection +// (each round peels a branch off the deferred conditional chain, producing new +// type identities the relation cache never recognizes as recursive). Without a +// guard this chase grows without bound until the process runs out of memory; +// checking this file must terminate with no diagnostics instead. + +export type NumType = "float" | "int" | "uint"; +export type IntegerType = "int" | "uint"; +export type NumOrBoolType = NumType | "bool"; +export type FloatVecType = "vec2" | "vec3" | "vec4"; +export type MatType = "mat2" | "mat3" | "mat4"; + +interface NumberToVec { + float: "vec"; + int: "ivec"; + uint: "uvec"; +} + +type NumberToVec2 = `${NumberToVec[TNum]}2`; + +type Number = Node | number; + +type Vec2OrLessOrNumber = Number | Node>; + +declare class NodeClass { +} + +interface NodeExtensions { +} + +interface FloatExtensions { +} + +interface IntExtensions { +} + +interface UintExtensions { +} + +interface BoolExtensions { +} + +interface NumExtensions { +} + +interface IntegerExtensions { +} + +interface NumOrBoolExtensions { +} + +interface NumVec2Extensions { +} + +interface NumVec3Extensions { +} + +interface NumVec4Extensions { +} + +interface NumOrBoolVec2Extensions { +} + +interface NumOrBoolVec3Extensions { +} + +interface NumOrBoolVec4Extensions { +} + +interface Vec2Extensions { +} + +interface Vec3Extensions { +} + +interface Vec4Extensions { +} + +interface ColorExtensions { +} + +interface FloatVecExtensions { +} + +interface FloatOrVecExtensions { +} + +interface IntOrVecExtensions { +} + +interface BoolOrVecExtensions { +} + +interface Mat2Extensions { +} + +interface Mat3Extensions { +} + +interface Mat4Extensions { +} + +interface MatExtensions { +} + +type Node = + & NodeClass + & (unknown extends TNodeType ? {} : NodeExtensions) + & (TNodeType extends "float" + ? NumOrBoolExtensions<"float"> & FloatExtensions & NumExtensions<"float"> & FloatOrVecExtensions<"float"> + : TNodeType extends "int" + ? NumOrBoolExtensions<"int"> & IntExtensions & NumExtensions<"int"> & IntegerExtensions<"int"> & IntOrVecExtensions<"int"> + : TNodeType extends "uint" + ? NumOrBoolExtensions<"uint"> & UintExtensions & NumExtensions<"uint"> & IntegerExtensions<"uint"> & IntOrVecExtensions<"uint"> + : TNodeType extends "bool" ? NumOrBoolExtensions<"bool"> & BoolExtensions & BoolOrVecExtensions<"bool"> + : TNodeType extends "vec2" + ? NumOrBoolVec2Extensions<"float"> & Vec2Extensions & NumVec2Extensions<"float"> & FloatVecExtensions<"vec2"> & FloatOrVecExtensions<"vec2"> + : TNodeType extends "ivec2" + ? NumOrBoolVec2Extensions<"int"> & NumVec2Extensions<"int"> & IntOrVecExtensions<"ivec2"> + : TNodeType extends "uvec2" + ? NumOrBoolVec2Extensions<"uint"> & NumVec2Extensions<"uint"> & IntOrVecExtensions<"uvec2"> + : TNodeType extends "bvec2" ? NumOrBoolVec2Extensions<"bool"> & BoolOrVecExtensions<"bvec2"> + : TNodeType extends "vec3" + ? NumOrBoolVec3Extensions<"float"> & Vec3Extensions & NumVec3Extensions<"float"> & FloatVecExtensions<"vec3"> & FloatOrVecExtensions<"vec3"> + : TNodeType extends "ivec3" + ? NumOrBoolVec3Extensions<"int"> & NumVec3Extensions<"int"> & IntOrVecExtensions<"ivec3"> + : TNodeType extends "uvec3" + ? NumOrBoolVec3Extensions<"uint"> & NumVec3Extensions<"uint"> & IntOrVecExtensions<"uvec3"> + : TNodeType extends "bvec3" ? NumOrBoolVec3Extensions<"bool"> & BoolOrVecExtensions<"bvec3"> + : TNodeType extends "vec4" + ? NumOrBoolVec4Extensions<"float"> & Vec4Extensions & NumVec4Extensions<"float"> & FloatVecExtensions<"vec4"> & FloatOrVecExtensions<"vec4"> + : TNodeType extends "ivec4" + ? NumOrBoolVec4Extensions<"int"> & NumVec4Extensions<"int"> & IntOrVecExtensions<"ivec4"> + : TNodeType extends "uvec4" + ? NumOrBoolVec4Extensions<"uint"> & NumVec4Extensions<"uint"> & IntOrVecExtensions<"uvec4"> + : TNodeType extends "bvec4" ? NumOrBoolVec4Extensions<"bool"> & BoolOrVecExtensions<"bvec4"> + : TNodeType extends "color" ? ColorExtensions + : TNodeType extends "mat2" ? Mat2Extensions & MatExtensions<"mat2"> + : TNodeType extends "mat3" ? Mat3Extensions & MatExtensions<"mat3"> + : TNodeType extends "mat4" ? Mat4Extensions & MatExtensions<"mat4"> + : {}); + +interface AddSubMulDivNumberVec { + (a: Vec2OrLessOrNumber, b: Vec2OrLessOrNumber, ...params: Vec2OrLessOrNumber[]): Node>; +} + +interface AddSubMulDivNumberVecNumExtensions { + (b: Vec2OrLessOrNumber, ...params: Vec2OrLessOrNumber[]): Node>; +} + +interface AddSubMulDivNumberVecVec2Extensions { + (b: Vec2OrLessOrNumber, ...params: Vec2OrLessOrNumber[]): Node>; +} + +interface Div extends AddSubMulDivNumberVec<"float">, AddSubMulDivNumberVec<"int">, AddSubMulDivNumberVec<"uint"> { +} + +declare const div: Div; + +interface NumExtensions { + div: AddSubMulDivNumberVecNumExtensions; +} + +interface NumVec2Extensions { + div: AddSubMulDivNumberVecVec2Extensions; +} + +declare class ContextNodeInterface extends NodeClass { + node: Node | null; +} + +type ContextNode = ContextNodeInterface; + +interface NodeExtensions { + context: (context?: unknown) => ContextNode; +} + +declare const uv: () => Node<"vec2">; + +declare const vec2: () => Node<"vec2">; + +export const x = uv().div(vec2());