From 0a1f3b64fbadfced18021052112e9f3579d3525a Mon Sep 17 00:00:00 2001 From: aleph-naught2tog Date: Wed, 14 Nov 2018 00:30:54 -0600 Subject: [PATCH] Disallows `async abstract` method declarations Since we do not allow `async` as a modifier on type members such as in an interface, it was decided that it should also not be allowed on abstract methods. Fixes #28516. --- src/compiler/checker.ts | 3 +++ tests/baselines/reference/abstractAsync.errors.txt | 9 +++++++++ tests/baselines/reference/abstractAsync.js | 11 +++++++++++ tests/baselines/reference/abstractAsync.symbols | 8 ++++++++ tests/baselines/reference/abstractAsync.types | 8 ++++++++ tests/cases/compiler/abstractAsync.ts | 4 ++++ 6 files changed, 43 insertions(+) create mode 100644 tests/baselines/reference/abstractAsync.errors.txt create mode 100644 tests/baselines/reference/abstractAsync.js create mode 100644 tests/baselines/reference/abstractAsync.symbols create mode 100644 tests/baselines/reference/abstractAsync.types create mode 100644 tests/cases/compiler/abstractAsync.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index e59641bed412e..54d6daca678a3 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -28342,6 +28342,9 @@ namespace ts { if (flags & ModifierFlags.Private) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "private", "abstract"); } + if (flags & ModifierFlags.Async) { + return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "async", "abstract"); + } } flags |= ModifierFlags.Abstract; diff --git a/tests/baselines/reference/abstractAsync.errors.txt b/tests/baselines/reference/abstractAsync.errors.txt new file mode 100644 index 0000000000000..d0f741468b28b --- /dev/null +++ b/tests/baselines/reference/abstractAsync.errors.txt @@ -0,0 +1,9 @@ +tests/cases/compiler/abstractAsync.ts(2,9): error TS1243: 'async' modifier cannot be used with 'abstract' modifier. + + +==== tests/cases/compiler/abstractAsync.ts (1 errors) ==== + abstract class ShouldFailClass { + async abstract badMethod(): Promise; + ~~~~~~~~ +!!! error TS1243: 'async' modifier cannot be used with 'abstract' modifier. + } \ No newline at end of file diff --git a/tests/baselines/reference/abstractAsync.js b/tests/baselines/reference/abstractAsync.js new file mode 100644 index 0000000000000..96665a0ada194 --- /dev/null +++ b/tests/baselines/reference/abstractAsync.js @@ -0,0 +1,11 @@ +//// [abstractAsync.ts] +abstract class ShouldFailClass { + async abstract badMethod(): Promise; +} + +//// [abstractAsync.js] +var ShouldFailClass = /** @class */ (function () { + function ShouldFailClass() { + } + return ShouldFailClass; +}()); diff --git a/tests/baselines/reference/abstractAsync.symbols b/tests/baselines/reference/abstractAsync.symbols new file mode 100644 index 0000000000000..e0cf473f8b8b5 --- /dev/null +++ b/tests/baselines/reference/abstractAsync.symbols @@ -0,0 +1,8 @@ +=== tests/cases/compiler/abstractAsync.ts === +abstract class ShouldFailClass { +>ShouldFailClass : Symbol(ShouldFailClass, Decl(abstractAsync.ts, 0, 0)) + + async abstract badMethod(): Promise; +>badMethod : Symbol(ShouldFailClass.badMethod, Decl(abstractAsync.ts, 0, 32)) +>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --)) +} diff --git a/tests/baselines/reference/abstractAsync.types b/tests/baselines/reference/abstractAsync.types new file mode 100644 index 0000000000000..1b1771c2ca753 --- /dev/null +++ b/tests/baselines/reference/abstractAsync.types @@ -0,0 +1,8 @@ +=== tests/cases/compiler/abstractAsync.ts === +abstract class ShouldFailClass { +>ShouldFailClass : ShouldFailClass + + async abstract badMethod(): Promise; +>badMethod : () => Promise +>Promise : Promise +} diff --git a/tests/cases/compiler/abstractAsync.ts b/tests/cases/compiler/abstractAsync.ts new file mode 100644 index 0000000000000..efd6d979ed16c --- /dev/null +++ b/tests/cases/compiler/abstractAsync.ts @@ -0,0 +1,4 @@ +// @lib: es2015 +abstract class ShouldFailClass { + async abstract badMethod(): Promise; +} \ No newline at end of file