Skip to content

Commit

Permalink
Add fast paths for 'BuiltinIterator' and 'AsyncBuiltinIterator' (#59368)
Browse files Browse the repository at this point in the history
  • Loading branch information
rbuckton authored Jul 19, 2024
1 parent 98f45d7 commit 79bd844
Showing 1 changed file with 17 additions and 0 deletions.
17 changes: 17 additions & 0 deletions src/compiler/checker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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,
Expand All @@ -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,
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
Expand All @@ -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;
}
Expand Down Expand Up @@ -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<T, TReturn, TNext>` or `AsyncIterable<T, TReturn, TNext>`
// - `BuiltinIterator<T, TReturn, TNext>` or `AsyncBuiltinIterator<T, TReturn, TNext>`
// - `IterableIterator<T, TReturn, TNext>` or `AsyncIterableIterator<T, TReturn, TNext>`
// - `Generator<T, TReturn, TNext>` or `AsyncGenerator<T, TReturn, TNext>`
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))
) {
Expand Down Expand Up @@ -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<T, TReturn, TNext>` or `AsyncIterableIterator<T, TReturn, TNext>`
// - `BuiltinIterator<T, TReturn, TNext>` or `AsyncBuiltinIterator<T, TReturn, TNext>`
// - `Iterator<T, TReturn, TNext>` or `AsyncIterator<T, TReturn, TNext>`
// - `Generator<T, TReturn, TNext>` or `AsyncGenerator<T, TReturn, TNext>`
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))
Expand Down

0 comments on commit 79bd844

Please sign in to comment.