Skip to content

Commit 849eeab

Browse files
committed
change diagnostic messages
1 parent 337d118 commit 849eeab

24 files changed

+302
-121
lines changed

src/compiler/checker.ts

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45151,12 +45151,32 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4515145151
}
4515245152

4515345153
for (const [errorNode, memberInfo] of notImplementedInfo) {
45154-
const missedProperties = map(memberInfo.missedProperties, prop => `'${prop}'`).join(", ");
45155-
if (isClassExpression(errorNode)) {
45156-
error(errorNode, length(memberInfo.missedProperties) > 1 ? Diagnostics.Non_abstract_class_expression_does_not_implement_inherited_abstract_members_0_from_class_1 : Diagnostics.Non_abstract_class_expression_does_not_implement_inherited_abstract_member_0_from_class_1, missedProperties, memberInfo.baseTypeName);
45154+
if (length(memberInfo.missedProperties) === 1) {
45155+
if (isClassExpression(errorNode)) {
45156+
error(errorNode, Diagnostics.Non_abstract_class_expression_does_not_implement_inherited_abstract_member_0_from_class_1, first(memberInfo.missedProperties), memberInfo.baseTypeName);
45157+
}
45158+
else {
45159+
error(errorNode, Diagnostics.Non_abstract_class_0_does_not_implement_inherited_abstract_member_1_from_class_2, memberInfo.typeName, first(memberInfo.missedProperties), memberInfo.baseTypeName);
45160+
}
45161+
}
45162+
else if (length(memberInfo.missedProperties) > 5) {
45163+
const missedProperties = map(memberInfo.missedProperties.slice(0, 4), prop => `'${prop}'`).join(", ");
45164+
const remainingMissedProperties = length(memberInfo.missedProperties) - 4;
45165+
if (isClassExpression(errorNode)) {
45166+
error(errorNode, Diagnostics.Non_abstract_class_expression_is_missing_implementations_for_the_following_members_of_0_Colon_1_and_2_more, memberInfo.baseTypeName, missedProperties, remainingMissedProperties);
45167+
}
45168+
else {
45169+
error(errorNode, Diagnostics.Non_abstract_class_0_is_missing_implementations_for_the_following_members_of_1_Colon_2_and_3_more, memberInfo.typeName, memberInfo.baseTypeName, missedProperties, remainingMissedProperties);
45170+
}
4515745171
}
4515845172
else {
45159-
error(errorNode, length(memberInfo.missedProperties) > 1 ? Diagnostics.Non_abstract_class_0_does_not_implement_inherited_abstract_members_1_from_class_2 : Diagnostics.Non_abstract_class_0_does_not_implement_inherited_abstract_member_1_from_class_2, memberInfo.typeName, missedProperties, memberInfo.baseTypeName);
45173+
const missedProperties = map(memberInfo.missedProperties, prop => `'${prop}'`).join(", ");
45174+
if (isClassExpression(errorNode)) {
45175+
error(errorNode, Diagnostics.Non_abstract_class_expression_is_missing_implementations_for_the_following_members_of_0_Colon_1, memberInfo.baseTypeName, missedProperties);
45176+
}
45177+
else {
45178+
error(errorNode, Diagnostics.Non_abstract_class_0_is_missing_implementations_for_the_following_members_of_1_Colon_2, memberInfo.typeName, memberInfo.baseTypeName, missedProperties);
45179+
}
4516045180
}
4516145181
}
4516245182
}

src/compiler/diagnosticMessages.json

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2938,6 +2938,10 @@
29382938
"category": "Error",
29392939
"code": 2649
29402940
},
2941+
"Non-abstract class expression is missing implementations for the following members of '{0}': {1} and {2} more.": {
2942+
"category": "Error",
2943+
"code": 2650
2944+
},
29412945
"A member initializer in a enum declaration cannot reference members declared after it, including members defined in other enums.": {
29422946
"category": "Error",
29432947
"code": 2651
@@ -2950,14 +2954,18 @@
29502954
"category": "Error",
29512955
"code": 2653
29522956
},
2953-
"Non-abstract class '{0}' does not implement inherited abstract members {1} from class '{2}'.": {
2957+
"Non-abstract class '{0}' is missing implementations for the following members of '{1}': {2}.": {
29542958
"category": "Error",
29552959
"code": 2654
29562960
},
2957-
"Non-abstract class expression does not implement inherited abstract members {0} from class '{1}'.": {
2961+
"Non-abstract class '{0}' is missing implementations for the following members of '{1}': {2} and {3} more.": {
29582962
"category": "Error",
29592963
"code": 2655
29602964
},
2965+
"Non-abstract class expression is missing implementations for the following members of '{0}': {1}.": {
2966+
"category": "Error",
2967+
"code": 2656
2968+
},
29612969
"JSX expressions must have one parent element.": {
29622970
"category": "Error",
29632971
"code": 2657

src/services/codefixes/fixClassDoesntImplementInheritedAbstractMember.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,13 @@ import {
2727

2828
const errorCodes = [
2929
Diagnostics.Non_abstract_class_0_does_not_implement_inherited_abstract_member_1_from_class_2.code,
30-
Diagnostics.Non_abstract_class_0_does_not_implement_inherited_abstract_members_1_from_class_2.code,
30+
Diagnostics.Non_abstract_class_0_is_missing_implementations_for_the_following_members_of_1_Colon_2.code,
31+
Diagnostics.Non_abstract_class_0_is_missing_implementations_for_the_following_members_of_1_Colon_2_and_3_more.code,
3132
Diagnostics.Non_abstract_class_expression_does_not_implement_inherited_abstract_member_0_from_class_1.code,
32-
Diagnostics.Non_abstract_class_expression_does_not_implement_inherited_abstract_members_0_from_class_1.code,
33+
Diagnostics.Non_abstract_class_expression_is_missing_implementations_for_the_following_members_of_0_Colon_1.code,
34+
Diagnostics.Non_abstract_class_expression_is_missing_implementations_for_the_following_members_of_0_Colon_1_and_2_more.code,
3335
];
36+
3437
const fixId = "fixClassDoesntImplementInheritedAbstractMember";
3538
registerCodeFix({
3639
errorCodes,

tests/baselines/reference/abstractPropertyNegative.errors.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
abstractPropertyNegative.ts(13,7): error TS2654: Non-abstract class 'C' does not implement inherited abstract members 'prop', 'readonlyProp', 'm', 'mismatch' from class 'B'.
1+
abstractPropertyNegative.ts(13,7): error TS2654: Non-abstract class 'C' is missing implementations for the following members of 'B': 'prop', 'readonlyProp', 'm', 'mismatch'.
22
abstractPropertyNegative.ts(15,5): error TS1253: Abstract properties can only appear within an abstract class.
33
abstractPropertyNegative.ts(16,37): error TS1005: '{' expected.
44
abstractPropertyNegative.ts(19,3): error TS2540: Cannot assign to 'ro' because it is a read-only property.
@@ -29,7 +29,7 @@ abstractPropertyNegative.ts(41,18): error TS2676: Accessors must both be abstrac
2929
}
3030
class C extends B {
3131
~
32-
!!! error TS2654: Non-abstract class 'C' does not implement inherited abstract members 'prop', 'readonlyProp', 'm', 'mismatch' from class 'B'.
32+
!!! error TS2654: Non-abstract class 'C' is missing implementations for the following members of 'B': 'prop', 'readonlyProp', 'm', 'mismatch'.
3333
readonly ro = "readonly please";
3434
abstract notAllowed: string;
3535
~~~~~~~~

tests/baselines/reference/classAbstractDeclarations.d.errors.txt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
classAbstractDeclarations.d.ts(2,5): error TS1242: 'abstract' modifier can only appear on a class, method, or property declaration.
22
classAbstractDeclarations.d.ts(2,28): error TS1183: An implementation cannot be declared in ambient contexts.
3-
classAbstractDeclarations.d.ts(11,15): error TS2515: Non-abstract class 'CC' does not implement inherited abstract member 'foo' from class 'AA'.
4-
classAbstractDeclarations.d.ts(13,15): error TS2515: Non-abstract class 'DD' does not implement inherited abstract member 'foo' from class 'BB'.
5-
classAbstractDeclarations.d.ts(17,15): error TS2515: Non-abstract class 'FF' does not implement inherited abstract member 'foo' from class 'CC'.
3+
classAbstractDeclarations.d.ts(11,15): error TS2515: Non-abstract class 'CC' does not implement inherited abstract member foo from class 'AA'.
4+
classAbstractDeclarations.d.ts(13,15): error TS2515: Non-abstract class 'DD' does not implement inherited abstract member foo from class 'BB'.
5+
classAbstractDeclarations.d.ts(17,15): error TS2515: Non-abstract class 'FF' does not implement inherited abstract member foo from class 'CC'.
66

77

88
==== classAbstractDeclarations.d.ts (5 errors) ====
@@ -22,17 +22,17 @@ classAbstractDeclarations.d.ts(17,15): error TS2515: Non-abstract class 'FF' doe
2222

2323
declare class CC extends AA {}
2424
~~
25-
!!! error TS2515: 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'.
2626

2727
declare class DD extends BB {}
2828
~~
29-
!!! error TS2515: 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'.
3030

3131
declare abstract class EE extends BB {}
3232

3333
declare class FF extends CC {}
3434
~~
35-
!!! error TS2515: 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'.
3636

3737
declare abstract class GG extends CC {}
3838

tests/baselines/reference/classAbstractExtends.errors.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
classAbstractExtends.ts(9,7): error TS2515: Non-abstract class 'C' does not implement inherited abstract member 'bar' from class 'B'.
1+
classAbstractExtends.ts(9,7): error TS2515: Non-abstract class 'C' does not implement inherited abstract member bar from class 'B'.
22

33

44
==== classAbstractExtends.ts (1 errors) ====
@@ -12,7 +12,7 @@ classAbstractExtends.ts(9,7): error TS2515: Non-abstract class 'C' does not impl
1212

1313
class C extends B { }
1414
~
15-
!!! error TS2515: 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'.
1616

1717
abstract class D extends B {}
1818

tests/baselines/reference/classAbstractGeneric.errors.txt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
classAbstractGeneric.ts(10,7): error TS2654: Non-abstract class 'C<T>' does not implement inherited abstract members 'foo', 'bar' from class 'A<T>'.
2-
classAbstractGeneric.ts(12,7): error TS2654: Non-abstract class 'D' does not implement inherited abstract members 'foo', 'bar' from class 'A<number>'.
3-
classAbstractGeneric.ts(14,7): error TS2515: Non-abstract class 'E<T>' does not implement inherited abstract member 'bar' from class 'A<T>'.
4-
classAbstractGeneric.ts(18,7): error TS2515: Non-abstract class 'F<T>' does not implement inherited abstract member 'foo' from class 'A<T>'.
1+
classAbstractGeneric.ts(10,7): error TS2654: Non-abstract class 'C<T>' is missing implementations for the following members of 'A<T>': 'foo', 'bar'.
2+
classAbstractGeneric.ts(12,7): error TS2654: Non-abstract class 'D' is missing implementations for the following members of 'A<number>': 'foo', 'bar'.
3+
classAbstractGeneric.ts(14,7): error TS2515: Non-abstract class 'E<T>' does not implement inherited abstract member bar from class 'A<T>'.
4+
classAbstractGeneric.ts(18,7): error TS2515: Non-abstract class 'F<T>' does not implement inherited abstract member foo from class 'A<T>'.
55

66

77
==== classAbstractGeneric.ts (4 errors) ====
@@ -16,21 +16,21 @@ classAbstractGeneric.ts(18,7): error TS2515: Non-abstract class 'F<T>' does not
1616

1717
class C<T> extends A<T> {} // error -- inherits abstract methods
1818
~
19-
!!! error TS2654: Non-abstract class 'C<T>' does not implement inherited abstract members 'foo', 'bar' from class 'A<T>'.
19+
!!! error TS2654: Non-abstract class 'C<T>' is missing implementations for the following members of 'A<T>': 'foo', 'bar'.
2020

2121
class D extends A<number> {} // error -- inherits abstract methods
2222
~
23-
!!! error TS2654: Non-abstract class 'D' does not implement inherited abstract members 'foo', 'bar' from class 'A<number>'.
23+
!!! error TS2654: Non-abstract class 'D' is missing implementations for the following members of 'A<number>': 'foo', 'bar'.
2424

2525
class E<T> extends A<T> { // error -- doesn't implement bar
2626
~
27-
!!! error TS2515: Non-abstract class 'E<T>' does not implement inherited abstract member 'bar' from class 'A<T>'.
27+
!!! error TS2515: Non-abstract class 'E<T>' does not implement inherited abstract member bar from class 'A<T>'.
2828
foo() { return this.t; }
2929
}
3030

3131
class F<T> extends A<T> { // error -- doesn't implement foo
3232
~
33-
!!! error TS2515: Non-abstract class 'F<T>' does not implement inherited abstract member 'foo' from class 'A<T>'.
33+
!!! error TS2515: Non-abstract class 'F<T>' does not implement inherited abstract member foo from class 'A<T>'.
3434
bar(t : T) {}
3535
}
3636

tests/baselines/reference/classAbstractInheritance.errors.txt

Lines changed: 0 additions & 33 deletions
This file was deleted.

tests/baselines/reference/classAbstractInheritance.symbols

Lines changed: 0 additions & 45 deletions
This file was deleted.
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
classAbstractInheritance1.ts(13,7): error TS2515: Non-abstract class 'CC' does not implement inherited abstract member foo from class 'AA'.
2+
classAbstractInheritance1.ts(15,7): error TS2515: Non-abstract class 'DD' does not implement inherited abstract member foo from class 'BB'.
3+
classAbstractInheritance1.ts(19,7): error TS2515: Non-abstract class 'FF' does not implement inherited abstract member foo from class 'CC'.
4+
5+
6+
==== classAbstractInheritance1.ts (3 errors) ====
7+
abstract class A {}
8+
9+
abstract class B extends A {}
10+
11+
class C extends A {}
12+
13+
abstract class AA {
14+
abstract foo();
15+
}
16+
17+
abstract class BB extends AA {}
18+
19+
class CC extends AA {}
20+
~~
21+
!!! error TS2515: Non-abstract class 'CC' does not implement inherited abstract member foo from class 'AA'.
22+
23+
class DD extends BB {}
24+
~~
25+
!!! error TS2515: Non-abstract class 'DD' does not implement inherited abstract member foo from class 'BB'.
26+
27+
abstract class EE extends BB {}
28+
29+
class FF extends CC {}
30+
~~
31+
!!! error TS2515: Non-abstract class 'FF' does not implement inherited abstract member foo from class 'CC'.
32+
33+
abstract class GG extends CC {}

tests/baselines/reference/classAbstractInheritance.js renamed to tests/baselines/reference/classAbstractInheritance1.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
//// [tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractInheritance.ts] ////
1+
//// [tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractInheritance1.ts] ////
22

3-
//// [classAbstractInheritance.ts]
3+
//// [classAbstractInheritance1.ts]
44
abstract class A {}
55

66
abstract class B extends A {}
@@ -23,7 +23,7 @@ class FF extends CC {}
2323

2424
abstract class GG extends CC {}
2525

26-
//// [classAbstractInheritance.js]
26+
//// [classAbstractInheritance1.js]
2727
var __extends = (this && this.__extends) || (function () {
2828
var extendStatics = function (d, b) {
2929
extendStatics = Object.setPrototypeOf ||
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
//// [tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractInheritance1.ts] ////
2+
3+
=== classAbstractInheritance1.ts ===
4+
abstract class A {}
5+
>A : Symbol(A, Decl(classAbstractInheritance1.ts, 0, 0))
6+
7+
abstract class B extends A {}
8+
>B : Symbol(B, Decl(classAbstractInheritance1.ts, 0, 19))
9+
>A : Symbol(A, Decl(classAbstractInheritance1.ts, 0, 0))
10+
11+
class C extends A {}
12+
>C : Symbol(C, Decl(classAbstractInheritance1.ts, 2, 29))
13+
>A : Symbol(A, Decl(classAbstractInheritance1.ts, 0, 0))
14+
15+
abstract class AA {
16+
>AA : Symbol(AA, Decl(classAbstractInheritance1.ts, 4, 20))
17+
18+
abstract foo();
19+
>foo : Symbol(AA.foo, Decl(classAbstractInheritance1.ts, 6, 19))
20+
}
21+
22+
abstract class BB extends AA {}
23+
>BB : Symbol(BB, Decl(classAbstractInheritance1.ts, 8, 1))
24+
>AA : Symbol(AA, Decl(classAbstractInheritance1.ts, 4, 20))
25+
26+
class CC extends AA {}
27+
>CC : Symbol(CC, Decl(classAbstractInheritance1.ts, 10, 31))
28+
>AA : Symbol(AA, Decl(classAbstractInheritance1.ts, 4, 20))
29+
30+
class DD extends BB {}
31+
>DD : Symbol(DD, Decl(classAbstractInheritance1.ts, 12, 22))
32+
>BB : Symbol(BB, Decl(classAbstractInheritance1.ts, 8, 1))
33+
34+
abstract class EE extends BB {}
35+
>EE : Symbol(EE, Decl(classAbstractInheritance1.ts, 14, 22))
36+
>BB : Symbol(BB, Decl(classAbstractInheritance1.ts, 8, 1))
37+
38+
class FF extends CC {}
39+
>FF : Symbol(FF, Decl(classAbstractInheritance1.ts, 16, 31))
40+
>CC : Symbol(CC, Decl(classAbstractInheritance1.ts, 10, 31))
41+
42+
abstract class GG extends CC {}
43+
>GG : Symbol(GG, Decl(classAbstractInheritance1.ts, 18, 22))
44+
>CC : Symbol(CC, Decl(classAbstractInheritance1.ts, 10, 31))
45+

tests/baselines/reference/classAbstractInheritance.types renamed to tests/baselines/reference/classAbstractInheritance1.types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
//// [tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractInheritance.ts] ////
1+
//// [tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractInheritance1.ts] ////
22

3-
=== classAbstractInheritance.ts ===
3+
=== classAbstractInheritance1.ts ===
44
abstract class A {}
55
>A : A
66

0 commit comments

Comments
 (0)