From 931430c3354ff40de1dfe7bda3fe73cd0524adc5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 25 Jul 2025 18:57:55 +0000 Subject: [PATCH] Accept baseline changes and complete fix for type assertion assignment issue Co-authored-by: jakebailey <5341706+jakebailey@users.noreply.github.com> --- src/compiler/utilities.ts | 90 +++++++++---------- ...sNameReferencesInStaticElements.errors.txt | 21 +++++ 2 files changed, 66 insertions(+), 45 deletions(-) create mode 100644 tests/baselines/reference/classNameReferencesInStaticElements.errors.txt diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index c6703ab7bf7..a78643db4c0 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -4780,51 +4780,51 @@ type AssignmentTarget = | PostfixUnaryExpression | ForInOrOfStatement; -function getAssignmentTarget(node: Node): AssignmentTarget | undefined { - let parent = node.parent; - while (true) { - switch (parent.kind) { - case SyntaxKind.BinaryExpression: - const binaryExpression = parent as BinaryExpression; - const binaryOperator = binaryExpression.operatorToken.kind; - return isAssignmentOperator(binaryOperator) && binaryExpression.left === node ? binaryExpression : undefined; - case SyntaxKind.PrefixUnaryExpression: - case SyntaxKind.PostfixUnaryExpression: - const unaryExpression = parent as PrefixUnaryExpression | PostfixUnaryExpression; - const unaryOperator = unaryExpression.operator; - return unaryOperator === SyntaxKind.PlusPlusToken || unaryOperator === SyntaxKind.MinusMinusToken ? unaryExpression : undefined; - case SyntaxKind.ForInStatement: - case SyntaxKind.ForOfStatement: - const forInOrOfStatement = parent as ForInOrOfStatement; - return forInOrOfStatement.initializer === node ? forInOrOfStatement : undefined; - case SyntaxKind.ParenthesizedExpression: - case SyntaxKind.ArrayLiteralExpression: - case SyntaxKind.SpreadElement: - case SyntaxKind.NonNullExpression: - case SyntaxKind.TypeAssertionExpression: - case SyntaxKind.AsExpression: - node = parent; - break; - case SyntaxKind.SpreadAssignment: - node = parent.parent; - break; - case SyntaxKind.ShorthandPropertyAssignment: - if ((parent as ShorthandPropertyAssignment).name !== node) { - return undefined; - } - node = parent.parent; - break; - case SyntaxKind.PropertyAssignment: - if ((parent as PropertyAssignment).name === node) { - return undefined; - } - node = parent.parent; - break; - default: - return undefined; - } - parent = node.parent; - } +function getAssignmentTarget(node: Node): AssignmentTarget | undefined { + let parent = node.parent; + while (true) { + switch (parent.kind) { + case SyntaxKind.BinaryExpression: + const binaryExpression = parent as BinaryExpression; + const binaryOperator = binaryExpression.operatorToken.kind; + return isAssignmentOperator(binaryOperator) && binaryExpression.left === node ? binaryExpression : undefined; + case SyntaxKind.PrefixUnaryExpression: + case SyntaxKind.PostfixUnaryExpression: + const unaryExpression = parent as PrefixUnaryExpression | PostfixUnaryExpression; + const unaryOperator = unaryExpression.operator; + return unaryOperator === SyntaxKind.PlusPlusToken || unaryOperator === SyntaxKind.MinusMinusToken ? unaryExpression : undefined; + case SyntaxKind.ForInStatement: + case SyntaxKind.ForOfStatement: + const forInOrOfStatement = parent as ForInOrOfStatement; + return forInOrOfStatement.initializer === node ? forInOrOfStatement : undefined; + case SyntaxKind.ParenthesizedExpression: + case SyntaxKind.ArrayLiteralExpression: + case SyntaxKind.SpreadElement: + case SyntaxKind.NonNullExpression: + case SyntaxKind.TypeAssertionExpression: + case SyntaxKind.AsExpression: + node = parent; + break; + case SyntaxKind.SpreadAssignment: + node = parent.parent; + break; + case SyntaxKind.ShorthandPropertyAssignment: + if ((parent as ShorthandPropertyAssignment).name !== node) { + return undefined; + } + node = parent.parent; + break; + case SyntaxKind.PropertyAssignment: + if ((parent as PropertyAssignment).name === node) { + return undefined; + } + node = parent.parent; + break; + default: + return undefined; + } + parent = node.parent; + } } /** @internal */ diff --git a/tests/baselines/reference/classNameReferencesInStaticElements.errors.txt b/tests/baselines/reference/classNameReferencesInStaticElements.errors.txt new file mode 100644 index 00000000000..43328c9e1f2 --- /dev/null +++ b/tests/baselines/reference/classNameReferencesInStaticElements.errors.txt @@ -0,0 +1,21 @@ +classNameReferencesInStaticElements.ts(12,2): error TS2629: Cannot assign to 'Foo' because it is a class. + + +==== classNameReferencesInStaticElements.ts (1 errors) ==== + // https://github.com/microsoft/TypeScript/issues/54607 + class Foo { + static { console.log(this, Foo) } + static x = () => { console.log(this, Foo) } + static y = function(this: unknown) { console.log(this, Foo) } + + #x() { console.log(Foo); } + x() { this.#x(); } + } + + const oldFoo = Foo; + (Foo as any) = null; + ~~~ +!!! error TS2629: Cannot assign to 'Foo' because it is a class. + oldFoo.x(); + oldFoo.y(); + new oldFoo().x(); \ No newline at end of file