@@ -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 }
@@ -13450,7 +13436,8 @@ namespace ts {
1345013436 if (includeOptional
1345113437 ? !(filteredByApplicability!.flags & TypeFlags.Never)
1345213438 : isRelatedTo(targetConstraint, sourceKeys)) {
13453- const indexingType = filteredByApplicability || getTypeParameterFromMappedType(target);
13439+ const typeParameter = getTypeParameterFromMappedType(target);
13440+ const indexingType = filteredByApplicability ? getIntersectionType([filteredByApplicability, typeParameter]) : typeParameter;
1345413441 const indexedAccessType = getIndexedAccessType(source, indexingType);
1345513442 const templateType = getTemplateTypeFromMappedType(target);
1345613443 if (result = isRelatedTo(indexedAccessType, templateType, reportErrors)) {
@@ -15265,15 +15252,23 @@ namespace ts {
1526515252 const inference = inferences[i];
1526615253 if (t === inference.typeParameter) {
1526715254 if (fix && !inference.isFixed) {
15255+ clearCachedInferences(inferences);
1526815256 inference.isFixed = true;
15269- inference.inferredType = undefined;
1527015257 }
1527115258 return getInferredType(context, i);
1527215259 }
1527315260 }
1527415261 return t;
1527515262 }
1527615263
15264+ function clearCachedInferences(inferences: InferenceInfo[]) {
15265+ for (const inference of inferences) {
15266+ if (!inference.isFixed) {
15267+ inference.inferredType = undefined;
15268+ }
15269+ }
15270+ }
15271+
1527715272 function createInferenceInfo(typeParameter: TypeParameter): InferenceInfo {
1527815273 return {
1527915274 typeParameter,
@@ -15553,17 +15548,17 @@ namespace ts {
1555315548 if (contravariant && !bivariant) {
1555415549 if (!contains(inference.contraCandidates, candidate)) {
1555515550 inference.contraCandidates = append(inference.contraCandidates, candidate);
15556- inference.inferredType = undefined ;
15551+ clearCachedInferences(inferences) ;
1555715552 }
1555815553 }
1555915554 else if (!contains(inference.candidates, candidate)) {
1556015555 inference.candidates = append(inference.candidates, candidate);
15561- inference.inferredType = undefined ;
15556+ clearCachedInferences(inferences) ;
1556215557 }
1556315558 }
1556415559 if (!(priority & InferencePriority.ReturnType) && target.flags & TypeFlags.TypeParameter && inference.topLevel && !isTypeParameterAtTopLevel(originalTarget, <TypeParameter>target)) {
1556515560 inference.topLevel = false;
15566- inference.inferredType = undefined ;
15561+ clearCachedInferences(inferences) ;
1556715562 }
1556815563 }
1556915564 return;
@@ -20714,7 +20709,8 @@ namespace ts {
2071420709 else {
2071520710 const promisedType = getPromisedTypeOfPromise(containingType);
2071620711 if (promisedType && getPropertyOfType(promisedType, propNode.escapedText)) {
20717- errorInfo = chainDiagnosticMessages(errorInfo, Diagnostics.Property_0_does_not_exist_on_type_1_Did_you_forget_to_use_await, declarationNameToString(propNode), typeToString(containingType));
20712+ errorInfo = chainDiagnosticMessages(errorInfo, Diagnostics.Property_0_does_not_exist_on_type_1, declarationNameToString(propNode), typeToString(containingType));
20713+ relatedInfo = createDiagnosticForNode(propNode, Diagnostics.Did_you_forget_to_use_await);
2071820714 }
2071920715 else {
2072020716 const suggestion = getSuggestedSymbolForNonexistentProperty(propNode, containingType);
@@ -22748,7 +22744,7 @@ namespace ts {
2274822744 isVariableDeclaration(decl.parent) && getSymbolOfNode(decl.parent));
2274922745 const prototype = assignmentSymbol && assignmentSymbol.exports && assignmentSymbol.exports.get("prototype" as __String);
2275022746 const init = prototype && prototype.valueDeclaration && getAssignedJSPrototype(prototype.valueDeclaration);
22751- return init ? checkExpression( init) : undefined;
22747+ return init ? getWidenedType(checkExpressionCached( init) ) : undefined;
2275222748 }
2275322749
2275422750 function getAssignedJSPrototype(node: Node) {
@@ -23391,9 +23387,36 @@ namespace ts {
2339123387 }
2339223388
2339323389 function createGeneratorReturnType(yieldType: Type, returnType: Type, nextType: Type, isAsyncGenerator: boolean) {
23394- return isAsyncGenerator
23395- ? createAsyncGeneratorType(yieldType, returnType, nextType)
23396- : 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]);
2339723420 }
2339823421
2339923422 function checkAndAggregateYieldOperandTypes(func: FunctionLikeDeclaration, checkMode: CheckMode | undefined) {
@@ -26401,7 +26424,11 @@ namespace ts {
2640126424 * The runtime behavior of the `await` keyword.
2640226425 */
2640326426 function checkAwaitedType(type: Type, errorNode: Node, diagnosticMessage: DiagnosticMessage, arg0?: string | number): Type {
26404- return getAwaitedType(type, errorNode, diagnosticMessage, arg0) || errorType;
26427+ const awaitedType = getAwaitedType(type, errorNode, diagnosticMessage, arg0);
26428+ if (awaitedType === type && !(type.flags & TypeFlags.AnyOrUnknown)) {
26429+ addErrorOrSuggestion(/*isError*/ false, createDiagnosticForNode(errorNode, Diagnostics.await_has_no_effect_on_the_type_of_this_expression));
26430+ }
26431+ return awaitedType || errorType;
2640526432 }
2640626433
2640726434 function getAwaitedType(type: Type, errorNode?: Node, diagnosticMessage?: DiagnosticMessage, arg0?: string | number): Type | undefined {
@@ -28226,6 +28253,13 @@ namespace ts {
2822628253 return (type as IterableOrIteratorType)[resolver.iterableCacheKey];
2822728254 }
2822828255
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+
2822928263 /**
2823028264 * Gets the *yield*, *return*, and *next* types of an `Iterable`-like or `AsyncIterable`-like
2823128265 * type from from common heuristics.
@@ -28251,10 +28285,7 @@ namespace ts {
2825128285 // iteration types of their `[Symbol.iterator]()` method. The same is true for their async cousins.
2825228286 // While we define these as `any` and `undefined` in our libs by default, a custom lib *could* use
2825328287 // different definitions.
28254- const globalIterationTypes =
28255- getIterationTypesOfIterableCached(globalType, resolver) ||
28256- getIterationTypesOfIterableSlow(globalType, resolver, /*errorNode*/ undefined);
28257- const { returnType, nextType } = globalIterationTypes === noIterationTypes ? defaultIterationTypes : globalIterationTypes;
28288+ const { returnType, nextType } = getIterationTypesOfGlobalIterableType(globalType, resolver);
2825828289 return (type as IterableOrIteratorType)[resolver.iterableCacheKey] = createIterationTypes(yieldType, returnType, nextType);
2825928290 }
2826028291
@@ -33011,9 +33042,6 @@ namespace ts {
3301133042 return grammarErrorAtPos(node, node.end - 1, ";".length, Diagnostics._0_expected, "{");
3301233043 }
3301333044 }
33014- else if (isClassLike(node.parent) && isStringLiteral(node.name) && node.name.text === "constructor" && (!compilerOptions.target || compilerOptions.target < ScriptTarget.ES5)) {
33015- return grammarErrorOnNode(node.name, Diagnostics.Quoted_constructors_have_previously_been_interpreted_as_methods_which_is_incorrect_In_TypeScript_3_6_they_will_be_correctly_parsed_as_constructors_In_the_meantime_consider_using_constructor_to_write_a_constructor_or_constructor_to_write_a_method);
33016- }
3301733045 if (checkGrammarForGenerator(node)) {
3301833046 return true;
3301933047 }
0 commit comments