Skip to content

Commit ec79590

Browse files
committed
Put parameter property initialiser into defineProperty's value
1 parent 5810765 commit ec79590

File tree

10 files changed

+71
-36
lines changed

10 files changed

+71
-36
lines changed

src/compiler/transformers/classFields.ts

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -326,10 +326,6 @@ namespace ts {
326326
if (constructor) {
327327
indexOfFirstStatement = addPrologueDirectivesAndInitialSuperCall(constructor, statements, visitor);
328328
}
329-
if (useDefineForClassFields) {
330-
addPropertyStatements(statements, properties, createThis());
331-
}
332-
333329
// Add the property initializers. Transforms this:
334330
//
335331
// public x = 1;
@@ -341,23 +337,18 @@ namespace ts {
341337
// }
342338
//
343339
if (constructor?.body) {
344-
let parameterPropertyDeclarationCount = 0;
345-
for (let i = indexOfFirstStatement; i < constructor.body.statements.length; i++) {
346-
if (isParameterPropertyDeclaration(getOriginalNode(constructor.body.statements[i]), constructor)) {
347-
parameterPropertyDeclarationCount++;
348-
}
349-
else {
350-
break;
351-
}
340+
let afterParameterProperties = findIndex(constructor.body.statements, s => !isParameterPropertyDeclaration(getOriginalNode(s), constructor), indexOfFirstStatement);
341+
if (afterParameterProperties === -1) {
342+
afterParameterProperties = constructor.body.statements.length;
352343
}
353-
if (parameterPropertyDeclarationCount > 0) {
354-
addRange(statements, visitNodes(constructor.body.statements, visitor, isStatement, indexOfFirstStatement, parameterPropertyDeclarationCount));
355-
indexOfFirstStatement += parameterPropertyDeclarationCount;
344+
if (afterParameterProperties > indexOfFirstStatement) {
345+
if (!useDefineForClassFields) {
346+
addRange(statements, visitNodes(constructor.body.statements, visitor, isStatement, indexOfFirstStatement, afterParameterProperties - indexOfFirstStatement));
347+
}
348+
indexOfFirstStatement = afterParameterProperties;
356349
}
357350
}
358-
if (!useDefineForClassFields) {
359-
addPropertyStatements(statements, properties, createThis());
360-
}
351+
addPropertyStatements(statements, properties, createThis());
361352

362353
// Add existing statements, skipping the initial super call.
363354
if (constructor) {
@@ -427,7 +418,9 @@ namespace ts {
427418
? updateComputedPropertyName(property.name, getGeneratedNameForNode(property.name))
428419
: property.name;
429420

430-
const initializer = property.initializer || emitAssignment ? visitNode(property.initializer, visitor, isExpression) : createVoidZero();
421+
const initializer = property.initializer || emitAssignment ? visitNode(property.initializer, visitor, isExpression)
422+
: hasModifier(getOriginalNode(property), ModifierFlags.ParameterPropertyModifier) && isIdentifier(propertyName) ? propertyName
423+
: createVoidZero();
431424
if (emitAssignment) {
432425
const memberAccess = createMemberAccessForPropertyName(receiver, propertyName, /*location*/ propertyName);
433426
return createAssignment(memberAccess, initializer);

src/compiler/transformers/ts.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -900,13 +900,13 @@ namespace ts {
900900
if (parametersWithPropertyAssignments) {
901901
for (const parameter of parametersWithPropertyAssignments) {
902902
if (isIdentifier(parameter.name)) {
903-
members.push(aggregateTransformFlags(createProperty(
903+
members.push(setOriginalNode(aggregateTransformFlags(createProperty(
904904
/*decorators*/ undefined,
905905
/*modifiers*/ undefined,
906906
parameter.name,
907907
/*questionOrExclamationToken*/ undefined,
908908
/*type*/ undefined,
909-
/*initializer*/ undefined)));
909+
/*initializer*/ undefined)), parameter));
910910
}
911911
}
912912
}

tests/baselines/reference/definePropertyES5.js

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
//// [definePropertyES5.ts]
22
var x: "p" = "p"
33
class A {
4-
a = 12
4+
a = this.y
55
b
66
["computed"] = 13
77
;[x] = 14
88
m() { }
99
constructor(public readonly y: number) { }
10+
z = this.y
1011
}
1112

1213

@@ -19,13 +20,13 @@ var A = /** @class */ (function () {
1920
enumerable: true,
2021
configurable: true,
2122
writable: true,
22-
value: void 0
23+
value: y
2324
});
2425
Object.defineProperty(this, "a", {
2526
enumerable: true,
2627
configurable: true,
2728
writable: true,
28-
value: 12
29+
value: this.y
2930
});
3031
Object.defineProperty(this, "b", {
3132
enumerable: true,
@@ -45,7 +46,12 @@ var A = /** @class */ (function () {
4546
writable: true,
4647
value: 14
4748
});
48-
this.y = y;
49+
Object.defineProperty(this, "z", {
50+
enumerable: true,
51+
configurable: true,
52+
writable: true,
53+
value: this.y
54+
});
4955
}
5056
Object.defineProperty(A.prototype, "m", {
5157
enumerable: false,

tests/baselines/reference/definePropertyES5.symbols

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,14 @@ var x: "p" = "p"
55
class A {
66
>A : Symbol(A, Decl(definePropertyES5.ts, 0, 16))
77

8-
a = 12
8+
a = this.y
99
>a : Symbol(A.a, Decl(definePropertyES5.ts, 1, 9))
10+
>this.y : Symbol(A.y, Decl(definePropertyES5.ts, 7, 16))
11+
>this : Symbol(A, Decl(definePropertyES5.ts, 0, 16))
12+
>y : Symbol(A.y, Decl(definePropertyES5.ts, 7, 16))
1013

1114
b
12-
>b : Symbol(A.b, Decl(definePropertyES5.ts, 2, 10))
15+
>b : Symbol(A.b, Decl(definePropertyES5.ts, 2, 14))
1316

1417
["computed"] = 13
1518
>["computed"] : Symbol(A["computed"], Decl(definePropertyES5.ts, 3, 5))
@@ -23,6 +26,12 @@ class A {
2326
>m : Symbol(A.m, Decl(definePropertyES5.ts, 5, 13))
2427

2528
constructor(public readonly y: number) { }
29+
>y : Symbol(A.y, Decl(definePropertyES5.ts, 7, 16))
30+
31+
z = this.y
32+
>z : Symbol(A.z, Decl(definePropertyES5.ts, 7, 46))
33+
>this.y : Symbol(A.y, Decl(definePropertyES5.ts, 7, 16))
34+
>this : Symbol(A, Decl(definePropertyES5.ts, 0, 16))
2635
>y : Symbol(A.y, Decl(definePropertyES5.ts, 7, 16))
2736
}
2837

tests/baselines/reference/definePropertyES5.types

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@ var x: "p" = "p"
66
class A {
77
>A : A
88

9-
a = 12
9+
a = this.y
1010
>a : number
11-
>12 : 12
11+
>this.y : number
12+
>this : this
13+
>y : number
1214

1315
b
1416
>b : any
@@ -27,6 +29,12 @@ class A {
2729
>m : () => void
2830

2931
constructor(public readonly y: number) { }
32+
>y : number
33+
34+
z = this.y
35+
>z : number
36+
>this.y : number
37+
>this : this
3038
>y : number
3139
}
3240

tests/baselines/reference/definePropertyESNext.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,11 @@ class A {
1111
class B {
1212
}
1313
class C extends B {
14-
z = 1
14+
z = this.ka
1515
constructor(public ka: number) {
1616
super()
1717
}
18+
ki = this.ka
1819
}
1920

2021

@@ -35,9 +36,10 @@ class B {
3536
}
3637
class C extends B {
3738
ka;
38-
z = 1;
39+
z = this.ka;
3940
constructor(ka) {
4041
super();
4142
this.ka = ka;
4243
}
44+
ki = this.ka;
4345
}

tests/baselines/reference/definePropertyESNext.symbols

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,22 @@ class C extends B {
3232
>C : Symbol(C, Decl(definePropertyESNext.ts, 10, 1))
3333
>B : Symbol(B, Decl(definePropertyESNext.ts, 8, 1))
3434

35-
z = 1
35+
z = this.ka
3636
>z : Symbol(C.z, Decl(definePropertyESNext.ts, 11, 19))
37+
>this.ka : Symbol(C.ka, Decl(definePropertyESNext.ts, 13, 16))
38+
>this : Symbol(C, Decl(definePropertyESNext.ts, 10, 1))
39+
>ka : Symbol(C.ka, Decl(definePropertyESNext.ts, 13, 16))
3740

3841
constructor(public ka: number) {
3942
>ka : Symbol(C.ka, Decl(definePropertyESNext.ts, 13, 16))
4043

4144
super()
4245
>super : Symbol(B, Decl(definePropertyESNext.ts, 8, 1))
4346
}
47+
ki = this.ka
48+
>ki : Symbol(C.ki, Decl(definePropertyESNext.ts, 15, 5))
49+
>this.ka : Symbol(C.ka, Decl(definePropertyESNext.ts, 13, 16))
50+
>this : Symbol(C, Decl(definePropertyESNext.ts, 10, 1))
51+
>ka : Symbol(C.ka, Decl(definePropertyESNext.ts, 13, 16))
4452
}
4553

tests/baselines/reference/definePropertyESNext.types

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,11 @@ class C extends B {
3636
>C : C
3737
>B : B
3838

39-
z = 1
39+
z = this.ka
4040
>z : number
41-
>1 : 1
41+
>this.ka : number
42+
>this : this
43+
>ka : number
4244

4345
constructor(public ka: number) {
4446
>ka : number
@@ -47,5 +49,10 @@ class C extends B {
4749
>super() : void
4850
>super : typeof B
4951
}
52+
ki = this.ka
53+
>ki : number
54+
>this.ka : number
55+
>this : this
56+
>ka : number
5057
}
5158

tests/cases/conformance/classes/propertyMemberDeclarations/definePropertyES5.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
22
// @useDefineForClassFields: true
33
var x: "p" = "p"
44
class A {
5-
a = 12
5+
a = this.y
66
b
77
["computed"] = 13
88
;[x] = 14
99
m() { }
1010
constructor(public readonly y: number) { }
11+
z = this.y
1112
}

tests/cases/conformance/classes/propertyMemberDeclarations/definePropertyESNext.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@ class A {
1212
class B {
1313
}
1414
class C extends B {
15-
z = 1
15+
z = this.ka
1616
constructor(public ka: number) {
1717
super()
1818
}
19+
ki = this.ka
1920
}

0 commit comments

Comments
 (0)