Skip to content

Commit e37ca49

Browse files
Zzzensandersnjakebailey
authored
arguments should not be allowed in class static block (#48172)
Co-authored-by: Nathan Shively-Sanders <[email protected]> Co-authored-by: Jake Bailey <[email protected]>
1 parent 11e7932 commit e37ca49

12 files changed

+930
-41
lines changed

src/compiler/checker.ts

+11-21
Original file line numberDiff line numberDiff line change
@@ -30738,8 +30738,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3073830738
// To avoid that we will give an error to users if they use arguments objects in arrow function so that they
3073930739
// can explicitly bound arguments objects
3074030740
if (symbol === argumentsSymbol) {
30741-
if (isInPropertyInitializerOrClassStaticBlock(node)) {
30742-
error(node, Diagnostics.arguments_cannot_be_referenced_in_property_initializers);
30741+
if (isInPropertyInitializerOrClassStaticBlock(node, /*ignoreArrowFunctions*/ true)) {
30742+
error(node, Diagnostics.arguments_cannot_be_referenced_in_property_initializers_or_class_static_initialization_blocks);
3074330743
return;
3074430744
}
3074530745

@@ -34788,31 +34788,21 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3478834788
}
3478934789
}
3479034790

34791-
function isInPropertyInitializerOrClassStaticBlock(node: Node): boolean {
34791+
function isInPropertyInitializerOrClassStaticBlock(node: Node, ignoreArrowFunctions?: boolean): boolean {
3479234792
return !!findAncestor(node, node => {
3479334793
switch (node.kind) {
3479434794
case SyntaxKind.PropertyDeclaration:
34795+
case SyntaxKind.ClassStaticBlockDeclaration:
3479534796
return true;
34796-
case SyntaxKind.PropertyAssignment:
34797-
case SyntaxKind.MethodDeclaration:
34798-
case SyntaxKind.GetAccessor:
34799-
case SyntaxKind.SetAccessor:
34800-
case SyntaxKind.SpreadAssignment:
34801-
case SyntaxKind.ComputedPropertyName:
34802-
case SyntaxKind.TemplateSpan:
34803-
case SyntaxKind.JsxExpression:
34804-
case SyntaxKind.JsxAttribute:
34805-
case SyntaxKind.JsxAttributes:
34806-
case SyntaxKind.JsxSpreadAttribute:
34807-
case SyntaxKind.JsxOpeningElement:
34808-
case SyntaxKind.ExpressionWithTypeArguments:
34809-
case SyntaxKind.HeritageClause:
34810-
return false;
34797+
case SyntaxKind.TypeQuery:
34798+
case SyntaxKind.JsxClosingElement: // already reported in JsxOpeningElement
34799+
return "quit";
3481134800
case SyntaxKind.ArrowFunction:
34812-
case SyntaxKind.ExpressionStatement:
34813-
return isBlock(node.parent) && isClassStaticBlockDeclaration(node.parent.parent) ? true : "quit";
34801+
return ignoreArrowFunctions ? false : "quit";
34802+
case SyntaxKind.Block:
34803+
return isFunctionLikeDeclaration(node.parent) && node.parent.kind !== SyntaxKind.ArrowFunction ? "quit" : false;
3481434804
default:
34815-
return isExpressionNode(node) ? false : "quit";
34805+
return false;
3481634806
}
3481734807
});
3481834808
}

src/compiler/diagnosticMessages.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -3767,7 +3767,7 @@
37673767
"category": "Error",
37683768
"code": 2814
37693769
},
3770-
"'arguments' cannot be referenced in property initializers.": {
3770+
"'arguments' cannot be referenced in property initializers or class static initialization blocks.": {
37713771
"category": "Error",
37723772
"code": 2815
37733773
},
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,152 @@
1-
argumentsUsedInClassFieldInitializerOrStaticInitializationBlock.ts(3,10): error TS2815: 'arguments' cannot be referenced in property initializers.
2-
argumentsUsedInClassFieldInitializerOrStaticInitializationBlock.ts(9,10): error TS2815: 'arguments' cannot be referenced in property initializers.
3-
argumentsUsedInClassFieldInitializerOrStaticInitializationBlock.ts(15,15): error TS2815: 'arguments' cannot be referenced in property initializers.
4-
argumentsUsedInClassFieldInitializerOrStaticInitializationBlock.ts(21,15): error TS2815: 'arguments' cannot be referenced in property initializers.
1+
argumentsUsedInClassFieldInitializerOrStaticInitializationBlock.ts(3,10): error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
2+
argumentsUsedInClassFieldInitializerOrStaticInitializationBlock.ts(9,10): error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
3+
argumentsUsedInClassFieldInitializerOrStaticInitializationBlock.ts(15,15): error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
4+
argumentsUsedInClassFieldInitializerOrStaticInitializationBlock.ts(21,15): error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
5+
argumentsUsedInClassFieldInitializerOrStaticInitializationBlock.ts(33,16): error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
6+
argumentsUsedInClassFieldInitializerOrStaticInitializationBlock.ts(40,7): error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
7+
argumentsUsedInClassFieldInitializerOrStaticInitializationBlock.ts(42,16): error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
8+
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.
9+
argumentsUsedInClassFieldInitializerOrStaticInitializationBlock.ts(75,7): error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
10+
argumentsUsedInClassFieldInitializerOrStaticInitializationBlock.ts(77,9): error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
11+
argumentsUsedInClassFieldInitializerOrStaticInitializationBlock.ts(96,26): error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
12+
argumentsUsedInClassFieldInitializerOrStaticInitializationBlock.ts(102,15): error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
513

614

7-
==== argumentsUsedInClassFieldInitializerOrStaticInitializationBlock.ts (4 errors) ====
15+
==== argumentsUsedInClassFieldInitializerOrStaticInitializationBlock.ts (12 errors) ====
816
function A() {
917
return class T {
1018
a = arguments
1119
~~~~~~~~~
12-
!!! error TS2815: 'arguments' cannot be referenced in property initializers.
20+
!!! error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
1321
}
1422
}
1523

1624
function A1() {
1725
return new class T {
1826
a = arguments
1927
~~~~~~~~~
20-
!!! error TS2815: 'arguments' cannot be referenced in property initializers.
28+
!!! error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
2129
}
2230
}
2331

2432
function B() {
2533
return class T {
2634
a = { b: arguments }
2735
~~~~~~~~~
28-
!!! error TS2815: 'arguments' cannot be referenced in property initializers.
36+
!!! error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
2937
}
3038
}
3139

3240
function B1() {
3341
return new class T {
3442
a = { b: arguments }
3543
~~~~~~~~~
36-
!!! error TS2815: 'arguments' cannot be referenced in property initializers.
44+
!!! error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
3745
}
3846
}
3947

4048
function C() {
4149
return class T {
4250
a = function () { arguments }
4351
}
44-
}
52+
}
53+
54+
function D() {
55+
return class T {
56+
a = () => arguments // should error
57+
~~~~~~~~~
58+
!!! error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
59+
}
60+
}
61+
62+
function D1() {
63+
return class T {
64+
a = () => {
65+
arguments; // should error
66+
~~~~~~~~~
67+
!!! error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
68+
const b = () => {
69+
return arguments; // should error
70+
~~~~~~~~~
71+
!!! error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
72+
}
73+
74+
function f() {
75+
return arguments; // ok
76+
}
77+
}
78+
}
79+
}
80+
81+
function D2() {
82+
return class {
83+
constructor() {
84+
arguments; // ok
85+
}
86+
get foo() {
87+
return arguments; // ok
88+
}
89+
set foo(foo: any) {
90+
arguments; // ok
91+
}
92+
bar() {
93+
arguments; // ok
94+
}
95+
[Symbol.iterator]() {
96+
~~~~~~
97+
!!! 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.
98+
arguments; // ok
99+
}
100+
}
101+
}
102+
103+
function D3() {
104+
return class T {
105+
static {
106+
arguments; // should error
107+
~~~~~~~~~
108+
!!! error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
109+
while(1) {
110+
arguments // should error
111+
~~~~~~~~~
112+
!!! error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
113+
}
114+
}
115+
}
116+
}
117+
118+
function D4() {
119+
return class T {
120+
static {
121+
function f() {
122+
arguments; // ok
123+
}
124+
}
125+
}
126+
}
127+
128+
129+
function D5() {
130+
return class T {
131+
a = (() => { return arguments; })() // should error
132+
~~~~~~~~~
133+
!!! error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
134+
}
135+
}
136+
137+
function D6() {
138+
return class T {
139+
a = (x = arguments) => {} // should error
140+
~~~~~~~~~
141+
!!! error TS2815: 'arguments' cannot be referenced in property initializers or class static initialization blocks.
142+
}
143+
}
144+
145+
function D7() {
146+
return class T {
147+
a(x = arguments){ // ok
148+
149+
}
150+
}
151+
}
152+

0 commit comments

Comments
 (0)