From 8662f0d0c251995f904b09032777d78a2a75129b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 11 Feb 2026 00:15:51 +0000 Subject: [PATCH 1/2] Initial plan From d29f71590bc83e904279ff6ae2c7a56a25110b0c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 11 Feb 2026 01:02:21 +0000 Subject: [PATCH 2/2] Port TypeScript PR #63026: Fix crash from circularly-reentrant getEffectsSignature Add PropagatesThisKeyword container flag and seenThisKeyword save/restore logic in IsControlFlowContainer branch to prevent infinite recursion when typeof queries in function-like type nodes trigger getEffectsSignature. Co-authored-by: jakebailey <5341706+jakebailey@users.noreply.github.com> --- internal/binder/binder.go | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/internal/binder/binder.go b/internal/binder/binder.go index f44ff210738..99f542474b1 100644 --- a/internal/binder/binder.go +++ b/internal/binder/binder.go @@ -39,6 +39,7 @@ const ( ContainerFlagsIsInterface ContainerFlags = 1 << 6 ContainerFlagsIsObjectLiteralOrClassExpressionMethodOrAccessor ContainerFlags = 1 << 7 ContainerFlagsIsThisContainer ContainerFlags = 1 << 8 + ContainerFlagsPropagatesThisKeyword ContainerFlags = 1 << 9 ) type ExpandoAssignmentInfo struct { @@ -1520,6 +1521,7 @@ func (b *Binder) bindContainer(node *ast.Node, containerFlags ContainerFlags) { saveExceptionTarget := b.currentExceptionTarget saveActiveLabelList := b.activeLabelList saveHasExplicitReturn := b.hasExplicitReturn + saveSeenThisKeyword := b.seenThisKeyword isImmediatelyInvoked := (containerFlags&ContainerFlagsIsFunctionExpression != 0 && !ast.HasSyntacticModifier(node, ast.ModifierFlagsAsync) && !isGeneratorFunctionExpression(node) && @@ -1545,9 +1547,10 @@ func (b *Binder) bindContainer(node *ast.Node, containerFlags ContainerFlags) { b.currentContinueTarget = nil b.activeLabelList = nil b.hasExplicitReturn = false + b.seenThisKeyword = false b.bindChildren(node) // Reset all reachability check related flags on node (for incremental scenarios) - node.Flags &= ^ast.NodeFlagsReachabilityCheckFlags + node.Flags &= ^(ast.NodeFlagsReachabilityCheckFlags | ast.NodeFlagsContainsThis) if b.currentFlow.Flags&ast.FlowFlagsUnreachable == 0 && containerFlags&ContainerFlagsIsFunctionLike != 0 { bodyData := node.BodyData() if bodyData != nil && ast.NodeIsPresent(bodyData.Body) { @@ -1558,6 +1561,9 @@ func (b *Binder) bindContainer(node *ast.Node, containerFlags ContainerFlags) { bodyData.EndFlowNode = b.currentFlow } } + if b.seenThisKeyword { + node.Flags |= ast.NodeFlagsContainsThis + } if node.Kind == ast.KindSourceFile { node.Flags |= b.emitFlags node.AsSourceFile().EndFlowNode = b.currentFlow @@ -1579,6 +1585,11 @@ func (b *Binder) bindContainer(node *ast.Node, containerFlags ContainerFlags) { b.currentExceptionTarget = saveExceptionTarget b.activeLabelList = saveActiveLabelList b.hasExplicitReturn = saveHasExplicitReturn + if containerFlags&ContainerFlagsPropagatesThisKeyword != 0 { + b.seenThisKeyword = saveSeenThisKeyword || b.seenThisKeyword + } else { + b.seenThisKeyword = saveSeenThisKeyword + } } else if containerFlags&ContainerFlagsIsInterface != 0 { b.seenThisKeyword = false b.bindChildren(node) @@ -2528,13 +2539,13 @@ func GetContainerFlags(node *ast.Node) ContainerFlags { case ast.KindConstructor, ast.KindClassStaticBlockDeclaration: return ContainerFlagsIsContainer | ContainerFlagsIsControlFlowContainer | ContainerFlagsHasLocals | ContainerFlagsIsFunctionLike | ContainerFlagsIsThisContainer case ast.KindMethodSignature, ast.KindCallSignature, ast.KindFunctionType, ast.KindConstructSignature, ast.KindConstructorType: - return ContainerFlagsIsContainer | ContainerFlagsIsControlFlowContainer | ContainerFlagsHasLocals | ContainerFlagsIsFunctionLike + return ContainerFlagsIsContainer | ContainerFlagsIsControlFlowContainer | ContainerFlagsHasLocals | ContainerFlagsIsFunctionLike | ContainerFlagsPropagatesThisKeyword case ast.KindFunctionDeclaration: return ContainerFlagsIsContainer | ContainerFlagsIsControlFlowContainer | ContainerFlagsHasLocals | ContainerFlagsIsFunctionLike | ContainerFlagsIsThisContainer case ast.KindFunctionExpression: return ContainerFlagsIsContainer | ContainerFlagsIsControlFlowContainer | ContainerFlagsHasLocals | ContainerFlagsIsFunctionLike | ContainerFlagsIsFunctionExpression | ContainerFlagsIsThisContainer case ast.KindArrowFunction: - return ContainerFlagsIsContainer | ContainerFlagsIsControlFlowContainer | ContainerFlagsHasLocals | ContainerFlagsIsFunctionLike | ContainerFlagsIsFunctionExpression + return ContainerFlagsIsContainer | ContainerFlagsIsControlFlowContainer | ContainerFlagsHasLocals | ContainerFlagsIsFunctionLike | ContainerFlagsIsFunctionExpression | ContainerFlagsPropagatesThisKeyword case ast.KindModuleBlock: return ContainerFlagsIsControlFlowContainer case ast.KindPropertyDeclaration: