@@ -15999,7 +15999,7 @@ namespace ts {
1599915999 // From within an async function you can return either a non-promise value or a promise. Any
1600016000 // Promise/A+ compatible implementation will always assimilate any foreign promise, so the
1600116001 // 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
1600316003 ? createPromiseReturnType(func, widenedType) // Async function
1600416004 : widenedType; // Generator function, AsyncGenerator function, or normal function
1600516005 }
@@ -16215,7 +16215,7 @@ namespace ts {
1621516215
1621616216 const functionFlags = getFunctionFlags(node);
1621716217 const returnOrPromisedType = node.type &&
16218- ((functionFlags & FunctionFlags.AsyncOrAsyncGenerator ) === FunctionFlags.Async ?
16218+ ((functionFlags & FunctionFlags.AsyncGenerator ) === FunctionFlags.Async ?
1621916219 checkAsyncFunctionReturnType(node) : // Async function
1622016220 getTypeFromTypeNode(node.type)); // AsyncGenerator function, Generator function, or normal function
1622116221
@@ -16245,7 +16245,7 @@ namespace ts {
1624516245 // its return type annotation.
1624616246 const exprType = checkExpression(<Expression>node.body);
1624716247 if (returnOrPromisedType) {
16248- if ((functionFlags & FunctionFlags.AsyncOrAsyncGenerator ) === FunctionFlags.Async) { // Async function
16248+ if ((functionFlags & FunctionFlags.AsyncGenerator ) === FunctionFlags.Async) { // Async function
1624916249 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);
1625016250 checkTypeAssignableTo(awaitedType, returnOrPromisedType, node.body);
1625116251 }
@@ -16985,12 +16985,16 @@ namespace ts {
1698516985 // we are in a yield context.
1698616986 const functionFlags = func && getFunctionFlags(func);
1698716987 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);
1699216993 }
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) {
1699416998 checkExternalEmitHelpers(node, ExternalEmitHelpers.Values);
1699516999 }
1699617000 }
@@ -17509,18 +17513,20 @@ namespace ts {
1750917513 }
1751017514
1751117515 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 );
1751617520 }
17517- }
1751817521
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 );
1752217525 }
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) {
1752417530 checkExternalEmitHelpers(node, ExternalEmitHelpers.Generator);
1752517531 }
1752617532 }
@@ -17548,7 +17554,7 @@ namespace ts {
1754817554
1754917555 if (node.type) {
1755017556 const functionFlags = getFunctionFlags(<FunctionDeclaration>node);
17551- if ((functionFlags & FunctionFlags.InvalidGenerator ) === FunctionFlags.Generator) {
17557+ if ((functionFlags & ( FunctionFlags.Invalid | FunctionFlags.Generator) ) === FunctionFlags.Generator) {
1755217558 const returnType = getTypeFromTypeNode(node.type);
1755317559 if (returnType === voidType) {
1755417560 error(node.type, Diagnostics.A_generator_cannot_have_a_void_type_annotation);
@@ -17568,7 +17574,7 @@ namespace ts {
1756817574 checkTypeAssignableTo(iterableIteratorInstantiation, returnType, node.type);
1756917575 }
1757017576 }
17571- else if ((functionFlags & FunctionFlags.AsyncOrAsyncGenerator ) === FunctionFlags.Async) {
17577+ else if ((functionFlags & FunctionFlags.AsyncGenerator ) === FunctionFlags.Async) {
1757217578 checkAsyncFunctionReturnType(<FunctionLikeDeclaration>node);
1757317579 }
1757417580 }
@@ -19535,11 +19541,14 @@ namespace ts {
1953519541
1953619542 if (node.kind === SyntaxKind.ForOfStatement) {
1953719543 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
1953919547 checkExternalEmitHelpers(node, ExternalEmitHelpers.ForAwaitOfIncludes);
1954019548 }
1954119549 }
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
1954319552 checkExternalEmitHelpers(node, ExternalEmitHelpers.ForOfIncludes);
1954419553 }
1954519554 }
@@ -19969,7 +19978,7 @@ namespace ts {
1996919978 }
1997019979
1997119980 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
1997319982 ? getPromisedTypeOfPromise(returnType) // Async function
1997419983 : returnType; // AsyncGenerator function, Generator function, or normal function
1997519984 return unwrappedReturnType && maybeTypeOfKind(unwrappedReturnType, TypeFlags.Void | TypeFlags.Any);
@@ -22979,6 +22988,7 @@ namespace ts {
2297922988 case ExternalEmitHelpers.Values: return "__values";
2298022989 case ExternalEmitHelpers.Read: return "__read";
2298122990 case ExternalEmitHelpers.Spread: return "__spread";
22991+ case ExternalEmitHelpers.Await: return "__await";
2298222992 case ExternalEmitHelpers.AsyncGenerator: return "__asyncGenerator";
2298322993 case ExternalEmitHelpers.AsyncDelegator: return "__asyncDelegator";
2298422994 case ExternalEmitHelpers.AsyncValues: return "__asyncValues";
0 commit comments