Skip to content

Commit

Permalink
🤖 Pick PR #53547 (Fix double-emit in constructor) into release-5.0 (#…
Browse files Browse the repository at this point in the history
…53550)

Co-authored-by: Ron Buckton <ron.buckton@microsoft.com>
  • Loading branch information
typescript-bot and rbuckton committed Mar 28, 2023
1 parent b78f920 commit aebd31b
Show file tree
Hide file tree
Showing 4 changed files with 129 additions and 54 deletions.
13 changes: 9 additions & 4 deletions src/compiler/transformers/esDecorators.ts
Expand Up @@ -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);
Expand Down
@@ -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; }
};
})();

This file was deleted.

Expand Up @@ -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; }
}

0 comments on commit aebd31b

Please sign in to comment.