Enforce keyword order of abstract and override (#43829)

* Enforce keyword order of abstract and override

* Update baselines

* Update existing test
This commit is contained in:
Andrew Branch
2021-04-28 16:41:28 -07:00
committed by GitHub
parent 791c747e06
commit a14b22718a
9 changed files with 53 additions and 22 deletions

View File

@@ -40837,6 +40837,9 @@ namespace ts {
if (flags & ModifierFlags.Async && lastAsync) {
return grammarErrorOnNode(lastAsync, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "async", "abstract");
}
if (flags & ModifierFlags.Override) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "abstract", "override");
}
}
if (isNamedDeclaration(node) && node.name.kind === SyntaxKind.PrivateIdentifier) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_a_private_identifier, "abstract");

View File

@@ -4,9 +4,8 @@ abstract class Base {
abstract bar(): void;
}
// No errors:
abstract class Sub extends Base {
override abstract foo(): number;
abstract override foo(): number;
bar() { }
}
@@ -31,7 +30,6 @@ var Base = /** @class */ (function () {
}
return Base;
}());
// No errors:
var Sub = /** @class */ (function (_super) {
__extends(Sub, _super);
function Sub() {

View File

@@ -9,14 +9,13 @@ abstract class Base {
>bar : Symbol(Base.bar, Decl(override10.ts, 1, 28))
}
// No errors:
abstract class Sub extends Base {
>Sub : Symbol(Sub, Decl(override10.ts, 3, 1))
>Base : Symbol(Base, Decl(override10.ts, 0, 0))
override abstract foo(): number;
>foo : Symbol(Sub.foo, Decl(override10.ts, 6, 33))
abstract override foo(): number;
>foo : Symbol(Sub.foo, Decl(override10.ts, 5, 33))
bar() { }
>bar : Symbol(Sub.bar, Decl(override10.ts, 7, 36))
>bar : Symbol(Sub.bar, Decl(override10.ts, 6, 36))
}

View File

@@ -9,12 +9,11 @@ abstract class Base {
>bar : () => void
}
// No errors:
abstract class Sub extends Base {
>Sub : Sub
>Base : Base
override abstract foo(): number;
abstract override foo(): number;
>foo : () => number
bar() { }

View File

@@ -4,11 +4,13 @@ tests/cases/conformance/override/override5.ts(20,21): error TS4113: This member
tests/cases/conformance/override/override5.ts(22,14): error TS1030: 'override' modifier already seen.
tests/cases/conformance/override/override5.ts(25,14): error TS1029: 'public' modifier must precede 'override' modifier.
tests/cases/conformance/override/override5.ts(27,5): error TS1089: 'override' modifier cannot appear on a constructor declaration.
tests/cases/conformance/override/override5.ts(39,14): error TS1029: 'abstract' modifier must precede 'override' modifier.
tests/cases/conformance/override/override5.ts(44,14): error TS1029: 'abstract' modifier must precede 'override' modifier.
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.
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.
==== tests/cases/conformance/override/override5.ts (8 errors) ====
==== tests/cases/conformance/override/override5.ts (10 errors) ====
class B {
p1: number = 1;
p2: number = 2;
@@ -60,11 +62,15 @@ tests/cases/conformance/override/override5.ts(45,23): error TS4112: This member
abstract class AD extends AB {
override abstract f(): void;
~~~~~~~~
!!! error TS1029: 'abstract' modifier must precede 'override' modifier.
abstract override b(): void;
}
abstract class AND {
override abstract f(): void;
~~~~~~~~
!!! error TS1029: 'abstract' modifier must precede 'override' modifier.
~
!!! error TS4112: This member cannot have an 'override' modifier because its containing class 'AND' does not extend another class.
abstract override b(): void;

View File

@@ -7,11 +7,13 @@ tests/cases/conformance/override/override7.ts(21,21): error TS4113: This member
tests/cases/conformance/override/override7.ts(22,14): error TS1029: 'public' modifier must precede 'override' modifier.
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'.
tests/cases/conformance/override/override7.ts(24,5): error TS1089: 'override' modifier cannot appear on a constructor declaration.
tests/cases/conformance/override/override7.ts(36,14): error TS1029: 'abstract' modifier must precede 'override' modifier.
tests/cases/conformance/override/override7.ts(41,14): error TS1029: 'abstract' modifier must precede 'override' modifier.
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.
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.
==== tests/cases/conformance/override/override7.ts (11 errors) ====
==== tests/cases/conformance/override/override7.ts (13 errors) ====
class B {
p1: number = 1;
p2: number = 2;
@@ -66,11 +68,15 @@ tests/cases/conformance/override/override7.ts(42,23): error TS4112: This member
abstract class AD extends AB {
override abstract f(): void;
~~~~~~~~
!!! error TS1029: 'abstract' modifier must precede 'override' modifier.
abstract override b(): void;
}
abstract class AND {
override abstract f(): void;
~~~~~~~~
!!! error TS1029: 'abstract' modifier must precede 'override' modifier.
~
!!! error TS4112: This member cannot have an 'override' modifier because its containing class 'AND' does not extend another class.
abstract override b(): void;

View File

@@ -1,15 +1,16 @@
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(21,12): error TS1029: 'public' modifier must precede 'override' modifier.
tests/cases/conformance/override/overrideKeywordOrder.ts(26,12): error TS1029: 'override' modifier must precede 'readonly' modifier.
tests/cases/conformance/override/overrideKeywordOrder.ts(32,12): error TS1029: 'abstract' modifier must precede 'override' modifier.
==== tests/cases/conformance/override/overrideKeywordOrder.ts (4 errors) ====
class Base {
==== tests/cases/conformance/override/overrideKeywordOrder.ts (5 errors) ====
abstract class Base {
static s1() {}
static s2() {}
m1() {}
m2() {}
abstract m1(): void;
abstract m2(): void;
p1: any;
p2: any;
}
@@ -25,6 +26,8 @@ tests/cases/conformance/override/overrideKeywordOrder.ts(24,12): error TS1029: '
~~~~~~
!!! error TS1029: 'static' modifier must precede 'override' modifier.
static override s2() {}
m1() {}
m2() {}
}
class Test3 extends Base {
override public m1() {} // error
@@ -37,5 +40,14 @@ tests/cases/conformance/override/overrideKeywordOrder.ts(24,12): error TS1029: '
readonly override p2: any; // error
~~~~~~~~
!!! error TS1029: 'override' modifier must precede 'readonly' modifier.
m1() {}
m2() {}
}
abstract class Test5 extends Base {
override abstract m1(): void; // error
~~~~~~~~
!!! error TS1029: 'abstract' modifier must precede 'override' modifier.
abstract override m2(): void;
}

View File

@@ -6,8 +6,7 @@ abstract class Base {
abstract bar(): void;
}
// No errors:
abstract class Sub extends Base {
override abstract foo(): number;
abstract override foo(): number;
bar() { }
}

View File

@@ -1,11 +1,11 @@
// @noTypesAndSymbols: true
// @noEmit: true
class Base {
abstract class Base {
static s1() {}
static s2() {}
m1() {}
m2() {}
abstract m1(): void;
abstract m2(): void;
p1: any;
p2: any;
}
@@ -17,6 +17,8 @@ class Test1 extends Base {
class Test2 extends Base {
override static s1() {} // error
static override s2() {}
m1() {}
m2() {}
}
class Test3 extends Base {
override public m1() {} // error
@@ -25,4 +27,11 @@ class Test3 extends Base {
class Test4 extends Base {
override readonly p1: any;
readonly override p2: any; // error
m1() {}
m2() {}
}
abstract class Test5 extends Base {
override abstract m1(): void; // error
abstract override m2(): void;
}