@@ -15999,7 +15999,7 @@ namespace ts {
15999
15999
// From within an async function you can return either a non-promise value or a promise. Any
16000
16000
// Promise/A+ compatible implementation will always assimilate any foreign promise, so the
16001
16001
// return type of the body is awaited type of the body, wrapped in a native Promise<T> type.
16002
- return (functionFlags & FunctionFlags.AsyncOrAsyncGenerator ) === FunctionFlags.Async
16002
+ return (functionFlags & FunctionFlags.AsyncGenerator ) === FunctionFlags.Async
16003
16003
? createPromiseReturnType(func, widenedType) // Async function
16004
16004
: widenedType; // Generator function, AsyncGenerator function, or normal function
16005
16005
}
@@ -16215,7 +16215,7 @@ namespace ts {
16215
16215
16216
16216
const functionFlags = getFunctionFlags(node);
16217
16217
const returnOrPromisedType = node.type &&
16218
- ((functionFlags & FunctionFlags.AsyncOrAsyncGenerator ) === FunctionFlags.Async ?
16218
+ ((functionFlags & FunctionFlags.AsyncGenerator ) === FunctionFlags.Async ?
16219
16219
checkAsyncFunctionReturnType(node) : // Async function
16220
16220
getTypeFromTypeNode(node.type)); // AsyncGenerator function, Generator function, or normal function
16221
16221
@@ -16245,7 +16245,7 @@ namespace ts {
16245
16245
// its return type annotation.
16246
16246
const exprType = checkExpression(<Expression>node.body);
16247
16247
if (returnOrPromisedType) {
16248
- if ((functionFlags & FunctionFlags.AsyncOrAsyncGenerator ) === FunctionFlags.Async) { // Async function
16248
+ if ((functionFlags & FunctionFlags.AsyncGenerator ) === FunctionFlags.Async) { // Async function
16249
16249
const awaitedType = checkAwaitedType(exprType, node.body, Diagnostics.The_return_type_of_an_async_function_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member);
16250
16250
checkTypeAssignableTo(awaitedType, returnOrPromisedType, node.body);
16251
16251
}
@@ -16985,12 +16985,16 @@ namespace ts {
16985
16985
// we are in a yield context.
16986
16986
const functionFlags = func && getFunctionFlags(func);
16987
16987
if (node.asteriskToken) {
16988
- if (functionFlags & FunctionFlags.Async) {
16989
- if (languageVersion < ScriptTarget.ES2017) {
16990
- checkExternalEmitHelpers(node, ExternalEmitHelpers.AsyncDelegator);
16991
- }
16988
+ // Async generator functions prior to ESNext require the __await, __asyncDelegator,
16989
+ // and __asyncValues helpers
16990
+ if ((functionFlags & FunctionFlags.AsyncGenerator) === FunctionFlags.AsyncGenerator &&
16991
+ languageVersion < ScriptTarget.ESNext) {
16992
+ checkExternalEmitHelpers(node, ExternalEmitHelpers.AsyncDelegatorIncludes);
16992
16993
}
16993
- else if (languageVersion < ScriptTarget.ES2015 && compilerOptions.downlevelIteration) {
16994
+
16995
+ // Generator functions prior to ES2015 require the __values helper
16996
+ if ((functionFlags & FunctionFlags.AsyncGenerator) === FunctionFlags.Generator &&
16997
+ languageVersion < ScriptTarget.ES2015 && compilerOptions.downlevelIteration) {
16994
16998
checkExternalEmitHelpers(node, ExternalEmitHelpers.Values);
16995
16999
}
16996
17000
}
@@ -17509,18 +17513,20 @@ namespace ts {
17509
17513
}
17510
17514
17511
17515
const functionFlags = getFunctionFlags(<FunctionLikeDeclaration>node);
17512
- if ((functionFlags & FunctionFlags.InvalidAsyncOrAsyncGenerator) === FunctionFlags.Async && languageVersion < ScriptTarget.ES2017 ) {
17513
- checkExternalEmitHelpers(node, ExternalEmitHelpers.Awaiter);
17514
- if (languageVersion < ScriptTarget.ES2015 ) {
17515
- checkExternalEmitHelpers(node, ExternalEmitHelpers.Generator );
17516
+ if (! (functionFlags & FunctionFlags.Invalid) ) {
17517
+ // Async generators prior to ESNext require the __await and __asyncGenerator helpers
17518
+ if ((functionFlags & FunctionFlags.AsyncGenerator) === FunctionFlags.AsyncGenerator && languageVersion < ScriptTarget.ESNext ) {
17519
+ checkExternalEmitHelpers(node, ExternalEmitHelpers.AsyncGeneratorIncludes );
17516
17520
}
17517
- }
17518
17521
17519
- if ((functionFlags & FunctionFlags.InvalidGenerator) === FunctionFlags.Generator) {
17520
- if (functionFlags & FunctionFlags.Async && languageVersion < ScriptTarget.ES2017) {
17521
- checkExternalEmitHelpers(node, ExternalEmitHelpers.AsyncGenerator );
17522
+ // Async functions prior to ES2017 require the __awaiter helper
17523
+ if (( functionFlags & FunctionFlags.AsyncGenerator) === FunctionFlags.Async && languageVersion < ScriptTarget.ES2017) {
17524
+ checkExternalEmitHelpers(node, ExternalEmitHelpers.Awaiter );
17522
17525
}
17523
- else if (languageVersion < ScriptTarget.ES2015) {
17526
+
17527
+ // Generator functions, Async functions, and Async Generator functions prior to
17528
+ // ES2015 require the __generator helper
17529
+ if ((functionFlags & FunctionFlags.AsyncGenerator) !== FunctionFlags.Normal && languageVersion < ScriptTarget.ES2015) {
17524
17530
checkExternalEmitHelpers(node, ExternalEmitHelpers.Generator);
17525
17531
}
17526
17532
}
@@ -17548,7 +17554,7 @@ namespace ts {
17548
17554
17549
17555
if (node.type) {
17550
17556
const functionFlags = getFunctionFlags(<FunctionDeclaration>node);
17551
- if ((functionFlags & FunctionFlags.InvalidGenerator ) === FunctionFlags.Generator) {
17557
+ if ((functionFlags & ( FunctionFlags.Invalid | FunctionFlags.Generator) ) === FunctionFlags.Generator) {
17552
17558
const returnType = getTypeFromTypeNode(node.type);
17553
17559
if (returnType === voidType) {
17554
17560
error(node.type, Diagnostics.A_generator_cannot_have_a_void_type_annotation);
@@ -17568,7 +17574,7 @@ namespace ts {
17568
17574
checkTypeAssignableTo(iterableIteratorInstantiation, returnType, node.type);
17569
17575
}
17570
17576
}
17571
- else if ((functionFlags & FunctionFlags.AsyncOrAsyncGenerator ) === FunctionFlags.Async) {
17577
+ else if ((functionFlags & FunctionFlags.AsyncGenerator ) === FunctionFlags.Async) {
17572
17578
checkAsyncFunctionReturnType(<FunctionLikeDeclaration>node);
17573
17579
}
17574
17580
}
@@ -19535,11 +19541,14 @@ namespace ts {
19535
19541
19536
19542
if (node.kind === SyntaxKind.ForOfStatement) {
19537
19543
if ((<ForOfStatement>node).awaitModifier) {
19538
- if (languageVersion < ScriptTarget.ES2017) {
19544
+ const functionFlags = getFunctionFlags(getContainingFunction(node));
19545
+ if ((functionFlags & (FunctionFlags.Invalid | FunctionFlags.Async)) === FunctionFlags.Async && languageVersion < ScriptTarget.ESNext) {
19546
+ // for..await..of in an async function or async generator function prior to ESNext requires the __asyncValues helper
19539
19547
checkExternalEmitHelpers(node, ExternalEmitHelpers.ForAwaitOfIncludes);
19540
19548
}
19541
19549
}
19542
- else if (languageVersion < ScriptTarget.ES2015 && compilerOptions.downlevelIteration) {
19550
+ else if (compilerOptions.downlevelIteration && languageVersion < ScriptTarget.ES2015) {
19551
+ // for..of prior to ES2015 requires the __values helper when downlevelIteration is enabled
19543
19552
checkExternalEmitHelpers(node, ExternalEmitHelpers.ForOfIncludes);
19544
19553
}
19545
19554
}
@@ -19969,7 +19978,7 @@ namespace ts {
19969
19978
}
19970
19979
19971
19980
function isUnwrappedReturnTypeVoidOrAny(func: FunctionLikeDeclaration, returnType: Type): boolean {
19972
- const unwrappedReturnType = (getFunctionFlags(func) & FunctionFlags.AsyncOrAsyncGenerator ) === FunctionFlags.Async
19981
+ const unwrappedReturnType = (getFunctionFlags(func) & FunctionFlags.AsyncGenerator ) === FunctionFlags.Async
19973
19982
? getPromisedTypeOfPromise(returnType) // Async function
19974
19983
: returnType; // AsyncGenerator function, Generator function, or normal function
19975
19984
return unwrappedReturnType && maybeTypeOfKind(unwrappedReturnType, TypeFlags.Void | TypeFlags.Any);
@@ -22979,6 +22988,7 @@ namespace ts {
22979
22988
case ExternalEmitHelpers.Values: return "__values";
22980
22989
case ExternalEmitHelpers.Read: return "__read";
22981
22990
case ExternalEmitHelpers.Spread: return "__spread";
22991
+ case ExternalEmitHelpers.Await: return "__await";
22982
22992
case ExternalEmitHelpers.AsyncGenerator: return "__asyncGenerator";
22983
22993
case ExternalEmitHelpers.AsyncDelegator: return "__asyncDelegator";
22984
22994
case ExternalEmitHelpers.AsyncValues: return "__asyncValues";
0 commit comments