Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 10 additions & 9 deletions tsc/internal/transformers/estransforms/classfields.go
Original file line number Diff line number Diff line change
Expand Up @@ -2040,23 +2040,22 @@ func (tx *classFieldsTransformer) visitClassExpressionInNewClassLexicalEnvironme
}

staticPropertiesOrClassStaticBlocks := tx.getStaticPropertiesAndClassStaticBlock(node)
hasTransformableStatics := (tx.shouldTransformPrivateElementsOrClassStaticBlocks ||
tx.nodeHasTransformPrivateStaticElementsFlag(node)) &&
core.Some(staticPropertiesOrClassStaticBlocks, func(n *ast.Node) bool {
return ast.IsClassStaticBlockDeclaration(n) ||
ast.IsPrivateIdentifierClassElementDeclaration(n) ||
(tx.shouldTransformInitializers && ast.IsInitializedProperty(n))
})

// Pre-compute whether the class expression will need a temp variable wrapper.
// Strada registers class aliases AFTER transformClassMembers (since onSubstituteNode runs
// at emit time), but we must predict this before visiting members since we substitute
// eagerly. This requires pre-detecting willHavePrivatePendingExpressions.
isClassWithConstructorReference := false
hasTransformableStatics := false
deferTempDeclaration := false
if !isDecoratedClassDeclaration {
isClassWithConstructorReference = tx.classContainsConstructorReference(node)
hasTransformableStatics = (tx.shouldTransformPrivateElementsOrClassStaticBlocks ||
tx.nodeHasTransformPrivateStaticElementsFlag(node)) &&
core.Some(staticPropertiesOrClassStaticBlocks, func(n *ast.Node) bool {
return ast.IsClassStaticBlockDeclaration(n) ||
ast.IsPrivateIdentifierClassElementDeclaration(n) ||
(tx.shouldTransformInitializers && ast.IsInitializedProperty(n))
})

// Private instance elements (fields, methods, accessors) transformed to
// WeakMap/WeakSet will add initialization expressions to pendingExpressions
Expand Down Expand Up @@ -2139,7 +2138,7 @@ func (tx *classFieldsTransformer) visitClassExpressionInNewClassLexicalEnvironme
} else {
expressions = append(expressions, classExpression)
}
} else {
} else if hasTransformableStatics || len(tx.pendingExpressions) > 0 {
Comment thread
a-tarasyuk marked this conversation as resolved.
// Decorated class declaration path: emit static properties as separate statements
// via pendingStatements, matching the class declaration output structure.

Expand Down Expand Up @@ -2167,6 +2166,8 @@ func (tx *classFieldsTransformer) visitClassExpressionInNewClassLexicalEnvironme
} else {
expressions = append(expressions, classExpression)
}
} else {
expressions = append(expressions, classExpression)
}

if len(expressions) > 1 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,22 @@ declare let dec: any;

@dec class C {}

@dec class C1 {
#field = C1;
}

@dec class C2 {
#method() { return C2; }
}

@dec class C3 {
get #accessor() { return C3; }
}

@dec class C4 {
set #accessor(value: unknown) { C4; }
}

export {}

//// [b.ts]
Expand Down Expand Up @@ -41,6 +57,97 @@ let C = (() => {
})();
return C = _classThis;
})();
let C1 = (() => {
var _C1_field;
let _classDecorators = [dec];
let _classDescriptor;
let _classExtraInitializers = [];
let _classThis;
var C1 = _classThis = class {
constructor() {
_C1_field.set(this, C1);
}
};
_C1_field = new WeakMap();
__setFunctionName(_classThis, "C1");
(() => {
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
C1 = _classThis = _classDescriptor.value;
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
__runInitializers(_classThis, _classExtraInitializers);
})();
return C1 = _classThis;
})();
let C2 = (() => {
var _C2_instances, _C2_method;
let _classDecorators = [dec];
let _classDescriptor;
let _classExtraInitializers = [];
let _classThis;
var C2 = _classThis = class {
constructor() {
_C2_instances.add(this);
}
};
_C2_instances = new WeakSet();
_C2_method = function _C2_method() { return C2; };
__setFunctionName(_classThis, "C2");
(() => {
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
C2 = _classThis = _classDescriptor.value;
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
__runInitializers(_classThis, _classExtraInitializers);
})();
return C2 = _classThis;
})();
let C3 = (() => {
var _C3_instances, _C3_accessor_get;
let _classDecorators = [dec];
let _classDescriptor;
let _classExtraInitializers = [];
let _classThis;
var C3 = _classThis = class {
constructor() {
_C3_instances.add(this);
}
};
_C3_instances = new WeakSet();
_C3_accessor_get = function _C3_accessor_get() { return C3; };
__setFunctionName(_classThis, "C3");
(() => {
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
C3 = _classThis = _classDescriptor.value;
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
__runInitializers(_classThis, _classExtraInitializers);
})();
return C3 = _classThis;
})();
let C4 = (() => {
var _C4_instances, _C4_accessor_set;
let _classDecorators = [dec];
let _classDescriptor;
let _classExtraInitializers = [];
let _classThis;
var C4 = _classThis = class {
constructor() {
_C4_instances.add(this);
}
};
_C4_instances = new WeakSet();
_C4_accessor_set = function _C4_accessor_set(value) { C4; };
__setFunctionName(_classThis, "C4");
(() => {
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
C4 = _classThis = _classDescriptor.value;
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
__runInitializers(_classThis, _classExtraInitializers);
})();
return C4 = _classThis;
})();
export {};
//// [b.js]
let C = (() => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,22 @@ declare let dec: any;

@dec class C {}

@dec class C1 {
#field = C1;
}

@dec class C2 {
#method() { return C2; }
}

@dec class C3 {
get #accessor() { return C3; }
}

@dec class C4 {
set #accessor(value: unknown) { C4; }
}

export {}

//// [b.ts]
Expand Down Expand Up @@ -41,6 +57,82 @@ let C = (() => {
};
return C = _classThis;
})();
let C1 = (() => {
var _a;
let _classDecorators = [dec];
let _classDescriptor;
let _classExtraInitializers = [];
let _classThis;
var C1 = class {
static { _classThis = this; }
static {
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
C1 = _classThis = _classDescriptor.value;
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
__runInitializers(_classThis, _classExtraInitializers);
}
#field = C1;
};
return C1 = _classThis;
})();
let C2 = (() => {
var _a;
let _classDecorators = [dec];
let _classDescriptor;
let _classExtraInitializers = [];
let _classThis;
var C2 = class {
static { _classThis = this; }
static {
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
C2 = _classThis = _classDescriptor.value;
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
__runInitializers(_classThis, _classExtraInitializers);
}
#method() { return C2; }
};
return C2 = _classThis;
})();
let C3 = (() => {
var _a;
let _classDecorators = [dec];
let _classDescriptor;
let _classExtraInitializers = [];
let _classThis;
var C3 = class {
static { _classThis = this; }
static {
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
C3 = _classThis = _classDescriptor.value;
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
__runInitializers(_classThis, _classExtraInitializers);
}
get #accessor() { return C3; }
};
return C3 = _classThis;
})();
let C4 = (() => {
var _a;
let _classDecorators = [dec];
let _classDescriptor;
let _classExtraInitializers = [];
let _classThis;
var C4 = class {
static { _classThis = this; }
static {
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
C4 = _classThis = _classDescriptor.value;
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
__runInitializers(_classThis, _classExtraInitializers);
}
set #accessor(value) { C4; }
};
return C4 = _classThis;
})();
export {};
//// [b.js]
let C = (() => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,22 @@ declare let dec: any;

@dec class C {}

@dec class C1 {
#field = C1;
}

@dec class C2 {
#method() { return C2; }
}

@dec class C3 {
get #accessor() { return C3; }
}

@dec class C4 {
set #accessor(value: unknown) { C4; }
}

export {}

//// [b.ts]
Expand All @@ -27,6 +43,22 @@ declare let dec: any;
@dec
class C {
}
@dec
class C1 {
#field = C1;
}
@dec
class C2 {
#method() { return C2; }
}
@dec
class C3 {
get #accessor() { return C3; }
}
@dec
class C4 {
set #accessor(value) { C4; }
}
export {};
//// [b.js]
@dec
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
//// [tests/cases/conformance/esDecorators/classDeclaration/esDecorators-classDeclaration-setFunctionNameComputedField.ts] ////

//// [esDecorators-classDeclaration-setFunctionNameComputedField.ts]
declare let dec: any;

const keys = {
get field(): "field" { return "field"; }
};

@dec class C {
#self = C;
[keys.field] = 0;
}

export {};


//// [esDecorators-classDeclaration-setFunctionNameComputedField.js]
const keys = {
get field() { return "field"; }
};
let C = (() => {
var _a, _b;
let _classDecorators = [dec];
let _classDescriptor;
let _classExtraInitializers = [];
let _classThis;
var C = class {
static { _classThis = this; }
constructor() {
this.#self = C;
this[_b] = 0;
}
static { _b = keys.field; }
static {
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
C = _classThis = _classDescriptor.value;
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
__runInitializers(_classThis, _classExtraInitializers);
}
#self;
};
return C = _classThis;
})();
export {};
Loading