Skip to content

Commit 54f3b41

Browse files
Merge pull request microsoft#4124 from ShyykoSerhiy/fix-3991
Fix for "Error for missing 'super' call is misleading"
2 parents ea3eb01 + 9f36eb5 commit 54f3b41

11 files changed

+290
-6
lines changed

src/compiler/checker.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10470,17 +10470,21 @@ namespace ts {
1047010470
return n.kind === SyntaxKind.CallExpression && (<CallExpression>n).expression.kind === SyntaxKind.SuperKeyword;
1047110471
}
1047210472

10473+
function containsSuperCallAsComputedPropertyName(n: Declaration): boolean {
10474+
return n.name && containsSuperCall(n.name);
10475+
}
10476+
1047310477
function containsSuperCall(n: Node): boolean {
1047410478
if (isSuperCallExpression(n)) {
1047510479
return true;
1047610480
}
10477-
switch (n.kind) {
10478-
case SyntaxKind.FunctionExpression:
10479-
case SyntaxKind.FunctionDeclaration:
10480-
case SyntaxKind.ArrowFunction:
10481-
case SyntaxKind.ObjectLiteralExpression: return false;
10482-
default: return forEachChild(n, containsSuperCall);
10481+
else if (isFunctionLike(n)) {
10482+
return false;
10483+
}
10484+
else if (isClassLike(n)) {
10485+
return forEach((<ClassLikeDeclaration>n).members, containsSuperCallAsComputedPropertyName);
1048310486
}
10487+
return forEachChild(n, containsSuperCall);
1048410488
}
1048510489

1048610490
function markThisReferencesAsErrors(n: Node): void {
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
tests/cases/compiler/superCallInsideClassDeclaration.ts(8,5): error TS2377: Constructors for derived classes must contain a 'super' call.
2+
3+
4+
==== tests/cases/compiler/superCallInsideClassDeclaration.ts (1 errors) ====
5+
class A {
6+
}
7+
8+
class C {
9+
}
10+
11+
class B extends A {
12+
constructor() {
13+
~~~~~~~~~~~~~~~
14+
15+
16+
class D extends C {
17+
~~~~~~~~~~~~~~~~~~~~~~~~~~~
18+
constructor() {
19+
~~~~~~~~~~~~~~~~~~~~~~~~~~~
20+
super();
21+
~~~~~~~~~~~~~~~~~~~~~~~~
22+
}
23+
~~~~~~~~~~~~~
24+
}
25+
~~~~~~~~~
26+
}
27+
~~~~~
28+
!!! error TS2377: Constructors for derived classes must contain a 'super' call.
29+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
//// [superCallInsideClassDeclaration.ts]
2+
class A {
3+
}
4+
5+
class C {
6+
}
7+
8+
class B extends A {
9+
constructor() {
10+
11+
class D extends C {
12+
constructor() {
13+
super();
14+
}
15+
}
16+
}
17+
}
18+
19+
//// [superCallInsideClassDeclaration.js]
20+
var __extends = (this && this.__extends) || function (d, b) {
21+
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
22+
function __() { this.constructor = d; }
23+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
24+
};
25+
var A = (function () {
26+
function A() {
27+
}
28+
return A;
29+
})();
30+
var C = (function () {
31+
function C() {
32+
}
33+
return C;
34+
})();
35+
var B = (function (_super) {
36+
__extends(B, _super);
37+
function B() {
38+
var D = (function (_super) {
39+
__extends(D, _super);
40+
function D() {
41+
_super.call(this);
42+
}
43+
return D;
44+
})(C);
45+
}
46+
return B;
47+
})(A);
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
tests/cases/compiler/superCallInsideClassExpression.ts(8,5): error TS2377: Constructors for derived classes must contain a 'super' call.
2+
3+
4+
==== tests/cases/compiler/superCallInsideClassExpression.ts (1 errors) ====
5+
class A {
6+
}
7+
8+
class C {
9+
}
10+
11+
class B extends A {
12+
constructor() {
13+
~~~~~~~~~~~~~~~
14+
15+
16+
var D = class extends C {
17+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
18+
constructor() {
19+
~~~~~~~~~~~~~~~~~~~~~~~~~~~
20+
super();
21+
~~~~~~~~~~~~~~~~~~~~~~~~
22+
}
23+
~~~~~~~~~~~~~
24+
}
25+
~~~~~~~~~
26+
}
27+
~~~~~
28+
!!! error TS2377: Constructors for derived classes must contain a 'super' call.
29+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
//// [superCallInsideClassExpression.ts]
2+
class A {
3+
}
4+
5+
class C {
6+
}
7+
8+
class B extends A {
9+
constructor() {
10+
11+
var D = class extends C {
12+
constructor() {
13+
super();
14+
}
15+
}
16+
}
17+
}
18+
19+
//// [superCallInsideClassExpression.js]
20+
var __extends = (this && this.__extends) || function (d, b) {
21+
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
22+
function __() { this.constructor = d; }
23+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
24+
};
25+
var A = (function () {
26+
function A() {
27+
}
28+
return A;
29+
})();
30+
var C = (function () {
31+
function C() {
32+
}
33+
return C;
34+
})();
35+
var B = (function (_super) {
36+
__extends(B, _super);
37+
function B() {
38+
var D = (function (_super) {
39+
__extends(class_1, _super);
40+
function class_1() {
41+
_super.call(this);
42+
}
43+
return class_1;
44+
})(C);
45+
}
46+
return B;
47+
})(A);
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
//// [superCallInsideObjectLiteralExpression.ts]
2+
class A {
3+
foo() {
4+
}
5+
}
6+
7+
class B extends A {
8+
constructor() {
9+
var x = {
10+
x: super()
11+
}
12+
}
13+
}
14+
15+
//// [superCallInsideObjectLiteralExpression.js]
16+
var __extends = (this && this.__extends) || function (d, b) {
17+
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
18+
function __() { this.constructor = d; }
19+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
20+
};
21+
var A = (function () {
22+
function A() {
23+
}
24+
A.prototype.foo = function () {
25+
};
26+
return A;
27+
})();
28+
var B = (function (_super) {
29+
__extends(B, _super);
30+
function B() {
31+
var x = {
32+
x: _super.call(this)
33+
};
34+
}
35+
return B;
36+
})(A);
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
=== tests/cases/compiler/superCallInsideObjectLiteralExpression.ts ===
2+
class A {
3+
>A : Symbol(A, Decl(superCallInsideObjectLiteralExpression.ts, 0, 0))
4+
5+
foo() {
6+
>foo : Symbol(foo, Decl(superCallInsideObjectLiteralExpression.ts, 0, 9))
7+
}
8+
}
9+
10+
class B extends A {
11+
>B : Symbol(B, Decl(superCallInsideObjectLiteralExpression.ts, 3, 1))
12+
>A : Symbol(A, Decl(superCallInsideObjectLiteralExpression.ts, 0, 0))
13+
14+
constructor() {
15+
var x = {
16+
>x : Symbol(x, Decl(superCallInsideObjectLiteralExpression.ts, 7, 11))
17+
18+
x: super()
19+
>x : Symbol(x, Decl(superCallInsideObjectLiteralExpression.ts, 7, 17))
20+
>super : Symbol(A, Decl(superCallInsideObjectLiteralExpression.ts, 0, 0))
21+
}
22+
}
23+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
=== tests/cases/compiler/superCallInsideObjectLiteralExpression.ts ===
2+
class A {
3+
>A : A
4+
5+
foo() {
6+
>foo : () => void
7+
}
8+
}
9+
10+
class B extends A {
11+
>B : B
12+
>A : A
13+
14+
constructor() {
15+
var x = {
16+
>x : { x: void; }
17+
>{ x: super() } : { x: void; }
18+
19+
x: super()
20+
>x : void
21+
>super() : void
22+
>super : typeof A
23+
}
24+
}
25+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
class A {
2+
}
3+
4+
class C {
5+
}
6+
7+
class B extends A {
8+
constructor() {
9+
10+
class D extends C {
11+
constructor() {
12+
super();
13+
}
14+
}
15+
}
16+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
class A {
2+
}
3+
4+
class C {
5+
}
6+
7+
class B extends A {
8+
constructor() {
9+
10+
var D = class extends C {
11+
constructor() {
12+
super();
13+
}
14+
}
15+
}
16+
}

0 commit comments

Comments
 (0)