Skip to content

Commit 3e28e29

Browse files
ShuiRuTianrbuckton
andauthored
fix 38503. (#39716)
* fix 38503. * trigger test. * trigger test. * Move isCallChain Co-authored-by: Ron Buckton <[email protected]>
1 parent c953969 commit 3e28e29

File tree

5 files changed

+33
-11
lines changed

5 files changed

+33
-11
lines changed

src/compiler/transformers/classFields.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,15 @@ namespace ts {
337337
if (shouldTransformPrivateFields && isPrivateIdentifierPropertyAccessExpression(node.expression)) {
338338
// Transform call expressions of private names to properly bind the `this` parameter.
339339
const { thisArg, target } = factory.createCallBinding(node.expression, hoistVariableDeclaration, languageVersion);
340+
if (isCallChain(node)) {
341+
return factory.updateCallChain(
342+
node,
343+
factory.createPropertyAccessChain(visitNode(target, visitor), node.questionDotToken, "call"),
344+
/*questionDotToken*/ undefined,
345+
/*typeArguments*/ undefined,
346+
[visitNode(thisArg, visitor, isExpression), ...visitNodes(node.arguments, visitor, isExpression)]
347+
);
348+
}
340349
return factory.updateCallExpression(
341350
node,
342351
factory.createPropertyAccessExpression(visitNode(target, visitor), "call"),

tests/baselines/reference/privateNameFieldCallExpression.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ class A {
55
x = 1;
66
test() {
77
this.#fieldFunc();
8+
this.#fieldFunc?.();
89
const func = this.#fieldFunc;
910
func();
1011
new this.#fieldFunc();
@@ -35,15 +36,17 @@ class A {
3536
}
3637
test() {
3738
var _a;
39+
var _b;
3840
__classPrivateFieldGet(this, _fieldFunc).call(this);
41+
(_a = __classPrivateFieldGet(this, _fieldFunc)) === null || _a === void 0 ? void 0 : _a.call(this);
3942
const func = __classPrivateFieldGet(this, _fieldFunc);
4043
func();
4144
new (__classPrivateFieldGet(this, _fieldFunc))();
4245
const arr = [1, 2];
4346
__classPrivateFieldGet(this, _fieldFunc2).call(this, 0, ...arr, 3);
4447
const b = new (__classPrivateFieldGet(this, _fieldFunc2))(0, ...arr, 3);
4548
const str = __classPrivateFieldGet(this, _fieldFunc2).bind(this) `head${1}middle${2}tail`;
46-
__classPrivateFieldGet((_a = this.getInstance()), _fieldFunc2).bind(_a) `test${1}and${2}`;
49+
__classPrivateFieldGet((_b = this.getInstance()), _fieldFunc2).bind(_b) `test${1}and${2}`;
4750
}
4851
getInstance() { return new A(); }
4952
}

tests/baselines/reference/privateNameFieldCallExpression.symbols

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,47 +18,51 @@ class A {
1818

1919
this.#fieldFunc();
2020
>this.#fieldFunc : Symbol(A.#fieldFunc, Decl(privateNameFieldCallExpression.ts, 0, 9))
21+
>this : Symbol(A, Decl(privateNameFieldCallExpression.ts, 0, 0))
22+
23+
this.#fieldFunc?.();
24+
>this.#fieldFunc : Symbol(A.#fieldFunc, Decl(privateNameFieldCallExpression.ts, 0, 9))
2125
>this : Symbol(A, Decl(privateNameFieldCallExpression.ts, 0, 0))
2226

2327
const func = this.#fieldFunc;
24-
>func : Symbol(func, Decl(privateNameFieldCallExpression.ts, 6, 13))
28+
>func : Symbol(func, Decl(privateNameFieldCallExpression.ts, 7, 13))
2529
>this.#fieldFunc : Symbol(A.#fieldFunc, Decl(privateNameFieldCallExpression.ts, 0, 9))
2630
>this : Symbol(A, Decl(privateNameFieldCallExpression.ts, 0, 0))
2731

2832
func();
29-
>func : Symbol(func, Decl(privateNameFieldCallExpression.ts, 6, 13))
33+
>func : Symbol(func, Decl(privateNameFieldCallExpression.ts, 7, 13))
3034

3135
new this.#fieldFunc();
3236
>this.#fieldFunc : Symbol(A.#fieldFunc, Decl(privateNameFieldCallExpression.ts, 0, 9))
3337
>this : Symbol(A, Decl(privateNameFieldCallExpression.ts, 0, 0))
3438

3539
const arr = [ 1, 2 ];
36-
>arr : Symbol(arr, Decl(privateNameFieldCallExpression.ts, 10, 13))
40+
>arr : Symbol(arr, Decl(privateNameFieldCallExpression.ts, 11, 13))
3741

3842
this.#fieldFunc2(0, ...arr, 3);
3943
>this.#fieldFunc2 : Symbol(A.#fieldFunc2, Decl(privateNameFieldCallExpression.ts, 1, 45))
4044
>this : Symbol(A, Decl(privateNameFieldCallExpression.ts, 0, 0))
41-
>arr : Symbol(arr, Decl(privateNameFieldCallExpression.ts, 10, 13))
45+
>arr : Symbol(arr, Decl(privateNameFieldCallExpression.ts, 11, 13))
4246

4347
const b = new this.#fieldFunc2(0, ...arr, 3);
44-
>b : Symbol(b, Decl(privateNameFieldCallExpression.ts, 12, 13))
48+
>b : Symbol(b, Decl(privateNameFieldCallExpression.ts, 13, 13))
4549
>this.#fieldFunc2 : Symbol(A.#fieldFunc2, Decl(privateNameFieldCallExpression.ts, 1, 45))
4650
>this : Symbol(A, Decl(privateNameFieldCallExpression.ts, 0, 0))
47-
>arr : Symbol(arr, Decl(privateNameFieldCallExpression.ts, 10, 13))
51+
>arr : Symbol(arr, Decl(privateNameFieldCallExpression.ts, 11, 13))
4852

4953
const str = this.#fieldFunc2`head${1}middle${2}tail`;
50-
>str : Symbol(str, Decl(privateNameFieldCallExpression.ts, 13, 13))
54+
>str : Symbol(str, Decl(privateNameFieldCallExpression.ts, 14, 13))
5155
>this.#fieldFunc2 : Symbol(A.#fieldFunc2, Decl(privateNameFieldCallExpression.ts, 1, 45))
5256
>this : Symbol(A, Decl(privateNameFieldCallExpression.ts, 0, 0))
5357

5458
this.getInstance().#fieldFunc2`test${1}and${2}`;
5559
>this.getInstance().#fieldFunc2 : Symbol(A.#fieldFunc2, Decl(privateNameFieldCallExpression.ts, 1, 45))
56-
>this.getInstance : Symbol(A.getInstance, Decl(privateNameFieldCallExpression.ts, 15, 5))
60+
>this.getInstance : Symbol(A.getInstance, Decl(privateNameFieldCallExpression.ts, 16, 5))
5761
>this : Symbol(A, Decl(privateNameFieldCallExpression.ts, 0, 0))
58-
>getInstance : Symbol(A.getInstance, Decl(privateNameFieldCallExpression.ts, 15, 5))
62+
>getInstance : Symbol(A.getInstance, Decl(privateNameFieldCallExpression.ts, 16, 5))
5963
}
6064
getInstance() { return new A(); }
61-
>getInstance : Symbol(A.getInstance, Decl(privateNameFieldCallExpression.ts, 15, 5))
65+
>getInstance : Symbol(A.getInstance, Decl(privateNameFieldCallExpression.ts, 16, 5))
6266
>A : Symbol(A, Decl(privateNameFieldCallExpression.ts, 0, 0))
6367
}
6468

tests/baselines/reference/privateNameFieldCallExpression.types

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ class A {
2727
this.#fieldFunc();
2828
>this.#fieldFunc() : void
2929
>this.#fieldFunc : () => void
30+
>this : this
31+
32+
this.#fieldFunc?.();
33+
>this.#fieldFunc?.() : void
34+
>this.#fieldFunc : () => void
3035
>this : this
3136

3237
const func = this.#fieldFunc;

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ class A {
66
x = 1;
77
test() {
88
this.#fieldFunc();
9+
this.#fieldFunc?.();
910
const func = this.#fieldFunc;
1011
func();
1112
new this.#fieldFunc();

0 commit comments

Comments
 (0)