From 59392e72ebc3648b7a598c8058bbadc724da4963 Mon Sep 17 00:00:00 2001 From: Ivan Arcuschin Date: Thu, 24 Feb 2022 22:20:48 -0300 Subject: [PATCH 1/2] Use related spans for "implement abstract class" errors --- src/compiler/checker.ts | 25 ++++++++++++++-- src/compiler/diagnosticMessages.json | 4 +++ ...sDoesntImplementInheritedAbstractMember.ts | 1 + .../abstractPropertyNegative.errors.txt | 19 +++++------- .../classAbstractDeclarations.d.errors.txt | 15 ++++++---- .../reference/classAbstractExtends.errors.txt | 5 ++-- .../reference/classAbstractGeneric.errors.txt | 30 +++++++++---------- .../classAbstractInheritance.errors.txt | 15 ++++++---- .../classAbstractInstantiations2.errors.txt | 5 ++-- ...assAbstractOverrideWithAbstract.errors.txt | 5 ++-- ...ssAbstractUsingAbstractMethods2.errors.txt | 10 ++++--- ...xpressionExtendingAbstractClass.errors.txt | 5 ++-- .../mixinAbstractClasses.2.errors.txt | 5 ++-- 13 files changed, 88 insertions(+), 56 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 4293cd82cb7fc..15fb9de1a7fe7 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -36173,6 +36173,8 @@ namespace ts { // NOTE: assignability is checked in checkClassDeclaration const baseProperties = getPropertiesOfType(baseType); + const derivedClassDecl = getClassLikeDeclarationOfSymbol(type.symbol)!; + const inheritedAbstractMemberNotImplementedErrors: Diagnostic[] = []; basePropertyCheck: for (const baseProperty of baseProperties) { const base = getTargetSymbol(baseProperty); @@ -36193,7 +36195,6 @@ namespace ts { // type declaration, derived and base resolve to the same symbol even in the case of generic classes. if (derived === base) { // derived class inherits base without override/redeclaration - const derivedClassDecl = getClassLikeDeclarationOfSymbol(type.symbol)!; // It is an error to inherit an abstract member without implementing it or being declared abstract. // If there is no declaration for the derived class (as in the case of class expressions), @@ -36212,12 +36213,16 @@ namespace ts { } if (derivedClassDecl.kind === SyntaxKind.ClassExpression) { - error(derivedClassDecl, Diagnostics.Non_abstract_class_expression_does_not_implement_inherited_abstract_member_0_from_class_1, + const err = createDiagnosticForNode(derivedClassDecl, + Diagnostics.Non_abstract_class_expression_does_not_implement_inherited_abstract_member_0_from_class_1, symbolToString(baseProperty), typeToString(baseType)); + inheritedAbstractMemberNotImplementedErrors.push(err); } else { - error(derivedClassDecl, Diagnostics.Non_abstract_class_0_does_not_implement_inherited_abstract_member_1_from_class_2, + const err = createDiagnosticForNode(derivedClassDecl, + Diagnostics.Non_abstract_class_0_does_not_implement_inherited_abstract_member_1_from_class_2, typeToString(type), symbolToString(baseProperty), typeToString(baseType)); + inheritedAbstractMemberNotImplementedErrors.push(err); } } } @@ -36293,6 +36298,20 @@ namespace ts { error(getNameOfDeclaration(derived.valueDeclaration) || derived.valueDeclaration, errorMessage, typeToString(baseType), symbolToString(base), typeToString(type)); } } + + if (inheritedAbstractMemberNotImplementedErrors.length) { + const err = error( + derivedClassDecl, + Diagnostics.Non_abstract_class_0_does_not_implement_all_abstract_members_of_1, + typeToString(type), typeToString(baseType)); + + for (const inheritedAbstractMemberNotImplementedError of inheritedAbstractMemberNotImplementedErrors) { + addRelatedInfo( + err, + inheritedAbstractMemberNotImplementedError, + ); + } + } } function getNonInterhitedProperties(type: InterfaceType, baseTypes: BaseType[], properties: Symbol[]) { diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 6fa1d5fb476a8..2afbd5517f462 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -6346,5 +6346,9 @@ "Invalid value for 'jsxFragmentFactory'. '{0}' is not a valid identifier or qualified-name.": { "category": "Error", "code": 18035 + }, + "Non-abstract class '{0}' does not implement all abstract members of '{1}'": { + "category": "Error", + "code": 18036 } } diff --git a/src/services/codefixes/fixClassDoesntImplementInheritedAbstractMember.ts b/src/services/codefixes/fixClassDoesntImplementInheritedAbstractMember.ts index ae1a2448560de..b797a3fa37116 100644 --- a/src/services/codefixes/fixClassDoesntImplementInheritedAbstractMember.ts +++ b/src/services/codefixes/fixClassDoesntImplementInheritedAbstractMember.ts @@ -1,6 +1,7 @@ /* @internal */ namespace ts.codefix { const errorCodes = [ + Diagnostics.Non_abstract_class_0_does_not_implement_all_abstract_members_of_1.code, Diagnostics.Non_abstract_class_0_does_not_implement_inherited_abstract_member_1_from_class_2.code, Diagnostics.Non_abstract_class_expression_does_not_implement_inherited_abstract_member_0_from_class_1.code, ]; diff --git a/tests/baselines/reference/abstractPropertyNegative.errors.txt b/tests/baselines/reference/abstractPropertyNegative.errors.txt index fd09b024213c4..2efa3d52416c5 100644 --- a/tests/baselines/reference/abstractPropertyNegative.errors.txt +++ b/tests/baselines/reference/abstractPropertyNegative.errors.txt @@ -1,9 +1,6 @@ tests/cases/compiler/abstractPropertyNegative.ts(10,18): error TS2380: 'get' and 'set' accessor must have the same type. tests/cases/compiler/abstractPropertyNegative.ts(11,18): error TS2380: 'get' and 'set' accessor must have the same type. -tests/cases/compiler/abstractPropertyNegative.ts(13,7): error TS2515: Non-abstract class 'C' does not implement inherited abstract member 'm' from class 'B'. -tests/cases/compiler/abstractPropertyNegative.ts(13,7): error TS2515: Non-abstract class 'C' does not implement inherited abstract member 'mismatch' from class 'B'. -tests/cases/compiler/abstractPropertyNegative.ts(13,7): error TS2515: Non-abstract class 'C' does not implement inherited abstract member 'prop' from class 'B'. -tests/cases/compiler/abstractPropertyNegative.ts(13,7): error TS2515: Non-abstract class 'C' does not implement inherited abstract member 'readonlyProp' from class 'B'. +tests/cases/compiler/abstractPropertyNegative.ts(13,7): error TS18036: Non-abstract class 'C' does not implement all abstract members of 'B' tests/cases/compiler/abstractPropertyNegative.ts(15,5): error TS1244: Abstract methods can only appear within an abstract class. tests/cases/compiler/abstractPropertyNegative.ts(16,37): error TS1005: '{' expected. tests/cases/compiler/abstractPropertyNegative.ts(19,3): error TS2540: Cannot assign to 'ro' because it is a read-only property. @@ -19,7 +16,7 @@ tests/cases/compiler/abstractPropertyNegative.ts(40,9): error TS2676: Accessors tests/cases/compiler/abstractPropertyNegative.ts(41,18): error TS2676: Accessors must both be abstract or non-abstract. -==== tests/cases/compiler/abstractPropertyNegative.ts (16 errors) ==== +==== tests/cases/compiler/abstractPropertyNegative.ts (13 errors) ==== interface A { prop: string; m(): string; @@ -38,13 +35,11 @@ tests/cases/compiler/abstractPropertyNegative.ts(41,18): error TS2676: Accessors } class C extends B { ~ -!!! error TS2515: Non-abstract class 'C' does not implement inherited abstract member 'm' from class 'B'. - ~ -!!! error TS2515: Non-abstract class 'C' does not implement inherited abstract member 'mismatch' from class 'B'. - ~ -!!! error TS2515: Non-abstract class 'C' does not implement inherited abstract member 'prop' from class 'B'. - ~ -!!! error TS2515: Non-abstract class 'C' does not implement inherited abstract member 'readonlyProp' from class 'B'. +!!! error TS18036: Non-abstract class 'C' does not implement all abstract members of 'B' +!!! related TS2515 tests/cases/compiler/abstractPropertyNegative.ts:13:7: Non-abstract class 'C' does not implement inherited abstract member 'prop' from class 'B'. +!!! related TS2515 tests/cases/compiler/abstractPropertyNegative.ts:13:7: Non-abstract class 'C' does not implement inherited abstract member 'readonlyProp' from class 'B'. +!!! related TS2515 tests/cases/compiler/abstractPropertyNegative.ts:13:7: Non-abstract class 'C' does not implement inherited abstract member 'm' from class 'B'. +!!! related TS2515 tests/cases/compiler/abstractPropertyNegative.ts:13:7: Non-abstract class 'C' does not implement inherited abstract member 'mismatch' from class 'B'. readonly ro = "readonly please"; abstract notAllowed: string; ~~~~~~~~ diff --git a/tests/baselines/reference/classAbstractDeclarations.d.errors.txt b/tests/baselines/reference/classAbstractDeclarations.d.errors.txt index d71f53118af7f..8e6b004423230 100644 --- a/tests/baselines/reference/classAbstractDeclarations.d.errors.txt +++ b/tests/baselines/reference/classAbstractDeclarations.d.errors.txt @@ -1,8 +1,8 @@ tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractDeclarations.d.ts(2,5): error TS1242: 'abstract' modifier can only appear on a class, method, or property declaration. tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractDeclarations.d.ts(2,28): error TS1183: An implementation cannot be declared in ambient contexts. -tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractDeclarations.d.ts(11,15): error TS2515: Non-abstract class 'CC' does not implement inherited abstract member 'foo' from class 'AA'. -tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractDeclarations.d.ts(13,15): error TS2515: Non-abstract class 'DD' does not implement inherited abstract member 'foo' from class 'BB'. -tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractDeclarations.d.ts(17,15): error TS2515: Non-abstract class 'FF' does not implement inherited abstract member 'foo' from class 'CC'. +tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractDeclarations.d.ts(11,15): error TS18036: Non-abstract class 'CC' does not implement all abstract members of 'AA' +tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractDeclarations.d.ts(13,15): error TS18036: Non-abstract class 'DD' does not implement all abstract members of 'BB' +tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractDeclarations.d.ts(17,15): error TS18036: Non-abstract class 'FF' does not implement all abstract members of 'CC' ==== tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractDeclarations.d.ts (5 errors) ==== @@ -22,17 +22,20 @@ tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbst declare class CC extends AA {} ~~ -!!! error TS2515: Non-abstract class 'CC' does not implement inherited abstract member 'foo' from class 'AA'. +!!! error TS18036: Non-abstract class 'CC' does not implement all abstract members of 'AA' +!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractDeclarations.d.ts:11:15: Non-abstract class 'CC' does not implement inherited abstract member 'foo' from class 'AA'. declare class DD extends BB {} ~~ -!!! error TS2515: Non-abstract class 'DD' does not implement inherited abstract member 'foo' from class 'BB'. +!!! error TS18036: Non-abstract class 'DD' does not implement all abstract members of 'BB' +!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractDeclarations.d.ts:13:15: Non-abstract class 'DD' does not implement inherited abstract member 'foo' from class 'BB'. declare abstract class EE extends BB {} declare class FF extends CC {} ~~ -!!! error TS2515: Non-abstract class 'FF' does not implement inherited abstract member 'foo' from class 'CC'. +!!! error TS18036: Non-abstract class 'FF' does not implement all abstract members of 'CC' +!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractDeclarations.d.ts:17:15: Non-abstract class 'FF' does not implement inherited abstract member 'foo' from class 'CC'. declare abstract class GG extends CC {} diff --git a/tests/baselines/reference/classAbstractExtends.errors.txt b/tests/baselines/reference/classAbstractExtends.errors.txt index 60b0f9ae0ac42..f522e2183f1d7 100644 --- a/tests/baselines/reference/classAbstractExtends.errors.txt +++ b/tests/baselines/reference/classAbstractExtends.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractExtends.ts(9,7): error TS2515: Non-abstract class 'C' does not implement inherited abstract member 'bar' from class 'B'. +tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractExtends.ts(9,7): error TS18036: Non-abstract class 'C' does not implement all abstract members of 'B' ==== tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractExtends.ts (1 errors) ==== @@ -12,7 +12,8 @@ tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbst class C extends B { } ~ -!!! error TS2515: Non-abstract class 'C' does not implement inherited abstract member 'bar' from class 'B'. +!!! error TS18036: Non-abstract class 'C' does not implement all abstract members of 'B' +!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractExtends.ts:9:7: Non-abstract class 'C' does not implement inherited abstract member 'bar' from class 'B'. abstract class D extends B {} diff --git a/tests/baselines/reference/classAbstractGeneric.errors.txt b/tests/baselines/reference/classAbstractGeneric.errors.txt index fb5a4c32a39d1..987f78b314b33 100644 --- a/tests/baselines/reference/classAbstractGeneric.errors.txt +++ b/tests/baselines/reference/classAbstractGeneric.errors.txt @@ -1,12 +1,10 @@ -tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts(10,7): error TS2515: Non-abstract class 'C' does not implement inherited abstract member 'bar' from class 'A'. -tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts(10,7): error TS2515: Non-abstract class 'C' does not implement inherited abstract member 'foo' from class 'A'. -tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts(12,7): error TS2515: Non-abstract class 'D' does not implement inherited abstract member 'bar' from class 'A'. -tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts(12,7): error TS2515: Non-abstract class 'D' does not implement inherited abstract member 'foo' from class 'A'. -tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts(14,7): error TS2515: Non-abstract class 'E' does not implement inherited abstract member 'bar' from class 'A'. -tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts(18,7): error TS2515: Non-abstract class 'F' does not implement inherited abstract member 'foo' from class 'A'. +tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts(10,7): error TS18036: Non-abstract class 'C' does not implement all abstract members of 'A' +tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts(12,7): error TS18036: Non-abstract class 'D' does not implement all abstract members of 'A' +tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts(14,7): error TS18036: Non-abstract class 'E' does not implement all abstract members of 'A' +tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts(18,7): error TS18036: Non-abstract class 'F' does not implement all abstract members of 'A' -==== tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts (6 errors) ==== +==== tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts (4 errors) ==== abstract class A { t: T; @@ -18,25 +16,27 @@ tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbst class C extends A {} // error -- inherits abstract methods ~ -!!! error TS2515: Non-abstract class 'C' does not implement inherited abstract member 'bar' from class 'A'. - ~ -!!! error TS2515: Non-abstract class 'C' does not implement inherited abstract member 'foo' from class 'A'. +!!! error TS18036: Non-abstract class 'C' does not implement all abstract members of 'A' +!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts:10:7: Non-abstract class 'C' does not implement inherited abstract member 'foo' from class 'A'. +!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts:10:7: Non-abstract class 'C' does not implement inherited abstract member 'bar' from class 'A'. class D extends A {} // error -- inherits abstract methods ~ -!!! error TS2515: Non-abstract class 'D' does not implement inherited abstract member 'bar' from class 'A'. - ~ -!!! error TS2515: Non-abstract class 'D' does not implement inherited abstract member 'foo' from class 'A'. +!!! error TS18036: Non-abstract class 'D' does not implement all abstract members of 'A' +!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts:12:7: Non-abstract class 'D' does not implement inherited abstract member 'foo' from class 'A'. +!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts:12:7: Non-abstract class 'D' does not implement inherited abstract member 'bar' from class 'A'. class E extends A { // error -- doesn't implement bar ~ -!!! error TS2515: Non-abstract class 'E' does not implement inherited abstract member 'bar' from class 'A'. +!!! error TS18036: Non-abstract class 'E' does not implement all abstract members of 'A' +!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts:14:7: Non-abstract class 'E' does not implement inherited abstract member 'bar' from class 'A'. foo() { return this.t; } } class F extends A { // error -- doesn't implement foo ~ -!!! error TS2515: Non-abstract class 'F' does not implement inherited abstract member 'foo' from class 'A'. +!!! error TS18036: Non-abstract class 'F' does not implement all abstract members of 'A' +!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts:18:7: Non-abstract class 'F' does not implement inherited abstract member 'foo' from class 'A'. bar(t : T) {} } diff --git a/tests/baselines/reference/classAbstractInheritance.errors.txt b/tests/baselines/reference/classAbstractInheritance.errors.txt index 3e1062044150d..7404d4f6947ed 100644 --- a/tests/baselines/reference/classAbstractInheritance.errors.txt +++ b/tests/baselines/reference/classAbstractInheritance.errors.txt @@ -1,6 +1,6 @@ -tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractInheritance.ts(13,7): error TS2515: Non-abstract class 'CC' does not implement inherited abstract member 'foo' from class 'AA'. -tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractInheritance.ts(15,7): error TS2515: Non-abstract class 'DD' does not implement inherited abstract member 'foo' from class 'BB'. -tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractInheritance.ts(19,7): error TS2515: Non-abstract class 'FF' does not implement inherited abstract member 'foo' from class 'CC'. +tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractInheritance.ts(13,7): error TS18036: Non-abstract class 'CC' does not implement all abstract members of 'AA' +tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractInheritance.ts(15,7): error TS18036: Non-abstract class 'DD' does not implement all abstract members of 'BB' +tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractInheritance.ts(19,7): error TS18036: Non-abstract class 'FF' does not implement all abstract members of 'CC' ==== tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractInheritance.ts (3 errors) ==== @@ -18,16 +18,19 @@ tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbst class CC extends AA {} ~~ -!!! error TS2515: Non-abstract class 'CC' does not implement inherited abstract member 'foo' from class 'AA'. +!!! error TS18036: Non-abstract class 'CC' does not implement all abstract members of 'AA' +!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractInheritance.ts:13:7: Non-abstract class 'CC' does not implement inherited abstract member 'foo' from class 'AA'. class DD extends BB {} ~~ -!!! error TS2515: Non-abstract class 'DD' does not implement inherited abstract member 'foo' from class 'BB'. +!!! error TS18036: Non-abstract class 'DD' does not implement all abstract members of 'BB' +!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractInheritance.ts:15:7: Non-abstract class 'DD' does not implement inherited abstract member 'foo' from class 'BB'. abstract class EE extends BB {} class FF extends CC {} ~~ -!!! error TS2515: Non-abstract class 'FF' does not implement inherited abstract member 'foo' from class 'CC'. +!!! error TS18036: Non-abstract class 'FF' does not implement all abstract members of 'CC' +!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractInheritance.ts:19:7: Non-abstract class 'FF' does not implement inherited abstract member 'foo' from class 'CC'. abstract class GG extends CC {} \ No newline at end of file diff --git a/tests/baselines/reference/classAbstractInstantiations2.errors.txt b/tests/baselines/reference/classAbstractInstantiations2.errors.txt index 3d1cb33d483f7..898404ca5cf49 100644 --- a/tests/baselines/reference/classAbstractInstantiations2.errors.txt +++ b/tests/baselines/reference/classAbstractInstantiations2.errors.txt @@ -4,7 +4,7 @@ tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbst tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractInstantiations2.ts(17,5): error TS2511: Cannot create an instance of an abstract class. tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractInstantiations2.ts(21,1): error TS2511: Cannot create an instance of an abstract class. tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractInstantiations2.ts(23,15): error TS2449: Class 'C' used before its declaration. -tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractInstantiations2.ts(26,7): error TS2515: Non-abstract class 'C' does not implement inherited abstract member 'bar' from class 'B'. +tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractInstantiations2.ts(26,7): error TS18036: Non-abstract class 'C' does not implement all abstract members of 'B' tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractInstantiations2.ts(46,5): error TS2391: Function implementation is missing or not immediately following the declaration. tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractInstantiations2.ts(46,5): error TS2512: Overload signatures must all be abstract or non-abstract. tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractInstantiations2.ts(50,5): error TS1244: Abstract methods can only appear within an abstract class. @@ -50,7 +50,8 @@ tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbst class C extends B { } // error -- not declared abstract ~ -!!! error TS2515: Non-abstract class 'C' does not implement inherited abstract member 'bar' from class 'B'. +!!! error TS18036: Non-abstract class 'C' does not implement all abstract members of 'B' +!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractInstantiations2.ts:26:7: Non-abstract class 'C' does not implement inherited abstract member 'bar' from class 'B'. abstract class D extends B { } // okay diff --git a/tests/baselines/reference/classAbstractOverrideWithAbstract.errors.txt b/tests/baselines/reference/classAbstractOverrideWithAbstract.errors.txt index d9d073a07e0ec..40e78e901bea4 100644 --- a/tests/baselines/reference/classAbstractOverrideWithAbstract.errors.txt +++ b/tests/baselines/reference/classAbstractOverrideWithAbstract.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractOverrideWithAbstract.ts(19,7): error TS2515: Non-abstract class 'CC' does not implement inherited abstract member 'foo' from class 'BB'. +tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractOverrideWithAbstract.ts(19,7): error TS18036: Non-abstract class 'CC' does not implement all abstract members of 'BB' ==== tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractOverrideWithAbstract.ts (1 errors) ==== @@ -22,7 +22,8 @@ tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbst class CC extends BB {} // error ~~ -!!! error TS2515: Non-abstract class 'CC' does not implement inherited abstract member 'foo' from class 'BB'. +!!! error TS18036: Non-abstract class 'CC' does not implement all abstract members of 'BB' +!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractOverrideWithAbstract.ts:19:7: Non-abstract class 'CC' does not implement inherited abstract member 'foo' from class 'BB'. class DD extends BB { foo() {} diff --git a/tests/baselines/reference/classAbstractUsingAbstractMethods2.errors.txt b/tests/baselines/reference/classAbstractUsingAbstractMethods2.errors.txt index e01b233a4c1c0..e010f2b0b6718 100644 --- a/tests/baselines/reference/classAbstractUsingAbstractMethods2.errors.txt +++ b/tests/baselines/reference/classAbstractUsingAbstractMethods2.errors.txt @@ -1,6 +1,6 @@ tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractUsingAbstractMethods2.ts(2,5): error TS1244: Abstract methods can only appear within an abstract class. -tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractUsingAbstractMethods2.ts(5,7): error TS2515: Non-abstract class 'B' does not implement inherited abstract member 'foo' from class 'A'. -tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractUsingAbstractMethods2.ts(21,7): error TS2515: Non-abstract class 'BB' does not implement inherited abstract member 'foo' from class 'AA'. +tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractUsingAbstractMethods2.ts(5,7): error TS18036: Non-abstract class 'B' does not implement all abstract members of 'A' +tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractUsingAbstractMethods2.ts(21,7): error TS18036: Non-abstract class 'BB' does not implement all abstract members of 'AA' ==== tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractUsingAbstractMethods2.ts (3 errors) ==== @@ -12,7 +12,8 @@ tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbst class B extends A {} ~ -!!! error TS2515: Non-abstract class 'B' does not implement inherited abstract member 'foo' from class 'A'. +!!! error TS18036: Non-abstract class 'B' does not implement all abstract members of 'A' +!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractUsingAbstractMethods2.ts:5:7: Non-abstract class 'B' does not implement inherited abstract member 'foo' from class 'A'. abstract class C extends A {} @@ -30,7 +31,8 @@ tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbst class BB extends AA {} ~~ -!!! error TS2515: Non-abstract class 'BB' does not implement inherited abstract member 'foo' from class 'AA'. +!!! error TS18036: Non-abstract class 'BB' does not implement all abstract members of 'AA' +!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractUsingAbstractMethods2.ts:21:7: Non-abstract class 'BB' does not implement inherited abstract member 'foo' from class 'AA'. abstract class CC extends AA {} diff --git a/tests/baselines/reference/classExpressionExtendingAbstractClass.errors.txt b/tests/baselines/reference/classExpressionExtendingAbstractClass.errors.txt index b5d709fbf6069..43bebfe03b6d0 100644 --- a/tests/baselines/reference/classExpressionExtendingAbstractClass.errors.txt +++ b/tests/baselines/reference/classExpressionExtendingAbstractClass.errors.txt @@ -1,4 +1,4 @@ -tests/cases/compiler/classExpressionExtendingAbstractClass.ts(5,9): error TS2653: Non-abstract class expression does not implement inherited abstract member 'foo' from class 'A'. +tests/cases/compiler/classExpressionExtendingAbstractClass.ts(5,9): error TS18036: Non-abstract class 'C' does not implement all abstract members of 'A' ==== tests/cases/compiler/classExpressionExtendingAbstractClass.ts (1 errors) ==== @@ -8,7 +8,8 @@ tests/cases/compiler/classExpressionExtendingAbstractClass.ts(5,9): error TS2653 var C = class extends A { // no error reported! ~~~~~ -!!! error TS2653: Non-abstract class expression does not implement inherited abstract member 'foo' from class 'A'. +!!! error TS18036: Non-abstract class 'C' does not implement all abstract members of 'A' +!!! related TS2653 tests/cases/compiler/classExpressionExtendingAbstractClass.ts:5:9: Non-abstract class expression does not implement inherited abstract member 'foo' from class 'A'. }; \ No newline at end of file diff --git a/tests/baselines/reference/mixinAbstractClasses.2.errors.txt b/tests/baselines/reference/mixinAbstractClasses.2.errors.txt index 99a92c854628c..f4f80528c731c 100644 --- a/tests/baselines/reference/mixinAbstractClasses.2.errors.txt +++ b/tests/baselines/reference/mixinAbstractClasses.2.errors.txt @@ -1,5 +1,5 @@ tests/cases/conformance/classes/mixinAbstractClasses.2.ts(7,11): error TS2797: A mixin class that extends from a type variable containing an abstract construct signature must also be declared 'abstract'. -tests/cases/conformance/classes/mixinAbstractClasses.2.ts(21,7): error TS2515: Non-abstract class 'DerivedFromAbstract' does not implement inherited abstract member 'abstractBaseMethod' from class 'AbstractBase & Mixin'. +tests/cases/conformance/classes/mixinAbstractClasses.2.ts(21,7): error TS18036: Non-abstract class 'DerivedFromAbstract' does not implement all abstract members of 'AbstractBase & Mixin' tests/cases/conformance/classes/mixinAbstractClasses.2.ts(25,1): error TS2511: Cannot create an instance of an abstract class. @@ -28,7 +28,8 @@ tests/cases/conformance/classes/mixinAbstractClasses.2.ts(25,1): error TS2511: C // error expected: Non-abstract class 'DerivedFromAbstract' does not implement inherited abstract member 'abstractBaseMethod' from class 'AbstractBase & Mixin'. class DerivedFromAbstract extends MixedBase { ~~~~~~~~~~~~~~~~~~~ -!!! error TS2515: Non-abstract class 'DerivedFromAbstract' does not implement inherited abstract member 'abstractBaseMethod' from class 'AbstractBase & Mixin'. +!!! error TS18036: Non-abstract class 'DerivedFromAbstract' does not implement all abstract members of 'AbstractBase & Mixin' +!!! related TS2515 tests/cases/conformance/classes/mixinAbstractClasses.2.ts:21:7: Non-abstract class 'DerivedFromAbstract' does not implement inherited abstract member 'abstractBaseMethod' from class 'AbstractBase & Mixin'. } // error expected: Cannot create an instance of an abstract class. From 768c917ac50c1d94b771a813631d05bfe3ebb580 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders <293473+sandersn@users.noreply.github.com> Date: Tue, 28 Mar 2023 06:44:30 -0700 Subject: [PATCH 2/2] Few small fixes 1. Lazily create top-level error instead of saving related errors in a list. addRelatedInfo already creates a list. 2. Remove unused errors in codefix trigger. 3. Related span points to base properties instead. --- src/compiler/checker.ts | 46 +++++++++---------- ...sDoesntImplementInheritedAbstractMember.ts | 2 - .../abstractPropertyNegative.errors.txt | 8 ++-- .../classAbstractDeclarations.d.errors.txt | 6 +-- .../reference/classAbstractExtends.errors.txt | 2 +- .../reference/classAbstractGeneric.errors.txt | 12 ++--- .../classAbstractInheritance.errors.txt | 6 +-- .../classAbstractInstantiations2.errors.txt | 2 +- ...assAbstractOverrideWithAbstract.errors.txt | 2 +- ...ssAbstractUsingAbstractMethods2.errors.txt | 4 +- ...xpressionExtendingAbstractClass.errors.txt | 2 +- .../mixinAbstractClasses.2.errors.txt | 2 +- 12 files changed, 44 insertions(+), 50 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 3cf1e7e636094..fcf5c3854c960 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -43138,8 +43138,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { // NOTE: assignability is checked in checkClassDeclaration const baseProperties = getPropertiesOfType(baseType); - const derivedClassDecl = getClassLikeDeclarationOfSymbol(type.symbol)!; - const inheritedAbstractMemberNotImplementedErrors: Diagnostic[] = []; + let inheritedAbstractMemberNotImplementedError: Diagnostic | undefined; basePropertyCheck: for (const baseProperty of baseProperties) { const base = getTargetSymbol(baseProperty); @@ -43160,6 +43159,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { // type declaration, derived and base resolve to the same symbol even in the case of generic classes. if (derived === base) { // derived class inherits base without override/redeclaration + const derivedClassDecl = getClassLikeDeclarationOfSymbol(type.symbol)!; // It is an error to inherit an abstract member without implementing it or being declared abstract. // If there is no declaration for the derived class (as in the case of class expressions), @@ -43177,19 +43177,28 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { } } + if (!inheritedAbstractMemberNotImplementedError) { + inheritedAbstractMemberNotImplementedError = error( + derivedClassDecl, + Diagnostics.Non_abstract_class_0_does_not_implement_all_abstract_members_of_1, + typeToString(type), typeToString(baseType)); + + } if (derivedClassDecl.kind === SyntaxKind.ClassExpression) { - const error = createDiagnosticForNode( - derivedClassDecl, - Diagnostics.Non_abstract_class_expression_does_not_implement_inherited_abstract_member_0_from_class_1, - symbolToString(baseProperty), typeToString(baseType)); - inheritedAbstractMemberNotImplementedErrors.push(error); + addRelatedInfo( + inheritedAbstractMemberNotImplementedError, + createDiagnosticForNode( + baseProperty.valueDeclaration ?? (baseProperty.declarations && first(baseProperty.declarations)) ?? derivedClassDecl, + Diagnostics.Non_abstract_class_expression_does_not_implement_inherited_abstract_member_0_from_class_1, + symbolToString(baseProperty), typeToString(baseType))); } else { - const error = createDiagnosticForNode( - derivedClassDecl, - Diagnostics.Non_abstract_class_0_does_not_implement_inherited_abstract_member_1_from_class_2, - typeToString(type), symbolToString(baseProperty), typeToString(baseType)) - inheritedAbstractMemberNotImplementedErrors.push(error); + addRelatedInfo( + inheritedAbstractMemberNotImplementedError, + createDiagnosticForNode( + baseProperty.valueDeclaration ?? (baseProperty.declarations && first(baseProperty.declarations)) ?? derivedClassDecl, + Diagnostics.Non_abstract_class_0_does_not_implement_inherited_abstract_member_1_from_class_2, + typeToString(type), symbolToString(baseProperty), typeToString(baseType))); } } } @@ -43268,19 +43277,6 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { error(getNameOfDeclaration(derived.valueDeclaration) || derived.valueDeclaration, errorMessage, typeToString(baseType), symbolToString(base), typeToString(type)); } } - if (inheritedAbstractMemberNotImplementedErrors.length) { - const err = error( - derivedClassDecl, - Diagnostics.Non_abstract_class_0_does_not_implement_all_abstract_members_of_1, - typeToString(type), typeToString(baseType)); - - for (const inheritedAbstractMemberNotImplementedError of inheritedAbstractMemberNotImplementedErrors) { - addRelatedInfo( - err, - inheritedAbstractMemberNotImplementedError, - ); - } - } } function isPropertyAbstractOrInterface(declaration: Declaration, baseDeclarationFlags: ModifierFlags) { diff --git a/src/services/codefixes/fixClassDoesntImplementInheritedAbstractMember.ts b/src/services/codefixes/fixClassDoesntImplementInheritedAbstractMember.ts index b535e913340b9..80649e31bc5dd 100644 --- a/src/services/codefixes/fixClassDoesntImplementInheritedAbstractMember.ts +++ b/src/services/codefixes/fixClassDoesntImplementInheritedAbstractMember.ts @@ -27,8 +27,6 @@ import { const errorCodes = [ Diagnostics.Non_abstract_class_0_does_not_implement_all_abstract_members_of_1.code, - Diagnostics.Non_abstract_class_0_does_not_implement_inherited_abstract_member_1_from_class_2.code, - Diagnostics.Non_abstract_class_expression_does_not_implement_inherited_abstract_member_0_from_class_1.code, ]; const fixId = "fixClassDoesntImplementInheritedAbstractMember"; registerCodeFix({ diff --git a/tests/baselines/reference/abstractPropertyNegative.errors.txt b/tests/baselines/reference/abstractPropertyNegative.errors.txt index c8b25f0380f6a..dab4d317d6712 100644 --- a/tests/baselines/reference/abstractPropertyNegative.errors.txt +++ b/tests/baselines/reference/abstractPropertyNegative.errors.txt @@ -33,10 +33,10 @@ tests/cases/compiler/abstractPropertyNegative.ts(41,18): error TS2676: Accessors class C extends B { ~ !!! error TS18052: Non-abstract class 'C' does not implement all abstract members of 'B' -!!! related TS2515 tests/cases/compiler/abstractPropertyNegative.ts:13:7: Non-abstract class 'C' does not implement inherited abstract member 'prop' from class 'B'. -!!! related TS2515 tests/cases/compiler/abstractPropertyNegative.ts:13:7: Non-abstract class 'C' does not implement inherited abstract member 'readonlyProp' from class 'B'. -!!! related TS2515 tests/cases/compiler/abstractPropertyNegative.ts:13:7: Non-abstract class 'C' does not implement inherited abstract member 'm' from class 'B'. -!!! related TS2515 tests/cases/compiler/abstractPropertyNegative.ts:13:7: Non-abstract class 'C' does not implement inherited abstract member 'mismatch' from class 'B'. +!!! related TS2515 tests/cases/compiler/abstractPropertyNegative.ts:6:14: Non-abstract class 'C' does not implement inherited abstract member 'prop' from class 'B'. +!!! related TS2515 tests/cases/compiler/abstractPropertyNegative.ts:8:18: Non-abstract class 'C' does not implement inherited abstract member 'readonlyProp' from class 'B'. +!!! related TS2515 tests/cases/compiler/abstractPropertyNegative.ts:9:14: Non-abstract class 'C' does not implement inherited abstract member 'm' from class 'B'. +!!! related TS2515 tests/cases/compiler/abstractPropertyNegative.ts:10:18: Non-abstract class 'C' does not implement inherited abstract member 'mismatch' from class 'B'. readonly ro = "readonly please"; abstract notAllowed: string; ~~~~~~~~ diff --git a/tests/baselines/reference/classAbstractDeclarations.d.errors.txt b/tests/baselines/reference/classAbstractDeclarations.d.errors.txt index c745549dbbf95..2beaa71420a9a 100644 --- a/tests/baselines/reference/classAbstractDeclarations.d.errors.txt +++ b/tests/baselines/reference/classAbstractDeclarations.d.errors.txt @@ -23,19 +23,19 @@ tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbst declare class CC extends AA {} ~~ !!! error TS18052: Non-abstract class 'CC' does not implement all abstract members of 'AA' -!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractDeclarations.d.ts:11:15: Non-abstract class 'CC' does not implement inherited abstract member 'foo' from class 'AA'. +!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractDeclarations.d.ts:6:14: Non-abstract class 'CC' does not implement inherited abstract member 'foo' from class 'AA'. declare class DD extends BB {} ~~ !!! error TS18052: Non-abstract class 'DD' does not implement all abstract members of 'BB' -!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractDeclarations.d.ts:13:15: Non-abstract class 'DD' does not implement inherited abstract member 'foo' from class 'BB'. +!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractDeclarations.d.ts:6:14: Non-abstract class 'DD' does not implement inherited abstract member 'foo' from class 'BB'. declare abstract class EE extends BB {} declare class FF extends CC {} ~~ !!! error TS18052: Non-abstract class 'FF' does not implement all abstract members of 'CC' -!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractDeclarations.d.ts:17:15: Non-abstract class 'FF' does not implement inherited abstract member 'foo' from class 'CC'. +!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractDeclarations.d.ts:6:14: Non-abstract class 'FF' does not implement inherited abstract member 'foo' from class 'CC'. declare abstract class GG extends CC {} diff --git a/tests/baselines/reference/classAbstractExtends.errors.txt b/tests/baselines/reference/classAbstractExtends.errors.txt index 26b9456dfb2da..61920461206e9 100644 --- a/tests/baselines/reference/classAbstractExtends.errors.txt +++ b/tests/baselines/reference/classAbstractExtends.errors.txt @@ -13,7 +13,7 @@ tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbst class C extends B { } ~ !!! error TS18052: Non-abstract class 'C' does not implement all abstract members of 'B' -!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractExtends.ts:9:7: Non-abstract class 'C' does not implement inherited abstract member 'bar' from class 'B'. +!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractExtends.ts:6:14: Non-abstract class 'C' does not implement inherited abstract member 'bar' from class 'B'. abstract class D extends B {} diff --git a/tests/baselines/reference/classAbstractGeneric.errors.txt b/tests/baselines/reference/classAbstractGeneric.errors.txt index 00e5c81a8b36d..655b13096f8a2 100644 --- a/tests/baselines/reference/classAbstractGeneric.errors.txt +++ b/tests/baselines/reference/classAbstractGeneric.errors.txt @@ -17,26 +17,26 @@ tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbst class C extends A {} // error -- inherits abstract methods ~ !!! error TS18052: Non-abstract class 'C' does not implement all abstract members of 'A' -!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts:10:7: Non-abstract class 'C' does not implement inherited abstract member 'foo' from class 'A'. -!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts:10:7: Non-abstract class 'C' does not implement inherited abstract member 'bar' from class 'A'. +!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts:4:14: Non-abstract class 'C' does not implement inherited abstract member 'foo' from class 'A'. +!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts:5:14: Non-abstract class 'C' does not implement inherited abstract member 'bar' from class 'A'. class D extends A {} // error -- inherits abstract methods ~ !!! error TS18052: Non-abstract class 'D' does not implement all abstract members of 'A' -!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts:12:7: Non-abstract class 'D' does not implement inherited abstract member 'foo' from class 'A'. -!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts:12:7: Non-abstract class 'D' does not implement inherited abstract member 'bar' from class 'A'. +!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts:4:14: Non-abstract class 'D' does not implement inherited abstract member 'foo' from class 'A'. +!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts:5:14: Non-abstract class 'D' does not implement inherited abstract member 'bar' from class 'A'. class E extends A { // error -- doesn't implement bar ~ !!! error TS18052: Non-abstract class 'E' does not implement all abstract members of 'A' -!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts:14:7: Non-abstract class 'E' does not implement inherited abstract member 'bar' from class 'A'. +!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts:5:14: Non-abstract class 'E' does not implement inherited abstract member 'bar' from class 'A'. foo() { return this.t; } } class F extends A { // error -- doesn't implement foo ~ !!! error TS18052: Non-abstract class 'F' does not implement all abstract members of 'A' -!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts:18:7: Non-abstract class 'F' does not implement inherited abstract member 'foo' from class 'A'. +!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts:4:14: Non-abstract class 'F' does not implement inherited abstract member 'foo' from class 'A'. bar(t : T) {} } diff --git a/tests/baselines/reference/classAbstractInheritance.errors.txt b/tests/baselines/reference/classAbstractInheritance.errors.txt index 2ec7b58ace977..853f8ad6d2798 100644 --- a/tests/baselines/reference/classAbstractInheritance.errors.txt +++ b/tests/baselines/reference/classAbstractInheritance.errors.txt @@ -19,18 +19,18 @@ tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbst class CC extends AA {} ~~ !!! error TS18052: Non-abstract class 'CC' does not implement all abstract members of 'AA' -!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractInheritance.ts:13:7: Non-abstract class 'CC' does not implement inherited abstract member 'foo' from class 'AA'. +!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractInheritance.ts:8:14: Non-abstract class 'CC' does not implement inherited abstract member 'foo' from class 'AA'. class DD extends BB {} ~~ !!! error TS18052: Non-abstract class 'DD' does not implement all abstract members of 'BB' -!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractInheritance.ts:15:7: Non-abstract class 'DD' does not implement inherited abstract member 'foo' from class 'BB'. +!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractInheritance.ts:8:14: Non-abstract class 'DD' does not implement inherited abstract member 'foo' from class 'BB'. abstract class EE extends BB {} class FF extends CC {} ~~ !!! error TS18052: Non-abstract class 'FF' does not implement all abstract members of 'CC' -!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractInheritance.ts:19:7: Non-abstract class 'FF' does not implement inherited abstract member 'foo' from class 'CC'. +!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractInheritance.ts:8:14: Non-abstract class 'FF' does not implement inherited abstract member 'foo' from class 'CC'. abstract class GG extends CC {} \ No newline at end of file diff --git a/tests/baselines/reference/classAbstractInstantiations2.errors.txt b/tests/baselines/reference/classAbstractInstantiations2.errors.txt index e91fe71fe83e6..0347025c3c21e 100644 --- a/tests/baselines/reference/classAbstractInstantiations2.errors.txt +++ b/tests/baselines/reference/classAbstractInstantiations2.errors.txt @@ -51,7 +51,7 @@ tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbst class C extends B { } // error -- not declared abstract ~ !!! error TS18052: Non-abstract class 'C' does not implement all abstract members of 'B' -!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractInstantiations2.ts:26:7: Non-abstract class 'C' does not implement inherited abstract member 'bar' from class 'B'. +!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractInstantiations2.ts:7:14: Non-abstract class 'C' does not implement inherited abstract member 'bar' from class 'B'. abstract class D extends B { } // okay diff --git a/tests/baselines/reference/classAbstractOverrideWithAbstract.errors.txt b/tests/baselines/reference/classAbstractOverrideWithAbstract.errors.txt index 76e2a21204532..ff8c32e2e290b 100644 --- a/tests/baselines/reference/classAbstractOverrideWithAbstract.errors.txt +++ b/tests/baselines/reference/classAbstractOverrideWithAbstract.errors.txt @@ -23,7 +23,7 @@ tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbst class CC extends BB {} // error ~~ !!! error TS18052: Non-abstract class 'CC' does not implement all abstract members of 'BB' -!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractOverrideWithAbstract.ts:19:7: Non-abstract class 'CC' does not implement inherited abstract member 'foo' from class 'BB'. +!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractOverrideWithAbstract.ts:15:14: Non-abstract class 'CC' does not implement inherited abstract member 'foo' from class 'BB'. class DD extends BB { foo() {} diff --git a/tests/baselines/reference/classAbstractUsingAbstractMethods2.errors.txt b/tests/baselines/reference/classAbstractUsingAbstractMethods2.errors.txt index b43c0821dcec7..677fc42742fc2 100644 --- a/tests/baselines/reference/classAbstractUsingAbstractMethods2.errors.txt +++ b/tests/baselines/reference/classAbstractUsingAbstractMethods2.errors.txt @@ -13,7 +13,7 @@ tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbst class B extends A {} ~ !!! error TS18052: Non-abstract class 'B' does not implement all abstract members of 'A' -!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractUsingAbstractMethods2.ts:5:7: Non-abstract class 'B' does not implement inherited abstract member 'foo' from class 'A'. +!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractUsingAbstractMethods2.ts:2:14: Non-abstract class 'B' does not implement inherited abstract member 'foo' from class 'A'. abstract class C extends A {} @@ -32,7 +32,7 @@ tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbst class BB extends AA {} ~~ !!! error TS18052: Non-abstract class 'BB' does not implement all abstract members of 'AA' -!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractUsingAbstractMethods2.ts:21:7: Non-abstract class 'BB' does not implement inherited abstract member 'foo' from class 'AA'. +!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractUsingAbstractMethods2.ts:18:14: Non-abstract class 'BB' does not implement inherited abstract member 'foo' from class 'AA'. abstract class CC extends AA {} diff --git a/tests/baselines/reference/classExpressionExtendingAbstractClass.errors.txt b/tests/baselines/reference/classExpressionExtendingAbstractClass.errors.txt index 1f3dab05b4b8e..6388e7c613570 100644 --- a/tests/baselines/reference/classExpressionExtendingAbstractClass.errors.txt +++ b/tests/baselines/reference/classExpressionExtendingAbstractClass.errors.txt @@ -9,7 +9,7 @@ tests/cases/compiler/classExpressionExtendingAbstractClass.ts(5,9): error TS1805 var C = class extends A { // no error reported! ~~~~~ !!! error TS18052: Non-abstract class 'C' does not implement all abstract members of 'A' -!!! related TS2653 tests/cases/compiler/classExpressionExtendingAbstractClass.ts:5:9: Non-abstract class expression does not implement inherited abstract member 'foo' from class 'A'. +!!! related TS2653 tests/cases/compiler/classExpressionExtendingAbstractClass.ts:2:14: Non-abstract class expression does not implement inherited abstract member 'foo' from class 'A'. }; \ No newline at end of file diff --git a/tests/baselines/reference/mixinAbstractClasses.2.errors.txt b/tests/baselines/reference/mixinAbstractClasses.2.errors.txt index 3053e46a2245e..8f4a29462113c 100644 --- a/tests/baselines/reference/mixinAbstractClasses.2.errors.txt +++ b/tests/baselines/reference/mixinAbstractClasses.2.errors.txt @@ -29,7 +29,7 @@ tests/cases/conformance/classes/mixinAbstractClasses.2.ts(25,1): error TS2511: C class DerivedFromAbstract extends MixedBase { ~~~~~~~~~~~~~~~~~~~ !!! error TS18052: Non-abstract class 'DerivedFromAbstract' does not implement all abstract members of 'AbstractBase & Mixin' -!!! related TS2515 tests/cases/conformance/classes/mixinAbstractClasses.2.ts:21:7: Non-abstract class 'DerivedFromAbstract' does not implement inherited abstract member 'abstractBaseMethod' from class 'AbstractBase & Mixin'. +!!! related TS2515 tests/cases/conformance/classes/mixinAbstractClasses.2.ts:15:14: Non-abstract class 'DerivedFromAbstract' does not implement inherited abstract member 'abstractBaseMethod' from class 'AbstractBase & Mixin'. } // error expected: Cannot create an instance of an abstract class.