diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 7717f51bd50fe..528025da1b2d0 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -2605,6 +2605,10 @@ "category": "Error", "code": 2753 }, + "'super' may not use type arguments.": { + "category": "Error", + "code": 2754 + }, "Import declaration '{0}' is using private name '{1}'.": { "category": "Error", diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index d185354ba8013..cb3305849219b 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -4189,6 +4189,14 @@ namespace ts { function parseSuperExpression(): MemberExpression { const expression = parseTokenNode(); + if (token() === SyntaxKind.LessThanToken) { + const startPos = getNodePos(); + const typeArguments = tryParse(parseTypeArgumentsInExpression); + if (typeArguments !== undefined) { + parseErrorAt(startPos, getNodePos(), Diagnostics.super_may_not_use_type_arguments); + } + } + if (token() === SyntaxKind.OpenParenToken || token() === SyntaxKind.DotToken || token() === SyntaxKind.OpenBracketToken) { return expression; } diff --git a/tests/baselines/reference/errorSuperCalls.errors.txt b/tests/baselines/reference/errorSuperCalls.errors.txt index 036367fd44b52..5d53d6719e08b 100644 --- a/tests/baselines/reference/errorSuperCalls.errors.txt +++ b/tests/baselines/reference/errorSuperCalls.errors.txt @@ -7,15 +7,14 @@ tests/cases/conformance/expressions/superCalls/errorSuperCalls.ts(26,9): error T tests/cases/conformance/expressions/superCalls/errorSuperCalls.ts(30,16): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. tests/cases/conformance/expressions/superCalls/errorSuperCalls.ts(34,9): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. tests/cases/conformance/expressions/superCalls/errorSuperCalls.ts(38,9): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. -tests/cases/conformance/expressions/superCalls/errorSuperCalls.ts(46,9): error TS17011: 'super' must be called before accessing a property of 'super' in the constructor of a derived class. -tests/cases/conformance/expressions/superCalls/errorSuperCalls.ts(46,14): error TS1034: 'super' must be followed by an argument list or member access. +tests/cases/conformance/expressions/superCalls/errorSuperCalls.ts(46,14): error TS2754: 'super' may not use type arguments. tests/cases/conformance/expressions/superCalls/errorSuperCalls.ts(58,9): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. tests/cases/conformance/expressions/superCalls/errorSuperCalls.ts(62,9): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. tests/cases/conformance/expressions/superCalls/errorSuperCalls.ts(67,9): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. tests/cases/conformance/expressions/superCalls/errorSuperCalls.ts(71,9): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. -==== tests/cases/conformance/expressions/superCalls/errorSuperCalls.ts (15 errors) ==== +==== tests/cases/conformance/expressions/superCalls/errorSuperCalls.ts (14 errors) ==== //super call in class constructor with no base type class NoBase { constructor() { @@ -80,10 +79,8 @@ tests/cases/conformance/expressions/superCalls/errorSuperCalls.ts(71,9): error T //super call with type arguments constructor() { super(); - ~~~~~ -!!! error TS17011: 'super' must be called before accessing a property of 'super' in the constructor of a derived class. - ~ -!!! error TS1034: 'super' must be followed by an argument list or member access. + ~~~~~~~~ +!!! error TS2754: 'super' may not use type arguments. super(); } } diff --git a/tests/baselines/reference/errorSuperCalls.js b/tests/baselines/reference/errorSuperCalls.js index 8048ed34aa63a..11cda4b76f7cb 100644 --- a/tests/baselines/reference/errorSuperCalls.js +++ b/tests/baselines/reference/errorSuperCalls.js @@ -140,8 +140,7 @@ var Derived = /** @class */ (function (_super) { __extends(Derived, _super); //super call with type arguments function Derived() { - var _this = this; - _super.prototype..call(_this); + var _this = _super.call(this) || this; _this = _super.call(this) || this; return _this; } diff --git a/tests/baselines/reference/errorSuperCalls.types b/tests/baselines/reference/errorSuperCalls.types index 3265475a13e27..31de16c40778c 100644 --- a/tests/baselines/reference/errorSuperCalls.types +++ b/tests/baselines/reference/errorSuperCalls.types @@ -91,10 +91,8 @@ class Derived extends Base { //super call with type arguments constructor() { super(); ->super() : any ->super : any ->super : Base -> : any +>super() : void +>super : typeof Base super(); >super() : void diff --git a/tests/baselines/reference/parserSuperExpression2.errors.txt b/tests/baselines/reference/parserSuperExpression2.errors.txt index cf3f7052d60a1..7363b284ebdbf 100644 --- a/tests/baselines/reference/parserSuperExpression2.errors.txt +++ b/tests/baselines/reference/parserSuperExpression2.errors.txt @@ -1,17 +1,14 @@ -tests/cases/conformance/parser/ecmascript5/SuperExpressions/parserSuperExpression2.ts(3,5): error TS2335: 'super' can only be referenced in a derived class. -tests/cases/conformance/parser/ecmascript5/SuperExpressions/parserSuperExpression2.ts(3,10): error TS1034: 'super' must be followed by an argument list or member access. -tests/cases/conformance/parser/ecmascript5/SuperExpressions/parserSuperExpression2.ts(3,11): error TS2304: Cannot find name 'T'. +tests/cases/conformance/parser/ecmascript5/SuperExpressions/parserSuperExpression2.ts(3,5): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. +tests/cases/conformance/parser/ecmascript5/SuperExpressions/parserSuperExpression2.ts(3,10): error TS2754: 'super' may not use type arguments. -==== tests/cases/conformance/parser/ecmascript5/SuperExpressions/parserSuperExpression2.ts (3 errors) ==== +==== tests/cases/conformance/parser/ecmascript5/SuperExpressions/parserSuperExpression2.ts (2 errors) ==== class C { M() { super(0); ~~~~~ -!!! error TS2335: 'super' can only be referenced in a derived class. - ~ -!!! error TS1034: 'super' must be followed by an argument list or member access. - ~ -!!! error TS2304: Cannot find name 'T'. +!!! error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. + ~~~ +!!! error TS2754: 'super' may not use type arguments. } } \ No newline at end of file diff --git a/tests/baselines/reference/parserSuperExpression2.js b/tests/baselines/reference/parserSuperExpression2.js index 2a1a8e3a13c80..cbb8b74933d30 100644 --- a/tests/baselines/reference/parserSuperExpression2.js +++ b/tests/baselines/reference/parserSuperExpression2.js @@ -10,7 +10,7 @@ var C = /** @class */ (function () { function C() { } C.prototype.M = function () { - _super.prototype..call(this, 0); + _this = _super.call(this, 0) || this; }; return C; }()); diff --git a/tests/baselines/reference/parserSuperExpression2.types b/tests/baselines/reference/parserSuperExpression2.types index 163c42edce47f..78de3390ee11d 100644 --- a/tests/baselines/reference/parserSuperExpression2.types +++ b/tests/baselines/reference/parserSuperExpression2.types @@ -6,10 +6,8 @@ class C { >M : () => void super(0); ->super(0) : any +>super(0) : void >super : any ->super : any -> : any >0 : 0 } } diff --git a/tests/baselines/reference/superWithTypeArgument.errors.txt b/tests/baselines/reference/superWithTypeArgument.errors.txt index 5860cb466d93f..3ea27e403f468 100644 --- a/tests/baselines/reference/superWithTypeArgument.errors.txt +++ b/tests/baselines/reference/superWithTypeArgument.errors.txt @@ -1,23 +1,15 @@ -tests/cases/compiler/superWithTypeArgument.ts(6,5): error TS2377: Constructors for derived classes must contain a 'super' call. -tests/cases/compiler/superWithTypeArgument.ts(7,9): error TS17011: 'super' must be called before accessing a property of 'super' in the constructor of a derived class. -tests/cases/compiler/superWithTypeArgument.ts(7,14): error TS1034: 'super' must be followed by an argument list or member access. +tests/cases/compiler/superWithTypeArgument.ts(7,14): error TS2754: 'super' may not use type arguments. -==== tests/cases/compiler/superWithTypeArgument.ts (3 errors) ==== +==== tests/cases/compiler/superWithTypeArgument.ts (1 errors) ==== class C { } class D extends C { constructor() { - ~~~~~~~~~~~~~~~ super(); - ~~~~~~~~~~~~~~~~~~~ - ~~~~~ -!!! error TS17011: 'super' must be called before accessing a property of 'super' in the constructor of a derived class. - ~ -!!! error TS1034: 'super' must be followed by an argument list or member access. + ~~~ +!!! error TS2754: 'super' may not use type arguments. } - ~~~~~ -!!! error TS2377: Constructors for derived classes must contain a 'super' call. } \ No newline at end of file diff --git a/tests/baselines/reference/superWithTypeArgument.js b/tests/baselines/reference/superWithTypeArgument.js index d53b906546c3b..aa2e41751e0df 100644 --- a/tests/baselines/reference/superWithTypeArgument.js +++ b/tests/baselines/reference/superWithTypeArgument.js @@ -31,9 +31,7 @@ var C = /** @class */ (function () { var D = /** @class */ (function (_super) { __extends(D, _super); function D() { - var _this = this; - _super.prototype..call(_this); - return _this; + return _super.call(this) || this; } return D; }(C)); diff --git a/tests/baselines/reference/superWithTypeArgument.symbols b/tests/baselines/reference/superWithTypeArgument.symbols index eeb5919958f84..50990b4817e68 100644 --- a/tests/baselines/reference/superWithTypeArgument.symbols +++ b/tests/baselines/reference/superWithTypeArgument.symbols @@ -12,6 +12,5 @@ class D extends C { constructor() { super(); >super : Symbol(C, Decl(superWithTypeArgument.ts, 0, 0)) ->T : Symbol(T, Decl(superWithTypeArgument.ts, 4, 8)) } } diff --git a/tests/baselines/reference/superWithTypeArgument.types b/tests/baselines/reference/superWithTypeArgument.types index eabf0dc713b07..b843f65583371 100644 --- a/tests/baselines/reference/superWithTypeArgument.types +++ b/tests/baselines/reference/superWithTypeArgument.types @@ -10,9 +10,7 @@ class D extends C { constructor() { super(); ->super() : any ->super : any ->super : C -> : any +>super() : void +>super : typeof C } } diff --git a/tests/baselines/reference/superWithTypeArgument2.errors.txt b/tests/baselines/reference/superWithTypeArgument2.errors.txt index 473e7f3b7ad70..01cb6d31e3223 100644 --- a/tests/baselines/reference/superWithTypeArgument2.errors.txt +++ b/tests/baselines/reference/superWithTypeArgument2.errors.txt @@ -1,23 +1,18 @@ -tests/cases/compiler/superWithTypeArgument2.ts(6,5): error TS2377: Constructors for derived classes must contain a 'super' call. -tests/cases/compiler/superWithTypeArgument2.ts(7,9): error TS17011: 'super' must be called before accessing a property of 'super' in the constructor of a derived class. -tests/cases/compiler/superWithTypeArgument2.ts(7,14): error TS1034: 'super' must be followed by an argument list or member access. +tests/cases/compiler/superWithTypeArgument2.ts(7,14): error TS2754: 'super' may not use type arguments. +tests/cases/compiler/superWithTypeArgument2.ts(7,18): error TS2554: Expected 0 arguments, but got 1. -==== tests/cases/compiler/superWithTypeArgument2.ts (3 errors) ==== +==== tests/cases/compiler/superWithTypeArgument2.ts (2 errors) ==== class C { foo: T; } class D extends C { constructor(x) { - ~~~~~~~~~~~~~~~~ super(x); - ~~~~~~~~~~~~~~~~~~~~ - ~~~~~ -!!! error TS17011: 'super' must be called before accessing a property of 'super' in the constructor of a derived class. - ~ -!!! error TS1034: 'super' must be followed by an argument list or member access. + ~~~ +!!! error TS2754: 'super' may not use type arguments. + ~ +!!! error TS2554: Expected 0 arguments, but got 1. } - ~~~~~ -!!! error TS2377: Constructors for derived classes must contain a 'super' call. } \ No newline at end of file diff --git a/tests/baselines/reference/superWithTypeArgument2.js b/tests/baselines/reference/superWithTypeArgument2.js index 1bbb5226f6e0c..33d6ef13532e4 100644 --- a/tests/baselines/reference/superWithTypeArgument2.js +++ b/tests/baselines/reference/superWithTypeArgument2.js @@ -31,9 +31,7 @@ var C = /** @class */ (function () { var D = /** @class */ (function (_super) { __extends(D, _super); function D(x) { - var _this = this; - _super.prototype..call(_this, x); - return _this; + return _super.call(this, x) || this; } return D; }(C)); diff --git a/tests/baselines/reference/superWithTypeArgument2.symbols b/tests/baselines/reference/superWithTypeArgument2.symbols index c42450e872384..35a371cde104b 100644 --- a/tests/baselines/reference/superWithTypeArgument2.symbols +++ b/tests/baselines/reference/superWithTypeArgument2.symbols @@ -19,7 +19,6 @@ class D extends C { super(x); >super : Symbol(C, Decl(superWithTypeArgument2.ts, 0, 0)) ->T : Symbol(T, Decl(superWithTypeArgument2.ts, 4, 8)) >x : Symbol(x, Decl(superWithTypeArgument2.ts, 5, 16)) } } diff --git a/tests/baselines/reference/superWithTypeArgument2.types b/tests/baselines/reference/superWithTypeArgument2.types index d1aed13f237c9..4f3547cfe71e5 100644 --- a/tests/baselines/reference/superWithTypeArgument2.types +++ b/tests/baselines/reference/superWithTypeArgument2.types @@ -14,10 +14,8 @@ class D extends C { >x : any super(x); ->super(x) : any ->super : any ->super : C -> : any +>super(x) : void +>super : typeof C >x : any } } diff --git a/tests/baselines/reference/superWithTypeArgument3.errors.txt b/tests/baselines/reference/superWithTypeArgument3.errors.txt index 37e6681d7701c..fc6d10fd80c7c 100644 --- a/tests/baselines/reference/superWithTypeArgument3.errors.txt +++ b/tests/baselines/reference/superWithTypeArgument3.errors.txt @@ -1,9 +1,7 @@ -tests/cases/compiler/superWithTypeArgument3.ts(7,5): error TS2377: Constructors for derived classes must contain a 'super' call. -tests/cases/compiler/superWithTypeArgument3.ts(8,9): error TS17011: 'super' must be called before accessing a property of 'super' in the constructor of a derived class. -tests/cases/compiler/superWithTypeArgument3.ts(8,14): error TS1034: 'super' must be followed by an argument list or member access. +tests/cases/compiler/superWithTypeArgument3.ts(8,14): error TS2754: 'super' may not use type arguments. -==== tests/cases/compiler/superWithTypeArgument3.ts (3 errors) ==== +==== tests/cases/compiler/superWithTypeArgument3.ts (1 errors) ==== class C { foo: T; bar(x: U) { } @@ -11,16 +9,10 @@ tests/cases/compiler/superWithTypeArgument3.ts(8,14): error TS1034: 'super' must class D extends C { constructor() { - ~~~~~~~~~~~~~~~ super(); - ~~~~~~~~~~~~~~~~~~~ - ~~~~~ -!!! error TS17011: 'super' must be called before accessing a property of 'super' in the constructor of a derived class. - ~ -!!! error TS1034: 'super' must be followed by an argument list or member access. + ~~~ +!!! error TS2754: 'super' may not use type arguments. } - ~~~~~ -!!! error TS2377: Constructors for derived classes must contain a 'super' call. bar() { super.bar(null); } diff --git a/tests/baselines/reference/superWithTypeArgument3.js b/tests/baselines/reference/superWithTypeArgument3.js index 236f69b7a71ad..940dda49cb75c 100644 --- a/tests/baselines/reference/superWithTypeArgument3.js +++ b/tests/baselines/reference/superWithTypeArgument3.js @@ -36,9 +36,7 @@ var C = /** @class */ (function () { var D = /** @class */ (function (_super) { __extends(D, _super); function D() { - var _this = this; - _super.prototype..call(_this); - return _this; + return _super.call(this) || this; } D.prototype.bar = function () { _super.prototype.bar.call(this, null); diff --git a/tests/baselines/reference/superWithTypeArgument3.symbols b/tests/baselines/reference/superWithTypeArgument3.symbols index 9a6ff93596195..a596264aa7d85 100644 --- a/tests/baselines/reference/superWithTypeArgument3.symbols +++ b/tests/baselines/reference/superWithTypeArgument3.symbols @@ -23,7 +23,6 @@ class D extends C { constructor() { super(); >super : Symbol(C, Decl(superWithTypeArgument3.ts, 0, 0)) ->T : Symbol(T, Decl(superWithTypeArgument3.ts, 5, 8)) } bar() { >bar : Symbol(D.bar, Decl(superWithTypeArgument3.ts, 8, 5)) diff --git a/tests/baselines/reference/superWithTypeArgument3.types b/tests/baselines/reference/superWithTypeArgument3.types index f4e43d15a970e..d7b857471beec 100644 --- a/tests/baselines/reference/superWithTypeArgument3.types +++ b/tests/baselines/reference/superWithTypeArgument3.types @@ -16,10 +16,8 @@ class D extends C { constructor() { super(); ->super() : any ->super : any ->super : C -> : any +>super() : void +>super : typeof C } bar() { >bar : () => void diff --git a/tests/baselines/reference/taggedTemplatesWithTypeArguments2.errors.txt b/tests/baselines/reference/taggedTemplatesWithTypeArguments2.errors.txt index 4460743303153..3e451b0b3d7cb 100644 --- a/tests/baselines/reference/taggedTemplatesWithTypeArguments2.errors.txt +++ b/tests/baselines/reference/taggedTemplatesWithTypeArguments2.errors.txt @@ -3,10 +3,11 @@ tests/cases/conformance/es6/templates/taggedTemplatesWithTypeArguments2.ts(15,11 tests/cases/conformance/es6/templates/taggedTemplatesWithTypeArguments2.ts(17,30): error TS2345: Argument of type '"hello"' is not assignable to parameter of type 'number'. tests/cases/conformance/es6/templates/taggedTemplatesWithTypeArguments2.ts(35,5): error TS2377: Constructors for derived classes must contain a 'super' call. tests/cases/conformance/es6/templates/taggedTemplatesWithTypeArguments2.ts(36,9): error TS17011: 'super' must be called before accessing a property of 'super' in the constructor of a derived class. -tests/cases/conformance/es6/templates/taggedTemplatesWithTypeArguments2.ts(36,14): error TS1034: 'super' must be followed by an argument list or member access. +tests/cases/conformance/es6/templates/taggedTemplatesWithTypeArguments2.ts(36,14): error TS2754: 'super' may not use type arguments. +tests/cases/conformance/es6/templates/taggedTemplatesWithTypeArguments2.ts(36,34): error TS1034: 'super' must be followed by an argument list or member access. -==== tests/cases/conformance/es6/templates/taggedTemplatesWithTypeArguments2.ts (6 errors) ==== +==== tests/cases/conformance/es6/templates/taggedTemplatesWithTypeArguments2.ts (7 errors) ==== export interface SomethingTaggable { (t: TemplateStringsArray, ...args: T[]): SomethingNewable; } @@ -53,7 +54,9 @@ tests/cases/conformance/es6/templates/taggedTemplatesWithTypeArguments2.ts(36,14 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~ !!! error TS17011: 'super' must be called before accessing a property of 'super' in the constructor of a derived class. - ~ + ~~~~~~~~~~~~~~~~~~~ +!!! error TS2754: 'super' may not use type arguments. + ~~~~~~~~~~~~~ !!! error TS1034: 'super' must be followed by an argument list or member access. } ~~~~~ diff --git a/tests/baselines/reference/taggedTemplatesWithTypeArguments2.symbols b/tests/baselines/reference/taggedTemplatesWithTypeArguments2.symbols index 631770a30ddc7..4196d6860fd60 100644 --- a/tests/baselines/reference/taggedTemplatesWithTypeArguments2.symbols +++ b/tests/baselines/reference/taggedTemplatesWithTypeArguments2.symbols @@ -78,6 +78,5 @@ class SomeDerived extends SomeBase { constructor() { super `hello world`; >super : Symbol(SomeBase, Decl(taggedTemplatesWithTypeArguments2.ts, 27, 10)) ->T : Symbol(T, Decl(taggedTemplatesWithTypeArguments2.ts, 33, 18)) } } diff --git a/tests/baselines/reference/taggedTemplatesWithTypeArguments2.types b/tests/baselines/reference/taggedTemplatesWithTypeArguments2.types index ee7661d84eb7d..bcb1a3c1e269c 100644 --- a/tests/baselines/reference/taggedTemplatesWithTypeArguments2.types +++ b/tests/baselines/reference/taggedTemplatesWithTypeArguments2.types @@ -92,7 +92,7 @@ class SomeDerived extends SomeBase { constructor() { super `hello world`; >super `hello world` : any ->super : any +>super : any >super : SomeBase > : any >`hello world` : "hello world"