@@ -13073,7 +13073,7 @@ namespace ts {
1307313073 function createPromiseReturnType(func: FunctionLikeDeclaration, promisedType: Type) {
1307413074 const promiseType = createPromiseType(promisedType);
1307513075 if (promiseType === emptyObjectType) {
13076- error(func, Diagnostics.An_async_function_or_method_must_have_a_valid_awaitable_return_type );
13076+ error(func, Diagnostics.An_async_function_or_method_must_return_a_Promise_Make_sure_you_have_a_declaration_for_Promise_or_include_ES2015_in_your_lib_option );
1307713077 return unknownType;
1307813078 }
1307913079
@@ -15515,36 +15515,6 @@ namespace ts {
1551515515 }
1551615516 }
1551715517
15518- /**
15519- * Checks that the return type provided is an instantiation of the global Promise<T> type
15520- * and returns the awaited type of the return type.
15521- *
15522- * @param returnType The return type of a FunctionLikeDeclaration
15523- * @param location The node on which to report the error.
15524- */
15525- function checkCorrectPromiseType(returnType: Type, location: Node, diagnostic: DiagnosticMessage, typeName?: string) {
15526- if (returnType === unknownType) {
15527- // The return type already had some other error, so we ignore and return
15528- // the unknown type.
15529- return unknownType;
15530- }
15531-
15532- const globalPromiseType = getGlobalPromiseType();
15533- if (globalPromiseType === emptyGenericType
15534- || globalPromiseType === getTargetType(returnType)) {
15535- // Either we couldn't resolve the global promise type, which would have already
15536- // reported an error, or we could resolve it and the return type is a valid type
15537- // reference to the global type. In either case, we return the awaited type for
15538- // the return type.
15539- return checkAwaitedType(returnType, location, Diagnostics.An_async_function_or_method_must_have_a_valid_awaitable_return_type);
15540- }
15541-
15542- // The promise type was not a valid type reference to the global promise type, so we
15543- // report an error and return the unknown type.
15544- error(location, diagnostic, typeName);
15545- return unknownType;
15546- }
15547-
1554815518 /**
1554915519 * Checks the return type of an async function to ensure it is a compatible
1555015520 * Promise implementation.
@@ -15559,11 +15529,6 @@ namespace ts {
1555915529 * @param node The signature to check
1556015530 */
1556115531 function checkAsyncFunctionReturnType(node: FunctionLikeDeclaration): Type {
15562- if (languageVersion >= ScriptTarget.ES2015) {
15563- const returnType = getTypeFromTypeNode(node.type);
15564- return checkCorrectPromiseType(returnType, node.type, Diagnostics.The_return_type_of_an_async_function_or_method_must_be_the_global_Promise_T_type);
15565- }
15566-
1556715532 // As part of our emit for an async function, we will need to emit the entity name of
1556815533 // the return type annotation as an expression. To meet the necessary runtime semantics
1556915534 // for __awaiter, we must also check that the type of the declaration (e.g. the static
@@ -15588,61 +15553,67 @@ namespace ts {
1558815553 // then<U>(...): Promise<U>;
1558915554 // }
1559015555 //
15556+ const returnType = getTypeFromTypeNode(node.type);
1559115557
15592- // Always mark the type node as referenced if it points to a value
15593- markTypeNodeAsReferenced(node.type);
15594-
15595- const promiseConstructorName = getEntityNameFromTypeNode(node.type);
15596- const promiseType = getTypeFromTypeNode(node.type);
15597- if (promiseType === unknownType) {
15598- if (!compilerOptions.isolatedModules) {
15599- if (promiseConstructorName) {
15600- error(node.type, Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, entityNameToString(promiseConstructorName));
15601- }
15602- else {
15603- error(node.type, Diagnostics.An_async_function_or_method_must_have_a_valid_awaitable_return_type);
15604- }
15558+ if (languageVersion >= ScriptTarget.ES2015) {
15559+ if (returnType === unknownType) {
15560+ return unknownType;
15561+ }
15562+ const globalPromiseType = getGlobalPromiseType();
15563+ if (globalPromiseType !== emptyGenericType && globalPromiseType !== getTargetType(returnType)) {
15564+ // The promise type was not a valid type reference to the global promise type, so we
15565+ // report an error and return the unknown type.
15566+ error(node.type, Diagnostics.The_return_type_of_an_async_function_or_method_must_be_the_global_Promise_T_type);
15567+ return unknownType;
1560515568 }
15606- return unknownType;
1560715569 }
15570+ else {
15571+ // Always mark the type node as referenced if it points to a value
15572+ markTypeNodeAsReferenced(node.type);
1560815573
15609- if (promiseConstructorName === undefined) {
15610- error(node.type, Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, typeToString(promiseType));
15611- return unknownType;
15612- }
15574+ if (returnType === unknownType) {
15575+ return unknownType;
15576+ }
1561315577
15614- const promiseConstructorSymbol = resolveEntityName(promiseConstructorName, SymbolFlags.Value, /*ignoreErrors*/ true);
15615- const promiseConstructorType = promiseConstructorSymbol ? getTypeOfSymbol(promiseConstructorSymbol) : unknownType;
15616- if (promiseConstructorType === unknownType) {
15617- error(node.type, Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, entityNameToString(promiseConstructorName));
15618- return unknownType;
15619- }
15578+ const promiseConstructorName = getEntityNameFromTypeNode(node.type);
15579+ if (promiseConstructorName === undefined) {
15580+ error(node.type, Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, typeToString(returnType));
15581+ return unknownType;
15582+ }
1562015583
15621- const globalPromiseConstructorLikeType = getGlobalPromiseConstructorLikeType();
15622- if (globalPromiseConstructorLikeType === emptyObjectType) {
15623- // If we couldn't resolve the global PromiseConstructorLike type we cannot verify
15624- // compatibility with __awaiter.
15625- error(node.type, Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, entityNameToString(promiseConstructorName));
15626- return unknownType;
15627- }
15584+ const promiseConstructorSymbol = resolveEntityName(promiseConstructorName, SymbolFlags.Value, /*ignoreErrors*/ true);
15585+ const promiseConstructorType = promiseConstructorSymbol ? getTypeOfSymbol(promiseConstructorSymbol) : unknownType;
15586+ if (promiseConstructorType === unknownType) {
15587+ error(node.type, Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, entityNameToString(promiseConstructorName));
15588+ return unknownType;
15589+ }
1562815590
15629- if (!checkTypeAssignableTo(promiseConstructorType, globalPromiseConstructorLikeType, node.type,
15630- Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value)) {
15631- return unknownType;
15632- }
15591+ const globalPromiseConstructorLikeType = getGlobalPromiseConstructorLikeType();
15592+ if (globalPromiseConstructorLikeType === emptyObjectType) {
15593+ // If we couldn't resolve the global PromiseConstructorLike type we cannot verify
15594+ // compatibility with __awaiter.
15595+ error(node.type, Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, entityNameToString(promiseConstructorName));
15596+ return unknownType;
15597+ }
1563315598
15634- // Verify there is no local declaration that could collide with the promise constructor.
15635- const rootName = promiseConstructorName && getFirstIdentifier(promiseConstructorName);
15636- const collidingSymbol = getSymbol(node.locals, rootName.text, SymbolFlags.Value);
15637- if (collidingSymbol) {
15638- error(collidingSymbol.valueDeclaration, Diagnostics.Duplicate_identifier_0_Compiler_uses_declaration_1_to_support_async_functions,
15639- rootName.text,
15640- entityNameToString(promiseConstructorName));
15641- return unknownType;
15599+ if (!checkTypeAssignableTo(promiseConstructorType, globalPromiseConstructorLikeType, node.type,
15600+ Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value)) {
15601+ return unknownType;
15602+ }
15603+
15604+ // Verify there is no local declaration that could collide with the promise constructor.
15605+ const rootName = promiseConstructorName && getFirstIdentifier(promiseConstructorName);
15606+ const collidingSymbol = getSymbol(node.locals, rootName.text, SymbolFlags.Value);
15607+ if (collidingSymbol) {
15608+ error(collidingSymbol.valueDeclaration, Diagnostics.Duplicate_identifier_0_Compiler_uses_declaration_1_to_support_async_functions,
15609+ rootName.text,
15610+ entityNameToString(promiseConstructorName));
15611+ return unknownType;
15612+ }
1564215613 }
1564315614
1564415615 // Get and return the awaited type of the return type.
15645- return checkAwaitedType(promiseType , node, Diagnostics.An_async_function_or_method_must_have_a_valid_awaitable_return_type);
15616+ return checkAwaitedType(returnType , node, Diagnostics.An_async_function_or_method_must_have_a_valid_awaitable_return_type);
1564615617 }
1564715618
1564815619 /** Check a decorator */
0 commit comments