Skip to content

Commit 09d68ef

Browse files
authored
fix(28516): forbid using async modifier with the abstract modifier (#39963)
1 parent f6f2d36 commit 09d68ef

File tree

6 files changed

+59
-25
lines changed

6 files changed

+59
-25
lines changed

src/compiler/checker.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38095,6 +38095,9 @@ namespace ts {
3809538095
if (flags & ModifierFlags.Private) {
3809638096
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "private", "abstract");
3809738097
}
38098+
if (flags & ModifierFlags.Async && lastAsync) {
38099+
return grammarErrorOnNode(lastAsync, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "async", "abstract");
38100+
}
3809838101
}
3809938102
if (isNamedDeclaration(node) && node.name.kind === SyntaxKind.PrivateIdentifier) {
3810038103
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_a_private_identifier, "abstract");
@@ -38113,6 +38116,9 @@ namespace ts {
3811338116
else if (node.kind === SyntaxKind.Parameter) {
3811438117
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_appear_on_a_parameter, "async");
3811538118
}
38119+
if (flags & ModifierFlags.Abstract) {
38120+
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "async", "abstract");
38121+
}
3811638122
flags |= ModifierFlags.Async;
3811738123
lastAsync = modifier;
3811838124
break;

tests/baselines/reference/classAbstractMixedWithModifiers.errors.txt

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,21 @@ tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbst
33
tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractMixedWithModifiers.ts(9,14): error TS1029: 'protected' modifier must precede 'abstract' modifier.
44
tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractMixedWithModifiers.ts(10,14): error TS1243: 'private' modifier cannot be used with 'abstract' modifier.
55
tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractMixedWithModifiers.ts(12,14): error TS1243: 'static' modifier cannot be used with 'abstract' modifier.
6-
tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractMixedWithModifiers.ts(14,12): error TS1243: 'static' modifier cannot be used with 'abstract' modifier.
6+
tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractMixedWithModifiers.ts(13,12): error TS1243: 'static' modifier cannot be used with 'abstract' modifier.
7+
tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractMixedWithModifiers.ts(15,14): error TS1243: 'async' modifier cannot be used with 'abstract' modifier.
8+
tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractMixedWithModifiers.ts(16,5): error TS1243: 'async' modifier cannot be used with 'abstract' modifier.
79

810

9-
==== tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractMixedWithModifiers.ts (6 errors) ====
11+
==== tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractMixedWithModifiers.ts (8 errors) ====
1012
abstract class A {
1113
abstract foo_a();
12-
14+
1315
public abstract foo_b();
1416
protected abstract foo_c();
1517
private abstract foo_d();
1618
~~~~~~~~
1719
!!! error TS1243: 'private' modifier cannot be used with 'abstract' modifier.
18-
20+
1921
abstract public foo_bb();
2022
~~~~~~
2123
!!! error TS1029: 'public' modifier must precede 'abstract' modifier.
@@ -25,12 +27,19 @@ tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbst
2527
abstract private foo_dd();
2628
~~~~~~~
2729
!!! error TS1243: 'private' modifier cannot be used with 'abstract' modifier.
28-
30+
2931
abstract static foo_d();
3032
~~~~~~
3133
!!! error TS1243: 'static' modifier cannot be used with 'abstract' modifier.
32-
3334
static abstract foo_e();
3435
~~~~~~~~
3536
!!! error TS1243: 'static' modifier cannot be used with 'abstract' modifier.
36-
}
37+
38+
abstract async foo_f();
39+
~~~~~
40+
!!! error TS1243: 'async' modifier cannot be used with 'abstract' modifier.
41+
async abstract foo_g();
42+
~~~~~
43+
!!! error TS1243: 'async' modifier cannot be used with 'abstract' modifier.
44+
}
45+

tests/baselines/reference/classAbstractMixedWithModifiers.js

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,22 @@
11
//// [classAbstractMixedWithModifiers.ts]
22
abstract class A {
33
abstract foo_a();
4-
4+
55
public abstract foo_b();
66
protected abstract foo_c();
77
private abstract foo_d();
8-
8+
99
abstract public foo_bb();
1010
abstract protected foo_cc();
1111
abstract private foo_dd();
12-
12+
1313
abstract static foo_d();
14-
1514
static abstract foo_e();
16-
}
15+
16+
abstract async foo_f();
17+
async abstract foo_g();
18+
}
19+
1720

1821
//// [classAbstractMixedWithModifiers.js]
1922
var A = /** @class */ (function () {

tests/baselines/reference/classAbstractMixedWithModifiers.symbols

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ abstract class A {
44

55
abstract foo_a();
66
>foo_a : Symbol(A.foo_a, Decl(classAbstractMixedWithModifiers.ts, 0, 18))
7-
7+
88
public abstract foo_b();
99
>foo_b : Symbol(A.foo_b, Decl(classAbstractMixedWithModifiers.ts, 1, 21))
1010

@@ -13,7 +13,7 @@ abstract class A {
1313

1414
private abstract foo_d();
1515
>foo_d : Symbol(A.foo_d, Decl(classAbstractMixedWithModifiers.ts, 4, 31))
16-
16+
1717
abstract public foo_bb();
1818
>foo_bb : Symbol(A.foo_bb, Decl(classAbstractMixedWithModifiers.ts, 5, 29))
1919

@@ -22,10 +22,17 @@ abstract class A {
2222

2323
abstract private foo_dd();
2424
>foo_dd : Symbol(A.foo_dd, Decl(classAbstractMixedWithModifiers.ts, 8, 32))
25-
25+
2626
abstract static foo_d();
2727
>foo_d : Symbol(A.foo_d, Decl(classAbstractMixedWithModifiers.ts, 9, 30))
28-
28+
2929
static abstract foo_e();
3030
>foo_e : Symbol(A.foo_e, Decl(classAbstractMixedWithModifiers.ts, 11, 28))
31+
32+
abstract async foo_f();
33+
>foo_f : Symbol(A.foo_f, Decl(classAbstractMixedWithModifiers.ts, 12, 28))
34+
35+
async abstract foo_g();
36+
>foo_g : Symbol(A.foo_g, Decl(classAbstractMixedWithModifiers.ts, 14, 27))
3137
}
38+

tests/baselines/reference/classAbstractMixedWithModifiers.types

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ abstract class A {
44

55
abstract foo_a();
66
>foo_a : () => any
7-
7+
88
public abstract foo_b();
99
>foo_b : () => any
1010

@@ -13,7 +13,7 @@ abstract class A {
1313

1414
private abstract foo_d();
1515
>foo_d : () => any
16-
16+
1717
abstract public foo_bb();
1818
>foo_bb : () => any
1919

@@ -22,10 +22,17 @@ abstract class A {
2222

2323
abstract private foo_dd();
2424
>foo_dd : () => any
25-
25+
2626
abstract static foo_d();
2727
>foo_d : () => any
28-
28+
2929
static abstract foo_e();
3030
>foo_e : () => any
31+
32+
abstract async foo_f();
33+
>foo_f : () => any
34+
35+
async abstract foo_g();
36+
>foo_g : () => any
3137
}
38+
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
abstract class A {
22
abstract foo_a();
3-
3+
44
public abstract foo_b();
55
protected abstract foo_c();
66
private abstract foo_d();
7-
7+
88
abstract public foo_bb();
99
abstract protected foo_cc();
1010
abstract private foo_dd();
11-
11+
1212
abstract static foo_d();
13-
1413
static abstract foo_e();
15-
}
14+
15+
abstract async foo_f();
16+
async abstract foo_g();
17+
}

0 commit comments

Comments
 (0)