Skip to content

Commit

Permalink
Fix transformed constructor code when there is code between prologue …
Browse files Browse the repository at this point in the history
…statements and super call (microsoft#48765)
  • Loading branch information
patrickszmucer authored and Jack-Works committed Apr 22, 2022
1 parent b23af9c commit 59318e2
Show file tree
Hide file tree
Showing 5 changed files with 140 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/compiler/transformers/es2015.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1146,7 +1146,7 @@ namespace ts {
[
...existingPrologue,
...prologue,
...(superStatementIndex <= existingPrologue.length ? emptyArray : visitNodes(constructor.body.statements, visitor, isStatement, existingPrologue.length, superStatementIndex)),
...(superStatementIndex <= existingPrologue.length ? emptyArray : visitNodes(constructor.body.statements, visitor, isStatement, existingPrologue.length, superStatementIndex - existingPrologue.length)),
...statements
]
),
Expand Down
52 changes: 52 additions & 0 deletions tests/baselines/reference/constructorWithSuperAndPrologue.es5.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
//// [constructorWithSuperAndPrologue.es5.ts]
// https://github.com/microsoft/TypeScript/issues/48761
"use strict";

class A {
public constructor() {
console.log("A")
}
}

class B extends A {
constructor() {
"ngInject";
console.log("B")
super();
}
}


//// [constructorWithSuperAndPrologue.es5.js]
// https://github.com/microsoft/TypeScript/issues/48761
"use strict";
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
if (typeof b !== "function" && b !== null)
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
var A = /** @class */ (function () {
function A() {
console.log("A");
}
return A;
}());
var B = /** @class */ (function (_super) {
__extends(B, _super);
function B() {
"ngInject";
console.log("B");
return _super.call(this) || this;
}
return B;
}(A));
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
=== tests/cases/compiler/constructorWithSuperAndPrologue.es5.ts ===
// https://github.com/microsoft/TypeScript/issues/48761
"use strict";

class A {
>A : Symbol(A, Decl(constructorWithSuperAndPrologue.es5.ts, 1, 13))

public constructor() {
console.log("A")
>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
>console : Symbol(console, Decl(lib.dom.d.ts, --, --))
>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
}
}

class B extends A {
>B : Symbol(B, Decl(constructorWithSuperAndPrologue.es5.ts, 7, 1))
>A : Symbol(A, Decl(constructorWithSuperAndPrologue.es5.ts, 1, 13))

constructor() {
"ngInject";
console.log("B")
>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
>console : Symbol(console, Decl(lib.dom.d.ts, --, --))
>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))

super();
>super : Symbol(A, Decl(constructorWithSuperAndPrologue.es5.ts, 1, 13))
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
=== tests/cases/compiler/constructorWithSuperAndPrologue.es5.ts ===
// https://github.com/microsoft/TypeScript/issues/48761
"use strict";
>"use strict" : "use strict"

class A {
>A : A

public constructor() {
console.log("A")
>console.log("A") : void
>console.log : (...data: any[]) => void
>console : Console
>log : (...data: any[]) => void
>"A" : "A"
}
}

class B extends A {
>B : B
>A : A

constructor() {
"ngInject";
>"ngInject" : "ngInject"

console.log("B")
>console.log("B") : void
>console.log : (...data: any[]) => void
>console : Console
>log : (...data: any[]) => void
>"B" : "B"

super();
>super() : void
>super : typeof A
}
}

17 changes: 17 additions & 0 deletions tests/cases/compiler/constructorWithSuperAndPrologue.es5.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// @target: es5
// https://github.com/microsoft/TypeScript/issues/48761
"use strict";

class A {
public constructor() {
console.log("A")
}
}

class B extends A {
constructor() {
"ngInject";
console.log("B")
super();
}
}

0 comments on commit 59318e2

Please sign in to comment.