🤖 Pick PR #53268 (fix(53204): Bug: __runInitializers(...) into release-5.0 (#53273)

Co-authored-by: Oleksandr T <oleksandr.tarasiuk@outlook.com>
This commit is contained in:
TypeScript Bot
2023-03-15 15:39:00 -07:00
committed by GitHub
parent cb69c8a717
commit 0e765ac48d
3 changed files with 79 additions and 1 deletions

View File

@@ -36,6 +36,7 @@ import {
Expression,
ExpressionStatement,
findComputedPropertyNameCacheAssignment,
findSuperStatementIndex,
firstOrUndefined,
forEachEntry,
ForStatement,
@@ -1072,8 +1073,11 @@ export function transformESDecorators(context: TransformationContext): (x: Sourc
if (initializerStatements) {
const statements: Statement[] = [];
const nonPrologueStart = factory.copyPrologue(node.body.statements, statements, /*ensureUseStrict*/ false, visitor);
const superStatementIndex = findSuperStatementIndex(node.body.statements, nonPrologueStart);
const indexOfFirstStatementAfterSuper = superStatementIndex >= 0 ? superStatementIndex + 1 : undefined;
addRange(statements, visitNodes(node.body.statements, visitor, isStatement, nonPrologueStart, indexOfFirstStatementAfterSuper ? indexOfFirstStatementAfterSuper - nonPrologueStart : undefined));
addRange(statements, initializerStatements);
addRange(statements, visitNodes(node.body.statements, visitor, isStatement, nonPrologueStart));
addRange(statements, visitNodes(node.body.statements, visitor, isStatement, indexOfFirstStatementAfterSuper));
body = factory.createBlock(statements, /*multiLine*/ true);
setOriginalNode(body, node.body);
setTextRange(body, node.body);

View File

@@ -0,0 +1,50 @@
//// [esDecorators-classExpression-classSuper.7.ts]
class A {}
class B extends A {
public constructor() {
'inject';
super();
const a = 1;
const b = 1;
}
@foo
public m(): void {}
}
function foo(method: any, _context: any): any {
return function (this: any) {
method.call(this);
};
}
new B();
//// [esDecorators-classExpression-classSuper.7.js]
class A {
}
let B = (() => {
let _instanceExtraInitializers = [];
let _m_decorators;
return class B extends A {
static {
_m_decorators = [foo];
__esDecorate(this, null, _m_decorators, { kind: "method", name: "m", static: false, private: false, access: { has: obj => "m" in obj, get: obj => obj.m } }, null, _instanceExtraInitializers);
}
constructor() {
'inject';
super();
__runInitializers(this, _instanceExtraInitializers);
const a = 1;
const b = 1;
}
m() { }
};
})();
function foo(method, _context) {
return function () {
method.call(this);
};
}
new B();

View File

@@ -0,0 +1,24 @@
// @target: es2022
// @noEmitHelpers: true
// @noTypesAndSymbols: true
class A {}
class B extends A {
public constructor() {
'inject';
super();
const a = 1;
const b = 1;
}
@foo
public m(): void {}
}
function foo(method: any, _context: any): any {
return function (this: any) {
method.call(this);
};
}
new B();