Skip to content

Commit 39298e6

Browse files
a-tarasyukmprobst
authored andcommitted
fix(46433): forbid using keywords as parameter names (microsoft#46459)
1 parent 4582e49 commit 39298e6

12 files changed

+124
-6
lines changed

src/compiler/diagnosticMessages.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1164,6 +1164,10 @@
11641164
"category": "Error",
11651165
"code": 1389
11661166
},
1167+
"'{0}' is not allowed as a parameter name.": {
1168+
"category": "Error",
1169+
"code": 1390
1170+
},
11671171
"An import alias cannot use 'import type'": {
11681172
"category": "Error",
11691173
"code": 1392

src/compiler/parser.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2611,7 +2611,10 @@ namespace ts {
26112611
case ParsingContext.ObjectLiteralMembers: return parseErrorAtCurrentToken(Diagnostics.Property_assignment_expected);
26122612
case ParsingContext.ArrayLiteralMembers: return parseErrorAtCurrentToken(Diagnostics.Expression_or_comma_expected);
26132613
case ParsingContext.JSDocParameters: return parseErrorAtCurrentToken(Diagnostics.Parameter_declaration_expected);
2614-
case ParsingContext.Parameters: return parseErrorAtCurrentToken(Diagnostics.Parameter_declaration_expected);
2614+
case ParsingContext.Parameters:
2615+
return isKeyword(token())
2616+
? parseErrorAtCurrentToken(Diagnostics._0_is_not_allowed_as_a_parameter_name, tokenToString(token()))
2617+
: parseErrorAtCurrentToken(Diagnostics.Parameter_declaration_expected);
26152618
case ParsingContext.TypeParameters: return parseErrorAtCurrentToken(Diagnostics.Type_parameter_declaration_expected);
26162619
case ParsingContext.TypeArguments: return parseErrorAtCurrentToken(Diagnostics.Type_argument_expected);
26172620
case ParsingContext.TupleElementTypes: return parseErrorAtCurrentToken(Diagnostics.Type_expected);

tests/baselines/reference/reservedWords2.errors.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,5 +118,4 @@ tests/cases/compiler/reservedWords2.ts(12,17): error TS1138: Parameter declarati
118118
!!! error TS1359: Identifier expected. 'null' is a reserved word that cannot be used here.
119119
~
120120
!!! error TS1138: Parameter declaration expected.
121-
122121

tests/baselines/reference/reservedWords2.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ var [debugger, if] = [1, 2];
1111
enum void {}
1212
function f(default: number) {}
1313
class C { m(null: string) {} }
14-
1514

1615

1716
//// [reservedWords2.js]

tests/baselines/reference/reservedWords2.symbols

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,3 @@ class C { m(null: string) {} }
4040
> : Symbol((Missing), Decl(reservedWords2.ts, 11, 12))
4141
>string : Symbol(string, Decl(reservedWords2.ts, 11, 17))
4242

43-

tests/baselines/reference/reservedWords2.types

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,4 +74,3 @@ class C { m(null: string) {} }
7474
> : any
7575
>string : any
7676

77-
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
tests/cases/compiler/reservedWords3.ts(1,13): error TS1390: 'enum' is not allowed as a parameter name.
2+
tests/cases/compiler/reservedWords3.ts(1,17): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
3+
tests/cases/compiler/reservedWords3.ts(1,17): error TS1003: Identifier expected.
4+
tests/cases/compiler/reservedWords3.ts(2,13): error TS1390: 'class' is not allowed as a parameter name.
5+
tests/cases/compiler/reservedWords3.ts(2,18): error TS1005: '{' expected.
6+
tests/cases/compiler/reservedWords3.ts(3,13): error TS1390: 'function' is not allowed as a parameter name.
7+
tests/cases/compiler/reservedWords3.ts(3,21): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
8+
tests/cases/compiler/reservedWords3.ts(3,21): error TS1003: Identifier expected.
9+
tests/cases/compiler/reservedWords3.ts(4,13): error TS1390: 'while' is not allowed as a parameter name.
10+
tests/cases/compiler/reservedWords3.ts(4,18): error TS1005: '(' expected.
11+
tests/cases/compiler/reservedWords3.ts(5,13): error TS1390: 'for' is not allowed as a parameter name.
12+
tests/cases/compiler/reservedWords3.ts(5,16): error TS1005: '(' expected.
13+
14+
15+
==== tests/cases/compiler/reservedWords3.ts (12 errors) ====
16+
function f1(enum) {}
17+
~~~~
18+
!!! error TS1390: 'enum' is not allowed as a parameter name.
19+
20+
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.
21+
~
22+
!!! error TS1003: Identifier expected.
23+
function f2(class) {}
24+
~~~~~
25+
!!! error TS1390: 'class' is not allowed as a parameter name.
26+
~
27+
!!! error TS1005: '{' expected.
28+
function f3(function) {}
29+
~~~~~~~~
30+
!!! error TS1390: 'function' is not allowed as a parameter name.
31+
32+
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.
33+
~
34+
!!! error TS1003: Identifier expected.
35+
function f4(while) {}
36+
~~~~~
37+
!!! error TS1390: 'while' is not allowed as a parameter name.
38+
~
39+
!!! error TS1005: '(' expected.
40+
function f5(for) {}
41+
~~~
42+
!!! error TS1390: 'for' is not allowed as a parameter name.
43+
~
44+
!!! error TS1005: '(' expected.
45+
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
//// [reservedWords3.ts]
2+
function f1(enum) {}
3+
function f2(class) {}
4+
function f3(function) {}
5+
function f4(while) {}
6+
function f5(for) {}
7+
8+
9+
//// [reservedWords3.js]
10+
function f1() { }
11+
var ;
12+
(function () {
13+
})( || ( = {}));
14+
{ }
15+
function f2() { }
16+
var default_1 = /** @class */ (function () {
17+
function default_1() {
18+
}
19+
return default_1;
20+
}());
21+
{ }
22+
function f3() { }
23+
function () { }
24+
{ }
25+
function f4() { }
26+
while () { }
27+
function f5() { }
28+
for (;;) { }
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
=== tests/cases/compiler/reservedWords3.ts ===
2+
function f1(enum) {}
3+
>f1 : Symbol(f1, Decl(reservedWords3.ts, 0, 0))
4+
> : Symbol((Missing), Decl(reservedWords3.ts, 0, 12))
5+
6+
function f2(class) {}
7+
>f2 : Symbol(f2, Decl(reservedWords3.ts, 0, 20))
8+
9+
function f3(function) {}
10+
>f3 : Symbol(f3, Decl(reservedWords3.ts, 1, 21))
11+
> : Symbol((Missing), Decl(reservedWords3.ts, 2, 12))
12+
13+
function f4(while) {}
14+
>f4 : Symbol(f4, Decl(reservedWords3.ts, 2, 24))
15+
16+
function f5(for) {}
17+
>f5 : Symbol(f5, Decl(reservedWords3.ts, 3, 21))
18+
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
=== tests/cases/compiler/reservedWords3.ts ===
2+
function f1(enum) {}
3+
>f1 : () => any
4+
> : (Missing)
5+
6+
function f2(class) {}
7+
>f2 : () => any
8+
9+
function f3(function) {}
10+
>f3 : () => any
11+
> : () => any
12+
13+
function f4(while) {}
14+
>f4 : () => any
15+
> : any
16+
17+
function f5(for) {}
18+
>f5 : () => any
19+
> : any
20+

tests/cases/compiler/reservedWords2.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,3 @@ var [debugger, if] = [1, 2];
1010
enum void {}
1111
function f(default: number) {}
1212
class C { m(null: string) {} }
13-
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
function f1(enum) {}
2+
function f2(class) {}
3+
function f3(function) {}
4+
function f4(while) {}
5+
function f5(for) {}

0 commit comments

Comments
 (0)