@@ -42,10 +42,10 @@ namespace ts {
4242 iterableCacheKey: "iterationTypesOfAsyncIterable" | "iterationTypesOfIterable";
4343 iteratorCacheKey: "iterationTypesOfAsyncIterator" | "iterationTypesOfIterator";
4444 iteratorSymbolName: "asyncIterator" | "iterator";
45- getGlobalIteratorType: (reportErrors: boolean) => Type ;
46- getGlobalIterableType: (reportErrors: boolean) => Type ;
47- getGlobalIterableIteratorType: (reportErrors: boolean) => Type ;
48- getGlobalGeneratorType: (reportErrors: boolean) => Type ;
45+ getGlobalIteratorType: (reportErrors: boolean) => GenericType ;
46+ getGlobalIterableType: (reportErrors: boolean) => GenericType ;
47+ getGlobalIterableIteratorType: (reportErrors: boolean) => GenericType ;
48+ getGlobalGeneratorType: (reportErrors: boolean) => GenericType ;
4949 resolveIterationType: (type: Type, errorNode: Node | undefined) => Type | undefined;
5050 mustHaveANextMethodDiagnostic: DiagnosticMessage;
5151 mustBeAMethodDiagnostic: DiagnosticMessage;
@@ -9531,24 +9531,10 @@ namespace ts {
95319531 return createTypeFromGenericGlobalType(getGlobalTypedPropertyDescriptorType(), [propertyType]);
95329532 }
95339533
9534- function createAsyncGeneratorType(yieldType: Type, returnType: Type, nextType: Type) {
9535- const globalAsyncGeneratorType = getGlobalAsyncGeneratorType(/*reportErrors*/ true);
9536- if (globalAsyncGeneratorType !== emptyGenericType) {
9537- yieldType = getAwaitedType(yieldType) || unknownType;
9538- returnType = getAwaitedType(returnType) || unknownType;
9539- nextType = getAwaitedType(nextType) || unknownType;
9540- }
9541- return createTypeFromGenericGlobalType(globalAsyncGeneratorType, [yieldType, returnType, nextType]);
9542- }
9543-
95449534 function createIterableType(iteratedType: Type): Type {
95459535 return createTypeFromGenericGlobalType(getGlobalIterableType(/*reportErrors*/ true), [iteratedType]);
95469536 }
95479537
9548- function createGeneratorType(yieldType: Type, returnType: Type, nextType: Type) {
9549- return createTypeFromGenericGlobalType(getGlobalGeneratorType(/*reportErrors*/ true), [yieldType, returnType, nextType]);
9550- }
9551-
95529538 function createArrayType(elementType: Type, readonly?: boolean): ObjectType {
95539539 return createTypeFromGenericGlobalType(readonly ? globalReadonlyArrayType : globalArrayType, [elementType]);
95549540 }
@@ -23401,9 +23387,36 @@ namespace ts {
2340123387 }
2340223388
2340323389 function createGeneratorReturnType(yieldType: Type, returnType: Type, nextType: Type, isAsyncGenerator: boolean) {
23404- return isAsyncGenerator
23405- ? createAsyncGeneratorType(yieldType, returnType, nextType)
23406- : createGeneratorType(yieldType, returnType, nextType);
23390+ const resolver = isAsyncGenerator ? asyncIterationTypesResolver : syncIterationTypesResolver;
23391+ const globalGeneratorType = resolver.getGlobalGeneratorType(/*reportErrors*/ false);
23392+ yieldType = resolver.resolveIterationType(yieldType, /*errorNode*/ undefined) || unknownType;
23393+ returnType = resolver.resolveIterationType(returnType, /*errorNode*/ undefined) || unknownType;
23394+ nextType = resolver.resolveIterationType(nextType, /*errorNode*/ undefined) || unknownType;
23395+ if (globalGeneratorType === emptyGenericType) {
23396+ // Fall back to the global IterableIterator if returnType is assignable to the expected return iteration
23397+ // type of IterableIterator, and the expected next iteration type of IterableIterator is assignable to
23398+ // nextType.
23399+ const globalType = resolver.getGlobalIterableIteratorType(/*reportErrors*/ false);
23400+ const iterationTypes = globalType !== emptyGenericType ? getIterationTypesOfGlobalIterableType(globalType, resolver) : undefined;
23401+ const iterableIteratorReturnType = iterationTypes ? iterationTypes.returnType : anyType;
23402+ const iterableIteratorNextType = iterationTypes ? iterationTypes.nextType : undefinedType;
23403+ if (isTypeAssignableTo(returnType, iterableIteratorReturnType) &&
23404+ isTypeAssignableTo(iterableIteratorNextType, nextType)) {
23405+ if (globalType !== emptyGenericType) {
23406+ return createTypeFromGenericGlobalType(globalType, [yieldType]);
23407+ }
23408+
23409+ // The global IterableIterator type doesn't exist, so report an error
23410+ resolver.getGlobalIterableIteratorType(/*reportErrors*/ true);
23411+ return emptyObjectType;
23412+ }
23413+
23414+ // The global Generator type doesn't exist, so report an error
23415+ resolver.getGlobalGeneratorType(/*reportErrors*/ true);
23416+ return emptyObjectType;
23417+ }
23418+
23419+ return createTypeFromGenericGlobalType(globalGeneratorType, [yieldType, returnType, nextType]);
2340723420 }
2340823421
2340923422 function checkAndAggregateYieldOperandTypes(func: FunctionLikeDeclaration, checkMode: CheckMode | undefined) {
@@ -28240,6 +28253,13 @@ namespace ts {
2824028253 return (type as IterableOrIteratorType)[resolver.iterableCacheKey];
2824128254 }
2824228255
28256+ function getIterationTypesOfGlobalIterableType(globalType: Type, resolver: IterationTypesResolver) {
28257+ const globalIterationTypes =
28258+ getIterationTypesOfIterableCached(globalType, resolver) ||
28259+ getIterationTypesOfIterableSlow(globalType, resolver, /*errorNode*/ undefined);
28260+ return globalIterationTypes === noIterationTypes ? defaultIterationTypes : globalIterationTypes;
28261+ }
28262+
2824328263 /**
2824428264 * Gets the *yield*, *return*, and *next* types of an `Iterable`-like or `AsyncIterable`-like
2824528265 * type from from common heuristics.
@@ -28265,10 +28285,7 @@ namespace ts {
2826528285 // iteration types of their `[Symbol.iterator]()` method. The same is true for their async cousins.
2826628286 // While we define these as `any` and `undefined` in our libs by default, a custom lib *could* use
2826728287 // different definitions.
28268- const globalIterationTypes =
28269- getIterationTypesOfIterableCached(globalType, resolver) ||
28270- getIterationTypesOfIterableSlow(globalType, resolver, /*errorNode*/ undefined);
28271- const { returnType, nextType } = globalIterationTypes === noIterationTypes ? defaultIterationTypes : globalIterationTypes;
28288+ const { returnType, nextType } = getIterationTypesOfGlobalIterableType(globalType, resolver);
2827228289 return (type as IterableOrIteratorType)[resolver.iterableCacheKey] = createIterationTypes(yieldType, returnType, nextType);
2827328290 }
2827428291
0 commit comments