close
Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
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
Prev Previous commit
Next Next commit
Add test case for iterator returned from Iterator.from() passing alon…
…g the return value of the wrapped iterator
  • Loading branch information
nikolaybotev committed Sep 10, 2024
commit 667ef7fb4d506fa4fafeb7015795e0bba4ec7357
11 changes: 10 additions & 1 deletion tests/baselines/reference/builtinIterator.errors.txt
Original file line number Diff line number Diff line change
Expand Up @@ -142,4 +142,13 @@ builtinIterator.ts(73,35): error TS2322: Type 'Generator<string, number, boolean
!!! error TS2322: Type '[undefined]' is not assignable to type '[] | [boolean]'.
!!! error TS2322: Type '[undefined]' is not assignable to type '[boolean]'.
!!! error TS2322: Type 'undefined' is not assignable to type 'boolean'.
!!! related TS6502 lib.esnext.iterator.d.ts:--:--: The expected type comes from the return type of this signature.
!!! related TS6502 lib.esnext.iterator.d.ts:--:--: The expected type comes from the return type of this signature.

// Iterator.from pass-through of return value
const customGenerator = function* () {
return 42;
}();
const withHelpers = Iterator.from(customGenerator);
const result = withHelpers.next();
const resultValue: number = result.value; // this should work

18 changes: 17 additions & 1 deletion tests/baselines/reference/builtinIterator.js
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,16 @@ declare const g1: Generator<string, number, boolean>;
const iter1 = Iterator.from(g1);

declare const iter2: IteratorObject<string>;
const iter3 = iter2.flatMap(() => g1);
const iter3 = iter2.flatMap(() => g1);

// Iterator.from pass-through of return value
const customGenerator = function* () {
return 42;
}();
const withHelpers = Iterator.from(customGenerator);
const result = withHelpers.next();
const resultValue: number = result.value; // this should work


//// [builtinIterator.js]
"use strict";
Expand Down Expand Up @@ -134,3 +143,10 @@ class BadIterator3 extends Iterator {
}
const iter1 = Iterator.from(g1);
const iter3 = iter2.flatMap(() => g1);
// Iterator.from pass-through of return value
const customGenerator = function* () {
return 42;
}();
const withHelpers = Iterator.from(customGenerator);
const result = withHelpers.next();
const resultValue = result.value; // this should work
25 changes: 25 additions & 0 deletions tests/baselines/reference/builtinIterator.symbols
Original file line number Diff line number Diff line change
Expand Up @@ -193,3 +193,28 @@ const iter3 = iter2.flatMap(() => g1);
>flatMap : Symbol(IteratorObject.flatMap, Decl(lib.esnext.iterator.d.ts, --, --))
>g1 : Symbol(g1, Decl(builtinIterator.ts, 68, 13))

// Iterator.from pass-through of return value
const customGenerator = function* () {
>customGenerator : Symbol(customGenerator, Decl(builtinIterator.ts, 75, 5))

return 42;
}();
const withHelpers = Iterator.from(customGenerator);
>withHelpers : Symbol(withHelpers, Decl(builtinIterator.ts, 78, 5))
>Iterator.from : Symbol(IteratorConstructor.from, Decl(lib.esnext.iterator.d.ts, --, --))
>Iterator : Symbol(Iterator, Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.esnext.iterator.d.ts, --, --))
>from : Symbol(IteratorConstructor.from, Decl(lib.esnext.iterator.d.ts, --, --))
>customGenerator : Symbol(customGenerator, Decl(builtinIterator.ts, 75, 5))

const result = withHelpers.next();
>result : Symbol(result, Decl(builtinIterator.ts, 79, 5))
>withHelpers.next : Symbol(Iterator.next, Decl(lib.es2015.iterable.d.ts, --, --))
>withHelpers : Symbol(withHelpers, Decl(builtinIterator.ts, 78, 5))
>next : Symbol(Iterator.next, Decl(lib.es2015.iterable.d.ts, --, --))

const resultValue: number = result.value; // this should work
>resultValue : Symbol(resultValue, Decl(builtinIterator.ts, 80, 5))
>result.value : Symbol(value, Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
>result : Symbol(result, Decl(builtinIterator.ts, 79, 5))
>value : Symbol(value, Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))

50 changes: 50 additions & 0 deletions tests/baselines/reference/builtinIterator.types
Original file line number Diff line number Diff line change
Expand Up @@ -426,3 +426,53 @@ const iter3 = iter2.flatMap(() => g1);
>g1 : Generator<string, number, boolean>
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

// Iterator.from pass-through of return value
const customGenerator = function* () {
>customGenerator : Generator<never, number, unknown>
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>function* () { return 42;}() : Generator<never, number, unknown>
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>function* () { return 42;} : () => Generator<never, number, unknown>
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

return 42;
>42 : 42
> : ^^

}();
const withHelpers = Iterator.from(customGenerator);
>withHelpers : IteratorObject<never, number, unknown>
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>Iterator.from(customGenerator) : IteratorObject<never, number, unknown>
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>Iterator.from : <T, TReturn = any, TNext = any>(value: Iterator<T, TReturn, TNext> | Iterable<T, TReturn, TNext>) => IteratorObject<T, TReturn, unknown>
> : ^ ^^ ^^^^^^^^ ^^^^^^^^ ^^ ^^^^^
>Iterator : IteratorConstructor
> : ^^^^^^^^^^^^^^^^^^^
>from : <T, TReturn = any, TNext = any>(value: Iterator<T, TReturn, TNext> | Iterable<T, TReturn, TNext>) => IteratorObject<T, TReturn, unknown>
> : ^ ^^ ^^^^^^^^ ^^^^^^^^ ^^ ^^^^^
>customGenerator : Generator<never, number, unknown>
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

const result = withHelpers.next();
>result : IteratorResult<never, number>
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>withHelpers.next() : IteratorResult<never, number>
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>withHelpers.next : (...[value]: [] | [unknown]) => IteratorResult<never, number>
> : ^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>withHelpers : IteratorObject<never, number, unknown>
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>next : (...[value]: [] | [unknown]) => IteratorResult<never, number>
> : ^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

const resultValue: number = result.value; // this should work
>resultValue : number
> : ^^^^^^
>result.value : number
> : ^^^^^^
>result : IteratorResult<never, number>
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>value : number
> : ^^^^^^

10 changes: 9 additions & 1 deletion tests/cases/compiler/builtinIterator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,4 +73,12 @@ declare const g1: Generator<string, number, boolean>;
const iter1 = Iterator.from(g1);

declare const iter2: IteratorObject<string>;
const iter3 = iter2.flatMap(() => g1);
const iter3 = iter2.flatMap(() => g1);

// Iterator.from pass-through of return value
const customGenerator = function* () {
return 42;
}();
const withHelpers = Iterator.from(customGenerator);
const result = withHelpers.next();
const resultValue: number = result.value; // this should work