Skip to content

arguments should not be allowed in class static block #48172

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Merged
merged 8 commits into from
May 2, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 11 additions & 21 deletions src/compiler/checker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30285,8 +30285,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
// To avoid that we will give an error to users if they use arguments objects in arrow function so that they
// can explicitly bound arguments objects
if (symbol === argumentsSymbol) {
if (isInPropertyInitializerOrClassStaticBlock(node)) {
error(node, Diagnostics.arguments_cannot_be_referenced_in_property_initializers);
if (isInPropertyInitializerOrClassStaticBlock(node, /*ignoreArrowFunctions*/ true)) {
error(node, Diagnostics.arguments_cannot_be_referenced_in_property_initializers_or_class_static_initialization_blocks);
return;
}

Expand Down Expand Up @@ -34335,31 +34335,21 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
}
}

function isInPropertyInitializerOrClassStaticBlock(node: Node): boolean {
function isInPropertyInitializerOrClassStaticBlock(node: Node, ignoreArrowFunctions?: boolean): boolean {
return !!findAncestor(node, node => {
switch (node.kind) {
case SyntaxKind.PropertyDeclaration:
case SyntaxKind.ClassStaticBlockDeclaration:
return true;
case SyntaxKind.PropertyAssignment:
case SyntaxKind.MethodDeclaration:
case SyntaxKind.GetAccessor:
case SyntaxKind.SetAccessor:
case SyntaxKind.SpreadAssignment:
case SyntaxKind.ComputedPropertyName:
case SyntaxKind.TemplateSpan:
case SyntaxKind.JsxExpression:
case SyntaxKind.JsxAttribute:
case SyntaxKind.JsxAttributes:
case SyntaxKind.JsxSpreadAttribute:
case SyntaxKind.JsxOpeningElement:
case SyntaxKind.ExpressionWithTypeArguments:
case SyntaxKind.HeritageClause:
return false;
case SyntaxKind.TypeQuery:
case SyntaxKind.JsxClosingElement: // already reported in JsxOpeningElement
return "quit";
case SyntaxKind.ArrowFunction:
case SyntaxKind.ExpressionStatement:
return isBlock(node.parent) && isClassStaticBlockDeclaration(node.parent.parent) ? true : "quit";
return ignoreArrowFunctions ? false : "quit";
case SyntaxKind.Block:
return isFunctionLikeDeclaration(node.parent) && node.parent.kind !== SyntaxKind.ArrowFunction ? "quit" : false;
default:
return isExpressionNode(node) ? false : "quit";
return false;
}
});
}
Expand Down
2 changes: 1 addition & 1 deletion src/compiler/diagnosticMessages.json
Original file line number Diff line number Diff line change
Expand Up @@ -3767,7 +3767,7 @@
"category": "Error",
"code": 2814
},
"'arguments' cannot be referenced in property initializers.": {
"'arguments' cannot be referenced in property initializers or class static initialization blocks.": {
"category": "Error",
"code": 2815
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,44 +1,152 @@
argumentsUsedInClassFieldInitializerOrStaticInitializationBlock.ts(3,10): error TS2815: 'arguments' cannot be referenced in property initializers.
argumentsUsedInClassFieldInitializerOrStaticInitializationBlock.ts(9,10): error TS2815: 'arguments' cannot be referenced in property initializers.
argumentsUsedInClassFieldInitializerOrStaticInitializationBlock.ts(15,15): error TS2815: 'arguments' cannot be referenced in property initializers.
argumentsUsedInClassFieldInitializerOrStaticInitializationBlock.ts(21,15): error TS2815: 'arguments' cannot be referenced in property initializers.
argumentsUsedInClassFieldInitializerOrStaticInitializationBlock.ts(3,10): error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
argumentsUsedInClassFieldInitializerOrStaticInitializationBlock.ts(9,10): error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
argumentsUsedInClassFieldInitializerOrStaticInitializationBlock.ts(15,15): error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
argumentsUsedInClassFieldInitializerOrStaticInitializationBlock.ts(21,15): error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
argumentsUsedInClassFieldInitializerOrStaticInitializationBlock.ts(33,16): error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
argumentsUsedInClassFieldInitializerOrStaticInitializationBlock.ts(40,7): error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
argumentsUsedInClassFieldInitializerOrStaticInitializationBlock.ts(42,16): error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
argumentsUsedInClassFieldInitializerOrStaticInitializationBlock.ts(66,6): error TS2585: 'Symbol' only refers to a type, but is being used as a value here. Do you need to change your target library? Try changing the 'lib' compiler option to es2015 or later.
argumentsUsedInClassFieldInitializerOrStaticInitializationBlock.ts(75,7): error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
argumentsUsedInClassFieldInitializerOrStaticInitializationBlock.ts(77,9): error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
argumentsUsedInClassFieldInitializerOrStaticInitializationBlock.ts(96,26): error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
argumentsUsedInClassFieldInitializerOrStaticInitializationBlock.ts(102,15): error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.


==== argumentsUsedInClassFieldInitializerOrStaticInitializationBlock.ts (4 errors) ====
==== argumentsUsedInClassFieldInitializerOrStaticInitializationBlock.ts (12 errors) ====
function A() {
return class T {
a = arguments
~~~~~~~~~
!!! error TS2815: 'arguments' cannot be referenced in property initializers.
!!! error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
}
}

function A1() {
return new class T {
a = arguments
~~~~~~~~~
!!! error TS2815: 'arguments' cannot be referenced in property initializers.
!!! error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
}
}

function B() {
return class T {
a = { b: arguments }
~~~~~~~~~
!!! error TS2815: 'arguments' cannot be referenced in property initializers.
!!! error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
}
}

function B1() {
return new class T {
a = { b: arguments }
~~~~~~~~~
!!! error TS2815: 'arguments' cannot be referenced in property initializers.
!!! error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
}
}

function C() {
return class T {
a = function () { arguments }
}
}
}

function D() {
return class T {
a = () => arguments // should error
~~~~~~~~~
!!! error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
}
}

function D1() {
return class T {
a = () => {
arguments; // should error
~~~~~~~~~
!!! error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
const b = () => {
return arguments; // should error
~~~~~~~~~
!!! error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
}

function f() {
return arguments; // ok
}
}
}
}

function D2() {
return class {
constructor() {
arguments; // ok
}
get foo() {
return arguments; // ok
}
set foo(foo: any) {
arguments; // ok
}
bar() {
arguments; // ok
}
[Symbol.iterator]() {
~~~~~~
!!! error TS2585: 'Symbol' only refers to a type, but is being used as a value here. Do you need to change your target library? Try changing the 'lib' compiler option to es2015 or later.
arguments; // ok
}
}
}

function D3() {
return class T {
static {
arguments; // should error
~~~~~~~~~
!!! error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
while(1) {
arguments // should error
~~~~~~~~~
!!! error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
}
}
}
}

function D4() {
return class T {
static {
function f() {
arguments; // ok
}
}
}
}


function D5() {
return class T {
a = (() => { return arguments; })() // should error
~~~~~~~~~
!!! error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
}
}

function D6() {
return class T {
a = (x = arguments) => {} // should error
~~~~~~~~~
!!! error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
}
}

function D7() {
return class T {
a(x = arguments){ // ok

}
}
}

Loading