Skip to content

Commit dc0a347

Browse files
Added missing static check for the containing property. Fixed other code review issues.
1 parent a29bcb0 commit dc0a347

10 files changed

+578
-137
lines changed

src/compiler/checker.ts

+4-5
Original file line numberDiff line numberDiff line change
@@ -26982,12 +26982,11 @@ namespace ts {
2698226982
grammarErrorOnNode(right, Diagnostics.Cannot_assign_to_private_method_0_Private_methods_are_not_writable, idText(right));
2698326983
}
2698426984

26985-
if (lexicallyScopedSymbol && (compilerOptions.target === ScriptTarget.ESNext && !useDefineForClassFields)) {
26986-
const lexicalValueDecl = lexicallyScopedSymbol.valueDeclaration;
26987-
const lexicalClass = lexicalValueDecl && getContainingClass(lexicalValueDecl);
26985+
if (lexicallyScopedSymbol?.valueDeclaration && (compilerOptions.target === ScriptTarget.ESNext && !useDefineForClassFields)) {
26986+
const lexicalClass = getContainingClass(lexicallyScopedSymbol.valueDeclaration);
2698826987
const parentStaticFieldInitializer = findAncestor(node, (n) => {
2698926988
if (n === lexicalClass) return "quit";
26990-
if (isPropertyDeclaration(n.parent) && n.parent.initializer === n && n.parent.parent === lexicalClass) {
26989+
if (isPropertyDeclaration(n.parent) && hasStaticModifier(n.parent) && n.parent.initializer === n && n.parent.parent === lexicalClass) {
2699126990
return true;
2699226991
}
2699326992
return false;
@@ -26996,7 +26995,7 @@ namespace ts {
2699626995
const parentStaticFieldInitializerSymbol = getSymbolOfNode(parentStaticFieldInitializer.parent);
2699726996
Debug.assert(parentStaticFieldInitializerSymbol, "Initializer without declaration symbol");
2699826997
const diagnostic = error(node,
26999-
Diagnostics.Property_0_is_used_in_a_static_property_s_initializer_in_the_same_class_This_is_only_supported_when_target_set_to_is_esnext_and_if_useDefineForClassFields_is_set_to_true,
26998+
Diagnostics.Property_0_may_not_be_used_in_a_static_property_s_initializer_in_the_same_class_when_target_is_esnext_and_useDefineForClassFields_is_false,
2700026999
symbolName(lexicallyScopedSymbol));
2700127000
addRelatedInfo(diagnostic,
2700227001
createDiagnosticForNode(parentStaticFieldInitializer.parent,

src/compiler/diagnosticMessages.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -3312,7 +3312,7 @@
33123312
"category": "Error",
33133313
"code": 2809
33143314
},
3315-
"Property '{0}' is used in a static property's initializer in the same class. This is only supported when 'target' set to is 'esnext' and if 'useDefineForClassFields' is set to 'true'": {
3315+
"Property '{0}' may not be used in a static property's initializer in the same class when 'target' is 'esnext' and 'useDefineForClassFields' is 'false'.": {
33163316
"category": "Error",
33173317
"code": 2810
33183318
},
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,55 @@
11
//// [privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts]
2-
class Test {
2+
class TestWithErrors {
33
#prop = 0
4-
static dd = new Test().#prop; // Err
4+
static dd = new TestWithErrors().#prop; // Err
55
static ["X_ z_ zz"] = class Inner {
66
#foo = 10
77
m() {
8-
new Test().#prop // Err
8+
new TestWithErrors().#prop // Err
99
}
1010
static C = class InnerInner {
1111
m() {
12-
new Test().#prop // Err
12+
new TestWithErrors().#prop // Err
1313
new Inner().#foo; // Err
1414
}
1515
}
1616

1717
static M(){
1818
return class {
1919
m() {
20-
new Test().#prop // Err
20+
new TestWithErrors().#prop // Err
2121
new Inner().#foo; // OK
2222
}
2323
}
2424
}
2525
}
26-
}
26+
}
27+
28+
class TestNoErrors {
29+
#prop = 0
30+
dd = new TestNoErrors().#prop; // OK
31+
["X_ z_ zz"] = class Inner {
32+
#foo = 10
33+
m() {
34+
new TestNoErrors().#prop // Ok
35+
}
36+
C = class InnerInner {
37+
m() {
38+
new TestNoErrors().#prop // Ok
39+
new Inner().#foo; // Ok
40+
}
41+
}
42+
43+
static M(){
44+
return class {
45+
m() {
46+
new TestNoErrors().#prop // OK
47+
new Inner().#foo; // OK
48+
}
49+
}
50+
}
51+
}
52+
}
2753

2854
//// [privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.js]
2955
"use strict";
@@ -32,25 +58,25 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
3258
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
3359
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
3460
};
35-
var _Test_prop, _Inner_foo, _a;
36-
class Test {
61+
var _TestWithErrors_prop, _Inner_foo, _a, _TestNoErrors_prop;
62+
class TestWithErrors {
3763
constructor() {
38-
_Test_prop.set(this, 0);
64+
_TestWithErrors_prop.set(this, 0);
3965
}
4066
}
41-
_Test_prop = new WeakMap();
42-
Test.dd = __classPrivateFieldGet(new Test(), _Test_prop, "f"); // Err
43-
Test["X_ z_ zz"] = (_a = class Inner {
67+
_TestWithErrors_prop = new WeakMap();
68+
TestWithErrors.dd = __classPrivateFieldGet(new TestWithErrors(), _TestWithErrors_prop, "f"); // Err
69+
TestWithErrors["X_ z_ zz"] = (_a = class Inner {
4470
constructor() {
4571
_Inner_foo.set(this, 10);
4672
}
4773
m() {
48-
__classPrivateFieldGet(new Test(), _Test_prop, "f"); // Err
74+
__classPrivateFieldGet(new TestWithErrors(), _TestWithErrors_prop, "f"); // Err
4975
}
5076
static M() {
5177
return class {
5278
m() {
53-
__classPrivateFieldGet(new Test(), _Test_prop, "f"); // Err
79+
__classPrivateFieldGet(new TestWithErrors(), _TestWithErrors_prop, "f"); // Err
5480
__classPrivateFieldGet(new Inner(), _Inner_foo, "f"); // OK
5581
}
5682
};
@@ -59,8 +85,40 @@ Test["X_ z_ zz"] = (_a = class Inner {
5985
_Inner_foo = new WeakMap(),
6086
_a.C = class InnerInner {
6187
m() {
62-
__classPrivateFieldGet(new Test(), _Test_prop, "f"); // Err
88+
__classPrivateFieldGet(new TestWithErrors(), _TestWithErrors_prop, "f"); // Err
6389
__classPrivateFieldGet(new _a(), _Inner_foo, "f"); // Err
6490
}
6591
},
6692
_a);
93+
class TestNoErrors {
94+
constructor() {
95+
var _Inner_foo_1, _b;
96+
_TestNoErrors_prop.set(this, 0);
97+
this.dd = __classPrivateFieldGet(new TestNoErrors(), _TestNoErrors_prop, "f"); // OK
98+
this["X_ z_ zz"] = (_b = class Inner {
99+
constructor() {
100+
_Inner_foo_1.set(this, 10);
101+
this.C = class InnerInner {
102+
m() {
103+
__classPrivateFieldGet(new TestNoErrors(), _TestNoErrors_prop, "f"); // Ok
104+
__classPrivateFieldGet(new Inner(), _Inner_foo_1, "f"); // Ok
105+
}
106+
};
107+
}
108+
m() {
109+
__classPrivateFieldGet(new TestNoErrors(), _TestNoErrors_prop, "f"); // Ok
110+
}
111+
static M() {
112+
return class {
113+
m() {
114+
__classPrivateFieldGet(new TestNoErrors(), _TestNoErrors_prop, "f"); // OK
115+
__classPrivateFieldGet(new Inner(), _Inner_foo_1, "f"); // OK
116+
}
117+
};
118+
}
119+
},
120+
_Inner_foo_1 = new WeakMap(),
121+
_b);
122+
}
123+
}
124+
_TestNoErrors_prop = new WeakMap();
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
=== tests/cases/conformance/classes/members/privateNames/privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts ===
2-
class Test {
3-
>Test : Symbol(Test, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 0, 0))
2+
class TestWithErrors {
3+
>TestWithErrors : Symbol(TestWithErrors, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 0, 0))
44

55
#prop = 0
6-
>#prop : Symbol(Test.#prop, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 0, 12))
6+
>#prop : Symbol(TestWithErrors.#prop, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 0, 22))
77

8-
static dd = new Test().#prop; // Err
9-
>dd : Symbol(Test.dd, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 1, 13))
10-
>new Test().#prop : Symbol(Test.#prop, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 0, 12))
11-
>Test : Symbol(Test, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 0, 0))
8+
static dd = new TestWithErrors().#prop; // Err
9+
>dd : Symbol(TestWithErrors.dd, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 1, 13))
10+
>new TestWithErrors().#prop : Symbol(TestWithErrors.#prop, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 0, 22))
11+
>TestWithErrors : Symbol(TestWithErrors, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 0, 0))
1212

1313
static ["X_ z_ zz"] = class Inner {
14-
>["X_ z_ zz"] : Symbol(Test["X_ z_ zz"], Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 2, 33))
15-
>"X_ z_ zz" : Symbol(Test["X_ z_ zz"], Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 2, 33))
14+
>["X_ z_ zz"] : Symbol(TestWithErrors["X_ z_ zz"], Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 2, 43))
15+
>"X_ z_ zz" : Symbol(TestWithErrors["X_ z_ zz"], Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 2, 43))
1616
>Inner : Symbol(Inner, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 3, 25))
1717

1818
#foo = 10
@@ -21,9 +21,9 @@ class Test {
2121
m() {
2222
>m : Symbol(Inner.m, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 4, 18))
2323

24-
new Test().#prop // Err
25-
>new Test().#prop : Symbol(Test.#prop, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 0, 12))
26-
>Test : Symbol(Test, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 0, 0))
24+
new TestWithErrors().#prop // Err
25+
>new TestWithErrors().#prop : Symbol(TestWithErrors.#prop, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 0, 22))
26+
>TestWithErrors : Symbol(TestWithErrors, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 0, 0))
2727
}
2828
static C = class InnerInner {
2929
>C : Symbol(Inner.C, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 7, 9))
@@ -32,9 +32,9 @@ class Test {
3232
m() {
3333
>m : Symbol(InnerInner.m, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 8, 37))
3434

35-
new Test().#prop // Err
36-
>new Test().#prop : Symbol(Test.#prop, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 0, 12))
37-
>Test : Symbol(Test, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 0, 0))
35+
new TestWithErrors().#prop // Err
36+
>new TestWithErrors().#prop : Symbol(TestWithErrors.#prop, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 0, 22))
37+
>TestWithErrors : Symbol(TestWithErrors, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 0, 0))
3838

3939
new Inner().#foo; // Err
4040
>new Inner().#foo : Symbol(Inner.#foo, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 3, 39))
@@ -49,9 +49,9 @@ class Test {
4949
m() {
5050
>m : Symbol((Anonymous class).m, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 16, 26))
5151

52-
new Test().#prop // Err
53-
>new Test().#prop : Symbol(Test.#prop, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 0, 12))
54-
>Test : Symbol(Test, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 0, 0))
52+
new TestWithErrors().#prop // Err
53+
>new TestWithErrors().#prop : Symbol(TestWithErrors.#prop, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 0, 22))
54+
>TestWithErrors : Symbol(TestWithErrors, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 0, 0))
5555

5656
new Inner().#foo; // OK
5757
>new Inner().#foo : Symbol(Inner.#foo, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 3, 39))
@@ -61,3 +61,66 @@ class Test {
6161
}
6262
}
6363
}
64+
65+
class TestNoErrors {
66+
>TestNoErrors : Symbol(TestNoErrors, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 24, 1))
67+
68+
#prop = 0
69+
>#prop : Symbol(TestNoErrors.#prop, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 26, 20))
70+
71+
dd = new TestNoErrors().#prop; // OK
72+
>dd : Symbol(TestNoErrors.dd, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 27, 13))
73+
>new TestNoErrors().#prop : Symbol(TestNoErrors.#prop, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 26, 20))
74+
>TestNoErrors : Symbol(TestNoErrors, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 24, 1))
75+
76+
["X_ z_ zz"] = class Inner {
77+
>["X_ z_ zz"] : Symbol(TestNoErrors["X_ z_ zz"], Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 28, 34))
78+
>"X_ z_ zz" : Symbol(TestNoErrors["X_ z_ zz"], Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 28, 34))
79+
>Inner : Symbol(Inner, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 29, 18))
80+
81+
#foo = 10
82+
>#foo : Symbol(Inner.#foo, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 29, 32))
83+
84+
m() {
85+
>m : Symbol(Inner.m, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 30, 18))
86+
87+
new TestNoErrors().#prop // Ok
88+
>new TestNoErrors().#prop : Symbol(TestNoErrors.#prop, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 26, 20))
89+
>TestNoErrors : Symbol(TestNoErrors, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 24, 1))
90+
}
91+
C = class InnerInner {
92+
>C : Symbol(Inner.C, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 33, 9))
93+
>InnerInner : Symbol(InnerInner, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 34, 11))
94+
95+
m() {
96+
>m : Symbol(InnerInner.m, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 34, 30))
97+
98+
new TestNoErrors().#prop // Ok
99+
>new TestNoErrors().#prop : Symbol(TestNoErrors.#prop, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 26, 20))
100+
>TestNoErrors : Symbol(TestNoErrors, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 24, 1))
101+
102+
new Inner().#foo; // Ok
103+
>new Inner().#foo : Symbol(Inner.#foo, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 29, 32))
104+
>Inner : Symbol(Inner, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 29, 18))
105+
}
106+
}
107+
108+
static M(){
109+
>M : Symbol(Inner.M, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 39, 9))
110+
111+
return class {
112+
m() {
113+
>m : Symbol((Anonymous class).m, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 42, 26))
114+
115+
new TestNoErrors().#prop // OK
116+
>new TestNoErrors().#prop : Symbol(TestNoErrors.#prop, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 26, 20))
117+
>TestNoErrors : Symbol(TestNoErrors, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 24, 1))
118+
119+
new Inner().#foo; // OK
120+
>new Inner().#foo : Symbol(Inner.#foo, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 29, 32))
121+
>Inner : Symbol(Inner, Decl(privateNameErrorsOnNotUseDefineForClassFieldsInEsNext.ts, 29, 18))
122+
}
123+
}
124+
}
125+
}
126+
}

0 commit comments

Comments
 (0)