diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 799cde7cdb..28b19171db 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -4846,6 +4846,7 @@ namespace ts { return; } const baseTypeNode = getBaseTypeNodeOfClass(type); + const typeArgs = typeArgumentsFromTypeReferenceNode(baseTypeNode); let baseType: Type; const originalBaseType = baseConstructorType && baseConstructorType.symbol ? getDeclaredTypeOfSymbol(baseConstructorType.symbol) : undefined; if (baseConstructorType.symbol && baseConstructorType.symbol.flags & SymbolFlags.Class && @@ -4853,7 +4854,7 @@ namespace ts { // When base constructor type is a class with no captured type arguments we know that the constructors all have the same type parameters as the // class and all return the instance type of the class. There is no need for further checks and we can apply the // type arguments in the same manner as a type reference to get the same error reporting experience. - baseType = getTypeFromClassOrInterfaceReference(baseTypeNode, baseConstructorType.symbol, typeArgumentsFromTypeReferenceNode(baseTypeNode)); + baseType = getTypeFromClassOrInterfaceReference(baseTypeNode, baseConstructorType.symbol, typeArgs); } else if (baseConstructorType.flags & TypeFlags.Any) { baseType = baseConstructorType; diff --git a/tests/baselines/reference/parserGenericsInTypeContexts1.errors.txt b/tests/baselines/reference/parserGenericsInTypeContexts1.errors.txt index e98b618d78..fb7dbacf65 100644 --- a/tests/baselines/reference/parserGenericsInTypeContexts1.errors.txt +++ b/tests/baselines/reference/parserGenericsInTypeContexts1.errors.txt @@ -1,4 +1,5 @@ tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts1.ts(1,17): error TS2304: Cannot find name 'A'. +tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts1.ts(1,19): error TS2304: Cannot find name 'T'. tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts1.ts(1,33): error TS2304: Cannot find name 'B'. tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts1.ts(1,35): error TS2304: Cannot find name 'T'. tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts1.ts(4,9): error TS2315: Type 'C' is not generic. @@ -17,10 +18,12 @@ tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts1.ts(14,18): error TS2304: Cannot find name 'T'. -==== tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts1.ts (17 errors) ==== +==== tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts1.ts (18 errors) ==== class C extends A implements B { ~ !!! error TS2304: Cannot find name 'A'. + ~ +!!! error TS2304: Cannot find name 'T'. ~ !!! error TS2304: Cannot find name 'B'. ~ diff --git a/tests/baselines/reference/parserGenericsInTypeContexts2.errors.txt b/tests/baselines/reference/parserGenericsInTypeContexts2.errors.txt index 79acb0fb6f..4fa6016feb 100644 --- a/tests/baselines/reference/parserGenericsInTypeContexts2.errors.txt +++ b/tests/baselines/reference/parserGenericsInTypeContexts2.errors.txt @@ -1,4 +1,9 @@ tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts2.ts(1,17): error TS2304: Cannot find name 'A'. +tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts2.ts(1,19): error TS2304: Cannot find name 'X'. +tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts2.ts(1,21): error TS2304: Cannot find name 'T'. +tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts2.ts(1,25): error TS2304: Cannot find name 'Y'. +tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts2.ts(1,27): error TS2304: Cannot find name 'Z'. +tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts2.ts(1,29): error TS2304: Cannot find name 'T'. tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts2.ts(1,45): error TS2304: Cannot find name 'B'. tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts2.ts(1,47): error TS2304: Cannot find name 'X'. tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts2.ts(1,49): error TS2304: Cannot find name 'T'. @@ -49,10 +54,20 @@ tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts2.ts(14,28): error TS2304: Cannot find name 'T'. -==== tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts2.ts (49 errors) ==== +==== tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts2.ts (54 errors) ==== class C extends A, Y>> implements B, Y>> { ~ !!! error TS2304: Cannot find name 'A'. + ~ +!!! error TS2304: Cannot find name 'X'. + ~ +!!! error TS2304: Cannot find name 'T'. + ~ +!!! error TS2304: Cannot find name 'Y'. + ~ +!!! error TS2304: Cannot find name 'Z'. + ~ +!!! error TS2304: Cannot find name 'T'. ~ !!! error TS2304: Cannot find name 'B'. ~ diff --git a/tests/baselines/reference/unusedInvalidTypeArguments.errors.txt b/tests/baselines/reference/unusedInvalidTypeArguments.errors.txt index bd78839ab2..d524c71798 100644 --- a/tests/baselines/reference/unusedInvalidTypeArguments.errors.txt +++ b/tests/baselines/reference/unusedInvalidTypeArguments.errors.txt @@ -5,7 +5,7 @@ /classReference.ts(4,24): error TS2315: Type 'C' is not generic. /interface.ts(1,21): error TS2307: Cannot find module 'unknown'. /new.ts(1,21): error TS2307: Cannot find module 'unkown'. -/super.ts(1,19): error TS2307: Cannot find module 'unknown'. +/super.ts(1,22): error TS2307: Cannot find module 'unknown'. /super.ts(8,17): error TS2304: Cannot find name 'InvalidReference'. /typeReference.ts(6,17): error TS2315: Type 'U' is not generic. @@ -61,13 +61,13 @@ !!! error TS2304: Cannot find name 'InvalidReference'. ==== /super.ts (2 errors) ==== - import { C } from "unknown"; - ~~~~~~~~~ + import { A, B } from "unknown"; + ~~~~~~~~~ !!! error TS2307: Cannot find module 'unknown'. type T = number; - export class D extends C { + export class C extends A { m() { super.m(1); super.m(); // Should get error for type argument diff --git a/tests/baselines/reference/unusedInvalidTypeArguments.js b/tests/baselines/reference/unusedInvalidTypeArguments.js index 955845ea01..9f32181a0f 100644 --- a/tests/baselines/reference/unusedInvalidTypeArguments.js +++ b/tests/baselines/reference/unusedInvalidTypeArguments.js @@ -35,11 +35,11 @@ g(); g(); // Should get error for type argument //// [super.ts] -import { C } from "unknown"; +import { A, B } from "unknown"; type T = number; -export class D extends C { +export class C extends A { m() { super.m(1); super.m(); // Should get error for type argument @@ -108,15 +108,15 @@ var __extends = (this && this.__extends) || (function () { })(); exports.__esModule = true; var unknown_1 = require("unknown"); -var D = (function (_super) { - __extends(D, _super); - function D() { +var C = (function (_super) { + __extends(C, _super); + function C() { return _super !== null && _super.apply(this, arguments) || this; } - D.prototype.m = function () { + C.prototype.m = function () { _super.prototype.m.call(this, 1); _super.prototype.m.call(this); // Should get error for type argument }; - return D; -}(unknown_1.C)); -exports.D = D; + return C; +}(unknown_1.A)); +exports.C = C; diff --git a/tests/cases/compiler/unusedInvalidTypeArguments.ts b/tests/cases/compiler/unusedInvalidTypeArguments.ts index d0bcf0519a..3f4d56f8d3 100644 --- a/tests/cases/compiler/unusedInvalidTypeArguments.ts +++ b/tests/cases/compiler/unusedInvalidTypeArguments.ts @@ -34,11 +34,11 @@ g(); g(); // Should get error for type argument // @Filename: /super.ts -import { C } from "unknown"; +import { A, B } from "unknown"; type T = number; -export class D extends C { +export class C extends A { m() { super.m(1); super.m(); // Should get error for type argument