From 79bd844d9b32a8e1d31998a72fc2365305107ff5 Mon Sep 17 00:00:00 2001 From: Ron Buckton Date: Fri, 19 Jul 2024 19:02:54 -0400 Subject: [PATCH] Add fast paths for 'BuiltinIterator' and 'AsyncBuiltinIterator' (#59368) --- src/compiler/checker.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index b31f54a89b7b8..8372bdcb7c342 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -1176,6 +1176,7 @@ interface IterationTypesResolver { getGlobalIteratorType: (reportErrors: boolean) => GenericType; getGlobalIterableType: (reportErrors: boolean) => GenericType; getGlobalIterableIteratorType: (reportErrors: boolean) => GenericType; + getGlobalBuiltinIteratorType: (reportErrors: boolean) => GenericType; getGlobalGeneratorType: (reportErrors: boolean) => GenericType; resolveIterationType: (type: Type, errorNode: Node | undefined) => Type | undefined; mustHaveANextMethodDiagnostic: DiagnosticMessage; @@ -2159,6 +2160,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { getGlobalIteratorType: getGlobalAsyncIteratorType, getGlobalIterableType: getGlobalAsyncIterableType, getGlobalIterableIteratorType: getGlobalAsyncIterableIteratorType, + getGlobalBuiltinIteratorType: getGlobalAsyncBuiltinIteratorType, getGlobalGeneratorType: getGlobalAsyncGeneratorType, resolveIterationType: (type, errorNode) => getAwaitedType(type, errorNode, Diagnostics.Type_of_await_operand_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member), mustHaveANextMethodDiagnostic: Diagnostics.An_async_iterator_must_have_a_next_method, @@ -2173,6 +2175,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { getGlobalIteratorType, getGlobalIterableType, getGlobalIterableIteratorType, + getGlobalBuiltinIteratorType, getGlobalGeneratorType, resolveIterationType: (type, _errorNode) => type, mustHaveANextMethodDiagnostic: Diagnostics.An_iterator_must_have_a_next_method, @@ -2234,12 +2237,14 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { var deferredGlobalIterableType: GenericType | undefined; var deferredGlobalIteratorType: GenericType | undefined; var deferredGlobalIterableIteratorType: GenericType | undefined; + var deferredGlobalBuiltinIteratorType: GenericType | undefined; var deferredGlobalGeneratorType: GenericType | undefined; var deferredGlobalIteratorYieldResultType: GenericType | undefined; var deferredGlobalIteratorReturnResultType: GenericType | undefined; var deferredGlobalAsyncIterableType: GenericType | undefined; var deferredGlobalAsyncIteratorType: GenericType | undefined; var deferredGlobalAsyncIterableIteratorType: GenericType | undefined; + var deferredGlobalAsyncBuiltinIteratorType: GenericType | undefined; var deferredGlobalAsyncGeneratorType: GenericType | undefined; var deferredGlobalTemplateStringsArrayType: ObjectType | undefined; var deferredGlobalImportMetaType: ObjectType; @@ -16930,6 +16935,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { return (deferredGlobalAsyncIterableIteratorType ||= getGlobalType("AsyncIterableIterator" as __String, /*arity*/ 3, reportErrors)) || emptyGenericType; } + function getGlobalAsyncBuiltinIteratorType(reportErrors: boolean) { + return (deferredGlobalAsyncBuiltinIteratorType ||= getGlobalType("AsyncBuiltinIterator" as __String, /*arity*/ 3, reportErrors)) || emptyGenericType; + } + function getGlobalAsyncGeneratorType(reportErrors: boolean) { return (deferredGlobalAsyncGeneratorType ||= getGlobalType("AsyncGenerator" as __String, /*arity*/ 3, reportErrors)) || emptyGenericType; } @@ -16946,6 +16955,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { return (deferredGlobalIterableIteratorType ||= getGlobalType("IterableIterator" as __String, /*arity*/ 3, reportErrors)) || emptyGenericType; } + function getGlobalBuiltinIteratorType(reportErrors: boolean) { + return (deferredGlobalBuiltinIteratorType ||= getGlobalType("BuiltinIterator" as __String, /*arity*/ 3, reportErrors)) || emptyGenericType; + } + function getGlobalGeneratorType(reportErrors: boolean) { return (deferredGlobalGeneratorType ||= getGlobalType("Generator" as __String, /*arity*/ 3, reportErrors)) || emptyGenericType; } @@ -44773,10 +44786,12 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { // As an optimization, if the type is an instantiation of the following global type, then // just grab its related type arguments: // - `Iterable` or `AsyncIterable` + // - `BuiltinIterator` or `AsyncBuiltinIterator` // - `IterableIterator` or `AsyncIterableIterator` // - `Generator` or `AsyncGenerator` if ( isReferenceToType(type, resolver.getGlobalIterableType(/*reportErrors*/ false)) || + isReferenceToType(type, resolver.getGlobalBuiltinIteratorType(/*reportErrors*/ false)) || isReferenceToType(type, resolver.getGlobalIterableIteratorType(/*reportErrors*/ false)) || isReferenceToType(type, resolver.getGlobalGeneratorType(/*reportErrors*/ false)) ) { @@ -44899,9 +44914,11 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { // As an optimization, if the type is an instantiation of one of the following global types, // then just grab its related type arguments: // - `IterableIterator` or `AsyncIterableIterator` + // - `BuiltinIterator` or `AsyncBuiltinIterator` // - `Iterator` or `AsyncIterator` // - `Generator` or `AsyncGenerator` if ( + isReferenceToType(type, resolver.getGlobalBuiltinIteratorType(/*reportErrors*/ false)) || isReferenceToType(type, resolver.getGlobalIterableIteratorType(/*reportErrors*/ false)) || isReferenceToType(type, resolver.getGlobalIteratorType(/*reportErrors*/ false)) || isReferenceToType(type, resolver.getGlobalGeneratorType(/*reportErrors*/ false))