Skip to content

Commit aef37f1

Browse files
author
Yui T
committed
Address code review: have more explicit error
1 parent 696e6a3 commit aef37f1

7 files changed

+110
-97
lines changed

src/compiler/checker.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12441,7 +12441,15 @@ module ts {
1244112441
let identifier = <Identifier>name;
1244212442
if (contextNode && (contextNode.parserContextFlags & ParserContextFlags.StrictMode) && isEvalOrArgumentsIdentifier(identifier)) {
1244312443
let nameText = declarationNameToString(identifier);
12444-
return grammarErrorOnNode(identifier, Diagnostics.Invalid_use_of_0_in_strict_mode, nameText);
12444+
12445+
// We are checking if this parameter's name is of method or constructor so that we can give more explicit errors because
12446+
// invalid usage error particularly of "arguments" is very common mistake
12447+
if (contextNode && (contextNode.parent.kind === SyntaxKind.MethodDeclaration || contextNode.parent.kind === SyntaxKind.Constructor)) {
12448+
return grammarErrorOnNode(identifier, Diagnostics.Invalid_use_of_0_because_class_definition_is_considered_a_strict_mode_code, nameText);
12449+
}
12450+
else {
12451+
return grammarErrorOnNode(identifier, Diagnostics.Invalid_use_of_0_in_strict_mode, nameText);
12452+
}
1244512453
}
1244612454
}
1244712455
}

src/compiler/diagnosticInformationMap.generated.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ module ts {
167167
Decorators_cannot_be_applied_to_multiple_get_Slashset_accessors_of_the_same_name: { code: 1207, category: DiagnosticCategory.Error, key: "Decorators cannot be applied to multiple get/set accessors of the same name." },
168168
Cannot_compile_non_external_modules_when_the_separateCompilation_flag_is_provided: { code: 1208, category: DiagnosticCategory.Error, key: "Cannot compile non-external modules when the '--separateCompilation' flag is provided." },
169169
Ambient_const_enums_are_not_allowed_when_the_separateCompilation_flag_is_provided: { code: 1209, category: DiagnosticCategory.Error, key: "Ambient const enums are not allowed when the '--separateCompilation' flag is provided." },
170+
Invalid_use_of_0_because_class_definition_is_considered_a_strict_mode_code: { code: 1210, category: DiagnosticCategory.Error, key: "Invalid use of '{0}' because class definition is considered a strict mode code " },
170171
Duplicate_identifier_0: { code: 2300, category: DiagnosticCategory.Error, key: "Duplicate identifier '{0}'." },
171172
Initializer_of_instance_member_variable_0_cannot_reference_identifier_1_declared_in_the_constructor: { code: 2301, category: DiagnosticCategory.Error, key: "Initializer of instance member variable '{0}' cannot reference identifier '{1}' declared in the constructor." },
172173
Static_members_cannot_reference_class_type_parameters: { code: 2302, category: DiagnosticCategory.Error, key: "Static members cannot reference class type parameters." },

src/compiler/diagnosticMessages.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -659,6 +659,10 @@
659659
"category": "Error",
660660
"code": 1209
661661
},
662+
"Invalid use of '{0}' because class definition is considered a strict mode code ": {
663+
"category": "Error",
664+
"code": 1210
665+
},
662666
"Duplicate identifier '{0}'.": {
663667
"category": "Error",
664668
"code": 2300

tests/baselines/reference/collisionArgumentsClassConstructor.errors.txt

Lines changed: 46 additions & 46 deletions
Large diffs are not rendered by default.

tests/baselines/reference/collisionArgumentsClassMethod.errors.txt

Lines changed: 42 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,34 @@
11
tests/cases/compiler/collisionArgumentsClassMethod.ts(2,27): error TS2396: Duplicate identifier 'arguments'. Compiler uses 'arguments' to initialize rest parameters.
2-
tests/cases/compiler/collisionArgumentsClassMethod.ts(2,30): error TS1100: Invalid use of 'arguments' in strict mode.
2+
tests/cases/compiler/collisionArgumentsClassMethod.ts(2,30): error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
33
tests/cases/compiler/collisionArgumentsClassMethod.ts(3,13): error TS1100: Invalid use of 'arguments' in strict mode.
4-
tests/cases/compiler/collisionArgumentsClassMethod.ts(5,17): error TS1100: Invalid use of 'arguments' in strict mode.
4+
tests/cases/compiler/collisionArgumentsClassMethod.ts(5,17): error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
55
tests/cases/compiler/collisionArgumentsClassMethod.ts(5,17): error TS2396: Duplicate identifier 'arguments'. Compiler uses 'arguments' to initialize rest parameters.
66
tests/cases/compiler/collisionArgumentsClassMethod.ts(6,13): error TS1100: Invalid use of 'arguments' in strict mode.
7-
tests/cases/compiler/collisionArgumentsClassMethod.ts(8,23): error TS1100: Invalid use of 'arguments' in strict mode.
7+
tests/cases/compiler/collisionArgumentsClassMethod.ts(8,23): error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
88
tests/cases/compiler/collisionArgumentsClassMethod.ts(9,13): error TS1100: Invalid use of 'arguments' in strict mode.
9-
tests/cases/compiler/collisionArgumentsClassMethod.ts(11,29): error TS1100: Invalid use of 'arguments' in strict mode.
10-
tests/cases/compiler/collisionArgumentsClassMethod.ts(12,29): error TS1100: Invalid use of 'arguments' in strict mode.
9+
tests/cases/compiler/collisionArgumentsClassMethod.ts(11,29): error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
10+
tests/cases/compiler/collisionArgumentsClassMethod.ts(12,29): error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
1111
tests/cases/compiler/collisionArgumentsClassMethod.ts(13,23): error TS2396: Duplicate identifier 'arguments'. Compiler uses 'arguments' to initialize rest parameters.
12-
tests/cases/compiler/collisionArgumentsClassMethod.ts(13,26): error TS1100: Invalid use of 'arguments' in strict mode.
12+
tests/cases/compiler/collisionArgumentsClassMethod.ts(13,26): error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
1313
tests/cases/compiler/collisionArgumentsClassMethod.ts(14,13): error TS1100: Invalid use of 'arguments' in strict mode.
14-
tests/cases/compiler/collisionArgumentsClassMethod.ts(16,16): error TS1100: Invalid use of 'arguments' in strict mode.
15-
tests/cases/compiler/collisionArgumentsClassMethod.ts(17,16): error TS1100: Invalid use of 'arguments' in strict mode.
16-
tests/cases/compiler/collisionArgumentsClassMethod.ts(18,16): error TS1100: Invalid use of 'arguments' in strict mode.
14+
tests/cases/compiler/collisionArgumentsClassMethod.ts(16,16): error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
15+
tests/cases/compiler/collisionArgumentsClassMethod.ts(17,16): error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
16+
tests/cases/compiler/collisionArgumentsClassMethod.ts(18,16): error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
1717
tests/cases/compiler/collisionArgumentsClassMethod.ts(18,16): error TS2396: Duplicate identifier 'arguments'. Compiler uses 'arguments' to initialize rest parameters.
1818
tests/cases/compiler/collisionArgumentsClassMethod.ts(19,13): error TS1100: Invalid use of 'arguments' in strict mode.
19-
tests/cases/compiler/collisionArgumentsClassMethod.ts(21,22): error TS1100: Invalid use of 'arguments' in strict mode.
20-
tests/cases/compiler/collisionArgumentsClassMethod.ts(22,22): error TS1100: Invalid use of 'arguments' in strict mode.
21-
tests/cases/compiler/collisionArgumentsClassMethod.ts(23,22): error TS1100: Invalid use of 'arguments' in strict mode.
19+
tests/cases/compiler/collisionArgumentsClassMethod.ts(21,22): error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
20+
tests/cases/compiler/collisionArgumentsClassMethod.ts(22,22): error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
21+
tests/cases/compiler/collisionArgumentsClassMethod.ts(23,22): error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
2222
tests/cases/compiler/collisionArgumentsClassMethod.ts(24,13): error TS1100: Invalid use of 'arguments' in strict mode.
23-
tests/cases/compiler/collisionArgumentsClassMethod.ts(29,30): error TS1100: Invalid use of 'arguments' in strict mode.
24-
tests/cases/compiler/collisionArgumentsClassMethod.ts(30,17): error TS1100: Invalid use of 'arguments' in strict mode.
25-
tests/cases/compiler/collisionArgumentsClassMethod.ts(31,23): error TS1100: Invalid use of 'arguments' in strict mode.
26-
tests/cases/compiler/collisionArgumentsClassMethod.ts(33,29): error TS1100: Invalid use of 'arguments' in strict mode.
27-
tests/cases/compiler/collisionArgumentsClassMethod.ts(34,29): error TS1100: Invalid use of 'arguments' in strict mode.
28-
tests/cases/compiler/collisionArgumentsClassMethod.ts(35,16): error TS1100: Invalid use of 'arguments' in strict mode.
29-
tests/cases/compiler/collisionArgumentsClassMethod.ts(36,16): error TS1100: Invalid use of 'arguments' in strict mode.
30-
tests/cases/compiler/collisionArgumentsClassMethod.ts(37,22): error TS1100: Invalid use of 'arguments' in strict mode.
31-
tests/cases/compiler/collisionArgumentsClassMethod.ts(38,22): error TS1100: Invalid use of 'arguments' in strict mode.
23+
tests/cases/compiler/collisionArgumentsClassMethod.ts(29,30): error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
24+
tests/cases/compiler/collisionArgumentsClassMethod.ts(30,17): error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
25+
tests/cases/compiler/collisionArgumentsClassMethod.ts(31,23): error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
26+
tests/cases/compiler/collisionArgumentsClassMethod.ts(33,29): error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
27+
tests/cases/compiler/collisionArgumentsClassMethod.ts(34,29): error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
28+
tests/cases/compiler/collisionArgumentsClassMethod.ts(35,16): error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
29+
tests/cases/compiler/collisionArgumentsClassMethod.ts(36,16): error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
30+
tests/cases/compiler/collisionArgumentsClassMethod.ts(37,22): error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
31+
tests/cases/compiler/collisionArgumentsClassMethod.ts(38,22): error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
3232
tests/cases/compiler/collisionArgumentsClassMethod.ts(43,13): error TS1100: Invalid use of 'arguments' in strict mode.
3333
tests/cases/compiler/collisionArgumentsClassMethod.ts(46,13): error TS1100: Invalid use of 'arguments' in strict mode.
3434

@@ -39,14 +39,14 @@ tests/cases/compiler/collisionArgumentsClassMethod.ts(46,13): error TS1100: Inva
3939
~~~~~~~~~~~~
4040
!!! error TS2396: Duplicate identifier 'arguments'. Compiler uses 'arguments' to initialize rest parameters.
4141
~~~~~~~~~
42-
!!! error TS1100: Invalid use of 'arguments' in strict mode.
42+
!!! error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
4343
var arguments: any[]; // no error
4444
~~~~~~~~~
4545
!!! error TS1100: Invalid use of 'arguments' in strict mode.
4646
}
4747
public foo1(arguments: number, ...rest) { //arguments is error
4848
~~~~~~~~~
49-
!!! error TS1100: Invalid use of 'arguments' in strict mode.
49+
!!! error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
5050
~~~~~~~~~~~~~~~~~
5151
!!! error TS2396: Duplicate identifier 'arguments'. Compiler uses 'arguments' to initialize rest parameters.
5252
var arguments = 10; // no error
@@ -55,35 +55,35 @@ tests/cases/compiler/collisionArgumentsClassMethod.ts(46,13): error TS1100: Inva
5555
}
5656
public fooNoError(arguments: number) { // no error
5757
~~~~~~~~~
58-
!!! error TS1100: Invalid use of 'arguments' in strict mode.
58+
!!! error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
5959
var arguments = 10; // no error
6060
~~~~~~~~~
6161
!!! error TS1100: Invalid use of 'arguments' in strict mode.
6262
}
6363
public f4(i: number, ...arguments); // no codegen no error
6464
~~~~~~~~~
65-
!!! error TS1100: Invalid use of 'arguments' in strict mode.
65+
!!! error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
6666
public f4(i: string, ...arguments); // no codegen no error
6767
~~~~~~~~~
68-
!!! error TS1100: Invalid use of 'arguments' in strict mode.
68+
!!! error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
6969
public f4(i: any, ...arguments) { // error
7070
~~~~~~~~~~~~
7171
!!! error TS2396: Duplicate identifier 'arguments'. Compiler uses 'arguments' to initialize rest parameters.
7272
~~~~~~~~~
73-
!!! error TS1100: Invalid use of 'arguments' in strict mode.
73+
!!! error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
7474
var arguments: any[]; // no error
7575
~~~~~~~~~
7676
!!! error TS1100: Invalid use of 'arguments' in strict mode.
7777
}
7878
public f41(arguments: number, ...rest); // no codegen no error
7979
~~~~~~~~~
80-
!!! error TS1100: Invalid use of 'arguments' in strict mode.
80+
!!! error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
8181
public f41(arguments: string, ...rest); // no codegen no error
8282
~~~~~~~~~
83-
!!! error TS1100: Invalid use of 'arguments' in strict mode.
83+
!!! error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
8484
public f41(arguments: any, ...rest) { // error
8585
~~~~~~~~~
86-
!!! error TS1100: Invalid use of 'arguments' in strict mode.
86+
!!! error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
8787
~~~~~~~~~~~~~~
8888
!!! error TS2396: Duplicate identifier 'arguments'. Compiler uses 'arguments' to initialize rest parameters.
8989
var arguments: any; // no error
@@ -92,13 +92,13 @@ tests/cases/compiler/collisionArgumentsClassMethod.ts(46,13): error TS1100: Inva
9292
}
9393
public f4NoError(arguments: number); // no error
9494
~~~~~~~~~
95-
!!! error TS1100: Invalid use of 'arguments' in strict mode.
95+
!!! error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
9696
public f4NoError(arguments: string); // no error
9797
~~~~~~~~~
98-
!!! error TS1100: Invalid use of 'arguments' in strict mode.
98+
!!! error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
9999
public f4NoError(arguments: any) { // no error
100100
~~~~~~~~~
101-
!!! error TS1100: Invalid use of 'arguments' in strict mode.
101+
!!! error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
102102
var arguments: any; // no error
103103
~~~~~~~~~
104104
!!! error TS1100: Invalid use of 'arguments' in strict mode.
@@ -108,32 +108,32 @@ tests/cases/compiler/collisionArgumentsClassMethod.ts(46,13): error TS1100: Inva
108108
declare class c2 {
109109
public foo(i: number, ...arguments); // No error - no code gen
110110
~~~~~~~~~
111-
!!! error TS1100: Invalid use of 'arguments' in strict mode.
111+
!!! error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
112112
public foo1(arguments: number, ...rest); // No error - no code gen
113113
~~~~~~~~~
114-
!!! error TS1100: Invalid use of 'arguments' in strict mode.
114+
!!! error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
115115
public fooNoError(arguments: number); // No error - no code gen
116116
~~~~~~~~~
117-
!!! error TS1100: Invalid use of 'arguments' in strict mode.
117+
!!! error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
118118

119119
public f4(i: number, ...arguments); // no codegen no error
120120
~~~~~~~~~
121-
!!! error TS1100: Invalid use of 'arguments' in strict mode.
121+
!!! error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
122122
public f4(i: string, ...arguments); // no codegen no error
123123
~~~~~~~~~
124-
!!! error TS1100: Invalid use of 'arguments' in strict mode.
124+
!!! error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
125125
public f41(arguments: number, ...rest); // no codegen no error
126126
~~~~~~~~~
127-
!!! error TS1100: Invalid use of 'arguments' in strict mode.
127+
!!! error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
128128
public f41(arguments: string, ...rest); // no codegen no error
129129
~~~~~~~~~
130-
!!! error TS1100: Invalid use of 'arguments' in strict mode.
130+
!!! error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
131131
public f4NoError(arguments: number); // no error
132132
~~~~~~~~~
133-
!!! error TS1100: Invalid use of 'arguments' in strict mode.
133+
!!! error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
134134
public f4NoError(arguments: string); // no error
135135
~~~~~~~~~
136-
!!! error TS1100: Invalid use of 'arguments' in strict mode.
136+
!!! error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
137137
}
138138

139139
class c3 {

tests/baselines/reference/parseClassDeclarationInStrictModeByDefaultInES6.errors.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
tests/cases/conformance/es6/classDeclaration/parseClassDeclarationInStrictModeByDefaultInES6.ts(4,16): error TS1100: Invalid use of 'arguments' in strict mode.
2-
tests/cases/conformance/es6/classDeclaration/parseClassDeclarationInStrictModeByDefaultInES6.ts(5,17): error TS1100: Invalid use of 'eval' in strict mode.
1+
tests/cases/conformance/es6/classDeclaration/parseClassDeclarationInStrictModeByDefaultInES6.ts(4,16): error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
2+
tests/cases/conformance/es6/classDeclaration/parseClassDeclarationInStrictModeByDefaultInES6.ts(5,17): error TS1210: Invalid use of 'eval' because class definition is considered a strict mode code
33
tests/cases/conformance/es6/classDeclaration/parseClassDeclarationInStrictModeByDefaultInES6.ts(6,9): error TS1100: Invalid use of 'arguments' in strict mode.
44
tests/cases/conformance/es6/classDeclaration/parseClassDeclarationInStrictModeByDefaultInES6.ts(6,9): error TS2322: Type 'string' is not assignable to type 'IArguments'.
55
Property 'callee' is missing in type 'String'.
@@ -11,10 +11,10 @@ tests/cases/conformance/es6/classDeclaration/parseClassDeclarationInStrictModeBy
1111
public implements() { }
1212
public foo(arguments: any) { }
1313
~~~~~~~~~
14-
!!! error TS1100: Invalid use of 'arguments' in strict mode.
14+
!!! error TS1210: Invalid use of 'arguments' because class definition is considered a strict mode code
1515
private bar(eval:any) {
1616
~~~~
17-
!!! error TS1100: Invalid use of 'eval' in strict mode.
17+
!!! error TS1210: Invalid use of 'eval' because class definition is considered a strict mode code
1818
arguments = "hello";
1919
~~~~~~~~~
2020
!!! error TS1100: Invalid use of 'arguments' in strict mode.

0 commit comments

Comments
 (0)