Skip to content

Commit cd38ef3

Browse files
authoredFeb 14, 2024
fix(es/helpers): Add addInitializer to field decorators (#8619)
**Description:** At some point the spec text of ES decorators was changed to also have addInitializer for field decorators. This is already used e.g. in mobx. This simple change removes the special case that was present for field decorators and seems to fix the issue for me. This change is backwards compatible since it only affects code that was broken before. **Related issue:** - Closes #8525
1 parent cb95f04 commit cd38ef3

File tree

6 files changed

+23
-35
lines changed

6 files changed

+23
-35
lines changed
 

‎crates/swc_ecma_transforms_base/src/helpers/_apply_decs_2203_r.js

+8-14
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,10 @@ function applyDecs2203RFactory() {
6767

6868
var decoratorFinishedRef = { v: false };
6969

70-
if (kind !== 0 /* FIELD */) {
71-
ctx.addInitializer = createAddInitializerMethod(
72-
initializers,
73-
decoratorFinishedRef
74-
);
75-
}
70+
ctx.addInitializer = createAddInitializerMethod(
71+
initializers,
72+
decoratorFinishedRef
73+
);
7674

7775
var get, set;
7876
if (kind === 0 /* FIELD */) {
@@ -376,17 +374,13 @@ function applyDecs2203RFactory() {
376374
base = Class;
377375
kind = kind - 5 /* STATIC */;
378376
// initialize staticInitializers when we see a non-field static member
379-
if (kind !== 0 /* FIELD */) {
380-
staticInitializers = staticInitializers || [];
381-
initializers = staticInitializers;
382-
}
377+
staticInitializers = staticInitializers || [];
378+
initializers = staticInitializers;
383379
} else {
384380
base = Class.prototype;
385381
// initialize protoInitializers when we see a non-field member
386-
if (kind !== 0 /* FIELD */) {
387-
protoInitializers = protoInitializers || [];
388-
initializers = protoInitializers;
389-
}
382+
protoInitializers = protoInitializers || [];
383+
initializers = protoInitializers;
390384
}
391385

392386
if (kind !== 0 /* FIELD */ && !isPrivate) {

‎crates/swc_ecma_transforms_proposal/tests/decorators/2022-03-fields--to-es2015/private/exec.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ expect(aContext.name).toBe('#a');
2525
expect(aContext.kind).toBe('field');
2626
expect(aContext.static).toBe(false);
2727
expect(aContext.private).toBe(true);
28-
expect(typeof aContext.addInitializer).toBe('undefined');
28+
expect(typeof aContext.addInitializer).toBe('function');
2929

3030
expect(bContext.access.get.call(foo)).toBe(124);
3131
bContext.access.set.call(foo, 123);
@@ -34,4 +34,4 @@ expect(bContext.name).toBe('#b');
3434
expect(bContext.kind).toBe('field');
3535
expect(bContext.static).toBe(false);
3636
expect(bContext.private).toBe(true);
37-
expect(typeof aContext.addInitializer).toBe('undefined');
37+
expect(typeof aContext.addInitializer).toBe('function');

‎crates/swc_ecma_transforms_proposal/tests/decorators/2022-03-fields--to-es2015/public/exec.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ expect(aContext.name).toBe('a');
3434
expect(aContext.kind).toBe('field');
3535
expect(aContext.static).toBe(false);
3636
expect(aContext.private).toBe(false);
37-
expect(typeof aContext.addInitializer).toBe('undefined');
37+
expect(typeof aContext.addInitializer).toBe('function');
3838
expect(foo.hasOwnProperty('a')).toBe(true);
3939
expect(Foo.prototype.hasOwnProperty('a')).toBe(false);
4040

@@ -45,7 +45,7 @@ expect(bContext.name).toBe('b');
4545
expect(bContext.kind).toBe('field');
4646
expect(bContext.static).toBe(false);
4747
expect(bContext.private).toBe(false);
48-
expect(typeof bContext.addInitializer).toBe('undefined');
48+
expect(typeof bContext.addInitializer).toBe('function');
4949
expect(foo.hasOwnProperty('b')).toBe(true);
5050
expect(Foo.prototype.hasOwnProperty('b')).toBe(false);
5151

@@ -56,6 +56,6 @@ expect(cContext.name).toBe('c');
5656
expect(cContext.kind).toBe('field');
5757
expect(cContext.static).toBe(false);
5858
expect(cContext.private).toBe(false);
59-
expect(typeof cContext.addInitializer).toBe('undefined');
59+
expect(typeof cContext.addInitializer).toBe('function');
6060
expect(foo.hasOwnProperty('c')).toBe(true);
6161
expect(Foo.prototype.hasOwnProperty('c')).toBe(false);

‎crates/swc_ecma_transforms_proposal/tests/decorators/2022-03-fields--to-es2015/static-private/exec.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ expect(aContext.name).toBe('#a');
2323
expect(aContext.kind).toBe('field');
2424
expect(aContext.static).toBe(true);
2525
expect(aContext.private).toBe(true);
26-
expect(typeof aContext.addInitializer).toBe('undefined');
26+
expect(typeof aContext.addInitializer).toBe('function');
2727

2828
expect(bContext.access.get.call(Foo)).toBe(124);
2929
bContext.access.set.call(Foo, 123);
@@ -32,4 +32,4 @@ expect(bContext.name).toBe('#b');
3232
expect(bContext.kind).toBe('field');
3333
expect(bContext.static).toBe(true);
3434
expect(bContext.private).toBe(true);
35-
expect(typeof aContext.addInitializer).toBe('undefined');
35+
expect(typeof aContext.addInitializer).toBe('function');

‎crates/swc_ecma_transforms_proposal/tests/decorators/2022-03-fields--to-es2015/static-public/exec.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ expect(aContext.name).toBe('a');
3232
expect(aContext.kind).toBe('field');
3333
expect(aContext.static).toBe(true);
3434
expect(aContext.private).toBe(false);
35-
expect(typeof aContext.addInitializer).toBe('undefined');
35+
expect(typeof aContext.addInitializer).toBe('function');
3636
expect(Foo.hasOwnProperty('a')).toBe(true);
3737

3838
expect(Foo.b).toBe(124);
@@ -42,7 +42,7 @@ expect(bContext.name).toBe('b');
4242
expect(bContext.kind).toBe('field');
4343
expect(bContext.static).toBe(true);
4444
expect(bContext.private).toBe(false);
45-
expect(typeof bContext.addInitializer).toBe('undefined');
45+
expect(typeof bContext.addInitializer).toBe('function');
4646
expect(Foo.hasOwnProperty('b')).toBe(true);
4747

4848
expect(Foo.c).toBe(457);
@@ -52,5 +52,5 @@ expect(cContext.name).toBe('c');
5252
expect(cContext.kind).toBe('field');
5353
expect(cContext.static).toBe(true);
5454
expect(cContext.private).toBe(false);
55-
expect(typeof cContext.addInitializer).toBe('undefined');
55+
expect(typeof cContext.addInitializer).toBe('function');
5656
expect(Foo.hasOwnProperty('c')).toBe(true);

‎packages/helpers/esm/_apply_decs_2203_r.js

+5-11
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,7 @@ export function _apply_decs_2203_r(targetClass, memberDecs, classDecs, parentCla
5151

5252
var decoratorFinishedRef = { v: false };
5353

54-
if (kind !== 0 /* FIELD */) {
55-
ctx.addInitializer = createAddInitializerMethod(initializers, decoratorFinishedRef);
56-
}
54+
ctx.addInitializer = createAddInitializerMethod(initializers, decoratorFinishedRef);
5755

5856
var get, set;
5957
if (kind === 0 /* FIELD */) {
@@ -306,17 +304,13 @@ export function _apply_decs_2203_r(targetClass, memberDecs, classDecs, parentCla
306304
base = Class;
307305
kind = kind - 5 /* STATIC */;
308306
// initialize staticInitializers when we see a non-field static member
309-
if (kind !== 0 /* FIELD */) {
310-
staticInitializers = staticInitializers || [];
311-
initializers = staticInitializers;
312-
}
307+
staticInitializers = staticInitializers || [];
308+
initializers = staticInitializers;
313309
} else {
314310
base = Class.prototype;
315311
// initialize protoInitializers when we see a non-field member
316-
if (kind !== 0 /* FIELD */) {
317-
protoInitializers = protoInitializers || [];
318-
initializers = protoInitializers;
319-
}
312+
protoInitializers = protoInitializers || [];
313+
initializers = protoInitializers;
320314
}
321315

322316
if (kind !== 0 /* FIELD */ && !isPrivate) {

0 commit comments

Comments
 (0)
Please sign in to comment.