Skip to content

Commit a14b227

Browse files
authored
Enforce keyword order of abstract and override (#43829)
* Enforce keyword order of abstract and override * Update baselines * Update existing test
1 parent 791c747 commit a14b227

File tree

9 files changed

+53
-22
lines changed

9 files changed

+53
-22
lines changed

src/compiler/checker.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40837,6 +40837,9 @@ namespace ts {
4083740837
if (flags & ModifierFlags.Async && lastAsync) {
4083840838
return grammarErrorOnNode(lastAsync, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "async", "abstract");
4083940839
}
40840+
if (flags & ModifierFlags.Override) {
40841+
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "abstract", "override");
40842+
}
4084040843
}
4084140844
if (isNamedDeclaration(node) && node.name.kind === SyntaxKind.PrivateIdentifier) {
4084240845
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_a_private_identifier, "abstract");

tests/baselines/reference/override10.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,8 @@ abstract class Base {
44
abstract bar(): void;
55
}
66

7-
// No errors:
87
abstract class Sub extends Base {
9-
override abstract foo(): number;
8+
abstract override foo(): number;
109
bar() { }
1110
}
1211

@@ -31,7 +30,6 @@ var Base = /** @class */ (function () {
3130
}
3231
return Base;
3332
}());
34-
// No errors:
3533
var Sub = /** @class */ (function (_super) {
3634
__extends(Sub, _super);
3735
function Sub() {

tests/baselines/reference/override10.symbols

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,13 @@ abstract class Base {
99
>bar : Symbol(Base.bar, Decl(override10.ts, 1, 28))
1010
}
1111

12-
// No errors:
1312
abstract class Sub extends Base {
1413
>Sub : Symbol(Sub, Decl(override10.ts, 3, 1))
1514
>Base : Symbol(Base, Decl(override10.ts, 0, 0))
1615

17-
override abstract foo(): number;
18-
>foo : Symbol(Sub.foo, Decl(override10.ts, 6, 33))
16+
abstract override foo(): number;
17+
>foo : Symbol(Sub.foo, Decl(override10.ts, 5, 33))
1918

2019
bar() { }
21-
>bar : Symbol(Sub.bar, Decl(override10.ts, 7, 36))
20+
>bar : Symbol(Sub.bar, Decl(override10.ts, 6, 36))
2221
}

tests/baselines/reference/override10.types

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,11 @@ abstract class Base {
99
>bar : () => void
1010
}
1111

12-
// No errors:
1312
abstract class Sub extends Base {
1413
>Sub : Sub
1514
>Base : Base
1615

17-
override abstract foo(): number;
16+
abstract override foo(): number;
1817
>foo : () => number
1918

2019
bar() { }

tests/baselines/reference/override5.errors.txt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@ tests/cases/conformance/override/override5.ts(20,21): error TS4113: This member
44
tests/cases/conformance/override/override5.ts(22,14): error TS1030: 'override' modifier already seen.
55
tests/cases/conformance/override/override5.ts(25,14): error TS1029: 'public' modifier must precede 'override' modifier.
66
tests/cases/conformance/override/override5.ts(27,5): error TS1089: 'override' modifier cannot appear on a constructor declaration.
7+
tests/cases/conformance/override/override5.ts(39,14): error TS1029: 'abstract' modifier must precede 'override' modifier.
8+
tests/cases/conformance/override/override5.ts(44,14): error TS1029: 'abstract' modifier must precede 'override' modifier.
79
tests/cases/conformance/override/override5.ts(44,23): error TS4112: This member cannot have an 'override' modifier because its containing class 'AND' does not extend another class.
810
tests/cases/conformance/override/override5.ts(45,23): error TS4112: This member cannot have an 'override' modifier because its containing class 'AND' does not extend another class.
911

1012

11-
==== tests/cases/conformance/override/override5.ts (8 errors) ====
13+
==== tests/cases/conformance/override/override5.ts (10 errors) ====
1214
class B {
1315
p1: number = 1;
1416
p2: number = 2;
@@ -60,11 +62,15 @@ tests/cases/conformance/override/override5.ts(45,23): error TS4112: This member
6062

6163
abstract class AD extends AB {
6264
override abstract f(): void;
65+
~~~~~~~~
66+
!!! error TS1029: 'abstract' modifier must precede 'override' modifier.
6367
abstract override b(): void;
6468
}
6569

6670
abstract class AND {
6771
override abstract f(): void;
72+
~~~~~~~~
73+
!!! error TS1029: 'abstract' modifier must precede 'override' modifier.
6874
~
6975
!!! error TS4112: This member cannot have an 'override' modifier because its containing class 'AND' does not extend another class.
7076
abstract override b(): void;

tests/baselines/reference/override7.errors.txt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@ tests/cases/conformance/override/override7.ts(21,21): error TS4113: This member
77
tests/cases/conformance/override/override7.ts(22,14): error TS1029: 'public' modifier must precede 'override' modifier.
88
tests/cases/conformance/override/override7.ts(22,21): error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'B'.
99
tests/cases/conformance/override/override7.ts(24,5): error TS1089: 'override' modifier cannot appear on a constructor declaration.
10+
tests/cases/conformance/override/override7.ts(36,14): error TS1029: 'abstract' modifier must precede 'override' modifier.
11+
tests/cases/conformance/override/override7.ts(41,14): error TS1029: 'abstract' modifier must precede 'override' modifier.
1012
tests/cases/conformance/override/override7.ts(41,23): error TS4112: This member cannot have an 'override' modifier because its containing class 'AND' does not extend another class.
1113
tests/cases/conformance/override/override7.ts(42,23): error TS4112: This member cannot have an 'override' modifier because its containing class 'AND' does not extend another class.
1214

1315

14-
==== tests/cases/conformance/override/override7.ts (11 errors) ====
16+
==== tests/cases/conformance/override/override7.ts (13 errors) ====
1517
class B {
1618
p1: number = 1;
1719
p2: number = 2;
@@ -66,11 +68,15 @@ tests/cases/conformance/override/override7.ts(42,23): error TS4112: This member
6668

6769
abstract class AD extends AB {
6870
override abstract f(): void;
71+
~~~~~~~~
72+
!!! error TS1029: 'abstract' modifier must precede 'override' modifier.
6973
abstract override b(): void;
7074
}
7175

7276
abstract class AND {
7377
override abstract f(): void;
78+
~~~~~~~~
79+
!!! error TS1029: 'abstract' modifier must precede 'override' modifier.
7480
~
7581
!!! error TS4112: This member cannot have an 'override' modifier because its containing class 'AND' does not extend another class.
7682
abstract override b(): void;

tests/baselines/reference/overrideKeywordOrder.errors.txt

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
tests/cases/conformance/override/overrideKeywordOrder.ts(12,9): error TS1029: 'override' modifier must precede 'async' modifier.
22
tests/cases/conformance/override/overrideKeywordOrder.ts(15,12): error TS1029: 'static' modifier must precede 'override' modifier.
3-
tests/cases/conformance/override/overrideKeywordOrder.ts(19,12): error TS1029: 'public' modifier must precede 'override' modifier.
4-
tests/cases/conformance/override/overrideKeywordOrder.ts(24,12): error TS1029: 'override' modifier must precede 'readonly' modifier.
3+
tests/cases/conformance/override/overrideKeywordOrder.ts(21,12): error TS1029: 'public' modifier must precede 'override' modifier.
4+
tests/cases/conformance/override/overrideKeywordOrder.ts(26,12): error TS1029: 'override' modifier must precede 'readonly' modifier.
5+
tests/cases/conformance/override/overrideKeywordOrder.ts(32,12): error TS1029: 'abstract' modifier must precede 'override' modifier.
56

67

7-
==== tests/cases/conformance/override/overrideKeywordOrder.ts (4 errors) ====
8-
class Base {
8+
==== tests/cases/conformance/override/overrideKeywordOrder.ts (5 errors) ====
9+
abstract class Base {
910
static s1() {}
1011
static s2() {}
11-
m1() {}
12-
m2() {}
12+
abstract m1(): void;
13+
abstract m2(): void;
1314
p1: any;
1415
p2: any;
1516
}
@@ -25,6 +26,8 @@ tests/cases/conformance/override/overrideKeywordOrder.ts(24,12): error TS1029: '
2526
~~~~~~
2627
!!! error TS1029: 'static' modifier must precede 'override' modifier.
2728
static override s2() {}
29+
m1() {}
30+
m2() {}
2831
}
2932
class Test3 extends Base {
3033
override public m1() {} // error
@@ -37,5 +40,14 @@ tests/cases/conformance/override/overrideKeywordOrder.ts(24,12): error TS1029: '
3740
readonly override p2: any; // error
3841
~~~~~~~~
3942
!!! error TS1029: 'override' modifier must precede 'readonly' modifier.
43+
m1() {}
44+
m2() {}
45+
}
46+
47+
abstract class Test5 extends Base {
48+
override abstract m1(): void; // error
49+
~~~~~~~~
50+
!!! error TS1029: 'abstract' modifier must precede 'override' modifier.
51+
abstract override m2(): void;
4052
}
4153

tests/cases/conformance/override/override10.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@ abstract class Base {
66
abstract bar(): void;
77
}
88

9-
// No errors:
109
abstract class Sub extends Base {
11-
override abstract foo(): number;
10+
abstract override foo(): number;
1211
bar() { }
1312
}

tests/cases/conformance/override/overrideKeywordOrder.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
// @noTypesAndSymbols: true
22
// @noEmit: true
33

4-
class Base {
4+
abstract class Base {
55
static s1() {}
66
static s2() {}
7-
m1() {}
8-
m2() {}
7+
abstract m1(): void;
8+
abstract m2(): void;
99
p1: any;
1010
p2: any;
1111
}
@@ -17,6 +17,8 @@ class Test1 extends Base {
1717
class Test2 extends Base {
1818
override static s1() {} // error
1919
static override s2() {}
20+
m1() {}
21+
m2() {}
2022
}
2123
class Test3 extends Base {
2224
override public m1() {} // error
@@ -25,4 +27,11 @@ class Test3 extends Base {
2527
class Test4 extends Base {
2628
override readonly p1: any;
2729
readonly override p2: any; // error
30+
m1() {}
31+
m2() {}
32+
}
33+
34+
abstract class Test5 extends Base {
35+
override abstract m1(): void; // error
36+
abstract override m2(): void;
2837
}

0 commit comments

Comments
 (0)