mirror of
https://github.com/microsoft/TypeScript.git
synced 2025-11-18 17:21:48 +00:00
Enforce keyword order between override and static/async (#43660)
* Enforce keyword order between override and static/async * Update old tests for new keyword order
This commit is contained in:
@@ -40529,6 +40529,9 @@ namespace ts {
|
||||
else if (flags & ModifierFlags.Readonly) {
|
||||
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "override", "readonly");
|
||||
}
|
||||
else if (flags & ModifierFlags.Async) {
|
||||
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "override", "async");
|
||||
}
|
||||
if (node.kind === SyntaxKind.Parameter) {
|
||||
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_appear_on_a_parameter, "override");
|
||||
}
|
||||
@@ -40592,6 +40595,9 @@ namespace ts {
|
||||
else if (flags & ModifierFlags.Abstract) {
|
||||
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "static", "abstract");
|
||||
}
|
||||
else if (flags & ModifierFlags.Override) {
|
||||
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "static", "override");
|
||||
}
|
||||
flags |= ModifierFlags.Static;
|
||||
lastStatic = modifier;
|
||||
break;
|
||||
|
||||
@@ -32,7 +32,7 @@ tests/cases/conformance/override/override5.ts(45,23): error TS4112: This member
|
||||
|
||||
override readonly p4: number;
|
||||
|
||||
override static sp: number;
|
||||
static override sp: number;
|
||||
~~
|
||||
!!! error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'B'.
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ class D extends B{
|
||||
|
||||
override readonly p4: number;
|
||||
|
||||
override static sp: number;
|
||||
static override sp: number;
|
||||
|
||||
override override oop: number;
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ class D extends B{
|
||||
override readonly p4: number;
|
||||
>p4 : Symbol(D.p4, Decl(override5.ts, 15, 33))
|
||||
|
||||
override static sp: number;
|
||||
static override sp: number;
|
||||
>sp : Symbol(D.sp, Decl(override5.ts, 17, 33))
|
||||
|
||||
override override oop: number;
|
||||
|
||||
@@ -44,7 +44,7 @@ class D extends B{
|
||||
override readonly p4: number;
|
||||
>p4 : number
|
||||
|
||||
override static sp: number;
|
||||
static override sp: number;
|
||||
>sp : number
|
||||
|
||||
override override oop: number;
|
||||
|
||||
@@ -32,7 +32,7 @@ tests/cases/conformance/override/override7.ts(42,23): error TS4112: This member
|
||||
|
||||
override readonly p4: number;
|
||||
|
||||
override static sp: number;
|
||||
static override sp: number;
|
||||
~~
|
||||
!!! error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'B'.
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ class D extends B{
|
||||
|
||||
override readonly p4: number;
|
||||
|
||||
override static sp: number;
|
||||
static override sp: number;
|
||||
|
||||
override override oop: number;
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ class D extends B{
|
||||
override readonly p4: number;
|
||||
>p4 : Symbol(D.p4, Decl(override7.ts, 12, 33))
|
||||
|
||||
override static sp: number;
|
||||
static override sp: number;
|
||||
>sp : Symbol(D.sp, Decl(override7.ts, 14, 33))
|
||||
|
||||
override override oop: number;
|
||||
|
||||
@@ -35,7 +35,7 @@ class D extends B{
|
||||
override readonly p4: number;
|
||||
>p4 : number
|
||||
|
||||
override static sp: number;
|
||||
static override sp: number;
|
||||
>sp : number
|
||||
|
||||
override override oop: number;
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
tests/cases/conformance/override/overrideKeywordOrder.ts(12,9): error TS1029: 'override' modifier must precede 'async' modifier.
|
||||
tests/cases/conformance/override/overrideKeywordOrder.ts(15,12): error TS1029: 'static' modifier must precede 'override' modifier.
|
||||
tests/cases/conformance/override/overrideKeywordOrder.ts(19,12): error TS1029: 'public' modifier must precede 'override' modifier.
|
||||
tests/cases/conformance/override/overrideKeywordOrder.ts(24,12): error TS1029: 'override' modifier must precede 'readonly' modifier.
|
||||
|
||||
|
||||
==== tests/cases/conformance/override/overrideKeywordOrder.ts (4 errors) ====
|
||||
class Base {
|
||||
static s1() {}
|
||||
static s2() {}
|
||||
m1() {}
|
||||
m2() {}
|
||||
p1: any;
|
||||
p2: any;
|
||||
}
|
||||
|
||||
class Test1 extends Base {
|
||||
override async m1() {}
|
||||
async override m2() {} // error
|
||||
~~~~~~~~
|
||||
!!! error TS1029: 'override' modifier must precede 'async' modifier.
|
||||
}
|
||||
class Test2 extends Base {
|
||||
override static s1() {} // error
|
||||
~~~~~~
|
||||
!!! error TS1029: 'static' modifier must precede 'override' modifier.
|
||||
static override s2() {}
|
||||
}
|
||||
class Test3 extends Base {
|
||||
override public m1() {} // error
|
||||
~~~~~~
|
||||
!!! error TS1029: 'public' modifier must precede 'override' modifier.
|
||||
public override m2() {}
|
||||
}
|
||||
class Test4 extends Base {
|
||||
override readonly p1: any;
|
||||
readonly override p2: any; // error
|
||||
~~~~~~~~
|
||||
!!! error TS1029: 'override' modifier must precede 'readonly' modifier.
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ class D extends B{
|
||||
|
||||
override readonly p4: number;
|
||||
|
||||
override static sp: number;
|
||||
static override sp: number;
|
||||
|
||||
override override oop: number;
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ class D extends B{
|
||||
|
||||
override readonly p4: number;
|
||||
|
||||
override static sp: number;
|
||||
static override sp: number;
|
||||
|
||||
override override oop: number;
|
||||
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
// @noTypesAndSymbols: true
|
||||
// @noEmit: true
|
||||
|
||||
class Base {
|
||||
static s1() {}
|
||||
static s2() {}
|
||||
m1() {}
|
||||
m2() {}
|
||||
p1: any;
|
||||
p2: any;
|
||||
}
|
||||
|
||||
class Test1 extends Base {
|
||||
override async m1() {}
|
||||
async override m2() {} // error
|
||||
}
|
||||
class Test2 extends Base {
|
||||
override static s1() {} // error
|
||||
static override s2() {}
|
||||
}
|
||||
class Test3 extends Base {
|
||||
override public m1() {} // error
|
||||
public override m2() {}
|
||||
}
|
||||
class Test4 extends Base {
|
||||
override readonly p1: any;
|
||||
readonly override p2: any; // error
|
||||
}
|
||||
Reference in New Issue
Block a user