Skip to content

Commit 49eb0d7

Browse files
ajafffDanielRosenwasser
authored andcommitted
Disallow 'declare' modifier on private named properties (#36381)
Fixes: #36345
1 parent 677e45c commit 49eb0d7

File tree

6 files changed

+30
-15
lines changed

6 files changed

+30
-15
lines changed

src/compiler/checker.ts

+7-4
Original file line numberDiff line numberDiff line change
@@ -35350,6 +35350,9 @@ namespace ts {
3535035350
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, text, "abstract");
3535135351
}
3535235352
}
35353+
else if (isPrivateIdentifierPropertyDeclaration(node)) {
35354+
return grammarErrorOnNode(modifier, Diagnostics.An_accessibility_modifier_cannot_be_used_with_a_private_identifier);
35355+
}
3535335356
flags |= modifierToFlag(modifier.kind);
3535435357
break;
3535535358

@@ -35436,6 +35439,9 @@ namespace ts {
3543635439
else if ((node.parent.flags & NodeFlags.Ambient) && node.parent.kind === SyntaxKind.ModuleBlock) {
3543735440
return grammarErrorOnNode(modifier, Diagnostics.A_declare_modifier_cannot_be_used_in_an_already_ambient_context);
3543835441
}
35442+
else if (isPrivateIdentifierPropertyDeclaration(node)) {
35443+
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_a_private_identifier, "declare");
35444+
}
3543935445
flags |= ModifierFlags.Ambient;
3544035446
lastDeclare = modifier;
3544135447
break;
@@ -35462,7 +35468,7 @@ namespace ts {
3546235468
}
3546335469
}
3546435470
if (isNamedDeclaration(node) && node.name.kind === SyntaxKind.PrivateIdentifier) {
35465-
return grammarErrorOnNode(node, Diagnostics._0_modifier_cannot_be_used_with_a_private_identifier, "abstract");
35471+
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_a_private_identifier, "abstract");
3546635472
}
3546735473

3546835474
flags |= ModifierFlags.Abstract;
@@ -35508,9 +35514,6 @@ namespace ts {
3550835514
else if (node.kind === SyntaxKind.Parameter && (flags & ModifierFlags.ParameterPropertyModifier) && (<ParameterDeclaration>node).dotDotDotToken) {
3550935515
return grammarErrorOnNode(node, Diagnostics.A_parameter_property_cannot_be_declared_using_a_rest_parameter);
3551035516
}
35511-
else if (isNamedDeclaration(node) && (flags & ModifierFlags.AccessibilityModifier) && node.name.kind === SyntaxKind.PrivateIdentifier) {
35512-
return grammarErrorOnNode(node, Diagnostics.An_accessibility_modifier_cannot_be_used_with_a_private_identifier);
35513-
}
3551435517
if (flags & ModifierFlags.Async) {
3551535518
return checkGrammarAsyncModifier(node, lastAsync!);
3551635519
}
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,30 @@
1-
tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts(2,12): error TS18010: An accessibility modifier cannot be used with a private identifier.
2-
tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts(3,13): error TS18010: An accessibility modifier cannot be used with a private identifier.
3-
tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts(4,15): error TS18010: An accessibility modifier cannot be used with a private identifier.
4-
tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts(9,14): error TS18019: 'abstract' modifier cannot be used with a private identifier
1+
tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts(2,5): error TS18010: An accessibility modifier cannot be used with a private identifier.
2+
tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts(3,5): error TS18010: An accessibility modifier cannot be used with a private identifier.
3+
tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts(4,5): error TS18010: An accessibility modifier cannot be used with a private identifier.
4+
tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts(6,5): error TS18019: 'declare' modifier cannot be used with a private identifier
5+
tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts(10,5): error TS18019: 'abstract' modifier cannot be used with a private identifier
56

67

7-
==== tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts (4 errors) ====
8+
==== tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts (5 errors) ====
89
class A {
910
public #foo = 3; // Error
10-
~~~~
11+
~~~~~~
1112
!!! error TS18010: An accessibility modifier cannot be used with a private identifier.
1213
private #bar = 3; // Error
13-
~~~~
14+
~~~~~~~
1415
!!! error TS18010: An accessibility modifier cannot be used with a private identifier.
1516
protected #baz = 3; // Error
16-
~~~~
17+
~~~~~~~~~
1718
!!! error TS18010: An accessibility modifier cannot be used with a private identifier.
1819
readonly #qux = 3; // OK
20+
declare #what: number; // Error
21+
~~~~~~~
22+
!!! error TS18019: 'declare' modifier cannot be used with a private identifier
1923
}
2024

2125
abstract class B {
2226
abstract #quux = 3; // Error
23-
~~~~~
27+
~~~~~~~~
2428
!!! error TS18019: 'abstract' modifier cannot be used with a private identifier
2529
}
2630

tests/baselines/reference/privateNamesIncompatibleModifiers.js

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ class A {
44
private #bar = 3; // Error
55
protected #baz = 3; // Error
66
readonly #qux = 3; // OK
7+
declare #what: number; // Error
78
}
89

910
abstract class B {

tests/baselines/reference/privateNamesIncompatibleModifiers.symbols

+5-2
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,15 @@ class A {
1313

1414
readonly #qux = 3; // OK
1515
>#qux : Symbol(A.#qux, Decl(privateNamesIncompatibleModifiers.ts, 3, 23))
16+
17+
declare #what: number; // Error
18+
>#what : Symbol(A.#what, Decl(privateNamesIncompatibleModifiers.ts, 4, 22))
1619
}
1720

1821
abstract class B {
19-
>B : Symbol(B, Decl(privateNamesIncompatibleModifiers.ts, 5, 1))
22+
>B : Symbol(B, Decl(privateNamesIncompatibleModifiers.ts, 6, 1))
2023

2124
abstract #quux = 3; // Error
22-
>#quux : Symbol(B.#quux, Decl(privateNamesIncompatibleModifiers.ts, 7, 18))
25+
>#quux : Symbol(B.#quux, Decl(privateNamesIncompatibleModifiers.ts, 8, 18))
2326
}
2427

tests/baselines/reference/privateNamesIncompatibleModifiers.types

+3
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ class A {
1717
readonly #qux = 3; // OK
1818
>#qux : 3
1919
>3 : 3
20+
21+
declare #what: number; // Error
22+
>#what : number
2023
}
2124

2225
abstract class B {

tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ class A {
66
private #bar = 3; // Error
77
protected #baz = 3; // Error
88
readonly #qux = 3; // OK
9+
declare #what: number; // Error
910
}
1011

1112
abstract class B {

0 commit comments

Comments
 (0)