diff --git a/src/compiler/transformers/esDecorators.ts b/src/compiler/transformers/esDecorators.ts index 0a3579d1e34f3..ede888850b445 100644 --- a/src/compiler/transformers/esDecorators.ts +++ b/src/compiler/transformers/esDecorators.ts @@ -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); - addRange(statements, visitNodes(node.body.statements, visitor, isStatement, nonPrologueStart)); + 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)); body = factory.createBlock(statements, /*multiLine*/ true); setOriginalNode(body, node.body); setTextRange(body, node.body); diff --git a/tests/baselines/reference/esDecorators-classExpression-classSuper.7.js b/tests/baselines/reference/esDecorators-classExpression-classSuper.7.js index 1558ab60ab93a..b496925f6861f 100644 --- a/tests/baselines/reference/esDecorators-classExpression-classSuper.7.js +++ b/tests/baselines/reference/esDecorators-classExpression-classSuper.7.js @@ -2,7 +2,10 @@ class A {} class B extends A { public constructor() { + 'inject'; super(); + const a = 1; + const b = 1; } @foo @@ -30,8 +33,11 @@ let B = (() => { __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() { } }; diff --git a/tests/cases/conformance/esDecorators/classExpression/classSuper/esDecorators-classExpression-classSuper.7.ts b/tests/cases/conformance/esDecorators/classExpression/classSuper/esDecorators-classExpression-classSuper.7.ts index 1a931f0edeca1..2c1452bbcbf4e 100644 --- a/tests/cases/conformance/esDecorators/classExpression/classSuper/esDecorators-classExpression-classSuper.7.ts +++ b/tests/cases/conformance/esDecorators/classExpression/classSuper/esDecorators-classExpression-classSuper.7.ts @@ -5,7 +5,10 @@ class A {} class B extends A { public constructor() { + 'inject'; super(); + const a = 1; + const b = 1; } @foo