Skip to content

Commit a745d1b

Browse files
authored
Disambiguate BuiltinIterator/BuiltinIteratorReturn (#59506)
1 parent aafdfe5 commit a745d1b

File tree

150 files changed

+1407
-1237
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

150 files changed

+1407
-1237
lines changed

src/compiler/checker.ts

Lines changed: 83 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1181,8 +1181,9 @@ interface IterationTypesResolver {
11811181
getGlobalIteratorType: (reportErrors: boolean) => GenericType;
11821182
getGlobalIterableType: (reportErrors: boolean) => GenericType;
11831183
getGlobalIterableIteratorType: (reportErrors: boolean) => GenericType;
1184-
getGlobalBuiltinIteratorType: (reportErrors: boolean) => GenericType;
1184+
getGlobalIteratorObjectType: (reportErrors: boolean) => GenericType;
11851185
getGlobalGeneratorType: (reportErrors: boolean) => GenericType;
1186+
getGlobalBuiltinIteratorTypes: () => readonly GenericType[];
11861187
resolveIterationType: (type: Type, errorNode: Node | undefined) => Type | undefined;
11871188
mustHaveANextMethodDiagnostic: DiagnosticMessage;
11881189
mustBeAMethodDiagnostic: DiagnosticMessage;
@@ -2167,8 +2168,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
21672168
getGlobalIteratorType: getGlobalAsyncIteratorType,
21682169
getGlobalIterableType: getGlobalAsyncIterableType,
21692170
getGlobalIterableIteratorType: getGlobalAsyncIterableIteratorType,
2170-
getGlobalBuiltinIteratorType: getGlobalBuiltinAsyncIteratorType,
2171+
getGlobalIteratorObjectType: getGlobalAsyncIteratorObjectType,
21712172
getGlobalGeneratorType: getGlobalAsyncGeneratorType,
2173+
getGlobalBuiltinIteratorTypes: getGlobalBuiltinAsyncIteratorTypes,
21722174
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),
21732175
mustHaveANextMethodDiagnostic: Diagnostics.An_async_iterator_must_have_a_next_method,
21742176
mustBeAMethodDiagnostic: Diagnostics.The_0_property_of_an_async_iterator_must_be_a_method,
@@ -2182,8 +2184,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
21822184
getGlobalIteratorType,
21832185
getGlobalIterableType,
21842186
getGlobalIterableIteratorType,
2185-
getGlobalBuiltinIteratorType,
2187+
getGlobalIteratorObjectType,
21862188
getGlobalGeneratorType,
2189+
getGlobalBuiltinIteratorTypes,
21872190
resolveIterationType: (type, _errorNode) => type,
21882191
mustHaveANextMethodDiagnostic: Diagnostics.An_iterator_must_have_a_next_method,
21892192
mustBeAMethodDiagnostic: Diagnostics.The_0_property_of_an_iterator_must_be_a_method,
@@ -2244,14 +2247,16 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
22442247
var deferredGlobalIterableType: GenericType | undefined;
22452248
var deferredGlobalIteratorType: GenericType | undefined;
22462249
var deferredGlobalIterableIteratorType: GenericType | undefined;
2247-
var deferredGlobalBuiltinIteratorType: GenericType | undefined;
2250+
var deferredGlobalIteratorObjectType: GenericType | undefined;
22482251
var deferredGlobalGeneratorType: GenericType | undefined;
22492252
var deferredGlobalIteratorYieldResultType: GenericType | undefined;
22502253
var deferredGlobalIteratorReturnResultType: GenericType | undefined;
22512254
var deferredGlobalAsyncIterableType: GenericType | undefined;
22522255
var deferredGlobalAsyncIteratorType: GenericType | undefined;
22532256
var deferredGlobalAsyncIterableIteratorType: GenericType | undefined;
2254-
var deferredGlobalBuiltinAsyncIteratorType: GenericType | undefined;
2257+
var deferredGlobalBuiltinIteratorTypes: readonly GenericType[] | undefined;
2258+
var deferredGlobalBuiltinAsyncIteratorTypes: readonly GenericType[] | undefined;
2259+
var deferredGlobalAsyncIteratorObjectType: GenericType | undefined;
22552260
var deferredGlobalAsyncGeneratorType: GenericType | undefined;
22562261
var deferredGlobalTemplateStringsArrayType: ObjectType | undefined;
22572262
var deferredGlobalImportMetaType: ObjectType;
@@ -12488,6 +12493,18 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1248812493
return removeMissingType(getTypeOfSymbol(symbol), !!(symbol.flags & SymbolFlags.Optional));
1248912494
}
1249012495

12496+
function isReferenceToSomeType(type: Type, targets: readonly Type[]) {
12497+
if (type === undefined || (getObjectFlags(type) & ObjectFlags.Reference) === 0) {
12498+
return false;
12499+
}
12500+
for (const target of targets) {
12501+
if ((type as TypeReference).target === target) {
12502+
return true;
12503+
}
12504+
}
12505+
return false;
12506+
}
12507+
1249112508
function isReferenceToType(type: Type, target: Type) {
1249212509
return type !== undefined
1249312510
&& target !== undefined
@@ -13001,7 +13018,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1300113018
links.instantiations.set(getTypeListId(typeParameters), type);
1300213019
}
1300313020
if (type === intrinsicMarkerType && symbol.escapedName === "BuiltinIteratorReturn") {
13004-
type = strictBuiltinIteratorReturn ? undefinedType : anyType;
13021+
type = getBuiltinIteratorReturnType();
1300513022
}
1300613023
}
1300713024
else {
@@ -16868,6 +16885,16 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1686816885
return symbol || reportErrors ? getTypeOfGlobalSymbol(symbol, arity) : undefined;
1686916886
}
1687016887

16888+
function getGlobalBuiltinTypes(typeNames: readonly string[], arity: 0): ObjectType[];
16889+
function getGlobalBuiltinTypes(typeNames: readonly string[], arity: number): GenericType[];
16890+
function getGlobalBuiltinTypes(typeNames: readonly string[], arity: number) {
16891+
let types: Type[] | undefined;
16892+
for (const typeName of typeNames) {
16893+
types = append(types, getGlobalType(typeName as __String, arity, /*reportErrors*/ false));
16894+
}
16895+
return types ?? emptyArray;
16896+
}
16897+
1687116898
function getGlobalTypedPropertyDescriptorType() {
1687216899
// We always report an error, so store a result in the event we could not resolve the symbol to prevent reporting it multiple times
1687316900
return deferredGlobalTypedPropertyDescriptorType ||= getGlobalType("TypedPropertyDescriptor" as __String, /*arity*/ 1, /*reportErrors*/ true) || emptyGenericType;
@@ -16949,8 +16976,13 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1694916976
return (deferredGlobalAsyncIterableIteratorType ||= getGlobalType("AsyncIterableIterator" as __String, /*arity*/ 3, reportErrors)) || emptyGenericType;
1695016977
}
1695116978

16952-
function getGlobalBuiltinAsyncIteratorType(reportErrors: boolean) {
16953-
return (deferredGlobalBuiltinAsyncIteratorType ||= getGlobalType("BuiltinAsyncIterator" as __String, /*arity*/ 3, reportErrors)) || emptyGenericType;
16979+
function getGlobalBuiltinAsyncIteratorTypes() {
16980+
// NOTE: This list does not include all built-in async iterator types, only those that are likely to be encountered frequently.
16981+
return deferredGlobalBuiltinAsyncIteratorTypes ??= getGlobalBuiltinTypes(["ReadableStreamAsyncIterator"], 1);
16982+
}
16983+
16984+
function getGlobalAsyncIteratorObjectType(reportErrors: boolean) {
16985+
return (deferredGlobalAsyncIteratorObjectType ||= getGlobalType("AsyncIteratorObject" as __String, /*arity*/ 3, reportErrors)) || emptyGenericType;
1695416986
}
1695516987

1695616988
function getGlobalAsyncGeneratorType(reportErrors: boolean) {
@@ -16969,8 +17001,17 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1696917001
return (deferredGlobalIterableIteratorType ||= getGlobalType("IterableIterator" as __String, /*arity*/ 3, reportErrors)) || emptyGenericType;
1697017002
}
1697117003

16972-
function getGlobalBuiltinIteratorType(reportErrors: boolean) {
16973-
return (deferredGlobalBuiltinIteratorType ||= getGlobalType("BuiltinIterator" as __String, /*arity*/ 3, reportErrors)) || emptyGenericType;
17004+
function getBuiltinIteratorReturnType() {
17005+
return strictBuiltinIteratorReturn ? undefinedType : anyType;
17006+
}
17007+
17008+
function getGlobalBuiltinIteratorTypes() {
17009+
// NOTE: This list does not include all built-in iterator types, only those that are likely to be encountered frequently.
17010+
return deferredGlobalBuiltinIteratorTypes ??= getGlobalBuiltinTypes(["ArrayIterator", "MapIterator", "SetIterator", "StringIterator"], 1);
17011+
}
17012+
17013+
function getGlobalIteratorObjectType(reportErrors: boolean) {
17014+
return (deferredGlobalIteratorObjectType ||= getGlobalType("IteratorObject" as __String, /*arity*/ 3, reportErrors)) || emptyGenericType;
1697417015
}
1697517016

1697617017
function getGlobalGeneratorType(reportErrors: boolean) {
@@ -44951,18 +44992,32 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4495144992
// As an optimization, if the type is an instantiation of the following global type, then
4495244993
// just grab its related type arguments:
4495344994
// - `Iterable<T, TReturn, TNext>` or `AsyncIterable<T, TReturn, TNext>`
44954-
// - `BuiltinIterator<T, TReturn, TNext>` or `BuiltinAsyncIterator<T, TReturn, TNext>`
44995+
// - `IteratorObject<T, TReturn, TNext>` or `AsyncIteratorObject<T, TReturn, TNext>`
4495544996
// - `IterableIterator<T, TReturn, TNext>` or `AsyncIterableIterator<T, TReturn, TNext>`
4495644997
// - `Generator<T, TReturn, TNext>` or `AsyncGenerator<T, TReturn, TNext>`
4495744998
if (
4495844999
isReferenceToType(type, resolver.getGlobalIterableType(/*reportErrors*/ false)) ||
44959-
isReferenceToType(type, resolver.getGlobalBuiltinIteratorType(/*reportErrors*/ false)) ||
45000+
isReferenceToType(type, resolver.getGlobalIteratorObjectType(/*reportErrors*/ false)) ||
4496045001
isReferenceToType(type, resolver.getGlobalIterableIteratorType(/*reportErrors*/ false)) ||
4496145002
isReferenceToType(type, resolver.getGlobalGeneratorType(/*reportErrors*/ false))
4496245003
) {
4496345004
const [yieldType, returnType, nextType] = getTypeArguments(type as GenericType);
4496445005
return setCachedIterationTypes(type, resolver.iterableCacheKey, createIterationTypes(resolver.resolveIterationType(yieldType, /*errorNode*/ undefined) || yieldType, resolver.resolveIterationType(returnType, /*errorNode*/ undefined) || returnType, nextType));
4496545006
}
45007+
45008+
// As an optimization, if the type is an instantiation of one of the following global types, then
45009+
// just grab the related type argument:
45010+
// - `ArrayIterator<T>`
45011+
// - `MapIterator<T>`
45012+
// - `SetIterator<T>`
45013+
// - `StringIterator<T>`
45014+
// - `ReadableStreamAsyncIterator<T>`
45015+
if (isReferenceToSomeType(type, resolver.getGlobalBuiltinIteratorTypes())) {
45016+
const [yieldType] = getTypeArguments(type as GenericType);
45017+
const returnType = getBuiltinIteratorReturnType();
45018+
const nextType = unknownType;
45019+
return setCachedIterationTypes(type, resolver.iterableCacheKey, createIterationTypes(resolver.resolveIterationType(yieldType, /*errorNode*/ undefined) || yieldType, resolver.resolveIterationType(returnType, /*errorNode*/ undefined) || returnType, nextType));
45020+
}
4496645021
}
4496745022

4496845023
function getPropertyNameForKnownSymbolName(symbolName: string): __String {
@@ -45079,18 +45134,32 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4507945134
// As an optimization, if the type is an instantiation of one of the following global types,
4508045135
// then just grab its related type arguments:
4508145136
// - `IterableIterator<T, TReturn, TNext>` or `AsyncIterableIterator<T, TReturn, TNext>`
45082-
// - `BuiltinIterator<T, TReturn, TNext>` or `BuiltinAsyncIterator<T, TReturn, TNext>`
45137+
// - `IteratorObject<T, TReturn, TNext>` or `AsyncIteratorObject<T, TReturn, TNext>`
4508345138
// - `Iterator<T, TReturn, TNext>` or `AsyncIterator<T, TReturn, TNext>`
4508445139
// - `Generator<T, TReturn, TNext>` or `AsyncGenerator<T, TReturn, TNext>`
4508545140
if (
45086-
isReferenceToType(type, resolver.getGlobalBuiltinIteratorType(/*reportErrors*/ false)) ||
4508745141
isReferenceToType(type, resolver.getGlobalIterableIteratorType(/*reportErrors*/ false)) ||
4508845142
isReferenceToType(type, resolver.getGlobalIteratorType(/*reportErrors*/ false)) ||
45143+
isReferenceToType(type, resolver.getGlobalIteratorObjectType(/*reportErrors*/ false)) ||
4508945144
isReferenceToType(type, resolver.getGlobalGeneratorType(/*reportErrors*/ false))
4509045145
) {
4509145146
const [yieldType, returnType, nextType] = getTypeArguments(type as GenericType);
4509245147
return setCachedIterationTypes(type, resolver.iteratorCacheKey, createIterationTypes(yieldType, returnType, nextType));
4509345148
}
45149+
45150+
// As an optimization, if the type is an instantiation of one of the following global types, then
45151+
// just grab the related type argument:
45152+
// - `ArrayIterator<T>`
45153+
// - `MapIterator<T>`
45154+
// - `SetIterator<T>`
45155+
// - `StringIterator<T>`
45156+
// - `ReadableStreamAsyncIterator<T>`
45157+
if (isReferenceToSomeType(type, resolver.getGlobalBuiltinIteratorTypes())) {
45158+
const [yieldType] = getTypeArguments(type as GenericType);
45159+
const returnType = getBuiltinIteratorReturnType();
45160+
const nextType = unknownType;
45161+
return setCachedIterationTypes(type, resolver.iteratorCacheKey, createIterationTypes(yieldType, returnType, nextType));
45162+
}
4509445163
}
4509545164

4509645165
function isIteratorResult(type: Type, kind: IterationTypeKind.Yield | IterationTypeKind.Return) {

src/lib/dom.asynciterable.generated.d.ts

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,22 @@
22
/// Window Async Iterable APIs
33
/////////////////////////////
44

5+
interface FileSystemDirectoryHandleAsyncIterator<T> extends AsyncIteratorObject<T, BuiltinIteratorReturn, unknown> {
6+
[Symbol.asyncIterator](): FileSystemDirectoryHandleAsyncIterator<T>;
7+
}
8+
59
interface FileSystemDirectoryHandle {
6-
[Symbol.asyncIterator](): BuiltinAsyncIterator<[string, FileSystemHandle], BuiltinIteratorReturn>;
7-
entries(): BuiltinAsyncIterator<[string, FileSystemHandle], BuiltinIteratorReturn>;
8-
keys(): BuiltinAsyncIterator<string, BuiltinIteratorReturn>;
9-
values(): BuiltinAsyncIterator<FileSystemHandle, BuiltinIteratorReturn>;
10+
[Symbol.asyncIterator](): FileSystemDirectoryHandleAsyncIterator<[string, FileSystemHandle]>;
11+
entries(): FileSystemDirectoryHandleAsyncIterator<[string, FileSystemHandle]>;
12+
keys(): FileSystemDirectoryHandleAsyncIterator<string>;
13+
values(): FileSystemDirectoryHandleAsyncIterator<FileSystemHandle>;
14+
}
15+
16+
interface ReadableStreamAsyncIterator<T> extends AsyncIteratorObject<T, BuiltinIteratorReturn, unknown> {
17+
[Symbol.asyncIterator](): ReadableStreamAsyncIterator<T>;
1018
}
1119

1220
interface ReadableStream<R = any> {
13-
[Symbol.asyncIterator](options?: ReadableStreamIteratorOptions): BuiltinAsyncIterator<R, BuiltinIteratorReturn>;
14-
values(options?: ReadableStreamIteratorOptions): BuiltinAsyncIterator<R, BuiltinIteratorReturn>;
21+
[Symbol.asyncIterator](options?: ReadableStreamIteratorOptions): ReadableStreamAsyncIterator<R>;
22+
values(options?: ReadableStreamIteratorOptions): ReadableStreamAsyncIterator<R>;
1523
}

src/lib/dom.iterable.d.ts

Lines changed: 35 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,34 @@
11
/// <reference lib="dom" />
22

33
interface DOMTokenList {
4-
[Symbol.iterator](): BuiltinIterator<string, BuiltinIteratorReturn>;
4+
[Symbol.iterator](): ArrayIterator<string>;
5+
}
6+
7+
interface HeadersIterator<T> extends IteratorObject<T, BuiltinIteratorReturn, unknown> {
8+
[Symbol.iterator](): HeadersIterator<T>;
59
}
610

711
interface Headers {
8-
[Symbol.iterator](): BuiltinIterator<[string, string], BuiltinIteratorReturn>;
12+
[Symbol.iterator](): HeadersIterator<[string, string]>;
913
/**
1014
* Returns an iterator allowing to go through all key/value pairs contained in this object.
1115
*/
12-
entries(): BuiltinIterator<[string, string], BuiltinIteratorReturn>;
16+
entries(): HeadersIterator<[string, string]>;
1317
/**
1418
* Returns an iterator allowing to go through all keys f the key/value pairs contained in this object.
1519
*/
16-
keys(): BuiltinIterator<string, BuiltinIteratorReturn>;
20+
keys(): HeadersIterator<string>;
1721
/**
1822
* Returns an iterator allowing to go through all values of the key/value pairs contained in this object.
1923
*/
20-
values(): BuiltinIterator<string, BuiltinIteratorReturn>;
24+
values(): HeadersIterator<string>;
2125
}
2226

2327
interface NodeList {
2428
/**
2529
* Returns an array of key, value pairs for every entry in the list
2630
*/
27-
entries(): BuiltinIterator<[number, Node], BuiltinIteratorReturn>;
31+
entries(): ArrayIterator<[number, Node]>;
2832
/**
2933
* Performs the specified action for each node in an list.
3034
* @param callbackfn A function that accepts up to three arguments. forEach calls the callbackfn function one time for each element in the list.
@@ -34,21 +38,21 @@ interface NodeList {
3438
/**
3539
* Returns an list of keys in the list
3640
*/
37-
keys(): BuiltinIterator<number, BuiltinIteratorReturn>;
41+
keys(): ArrayIterator<number>;
3842

3943
/**
4044
* Returns an list of values in the list
4145
*/
42-
values(): BuiltinIterator<Node, BuiltinIteratorReturn>;
46+
values(): ArrayIterator<Node>;
4347

44-
[Symbol.iterator](): BuiltinIterator<Node, BuiltinIteratorReturn>;
48+
[Symbol.iterator](): ArrayIterator<Node>;
4549
}
4650

4751
interface NodeListOf<TNode extends Node> {
4852
/**
4953
* Returns an array of key, value pairs for every entry in the list
5054
*/
51-
entries(): BuiltinIterator<[number, TNode], BuiltinIteratorReturn>;
55+
entries(): ArrayIterator<[number, TNode]>;
5256

5357
/**
5458
* Performs the specified action for each node in an list.
@@ -59,55 +63,63 @@ interface NodeListOf<TNode extends Node> {
5963
/**
6064
* Returns an list of keys in the list
6165
*/
62-
keys(): BuiltinIterator<number, BuiltinIteratorReturn>;
66+
keys(): ArrayIterator<number>;
6367
/**
6468
* Returns an list of values in the list
6569
*/
66-
values(): BuiltinIterator<TNode, BuiltinIteratorReturn>;
70+
values(): ArrayIterator<TNode>;
6771

68-
[Symbol.iterator](): BuiltinIterator<TNode, BuiltinIteratorReturn>;
72+
[Symbol.iterator](): ArrayIterator<TNode>;
6973
}
7074

7175
interface HTMLCollectionBase {
72-
[Symbol.iterator](): BuiltinIterator<Element, BuiltinIteratorReturn>;
76+
[Symbol.iterator](): ArrayIterator<Element>;
7377
}
7478

7579
interface HTMLCollectionOf<T extends Element> {
76-
[Symbol.iterator](): BuiltinIterator<T, BuiltinIteratorReturn>;
80+
[Symbol.iterator](): ArrayIterator<T>;
81+
}
82+
83+
interface FormDataIterator<T> extends IteratorObject<T, BuiltinIteratorReturn, unknown> {
84+
[Symbol.iterator](): FormDataIterator<T>;
7785
}
7886

7987
interface FormData {
8088
/**
8189
* Returns an array of key, value pairs for every entry in the list
8290
*/
83-
entries(): BuiltinIterator<[string, string | File], BuiltinIteratorReturn>;
91+
entries(): FormDataIterator<[string, string | File]>;
8492
/**
8593
* Returns a list of keys in the list
8694
*/
87-
keys(): BuiltinIterator<string, BuiltinIteratorReturn>;
95+
keys(): FormDataIterator<string>;
8896
/**
8997
* Returns a list of values in the list
9098
*/
91-
values(): BuiltinIterator<string | File, BuiltinIteratorReturn>;
99+
values(): FormDataIterator<string | File>;
100+
101+
[Symbol.iterator](): FormDataIterator<string | File>;
102+
}
92103

93-
[Symbol.iterator](): BuiltinIterator<string | File, BuiltinIteratorReturn>;
104+
interface URLSearchParamsIterator<T> extends IteratorObject<T, BuiltinIteratorReturn, unknown> {
105+
[Symbol.iterator](): URLSearchParamsIterator<T>;
94106
}
95107

96108
interface URLSearchParams {
97109
/**
98110
* Returns an array of key, value pairs for every entry in the search params
99111
*/
100-
entries(): BuiltinIterator<[string, string], BuiltinIteratorReturn>;
112+
entries(): URLSearchParamsIterator<[string, string]>;
101113
/**
102114
* Returns a list of keys in the search params
103115
*/
104-
keys(): BuiltinIterator<string, BuiltinIteratorReturn>;
116+
keys(): URLSearchParamsIterator<string>;
105117
/**
106118
* Returns a list of values in the search params
107119
*/
108-
values(): BuiltinIterator<string, BuiltinIteratorReturn>;
120+
values(): URLSearchParamsIterator<string>;
109121
/**
110122
* iterate over key/value pairs
111123
*/
112-
[Symbol.iterator](): BuiltinIterator<[string, string], BuiltinIteratorReturn>;
124+
[Symbol.iterator](): URLSearchParamsIterator<[string, string]>;
113125
}

0 commit comments

Comments
 (0)