Skip to content

Commit 79bd844

Browse files
authored
Add fast paths for 'BuiltinIterator' and 'AsyncBuiltinIterator' (#59368)
1 parent 98f45d7 commit 79bd844

File tree

1 file changed

+17
-0
lines changed

1 file changed

+17
-0
lines changed

src/compiler/checker.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1176,6 +1176,7 @@ interface IterationTypesResolver {
11761176
getGlobalIteratorType: (reportErrors: boolean) => GenericType;
11771177
getGlobalIterableType: (reportErrors: boolean) => GenericType;
11781178
getGlobalIterableIteratorType: (reportErrors: boolean) => GenericType;
1179+
getGlobalBuiltinIteratorType: (reportErrors: boolean) => GenericType;
11791180
getGlobalGeneratorType: (reportErrors: boolean) => GenericType;
11801181
resolveIterationType: (type: Type, errorNode: Node | undefined) => Type | undefined;
11811182
mustHaveANextMethodDiagnostic: DiagnosticMessage;
@@ -2159,6 +2160,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
21592160
getGlobalIteratorType: getGlobalAsyncIteratorType,
21602161
getGlobalIterableType: getGlobalAsyncIterableType,
21612162
getGlobalIterableIteratorType: getGlobalAsyncIterableIteratorType,
2163+
getGlobalBuiltinIteratorType: getGlobalAsyncBuiltinIteratorType,
21622164
getGlobalGeneratorType: getGlobalAsyncGeneratorType,
21632165
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),
21642166
mustHaveANextMethodDiagnostic: Diagnostics.An_async_iterator_must_have_a_next_method,
@@ -2173,6 +2175,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
21732175
getGlobalIteratorType,
21742176
getGlobalIterableType,
21752177
getGlobalIterableIteratorType,
2178+
getGlobalBuiltinIteratorType,
21762179
getGlobalGeneratorType,
21772180
resolveIterationType: (type, _errorNode) => type,
21782181
mustHaveANextMethodDiagnostic: Diagnostics.An_iterator_must_have_a_next_method,
@@ -2234,12 +2237,14 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
22342237
var deferredGlobalIterableType: GenericType | undefined;
22352238
var deferredGlobalIteratorType: GenericType | undefined;
22362239
var deferredGlobalIterableIteratorType: GenericType | undefined;
2240+
var deferredGlobalBuiltinIteratorType: GenericType | undefined;
22372241
var deferredGlobalGeneratorType: GenericType | undefined;
22382242
var deferredGlobalIteratorYieldResultType: GenericType | undefined;
22392243
var deferredGlobalIteratorReturnResultType: GenericType | undefined;
22402244
var deferredGlobalAsyncIterableType: GenericType | undefined;
22412245
var deferredGlobalAsyncIteratorType: GenericType | undefined;
22422246
var deferredGlobalAsyncIterableIteratorType: GenericType | undefined;
2247+
var deferredGlobalAsyncBuiltinIteratorType: GenericType | undefined;
22432248
var deferredGlobalAsyncGeneratorType: GenericType | undefined;
22442249
var deferredGlobalTemplateStringsArrayType: ObjectType | undefined;
22452250
var deferredGlobalImportMetaType: ObjectType;
@@ -16930,6 +16935,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1693016935
return (deferredGlobalAsyncIterableIteratorType ||= getGlobalType("AsyncIterableIterator" as __String, /*arity*/ 3, reportErrors)) || emptyGenericType;
1693116936
}
1693216937

16938+
function getGlobalAsyncBuiltinIteratorType(reportErrors: boolean) {
16939+
return (deferredGlobalAsyncBuiltinIteratorType ||= getGlobalType("AsyncBuiltinIterator" as __String, /*arity*/ 3, reportErrors)) || emptyGenericType;
16940+
}
16941+
1693316942
function getGlobalAsyncGeneratorType(reportErrors: boolean) {
1693416943
return (deferredGlobalAsyncGeneratorType ||= getGlobalType("AsyncGenerator" as __String, /*arity*/ 3, reportErrors)) || emptyGenericType;
1693516944
}
@@ -16946,6 +16955,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1694616955
return (deferredGlobalIterableIteratorType ||= getGlobalType("IterableIterator" as __String, /*arity*/ 3, reportErrors)) || emptyGenericType;
1694716956
}
1694816957

16958+
function getGlobalBuiltinIteratorType(reportErrors: boolean) {
16959+
return (deferredGlobalBuiltinIteratorType ||= getGlobalType("BuiltinIterator" as __String, /*arity*/ 3, reportErrors)) || emptyGenericType;
16960+
}
16961+
1694916962
function getGlobalGeneratorType(reportErrors: boolean) {
1695016963
return (deferredGlobalGeneratorType ||= getGlobalType("Generator" as __String, /*arity*/ 3, reportErrors)) || emptyGenericType;
1695116964
}
@@ -44773,10 +44786,12 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4477344786
// As an optimization, if the type is an instantiation of the following global type, then
4477444787
// just grab its related type arguments:
4477544788
// - `Iterable<T, TReturn, TNext>` or `AsyncIterable<T, TReturn, TNext>`
44789+
// - `BuiltinIterator<T, TReturn, TNext>` or `AsyncBuiltinIterator<T, TReturn, TNext>`
4477644790
// - `IterableIterator<T, TReturn, TNext>` or `AsyncIterableIterator<T, TReturn, TNext>`
4477744791
// - `Generator<T, TReturn, TNext>` or `AsyncGenerator<T, TReturn, TNext>`
4477844792
if (
4477944793
isReferenceToType(type, resolver.getGlobalIterableType(/*reportErrors*/ false)) ||
44794+
isReferenceToType(type, resolver.getGlobalBuiltinIteratorType(/*reportErrors*/ false)) ||
4478044795
isReferenceToType(type, resolver.getGlobalIterableIteratorType(/*reportErrors*/ false)) ||
4478144796
isReferenceToType(type, resolver.getGlobalGeneratorType(/*reportErrors*/ false))
4478244797
) {
@@ -44899,9 +44914,11 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4489944914
// As an optimization, if the type is an instantiation of one of the following global types,
4490044915
// then just grab its related type arguments:
4490144916
// - `IterableIterator<T, TReturn, TNext>` or `AsyncIterableIterator<T, TReturn, TNext>`
44917+
// - `BuiltinIterator<T, TReturn, TNext>` or `AsyncBuiltinIterator<T, TReturn, TNext>`
4490244918
// - `Iterator<T, TReturn, TNext>` or `AsyncIterator<T, TReturn, TNext>`
4490344919
// - `Generator<T, TReturn, TNext>` or `AsyncGenerator<T, TReturn, TNext>`
4490444920
if (
44921+
isReferenceToType(type, resolver.getGlobalBuiltinIteratorType(/*reportErrors*/ false)) ||
4490544922
isReferenceToType(type, resolver.getGlobalIterableIteratorType(/*reportErrors*/ false)) ||
4490644923
isReferenceToType(type, resolver.getGlobalIteratorType(/*reportErrors*/ false)) ||
4490744924
isReferenceToType(type, resolver.getGlobalGeneratorType(/*reportErrors*/ false))

0 commit comments

Comments
 (0)