diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index cd91f4272484a..c2304527d5815 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -22720,8 +22720,15 @@ namespace ts { duplicateFunctionDeclaration = true; } } - else if (previousDeclaration && previousDeclaration.parent === node.parent && previousDeclaration.end !== node.pos) { - reportImplementationExpectedError(previousDeclaration); + else if (previousDeclaration && previousDeclaration.parent === node.parent) { + if (previousDeclaration.end !== node.pos) { + reportImplementationExpectedError(previousDeclaration); + } + else { + if (hasModifier(node, ModifierFlags.Abstract) && (node as FunctionLikeDeclaration).asteriskToken) { + error(current, Diagnostics.An_overload_signature_cannot_be_declared_as_a_generator); + } + } } if (nodeIsPresent((node as FunctionLikeDeclaration).body)) { @@ -28720,7 +28727,7 @@ namespace ts { if (node.flags & NodeFlags.Ambient) { return grammarErrorOnNode(node.asteriskToken!, Diagnostics.Generators_are_not_allowed_in_an_ambient_context); } - if (!node.body) { + if (!node.body && !hasModifier(node, ModifierFlags.Abstract)) { return grammarErrorOnNode(node.asteriskToken!, Diagnostics.An_overload_signature_cannot_be_declared_as_a_generator); } } diff --git a/tests/baselines/reference/abstractGenerator.js b/tests/baselines/reference/abstractGenerator.js new file mode 100644 index 0000000000000..9a8e7f115cca5 --- /dev/null +++ b/tests/baselines/reference/abstractGenerator.js @@ -0,0 +1,12 @@ +//// [abstractGenerator.ts] +abstract class Passes { + abstract *foo(); +} + + +//// [abstractGenerator.js] +var Passes = /** @class */ (function () { + function Passes() { + } + return Passes; +}()); diff --git a/tests/baselines/reference/abstractGenerator.symbols b/tests/baselines/reference/abstractGenerator.symbols new file mode 100644 index 0000000000000..2d08224818984 --- /dev/null +++ b/tests/baselines/reference/abstractGenerator.symbols @@ -0,0 +1,8 @@ +=== tests/cases/compiler/abstractGenerator.ts === +abstract class Passes { +>Passes : Symbol(Passes, Decl(abstractGenerator.ts, 0, 0)) + + abstract *foo(); +>foo : Symbol(Passes.foo, Decl(abstractGenerator.ts, 0, 23)) +} + diff --git a/tests/baselines/reference/abstractGenerator.types b/tests/baselines/reference/abstractGenerator.types new file mode 100644 index 0000000000000..aa84674e2e047 --- /dev/null +++ b/tests/baselines/reference/abstractGenerator.types @@ -0,0 +1,8 @@ +=== tests/cases/compiler/abstractGenerator.ts === +abstract class Passes { +>Passes : Passes + + abstract *foo(); +>foo : () => any +} + diff --git a/tests/cases/compiler/abstractGenerator.ts b/tests/cases/compiler/abstractGenerator.ts new file mode 100644 index 0000000000000..6f5e9c28f203b --- /dev/null +++ b/tests/cases/compiler/abstractGenerator.ts @@ -0,0 +1,3 @@ +abstract class Passes { + abstract *foo(); +}