Skip to content

Commit a1dfb1a

Browse files
authored
Fix class decorator detection in class fields transform (#58554)
1 parent d66a309 commit a1dfb1a

8 files changed

+344
-232
lines changed

src/compiler/transformers/classFields.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,9 @@ import {
8686
isCallChain,
8787
isCallToHelper,
8888
isCatchClause,
89-
isClassDeclaration,
9089
isClassElement,
9190
isClassExpression,
91+
isClassLike,
9292
isClassNamedEvaluationHelperBlock,
9393
isClassStaticBlockDeclaration,
9494
isClassThisAssignmentBlock,
@@ -901,10 +901,9 @@ export function transformClassFields(context: TransformationContext): (x: Source
901901
}
902902
}
903903

904-
function getClassThis() {
904+
function tryGetClassThis() {
905905
const lex = getClassLexicalEnvironment();
906-
const classThis = lex.classThis ?? lex.classConstructor ?? currentClassContainer?.name;
907-
return Debug.checkDefined(classThis);
906+
return lex.classThis ?? lex.classConstructor ?? currentClassContainer?.name;
908907
}
909908

910909
function transformAutoAccessor(node: AutoAccessorPropertyDeclaration): VisitResult<Node> {
@@ -946,7 +945,7 @@ export function transformClassFields(context: TransformationContext): (x: Source
946945
setEmitFlags(backingField, EmitFlags.NoComments);
947946
setSourceMapRange(backingField, sourceMapRange);
948947

949-
const receiver = isStatic(node) ? getClassThis() : factory.createThis();
948+
const receiver = isStatic(node) ? tryGetClassThis() ?? factory.createThis() : factory.createThis();
950949
const getter = createAccessorPropertyGetRedirector(factory, node, modifiers, getterName, receiver);
951950
setOriginalNode(getter, node);
952951
setCommentRange(getter, commentRange);
@@ -1713,7 +1712,7 @@ export function transformClassFields(context: TransformationContext): (x: Source
17131712
function getClassFacts(node: ClassLikeDeclaration) {
17141713
let facts = ClassFacts.None;
17151714
const original = getOriginalNode(node);
1716-
if (isClassDeclaration(original) && classOrConstructorParameterIsDecorated(legacyDecorators, original)) {
1715+
if (isClassLike(original) && classOrConstructorParameterIsDecorated(legacyDecorators, original)) {
17171716
facts |= ClassFacts.ClassWasDecorated;
17181717
}
17191718
if (shouldTransformPrivateElementsOrClassStaticBlocks && (classHasClassThisAssignment(node) || classHasExplicitlyAssignedName(node))) {

tests/baselines/reference/esDecorators-classExpression-commentPreservation(target=es2015).js

Lines changed: 57 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -116,63 +116,62 @@ class C {
116116
let _z_decorators;
117117
let _z_initializers = [];
118118
let _z_extraInitializers = [];
119-
var C = (_classThis = class {
120-
/*5*/
121-
method() { }
122-
/*8*/
123-
get x() { return 1; }
124-
/*11*/
125-
set x(value) { }
126-
/*17*/
127-
get z() { return __classPrivateFieldGet(this, _C_z_1_accessor_storage, "f"); }
128-
set z(value) { __classPrivateFieldSet(this, _C_z_1_accessor_storage, value, "f"); }
129-
constructor() {
130-
/*14*/
131-
this.y = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _y_initializers, 1));
132-
_C_z_1_accessor_storage.set(this, (__runInitializers(this, _y_extraInitializers), __runInitializers(this, _z_initializers, 1)));
133-
__runInitializers(this, _z_extraInitializers);
134-
}
135-
},
136-
_C_z_1_accessor_storage = new WeakMap(),
137-
_C_method_get = function _C_method_get() { return _static_private_method_descriptor.value; },
138-
_C_x_get = function _C_x_get() { return _static_private_get_x_descriptor.get.call(this); },
139-
_C_x_set = function _C_x_set(value) { return _static_private_set_x_descriptor.set.call(this, value); },
140-
_C_z_get = function _C_z_get() { return _static_private_z_descriptor.get.call(this); },
141-
_C_z_set = function _C_z_set(value) { return _static_private_z_descriptor.set.call(this, value); },
142-
__setFunctionName(_classThis, "C"),
143-
(() => {
144-
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
145-
_method_decorators = [dec, dec];
146-
_get_x_decorators = [dec, dec];
147-
_set_x_decorators = [dec, dec];
148-
_y_decorators = [dec, dec];
149-
_z_decorators = [dec, dec];
150-
_static_private_method_decorators = [dec, dec];
151-
_static_private_get_x_decorators = [dec, dec];
152-
_static_private_set_x_decorators = [dec, dec];
153-
_static_private_y_decorators = [dec, dec];
154-
_static_private_z_decorators = [dec, dec];
155-
__esDecorate(_classThis, _static_private_method_descriptor = { value: __setFunctionName(function () { }, "#method") }, _static_private_method_decorators, { kind: "method", name: "#method", static: true, private: true, access: { has: obj => __classPrivateFieldIn(_classThis, obj), get: obj => __classPrivateFieldGet(obj, _classThis, "a", _C_method_get) }, metadata: _metadata }, null, _staticExtraInitializers);
156-
__esDecorate(_classThis, _static_private_get_x_descriptor = { get: __setFunctionName(function () { return 1; }, "#x", "get") }, _static_private_get_x_decorators, { kind: "getter", name: "#x", static: true, private: true, access: { has: obj => __classPrivateFieldIn(_classThis, obj), get: obj => __classPrivateFieldGet(obj, _classThis, "a", _C_x_get) }, metadata: _metadata }, null, _staticExtraInitializers);
157-
__esDecorate(_classThis, _static_private_set_x_descriptor = { set: __setFunctionName(function (value) { }, "#x", "set") }, _static_private_set_x_decorators, { kind: "setter", name: "#x", static: true, private: true, access: { has: obj => __classPrivateFieldIn(_classThis, obj), set: (obj, value) => { __classPrivateFieldSet(obj, _classThis, value, "a", _C_x_set); } }, metadata: _metadata }, null, _staticExtraInitializers);
158-
__esDecorate(_classThis, _static_private_z_descriptor = { get: __setFunctionName(function () { return __classPrivateFieldGet(_classThis, _classThis, "f", _C_z_accessor_storage); }, "#z", "get"), set: __setFunctionName(function (value) { __classPrivateFieldSet(_classThis, _classThis, value, "f", _C_z_accessor_storage); }, "#z", "set") }, _static_private_z_decorators, { kind: "accessor", name: "#z", static: true, private: true, access: { has: obj => __classPrivateFieldIn(_classThis, obj), get: obj => __classPrivateFieldGet(obj, _classThis, "a", _C_z_get), set: (obj, value) => { __classPrivateFieldSet(obj, _classThis, value, "a", _C_z_set); } }, metadata: _metadata }, _static_private_z_initializers, _static_private_z_extraInitializers);
159-
__esDecorate(_classThis, null, _method_decorators, { kind: "method", name: "method", static: false, private: false, access: { has: obj => "method" in obj, get: obj => obj.method }, metadata: _metadata }, null, _instanceExtraInitializers);
160-
__esDecorate(_classThis, null, _get_x_decorators, { kind: "getter", name: "x", static: false, private: false, access: { has: obj => "x" in obj, get: obj => obj.x }, metadata: _metadata }, null, _instanceExtraInitializers);
161-
__esDecorate(_classThis, null, _set_x_decorators, { kind: "setter", name: "x", static: false, private: false, access: { has: obj => "x" in obj, set: (obj, value) => { obj.x = value; } }, metadata: _metadata }, null, _instanceExtraInitializers);
162-
__esDecorate(_classThis, null, _z_decorators, { kind: "accessor", name: "z", static: false, private: false, access: { has: obj => "z" in obj, get: obj => obj.z, set: (obj, value) => { obj.z = value; } }, metadata: _metadata }, _z_initializers, _z_extraInitializers);
163-
__esDecorate(null, null, _static_private_y_decorators, { kind: "field", name: "#y", static: true, private: true, access: { has: obj => __classPrivateFieldIn(_classThis, obj), get: obj => __classPrivateFieldGet(obj, _classThis, "f", _C_y), set: (obj, value) => { __classPrivateFieldSet(obj, _classThis, value, "f", _C_y); } }, metadata: _metadata }, _static_private_y_initializers, _static_private_y_extraInitializers);
164-
__esDecorate(null, null, _y_decorators, { kind: "field", name: "y", static: false, private: false, access: { has: obj => "y" in obj, get: obj => obj.y, set: (obj, value) => { obj.y = value; } }, metadata: _metadata }, _y_initializers, _y_extraInitializers);
165-
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
166-
C = _classThis = _classDescriptor.value;
167-
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
168-
})(),
169-
/*29*/
170-
_C_y = { value: (__runInitializers(_classThis, _staticExtraInitializers), __runInitializers(_classThis, _static_private_y_initializers, 1)) },
171-
_C_z_accessor_storage = { value: (__runInitializers(_classThis, _static_private_y_extraInitializers), __runInitializers(_classThis, _static_private_z_initializers, 1)) },
172-
(() => {
173-
__runInitializers(_classThis, _static_private_z_extraInitializers);
174-
__runInitializers(_classThis, _classExtraInitializers);
175-
})(),
176-
_classThis);
119+
var C = _classThis = class {
120+
/*5*/
121+
method() { }
122+
/*8*/
123+
get x() { return 1; }
124+
/*11*/
125+
set x(value) { }
126+
/*17*/
127+
get z() { return __classPrivateFieldGet(this, _C_z_1_accessor_storage, "f"); }
128+
set z(value) { __classPrivateFieldSet(this, _C_z_1_accessor_storage, value, "f"); }
129+
constructor() {
130+
/*14*/
131+
this.y = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _y_initializers, 1));
132+
_C_z_1_accessor_storage.set(this, (__runInitializers(this, _y_extraInitializers), __runInitializers(this, _z_initializers, 1)));
133+
__runInitializers(this, _z_extraInitializers);
134+
}
135+
};
136+
_C_z_1_accessor_storage = new WeakMap();
137+
_C_method_get = function _C_method_get() { return _static_private_method_descriptor.value; };
138+
_C_x_get = function _C_x_get() { return _static_private_get_x_descriptor.get.call(this); };
139+
_C_x_set = function _C_x_set(value) { return _static_private_set_x_descriptor.set.call(this, value); };
140+
_C_z_get = function _C_z_get() { return _static_private_z_descriptor.get.call(this); };
141+
_C_z_set = function _C_z_set(value) { return _static_private_z_descriptor.set.call(this, value); };
142+
__setFunctionName(_classThis, "C");
143+
(() => {
144+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
145+
_method_decorators = [dec, dec];
146+
_get_x_decorators = [dec, dec];
147+
_set_x_decorators = [dec, dec];
148+
_y_decorators = [dec, dec];
149+
_z_decorators = [dec, dec];
150+
_static_private_method_decorators = [dec, dec];
151+
_static_private_get_x_decorators = [dec, dec];
152+
_static_private_set_x_decorators = [dec, dec];
153+
_static_private_y_decorators = [dec, dec];
154+
_static_private_z_decorators = [dec, dec];
155+
__esDecorate(_classThis, _static_private_method_descriptor = { value: __setFunctionName(function () { }, "#method") }, _static_private_method_decorators, { kind: "method", name: "#method", static: true, private: true, access: { has: obj => __classPrivateFieldIn(_classThis, obj), get: obj => __classPrivateFieldGet(obj, _classThis, "a", _C_method_get) }, metadata: _metadata }, null, _staticExtraInitializers);
156+
__esDecorate(_classThis, _static_private_get_x_descriptor = { get: __setFunctionName(function () { return 1; }, "#x", "get") }, _static_private_get_x_decorators, { kind: "getter", name: "#x", static: true, private: true, access: { has: obj => __classPrivateFieldIn(_classThis, obj), get: obj => __classPrivateFieldGet(obj, _classThis, "a", _C_x_get) }, metadata: _metadata }, null, _staticExtraInitializers);
157+
__esDecorate(_classThis, _static_private_set_x_descriptor = { set: __setFunctionName(function (value) { }, "#x", "set") }, _static_private_set_x_decorators, { kind: "setter", name: "#x", static: true, private: true, access: { has: obj => __classPrivateFieldIn(_classThis, obj), set: (obj, value) => { __classPrivateFieldSet(obj, _classThis, value, "a", _C_x_set); } }, metadata: _metadata }, null, _staticExtraInitializers);
158+
__esDecorate(_classThis, _static_private_z_descriptor = { get: __setFunctionName(function () { return __classPrivateFieldGet(_classThis, _classThis, "f", _C_z_accessor_storage); }, "#z", "get"), set: __setFunctionName(function (value) { __classPrivateFieldSet(_classThis, _classThis, value, "f", _C_z_accessor_storage); }, "#z", "set") }, _static_private_z_decorators, { kind: "accessor", name: "#z", static: true, private: true, access: { has: obj => __classPrivateFieldIn(_classThis, obj), get: obj => __classPrivateFieldGet(obj, _classThis, "a", _C_z_get), set: (obj, value) => { __classPrivateFieldSet(obj, _classThis, value, "a", _C_z_set); } }, metadata: _metadata }, _static_private_z_initializers, _static_private_z_extraInitializers);
159+
__esDecorate(_classThis, null, _method_decorators, { kind: "method", name: "method", static: false, private: false, access: { has: obj => "method" in obj, get: obj => obj.method }, metadata: _metadata }, null, _instanceExtraInitializers);
160+
__esDecorate(_classThis, null, _get_x_decorators, { kind: "getter", name: "x", static: false, private: false, access: { has: obj => "x" in obj, get: obj => obj.x }, metadata: _metadata }, null, _instanceExtraInitializers);
161+
__esDecorate(_classThis, null, _set_x_decorators, { kind: "setter", name: "x", static: false, private: false, access: { has: obj => "x" in obj, set: (obj, value) => { obj.x = value; } }, metadata: _metadata }, null, _instanceExtraInitializers);
162+
__esDecorate(_classThis, null, _z_decorators, { kind: "accessor", name: "z", static: false, private: false, access: { has: obj => "z" in obj, get: obj => obj.z, set: (obj, value) => { obj.z = value; } }, metadata: _metadata }, _z_initializers, _z_extraInitializers);
163+
__esDecorate(null, null, _static_private_y_decorators, { kind: "field", name: "#y", static: true, private: true, access: { has: obj => __classPrivateFieldIn(_classThis, obj), get: obj => __classPrivateFieldGet(obj, _classThis, "f", _C_y), set: (obj, value) => { __classPrivateFieldSet(obj, _classThis, value, "f", _C_y); } }, metadata: _metadata }, _static_private_y_initializers, _static_private_y_extraInitializers);
164+
__esDecorate(null, null, _y_decorators, { kind: "field", name: "y", static: false, private: false, access: { has: obj => "y" in obj, get: obj => obj.y, set: (obj, value) => { obj.y = value; } }, metadata: _metadata }, _y_initializers, _y_extraInitializers);
165+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
166+
C = _classThis = _classDescriptor.value;
167+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
168+
})();
169+
/*29*/
170+
_C_y = { value: (__runInitializers(_classThis, _staticExtraInitializers), __runInitializers(_classThis, _static_private_y_initializers, 1)) };
171+
_C_z_accessor_storage = { value: (__runInitializers(_classThis, _static_private_y_extraInitializers), __runInitializers(_classThis, _static_private_z_initializers, 1)) };
172+
(() => {
173+
__runInitializers(_classThis, _static_private_z_extraInitializers);
174+
__runInitializers(_classThis, _classExtraInitializers);
175+
})();
177176
return C = _classThis;
178177
})());

0 commit comments

Comments
 (0)