diff --git a/src/compiler/transformers/esDecorators.ts b/src/compiler/transformers/esDecorators.ts index ede888850b4..c6cf63c3759 100644 --- a/src/compiler/transformers/esDecorators.ts +++ b/src/compiler/transformers/esDecorators.ts @@ -1074,10 +1074,15 @@ export function transformESDecorators(context: TransformationContext): (x: Sourc 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, indexOfFirstStatementAfterSuper)); + if (superStatementIndex >= 0) { + addRange(statements, visitNodes(node.body.statements, visitor, isStatement, nonPrologueStart, superStatementIndex + 1 - nonPrologueStart)); + addRange(statements, initializerStatements); + addRange(statements, visitNodes(node.body.statements, visitor, isStatement, superStatementIndex + 1)); + } + else { + addRange(statements, initializerStatements); + addRange(statements, visitNodes(node.body.statements, visitor, isStatement)); + } body = factory.createBlock(statements, /*multiLine*/ true); setOriginalNode(body, node.body); setTextRange(body, node.body); diff --git a/tests/baselines/reference/esDecorators-classDeclaration-classSuper.7.js b/tests/baselines/reference/esDecorators-classDeclaration-classSuper.7.js new file mode 100644 index 00000000000..e0f2c4397b0 --- /dev/null +++ b/tests/baselines/reference/esDecorators-classDeclaration-classSuper.7.js @@ -0,0 +1,101 @@ +//// [esDecorators-classDeclaration-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(); + +// https://github.com/microsoft/TypeScript/issues/53448 +class C { + public constructor() { + this.val; + } + + @foo + public get val(): number { return 3; } +} +class D extends A { + public constructor() { + super(); + this.val; + } + + @foo + public get val(): number { return 3; } +} + + +//// [esDecorators-classDeclaration-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(); +// https://github.com/microsoft/TypeScript/issues/53448 +let C = (() => { + let _instanceExtraInitializers_1 = []; + let _get_val_decorators; + return class C { + static { + _get_val_decorators = [foo]; + __esDecorate(this, null, _get_val_decorators, { kind: "getter", name: "val", static: false, private: false, access: { has: obj => "val" in obj, get: obj => obj.val } }, null, _instanceExtraInitializers_1); + } + constructor() { + __runInitializers(this, _instanceExtraInitializers_1); + this.val; + } + get val() { return 3; } + }; +})(); +let D = (() => { + let _instanceExtraInitializers_2 = []; + let _get_val_decorators; + return class D extends A { + static { + _get_val_decorators = [foo]; + __esDecorate(this, null, _get_val_decorators, { kind: "getter", name: "val", static: false, private: false, access: { has: obj => "val" in obj, get: obj => obj.val } }, null, _instanceExtraInitializers_2); + } + constructor() { + super(); + __runInitializers(this, _instanceExtraInitializers_2); + this.val; + } + get val() { return 3; } + }; +})(); diff --git a/tests/baselines/reference/esDecorators-classExpression-classSuper.7.js b/tests/baselines/reference/esDecorators-classExpression-classSuper.7.js deleted file mode 100644 index b496925f686..00000000000 --- a/tests/baselines/reference/esDecorators-classExpression-classSuper.7.js +++ /dev/null @@ -1,50 +0,0 @@ -//// [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(); diff --git a/tests/cases/conformance/esDecorators/classExpression/classSuper/esDecorators-classExpression-classSuper.7.ts b/tests/cases/conformance/esDecorators/classDeclaration/classSuper/esDecorators-classDeclaration-classSuper.7.ts similarity index 51% rename from tests/cases/conformance/esDecorators/classExpression/classSuper/esDecorators-classExpression-classSuper.7.ts rename to tests/cases/conformance/esDecorators/classDeclaration/classSuper/esDecorators-classDeclaration-classSuper.7.ts index 2c1452bbcbf..0365481bfc2 100644 --- a/tests/cases/conformance/esDecorators/classExpression/classSuper/esDecorators-classExpression-classSuper.7.ts +++ b/tests/cases/conformance/esDecorators/classDeclaration/classSuper/esDecorators-classDeclaration-classSuper.7.ts @@ -22,3 +22,22 @@ function foo(method: any, _context: any): any { } new B(); + +// https://github.com/microsoft/TypeScript/issues/53448 +class C { + public constructor() { + this.val; + } + + @foo + public get val(): number { return 3; } +} +class D extends A { + public constructor() { + super(); + this.val; + } + + @foo + public get val(): number { return 3; } +}