Skip to content

Add BuiltinIteratorReturn to IterableIterator and AsyncIterableIterator return types #1713

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 18 commits into from
Aug 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions baselines/audioworklet.asynciterable.generated.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@
/// AudioWorklet Async Iterable APIs
/////////////////////////////

interface ReadableStreamAsyncIterator<T> extends AsyncIteratorObject<T, BuiltinIteratorReturn, unknown> {
[Symbol.asyncIterator](): ReadableStreamAsyncIterator<T>;
}

interface ReadableStream<R = any> {
[Symbol.asyncIterator](options?: ReadableStreamIteratorOptions): AsyncIterableIterator<R>;
values(options?: ReadableStreamIteratorOptions): AsyncIterableIterator<R>;
[Symbol.asyncIterator](options?: ReadableStreamIteratorOptions): ReadableStreamAsyncIterator<R>;
values(options?: ReadableStreamIteratorOptions): ReadableStreamAsyncIterator<R>;
}
12 changes: 8 additions & 4 deletions baselines/audioworklet.iterable.generated.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,16 @@ interface MessageEvent<T = any> {
initMessageEvent(type: string, bubbles?: boolean, cancelable?: boolean, data?: any, origin?: string, lastEventId?: string, source?: MessageEventSource | null, ports?: Iterable<MessagePort>): void;
}

interface URLSearchParamsIterator<T> extends IteratorObject<T, BuiltinIteratorReturn, unknown> {
[Symbol.iterator](): URLSearchParamsIterator<T>;
}

interface URLSearchParams {
[Symbol.iterator](): IterableIterator<[string, string]>;
[Symbol.iterator](): URLSearchParamsIterator<[string, string]>;
/** Returns an array of key, value pairs for every entry in the search params. */
entries(): IterableIterator<[string, string]>;
entries(): URLSearchParamsIterator<[string, string]>;
/** Returns a list of keys in the search params. */
keys(): IterableIterator<string>;
keys(): URLSearchParamsIterator<string>;
/** Returns a list of values in the search params. */
values(): IterableIterator<string>;
values(): URLSearchParamsIterator<string>;
}
20 changes: 14 additions & 6 deletions baselines/dom.asynciterable.generated.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,22 @@
/// Window Async Iterable APIs
/////////////////////////////

interface FileSystemDirectoryHandleAsyncIterator<T> extends AsyncIteratorObject<T, BuiltinIteratorReturn, unknown> {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't understand this, is FooAsyncIterator basically same as BarAsyncIterator, because I don't see a difference between this and ReadableStreamAsyncIterator below?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

They have independent prototypes on the web, so you could theoretically augment ReadbleStreamAsyncIterator independently via its prototype:

var rs = new ReadableStream();
var proto = Object.getPrototypeOf(rs[Symbol.asyncIterator]());
proto; // [object ReadableStream AsyncIterator]

As with ArrayIterator, MapIterator, SetIterator, etc., we've opted to use interface names that more closely align with the underlying prototype.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

They have independent prototypes because the underlying iterator algorithms are different, but I wouldn't expect any independent members on them that would require separate declarations, at least not in the foreseeable future, because Web IDL simply doesn't have syntax for that and I don't see why IDL would want that.

@MattiasBuelens may have some opinion.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, but the general principle we've agreed on in microsoft/TypeScript#58243 and in design meeting is to try to give these things a relevant name. BuiltinIterator was too broad and confusing, and IteratorObject<T, BuiltinIteratorReturn, unknown> was too unwieldy and verbose. Since we must give these names, we've opted to give them names that reflect the actual runtime reality.

Copy link
Contributor

@saschanaz saschanaz Aug 6, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmmmm. I guess it would be fine as we don't have too many iterable interfaces here, and also matching with TS principle makes sense. I still worry that this would encourage people do weird things that doesn't fit the spec intention though.

[Symbol.asyncIterator](): FileSystemDirectoryHandleAsyncIterator<T>;
}

interface FileSystemDirectoryHandle {
[Symbol.asyncIterator](): AsyncIterableIterator<[string, FileSystemHandle]>;
entries(): AsyncIterableIterator<[string, FileSystemHandle]>;
keys(): AsyncIterableIterator<string>;
values(): AsyncIterableIterator<FileSystemHandle>;
[Symbol.asyncIterator](): FileSystemDirectoryHandleAsyncIterator<[string, FileSystemHandle]>;
entries(): FileSystemDirectoryHandleAsyncIterator<[string, FileSystemHandle]>;
keys(): FileSystemDirectoryHandleAsyncIterator<string>;
values(): FileSystemDirectoryHandleAsyncIterator<FileSystemHandle>;
}

interface ReadableStreamAsyncIterator<T> extends AsyncIteratorObject<T, BuiltinIteratorReturn, unknown> {
[Symbol.asyncIterator](): ReadableStreamAsyncIterator<T>;
}

interface ReadableStream<R = any> {
[Symbol.asyncIterator](options?: ReadableStreamIteratorOptions): AsyncIterableIterator<R>;
values(options?: ReadableStreamIteratorOptions): AsyncIterableIterator<R>;
[Symbol.asyncIterator](options?: ReadableStreamIteratorOptions): ReadableStreamAsyncIterator<R>;
values(options?: ReadableStreamIteratorOptions): ReadableStreamAsyncIterator<R>;
}
166 changes: 93 additions & 73 deletions baselines/dom.iterable.generated.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,36 +23,36 @@ interface BaseAudioContext {
}

interface CSSKeyframesRule {
[Symbol.iterator](): IterableIterator<CSSKeyframeRule>;
[Symbol.iterator](): ArrayIterator<CSSKeyframeRule>;
}

interface CSSNumericArray {
[Symbol.iterator](): IterableIterator<CSSNumericValue>;
entries(): IterableIterator<[number, CSSNumericValue]>;
keys(): IterableIterator<number>;
values(): IterableIterator<CSSNumericValue>;
[Symbol.iterator](): ArrayIterator<CSSNumericValue>;
entries(): ArrayIterator<[number, CSSNumericValue]>;
keys(): ArrayIterator<number>;
values(): ArrayIterator<CSSNumericValue>;
}

interface CSSRuleList {
[Symbol.iterator](): IterableIterator<CSSRule>;
[Symbol.iterator](): ArrayIterator<CSSRule>;
}

interface CSSStyleDeclaration {
[Symbol.iterator](): IterableIterator<string>;
[Symbol.iterator](): ArrayIterator<string>;
}

interface CSSTransformValue {
[Symbol.iterator](): IterableIterator<CSSTransformComponent>;
entries(): IterableIterator<[number, CSSTransformComponent]>;
keys(): IterableIterator<number>;
values(): IterableIterator<CSSTransformComponent>;
[Symbol.iterator](): ArrayIterator<CSSTransformComponent>;
entries(): ArrayIterator<[number, CSSTransformComponent]>;
keys(): ArrayIterator<number>;
values(): ArrayIterator<CSSTransformComponent>;
}

interface CSSUnparsedValue {
[Symbol.iterator](): IterableIterator<CSSUnparsedSegment>;
entries(): IterableIterator<[number, CSSUnparsedSegment]>;
keys(): IterableIterator<number>;
values(): IterableIterator<CSSUnparsedSegment>;
[Symbol.iterator](): ArrayIterator<CSSUnparsedSegment>;
entries(): ArrayIterator<[number, CSSUnparsedSegment]>;
keys(): ArrayIterator<number>;
values(): ArrayIterator<CSSUnparsedSegment>;
}

interface Cache {
Expand All @@ -74,72 +74,80 @@ interface CustomStateSet extends Set<string> {
}

interface DOMRectList {
[Symbol.iterator](): IterableIterator<DOMRect>;
[Symbol.iterator](): ArrayIterator<DOMRect>;
}

interface DOMStringList {
[Symbol.iterator](): IterableIterator<string>;
[Symbol.iterator](): ArrayIterator<string>;
}

interface DOMTokenList {
[Symbol.iterator](): IterableIterator<string>;
entries(): IterableIterator<[number, string]>;
keys(): IterableIterator<number>;
values(): IterableIterator<string>;
[Symbol.iterator](): ArrayIterator<string>;
entries(): ArrayIterator<[number, string]>;
keys(): ArrayIterator<number>;
values(): ArrayIterator<string>;
}

interface DataTransferItemList {
[Symbol.iterator](): IterableIterator<DataTransferItem>;
[Symbol.iterator](): ArrayIterator<DataTransferItem>;
}

interface EventCounts extends ReadonlyMap<string, number> {
}

interface FileList {
[Symbol.iterator](): IterableIterator<File>;
[Symbol.iterator](): ArrayIterator<File>;
}

interface FontFaceSet extends Set<FontFace> {
}

interface FormDataIterator<T> extends IteratorObject<T, BuiltinIteratorReturn, unknown> {
[Symbol.iterator](): FormDataIterator<T>;
}

interface FormData {
[Symbol.iterator](): IterableIterator<[string, FormDataEntryValue]>;
[Symbol.iterator](): FormDataIterator<[string, FormDataEntryValue]>;
/** Returns an array of key, value pairs for every entry in the list. */
entries(): IterableIterator<[string, FormDataEntryValue]>;
entries(): FormDataIterator<[string, FormDataEntryValue]>;
/** Returns a list of keys in the list. */
keys(): IterableIterator<string>;
keys(): FormDataIterator<string>;
/** Returns a list of values in the list. */
values(): IterableIterator<FormDataEntryValue>;
values(): FormDataIterator<FormDataEntryValue>;
}

interface HTMLAllCollection {
[Symbol.iterator](): IterableIterator<Element>;
[Symbol.iterator](): ArrayIterator<Element>;
}

interface HTMLCollectionBase {
[Symbol.iterator](): IterableIterator<Element>;
[Symbol.iterator](): ArrayIterator<Element>;
}

interface HTMLCollectionOf<T extends Element> {
[Symbol.iterator](): IterableIterator<T>;
[Symbol.iterator](): ArrayIterator<T>;
}

interface HTMLFormElement {
[Symbol.iterator](): IterableIterator<Element>;
[Symbol.iterator](): ArrayIterator<Element>;
}

interface HTMLSelectElement {
[Symbol.iterator](): IterableIterator<HTMLOptionElement>;
[Symbol.iterator](): ArrayIterator<HTMLOptionElement>;
}

interface HeadersIterator<T> extends IteratorObject<T, BuiltinIteratorReturn, unknown> {
[Symbol.iterator](): HeadersIterator<T>;
}

interface Headers {
[Symbol.iterator](): IterableIterator<[string, string]>;
[Symbol.iterator](): HeadersIterator<[string, string]>;
/** Returns an iterator allowing to go through all key/value pairs contained in this object. */
entries(): IterableIterator<[string, string]>;
entries(): HeadersIterator<[string, string]>;
/** Returns an iterator allowing to go through all keys of the key/value pairs contained in this object. */
keys(): IterableIterator<string>;
keys(): HeadersIterator<string>;
/** Returns an iterator allowing to go through all values of the key/value pairs contained in this object. */
values(): IterableIterator<string>;
values(): HeadersIterator<string>;
}

interface Highlight extends Set<AbstractRange> {
Expand Down Expand Up @@ -179,15 +187,19 @@ interface MIDIOutput {
interface MIDIOutputMap extends ReadonlyMap<string, MIDIOutput> {
}

interface MediaKeyStatusMapIterator<T> extends IteratorObject<T, BuiltinIteratorReturn, unknown> {
[Symbol.iterator](): MediaKeyStatusMapIterator<T>;
}

interface MediaKeyStatusMap {
[Symbol.iterator](): IterableIterator<[BufferSource, MediaKeyStatus]>;
entries(): IterableIterator<[BufferSource, MediaKeyStatus]>;
keys(): IterableIterator<BufferSource>;
values(): IterableIterator<MediaKeyStatus>;
[Symbol.iterator](): MediaKeyStatusMapIterator<[BufferSource, MediaKeyStatus]>;
entries(): MediaKeyStatusMapIterator<[BufferSource, MediaKeyStatus]>;
keys(): MediaKeyStatusMapIterator<BufferSource>;
values(): MediaKeyStatusMapIterator<MediaKeyStatus>;
}

interface MediaList {
[Symbol.iterator](): IterableIterator<string>;
[Symbol.iterator](): ArrayIterator<string>;
}

interface MessageEvent<T = any> {
Expand All @@ -196,11 +208,11 @@ interface MessageEvent<T = any> {
}

interface MimeTypeArray {
[Symbol.iterator](): IterableIterator<MimeType>;
[Symbol.iterator](): ArrayIterator<MimeType>;
}

interface NamedNodeMap {
[Symbol.iterator](): IterableIterator<Attr>;
[Symbol.iterator](): ArrayIterator<Attr>;
}

interface Navigator {
Expand All @@ -215,31 +227,31 @@ interface Navigator {
}

interface NodeList {
[Symbol.iterator](): IterableIterator<Node>;
[Symbol.iterator](): ArrayIterator<Node>;
/** Returns an array of key, value pairs for every entry in the list. */
entries(): IterableIterator<[number, Node]>;
entries(): ArrayIterator<[number, Node]>;
/** Returns an list of keys in the list. */
keys(): IterableIterator<number>;
keys(): ArrayIterator<number>;
/** Returns an list of values in the list. */
values(): IterableIterator<Node>;
values(): ArrayIterator<Node>;
}

interface NodeListOf<TNode extends Node> {
[Symbol.iterator](): IterableIterator<TNode>;
[Symbol.iterator](): ArrayIterator<TNode>;
/** Returns an array of key, value pairs for every entry in the list. */
entries(): IterableIterator<[number, TNode]>;
entries(): ArrayIterator<[number, TNode]>;
/** Returns an list of keys in the list. */
keys(): IterableIterator<number>;
keys(): ArrayIterator<number>;
/** Returns an list of values in the list. */
values(): IterableIterator<TNode>;
values(): ArrayIterator<TNode>;
}

interface Plugin {
[Symbol.iterator](): IterableIterator<MimeType>;
[Symbol.iterator](): ArrayIterator<MimeType>;
}

interface PluginArray {
[Symbol.iterator](): IterableIterator<Plugin>;
[Symbol.iterator](): ArrayIterator<Plugin>;
}

interface RTCRtpTransceiver {
Expand All @@ -251,46 +263,50 @@ interface RTCStatsReport extends ReadonlyMap<string, any> {
}

interface SVGLengthList {
[Symbol.iterator](): IterableIterator<SVGLength>;
[Symbol.iterator](): ArrayIterator<SVGLength>;
}

interface SVGNumberList {
[Symbol.iterator](): IterableIterator<SVGNumber>;
[Symbol.iterator](): ArrayIterator<SVGNumber>;
}

interface SVGPointList {
[Symbol.iterator](): IterableIterator<DOMPoint>;
[Symbol.iterator](): ArrayIterator<DOMPoint>;
}

interface SVGStringList {
[Symbol.iterator](): IterableIterator<string>;
[Symbol.iterator](): ArrayIterator<string>;
}

interface SVGTransformList {
[Symbol.iterator](): IterableIterator<SVGTransform>;
[Symbol.iterator](): ArrayIterator<SVGTransform>;
}

interface SourceBufferList {
[Symbol.iterator](): IterableIterator<SourceBuffer>;
[Symbol.iterator](): ArrayIterator<SourceBuffer>;
}

interface SpeechRecognitionResult {
[Symbol.iterator](): IterableIterator<SpeechRecognitionAlternative>;
[Symbol.iterator](): ArrayIterator<SpeechRecognitionAlternative>;
}

interface SpeechRecognitionResultList {
[Symbol.iterator](): IterableIterator<SpeechRecognitionResult>;
[Symbol.iterator](): ArrayIterator<SpeechRecognitionResult>;
}

interface StylePropertyMapReadOnlyIterator<T> extends IteratorObject<T, BuiltinIteratorReturn, unknown> {
[Symbol.iterator](): StylePropertyMapReadOnlyIterator<T>;
}

interface StylePropertyMapReadOnly {
[Symbol.iterator](): IterableIterator<[string, Iterable<CSSStyleValue>]>;
entries(): IterableIterator<[string, Iterable<CSSStyleValue>]>;
keys(): IterableIterator<string>;
values(): IterableIterator<Iterable<CSSStyleValue>>;
[Symbol.iterator](): StylePropertyMapReadOnlyIterator<[string, Iterable<CSSStyleValue>]>;
entries(): StylePropertyMapReadOnlyIterator<[string, Iterable<CSSStyleValue>]>;
keys(): StylePropertyMapReadOnlyIterator<string>;
values(): StylePropertyMapReadOnlyIterator<Iterable<CSSStyleValue>>;
}

interface StyleSheetList {
[Symbol.iterator](): IterableIterator<CSSStyleSheet>;
[Symbol.iterator](): ArrayIterator<CSSStyleSheet>;
}

interface SubtleCrypto {
Expand All @@ -309,25 +325,29 @@ interface SubtleCrypto {
}

interface TextTrackCueList {
[Symbol.iterator](): IterableIterator<TextTrackCue>;
[Symbol.iterator](): ArrayIterator<TextTrackCue>;
}

interface TextTrackList {
[Symbol.iterator](): IterableIterator<TextTrack>;
[Symbol.iterator](): ArrayIterator<TextTrack>;
}

interface TouchList {
[Symbol.iterator](): IterableIterator<Touch>;
[Symbol.iterator](): ArrayIterator<Touch>;
}

interface URLSearchParamsIterator<T> extends IteratorObject<T, BuiltinIteratorReturn, unknown> {
[Symbol.iterator](): URLSearchParamsIterator<T>;
}

interface URLSearchParams {
[Symbol.iterator](): IterableIterator<[string, string]>;
[Symbol.iterator](): URLSearchParamsIterator<[string, string]>;
/** Returns an array of key, value pairs for every entry in the search params. */
entries(): IterableIterator<[string, string]>;
entries(): URLSearchParamsIterator<[string, string]>;
/** Returns a list of keys in the search params. */
keys(): IterableIterator<string>;
keys(): URLSearchParamsIterator<string>;
/** Returns a list of values in the search params. */
values(): IterableIterator<string>;
values(): URLSearchParamsIterator<string>;
}

interface WEBGL_draw_buffers {
Expand Down
Loading
Loading