Skip to content

Commit 733eff2

Browse files
authored
Revert "Use related spans for "implement abstract class" errors" (microsoft#48029)
1 parent dada02a commit 733eff2

13 files changed

+56
-88
lines changed

Diff for: src/compiler/checker.ts

+3-22
Original file line numberDiff line numberDiff line change
@@ -39220,8 +39220,6 @@ namespace ts {
3922039220

3922139221
// NOTE: assignability is checked in checkClassDeclaration
3922239222
const baseProperties = getPropertiesOfType(baseType);
39223-
const derivedClassDecl = getClassLikeDeclarationOfSymbol(type.symbol)!;
39224-
const inheritedAbstractMemberNotImplementedErrors: Diagnostic[] = [];
3922539223
basePropertyCheck: for (const baseProperty of baseProperties) {
3922639224
const base = getTargetSymbol(baseProperty);
3922739225

@@ -39242,6 +39240,7 @@ namespace ts {
3924239240
// type declaration, derived and base resolve to the same symbol even in the case of generic classes.
3924339241
if (derived === base) {
3924439242
// derived class inherits base without override/redeclaration
39243+
const derivedClassDecl = getClassLikeDeclarationOfSymbol(type.symbol)!;
3924539244

3924639245
// It is an error to inherit an abstract member without implementing it or being declared abstract.
3924739246
// If there is no declaration for the derived class (as in the case of class expressions),
@@ -39260,16 +39259,12 @@ namespace ts {
3926039259
}
3926139260

3926239261
if (derivedClassDecl.kind === SyntaxKind.ClassExpression) {
39263-
const err = createDiagnosticForNode(derivedClassDecl,
39264-
Diagnostics.Non_abstract_class_expression_does_not_implement_inherited_abstract_member_0_from_class_1,
39262+
error(derivedClassDecl, Diagnostics.Non_abstract_class_expression_does_not_implement_inherited_abstract_member_0_from_class_1,
3926539263
symbolToString(baseProperty), typeToString(baseType));
39266-
inheritedAbstractMemberNotImplementedErrors.push(err);
3926739264
}
3926839265
else {
39269-
const err = createDiagnosticForNode(derivedClassDecl,
39270-
Diagnostics.Non_abstract_class_0_does_not_implement_inherited_abstract_member_1_from_class_2,
39266+
error(derivedClassDecl, Diagnostics.Non_abstract_class_0_does_not_implement_inherited_abstract_member_1_from_class_2,
3927139267
typeToString(type), symbolToString(baseProperty), typeToString(baseType));
39272-
inheritedAbstractMemberNotImplementedErrors.push(err);
3927339268
}
3927439269
}
3927539270
}
@@ -39345,20 +39340,6 @@ namespace ts {
3934539340
error(getNameOfDeclaration(derived.valueDeclaration) || derived.valueDeclaration, errorMessage, typeToString(baseType), symbolToString(base), typeToString(type));
3934639341
}
3934739342
}
39348-
39349-
if (inheritedAbstractMemberNotImplementedErrors.length) {
39350-
const err = error(
39351-
derivedClassDecl,
39352-
Diagnostics.Non_abstract_class_0_does_not_implement_all_abstract_members_of_1,
39353-
typeToString(type), typeToString(baseType));
39354-
39355-
for (const inheritedAbstractMemberNotImplementedError of inheritedAbstractMemberNotImplementedErrors) {
39356-
addRelatedInfo(
39357-
err,
39358-
inheritedAbstractMemberNotImplementedError,
39359-
);
39360-
}
39361-
}
3936239343
}
3936339344

3936439345
function getNonInterhitedProperties(type: InterfaceType, baseTypes: BaseType[], properties: Symbol[]) {

Diff for: src/compiler/diagnosticMessages.json

-4
Original file line numberDiff line numberDiff line change
@@ -7286,9 +7286,5 @@
72867286
"A 'return' statement cannot be used inside a class static block.": {
72877287
"category": "Error",
72887288
"code": 18041
7289-
},
7290-
"Non-abstract class '{0}' does not implement all abstract members of '{1}'": {
7291-
"category": "Error",
7292-
"code": 18042
72937289
}
72947290
}

Diff for: src/services/codefixes/fixClassDoesntImplementInheritedAbstractMember.ts

-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
/* @internal */
22
namespace ts.codefix {
33
const errorCodes = [
4-
Diagnostics.Non_abstract_class_0_does_not_implement_all_abstract_members_of_1.code,
54
Diagnostics.Non_abstract_class_0_does_not_implement_inherited_abstract_member_1_from_class_2.code,
65
Diagnostics.Non_abstract_class_expression_does_not_implement_inherited_abstract_member_0_from_class_1.code,
76
];

Diff for: tests/baselines/reference/abstractPropertyNegative.errors.txt

+12-7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
tests/cases/compiler/abstractPropertyNegative.ts(10,18): error TS2380: The return type of a 'get' accessor must be assignable to its 'set' accessor type
2-
tests/cases/compiler/abstractPropertyNegative.ts(13,7): error TS18042: Non-abstract class 'C' does not implement all abstract members of 'B'
2+
tests/cases/compiler/abstractPropertyNegative.ts(13,7): error TS2515: Non-abstract class 'C' does not implement inherited abstract member 'm' from class 'B'.
3+
tests/cases/compiler/abstractPropertyNegative.ts(13,7): error TS2515: Non-abstract class 'C' does not implement inherited abstract member 'mismatch' from class 'B'.
4+
tests/cases/compiler/abstractPropertyNegative.ts(13,7): error TS2515: Non-abstract class 'C' does not implement inherited abstract member 'prop' from class 'B'.
5+
tests/cases/compiler/abstractPropertyNegative.ts(13,7): error TS2515: Non-abstract class 'C' does not implement inherited abstract member 'readonlyProp' from class 'B'.
36
tests/cases/compiler/abstractPropertyNegative.ts(15,5): error TS1244: Abstract methods can only appear within an abstract class.
47
tests/cases/compiler/abstractPropertyNegative.ts(16,37): error TS1005: '{' expected.
58
tests/cases/compiler/abstractPropertyNegative.ts(19,3): error TS2540: Cannot assign to 'ro' because it is a read-only property.
@@ -15,7 +18,7 @@ tests/cases/compiler/abstractPropertyNegative.ts(40,9): error TS2676: Accessors
1518
tests/cases/compiler/abstractPropertyNegative.ts(41,18): error TS2676: Accessors must both be abstract or non-abstract.
1619

1720

18-
==== tests/cases/compiler/abstractPropertyNegative.ts (12 errors) ====
21+
==== tests/cases/compiler/abstractPropertyNegative.ts (15 errors) ====
1922
interface A {
2023
prop: string;
2124
m(): string;
@@ -32,11 +35,13 @@ tests/cases/compiler/abstractPropertyNegative.ts(41,18): error TS2676: Accessors
3235
}
3336
class C extends B {
3437
~
35-
!!! error TS18042: Non-abstract class 'C' does not implement all abstract members of 'B'
36-
!!! related TS2515 tests/cases/compiler/abstractPropertyNegative.ts:13:7: Non-abstract class 'C' does not implement inherited abstract member 'prop' from class 'B'.
37-
!!! related TS2515 tests/cases/compiler/abstractPropertyNegative.ts:13:7: Non-abstract class 'C' does not implement inherited abstract member 'readonlyProp' from class 'B'.
38-
!!! related TS2515 tests/cases/compiler/abstractPropertyNegative.ts:13:7: Non-abstract class 'C' does not implement inherited abstract member 'm' from class 'B'.
39-
!!! related TS2515 tests/cases/compiler/abstractPropertyNegative.ts:13:7: Non-abstract class 'C' does not implement inherited abstract member 'mismatch' from class 'B'.
38+
!!! error TS2515: Non-abstract class 'C' does not implement inherited abstract member 'm' from class 'B'.
39+
~
40+
!!! error TS2515: Non-abstract class 'C' does not implement inherited abstract member 'mismatch' from class 'B'.
41+
~
42+
!!! error TS2515: Non-abstract class 'C' does not implement inherited abstract member 'prop' from class 'B'.
43+
~
44+
!!! error TS2515: Non-abstract class 'C' does not implement inherited abstract member 'readonlyProp' from class 'B'.
4045
readonly ro = "readonly please";
4146
abstract notAllowed: string;
4247
~~~~~~~~

Diff for: tests/baselines/reference/classAbstractDeclarations.d.errors.txt

+6-9
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
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.
22
tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractDeclarations.d.ts(2,28): error TS1183: An implementation cannot be declared in ambient contexts.
3-
tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractDeclarations.d.ts(11,15): error TS18042: Non-abstract class 'CC' does not implement all abstract members of 'AA'
4-
tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractDeclarations.d.ts(13,15): error TS18042: Non-abstract class 'DD' does not implement all abstract members of 'BB'
5-
tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractDeclarations.d.ts(17,15): error TS18042: Non-abstract class 'FF' does not implement all abstract members of 'CC'
3+
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'.
4+
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'.
5+
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'.
66

77

88
==== tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractDeclarations.d.ts (5 errors) ====
@@ -22,20 +22,17 @@ tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbst
2222

2323
declare class CC extends AA {}
2424
~~
25-
!!! error TS18042: Non-abstract class 'CC' does not implement all abstract members of 'AA'
26-
!!! 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'.
25+
!!! error TS2515: Non-abstract class 'CC' does not implement inherited abstract member 'foo' from class 'AA'.
2726

2827
declare class DD extends BB {}
2928
~~
30-
!!! error TS18042: Non-abstract class 'DD' does not implement all abstract members of 'BB'
31-
!!! 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'.
29+
!!! error TS2515: Non-abstract class 'DD' does not implement inherited abstract member 'foo' from class 'BB'.
3230

3331
declare abstract class EE extends BB {}
3432

3533
declare class FF extends CC {}
3634
~~
37-
!!! error TS18042: Non-abstract class 'FF' does not implement all abstract members of 'CC'
38-
!!! 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'.
35+
!!! error TS2515: Non-abstract class 'FF' does not implement inherited abstract member 'foo' from class 'CC'.
3936

4037
declare abstract class GG extends CC {}
4138

Diff for: tests/baselines/reference/classAbstractExtends.errors.txt

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractExtends.ts(9,7): error TS18042: Non-abstract class 'C' does not implement all abstract members of 'B'
1+
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'.
22

33

44
==== tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractExtends.ts (1 errors) ====
@@ -12,8 +12,7 @@ tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbst
1212

1313
class C extends B { }
1414
~
15-
!!! error TS18042: Non-abstract class 'C' does not implement all abstract members of 'B'
16-
!!! 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'.
15+
!!! error TS2515: Non-abstract class 'C' does not implement inherited abstract member 'bar' from class 'B'.
1716

1817
abstract class D extends B {}
1918

Diff for: tests/baselines/reference/classAbstractGeneric.errors.txt

+15-15
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts(10,7): error TS18042: Non-abstract class 'C<T>' does not implement all abstract members of 'A<T>'
2-
tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts(12,7): error TS18042: Non-abstract class 'D' does not implement all abstract members of 'A<number>'
3-
tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts(14,7): error TS18042: Non-abstract class 'E<T>' does not implement all abstract members of 'A<T>'
4-
tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts(18,7): error TS18042: Non-abstract class 'F<T>' does not implement all abstract members of 'A<T>'
1+
tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts(10,7): error TS2515: Non-abstract class 'C<T>' does not implement inherited abstract member 'bar' from class 'A<T>'.
2+
tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts(10,7): error TS2515: Non-abstract class 'C<T>' does not implement inherited abstract member 'foo' from class 'A<T>'.
3+
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<number>'.
4+
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<number>'.
5+
tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts(14,7): error TS2515: Non-abstract class 'E<T>' does not implement inherited abstract member 'bar' from class 'A<T>'.
6+
tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts(18,7): error TS2515: Non-abstract class 'F<T>' does not implement inherited abstract member 'foo' from class 'A<T>'.
57

68

7-
==== tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts (4 errors) ====
9+
==== tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts (6 errors) ====
810
abstract class A<T> {
911
t: T;
1012

@@ -16,27 +18,25 @@ tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbst
1618

1719
class C<T> extends A<T> {} // error -- inherits abstract methods
1820
~
19-
!!! error TS18042: Non-abstract class 'C<T>' does not implement all abstract members of 'A<T>'
20-
!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts:10:7: Non-abstract class 'C<T>' does not implement inherited abstract member 'foo' from class 'A<T>'.
21-
!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts:10:7: Non-abstract class 'C<T>' does not implement inherited abstract member 'bar' from class 'A<T>'.
21+
!!! error TS2515: Non-abstract class 'C<T>' does not implement inherited abstract member 'bar' from class 'A<T>'.
22+
~
23+
!!! error TS2515: Non-abstract class 'C<T>' does not implement inherited abstract member 'foo' from class 'A<T>'.
2224

2325
class D extends A<number> {} // error -- inherits abstract methods
2426
~
25-
!!! error TS18042: Non-abstract class 'D' does not implement all abstract members of 'A<number>'
26-
!!! 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<number>'.
27-
!!! 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<number>'.
27+
!!! error TS2515: Non-abstract class 'D' does not implement inherited abstract member 'bar' from class 'A<number>'.
28+
~
29+
!!! error TS2515: Non-abstract class 'D' does not implement inherited abstract member 'foo' from class 'A<number>'.
2830

2931
class E<T> extends A<T> { // error -- doesn't implement bar
3032
~
31-
!!! error TS18042: Non-abstract class 'E<T>' does not implement all abstract members of 'A<T>'
32-
!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts:14:7: Non-abstract class 'E<T>' does not implement inherited abstract member 'bar' from class 'A<T>'.
33+
!!! error TS2515: Non-abstract class 'E<T>' does not implement inherited abstract member 'bar' from class 'A<T>'.
3334
foo() { return this.t; }
3435
}
3536

3637
class F<T> extends A<T> { // error -- doesn't implement foo
3738
~
38-
!!! error TS18042: Non-abstract class 'F<T>' does not implement all abstract members of 'A<T>'
39-
!!! related TS2515 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts:18:7: Non-abstract class 'F<T>' does not implement inherited abstract member 'foo' from class 'A<T>'.
39+
!!! error TS2515: Non-abstract class 'F<T>' does not implement inherited abstract member 'foo' from class 'A<T>'.
4040
bar(t : T) {}
4141
}
4242

0 commit comments

Comments
 (0)