Skip to content

Commit 06f25c0

Browse files
authored
Enforce keyword order between override and static/async (microsoft#43660)
* Enforce keyword order between override and static/async * Update old tests for new keyword order
1 parent 0987ee9 commit 06f25c0

13 files changed

+85
-10
lines changed

src/compiler/checker.ts

+6
Original file line numberDiff line numberDiff line change
@@ -40529,6 +40529,9 @@ namespace ts {
4052940529
else if (flags & ModifierFlags.Readonly) {
4053040530
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "override", "readonly");
4053140531
}
40532+
else if (flags & ModifierFlags.Async) {
40533+
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "override", "async");
40534+
}
4053240535
if (node.kind === SyntaxKind.Parameter) {
4053340536
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_appear_on_a_parameter, "override");
4053440537
}
@@ -40592,6 +40595,9 @@ namespace ts {
4059240595
else if (flags & ModifierFlags.Abstract) {
4059340596
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "static", "abstract");
4059440597
}
40598+
else if (flags & ModifierFlags.Override) {
40599+
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "static", "override");
40600+
}
4059540601
flags |= ModifierFlags.Static;
4059640602
lastStatic = modifier;
4059740603
break;

tests/baselines/reference/override5.errors.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ tests/cases/conformance/override/override5.ts(45,23): error TS4112: This member
3232

3333
override readonly p4: number;
3434

35-
override static sp: number;
35+
static override sp: number;
3636
~~
3737
!!! error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'B'.
3838

tests/baselines/reference/override5.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class D extends B{
1818

1919
override readonly p4: number;
2020

21-
override static sp: number;
21+
static override sp: number;
2222

2323
override override oop: number;
2424

tests/baselines/reference/override5.symbols

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class D extends B{
4040
override readonly p4: number;
4141
>p4 : Symbol(D.p4, Decl(override5.ts, 15, 33))
4242

43-
override static sp: number;
43+
static override sp: number;
4444
>sp : Symbol(D.sp, Decl(override5.ts, 17, 33))
4545

4646
override override oop: number;

tests/baselines/reference/override5.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ class D extends B{
4444
override readonly p4: number;
4545
>p4 : number
4646

47-
override static sp: number;
47+
static override sp: number;
4848
>sp : number
4949

5050
override override oop: number;

tests/baselines/reference/override7.errors.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ tests/cases/conformance/override/override7.ts(42,23): error TS4112: This member
3232

3333
override readonly p4: number;
3434

35-
override static sp: number;
35+
static override sp: number;
3636
~~
3737
!!! error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'B'.
3838

tests/baselines/reference/override7.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class D extends B{
1515

1616
override readonly p4: number;
1717

18-
override static sp: number;
18+
static override sp: number;
1919

2020
override override oop: number;
2121

tests/baselines/reference/override7.symbols

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class D extends B{
3131
override readonly p4: number;
3232
>p4 : Symbol(D.p4, Decl(override7.ts, 12, 33))
3333

34-
override static sp: number;
34+
static override sp: number;
3535
>sp : Symbol(D.sp, Decl(override7.ts, 14, 33))
3636

3737
override override oop: number;

tests/baselines/reference/override7.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class D extends B{
3535
override readonly p4: number;
3636
>p4 : number
3737

38-
override static sp: number;
38+
static override sp: number;
3939
>sp : number
4040

4141
override override oop: number;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
tests/cases/conformance/override/overrideKeywordOrder.ts(12,9): error TS1029: 'override' modifier must precede 'async' modifier.
2+
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.
5+
6+
7+
==== tests/cases/conformance/override/overrideKeywordOrder.ts (4 errors) ====
8+
class Base {
9+
static s1() {}
10+
static s2() {}
11+
m1() {}
12+
m2() {}
13+
p1: any;
14+
p2: any;
15+
}
16+
17+
class Test1 extends Base {
18+
override async m1() {}
19+
async override m2() {} // error
20+
~~~~~~~~
21+
!!! error TS1029: 'override' modifier must precede 'async' modifier.
22+
}
23+
class Test2 extends Base {
24+
override static s1() {} // error
25+
~~~~~~
26+
!!! error TS1029: 'static' modifier must precede 'override' modifier.
27+
static override s2() {}
28+
}
29+
class Test3 extends Base {
30+
override public m1() {} // error
31+
~~~~~~
32+
!!! error TS1029: 'public' modifier must precede 'override' modifier.
33+
public override m2() {}
34+
}
35+
class Test4 extends Base {
36+
override readonly p1: any;
37+
readonly override p2: any; // error
38+
~~~~~~~~
39+
!!! error TS1029: 'override' modifier must precede 'readonly' modifier.
40+
}
41+

tests/cases/conformance/override/override5.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class D extends B{
1919

2020
override readonly p4: number;
2121

22-
override static sp: number;
22+
static override sp: number;
2323

2424
override override oop: number;
2525

tests/cases/conformance/override/override7.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class D extends B{
1616

1717
override readonly p4: number;
1818

19-
override static sp: number;
19+
static override sp: number;
2020

2121
override override oop: number;
2222

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// @noTypesAndSymbols: true
2+
// @noEmit: true
3+
4+
class Base {
5+
static s1() {}
6+
static s2() {}
7+
m1() {}
8+
m2() {}
9+
p1: any;
10+
p2: any;
11+
}
12+
13+
class Test1 extends Base {
14+
override async m1() {}
15+
async override m2() {} // error
16+
}
17+
class Test2 extends Base {
18+
override static s1() {} // error
19+
static override s2() {}
20+
}
21+
class Test3 extends Base {
22+
override public m1() {} // error
23+
public override m2() {}
24+
}
25+
class Test4 extends Base {
26+
override readonly p1: any;
27+
readonly override p2: any; // error
28+
}

0 commit comments

Comments
 (0)