Skip to content

Commit 22f2c74

Browse files
authored
Port "Error on too many parameters for iterator method" (#1059)
1 parent 8188edd commit 22f2c74

File tree

5 files changed

+228
-60
lines changed

5 files changed

+228
-60
lines changed

internal/checker/checker.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,7 @@ type IterationTypesResolver struct {
501501
iteratorSymbolName string
502502
getGlobalIteratorType func() *Type
503503
getGlobalIterableType func() *Type
504+
getGlobalIterableTypeChecked func() *Type
504505
getGlobalIterableIteratorType func() *Type
505506
getGlobalIterableIteratorTypeChecked func() *Type
506507
getGlobalIteratorObjectType func() *Type
@@ -812,6 +813,7 @@ type Checker struct {
812813
getGlobalGeneratorType func() *Type
813814
getGlobalAsyncIteratorType func() *Type
814815
getGlobalAsyncIterableType func() *Type
816+
getGlobalAsyncIterableTypeChecked func() *Type
815817
getGlobalAsyncIterableIteratorType func() *Type
816818
getGlobalAsyncIterableIteratorTypeChecked func() *Type
817819
getGlobalAsyncIteratorObjectType func() *Type
@@ -1038,6 +1040,7 @@ func NewChecker(program Program) *Checker {
10381040
c.getGlobalGeneratorType = c.getGlobalTypeResolver("Generator", 3 /*arity*/, false /*reportErrors*/)
10391041
c.getGlobalAsyncIteratorType = c.getGlobalTypeResolver("AsyncIterator", 3 /*arity*/, false /*reportErrors*/)
10401042
c.getGlobalAsyncIterableType = c.getGlobalTypeResolver("AsyncIterable", 3 /*arity*/, false /*reportErrors*/)
1043+
c.getGlobalAsyncIterableTypeChecked = c.getGlobalTypeResolver("AsyncIterable", 3 /*arity*/, true /*reportErrors*/)
10411044
c.getGlobalAsyncIterableIteratorType = c.getGlobalTypeResolver("AsyncIterableIterator", 3 /*arity*/, false /*reportErrors*/)
10421045
c.getGlobalAsyncIterableIteratorTypeChecked = c.getGlobalTypeResolver("AsyncIterableIterator", 3 /*arity*/, true /*reportErrors*/)
10431046
c.getGlobalAsyncIteratorObjectType = c.getGlobalTypeResolver("AsyncIteratorObject", 3 /*arity*/, false /*reportErrors*/)
@@ -1207,6 +1210,7 @@ func (c *Checker) initializeIterationResolvers() {
12071210
iteratorSymbolName: "iterator",
12081211
getGlobalIteratorType: c.getGlobalIteratorType,
12091212
getGlobalIterableType: c.getGlobalIterableType,
1213+
getGlobalIterableTypeChecked: c.getGlobalIterableTypeChecked,
12101214
getGlobalIterableIteratorType: c.getGlobalIterableIteratorType,
12111215
getGlobalIterableIteratorTypeChecked: c.getGlobalIterableIteratorTypeChecked,
12121216
getGlobalIteratorObjectType: c.getGlobalIteratorObjectType,
@@ -1223,6 +1227,7 @@ func (c *Checker) initializeIterationResolvers() {
12231227
iteratorSymbolName: "asyncIterator",
12241228
getGlobalIteratorType: c.getGlobalAsyncIteratorType,
12251229
getGlobalIterableType: c.getGlobalAsyncIterableType,
1230+
getGlobalIterableTypeChecked: c.getGlobalAsyncIterableTypeChecked,
12261231
getGlobalIterableIteratorType: c.getGlobalAsyncIterableIteratorType,
12271232
getGlobalIterableIteratorTypeChecked: c.getGlobalAsyncIterableIteratorTypeChecked,
12281233
getGlobalIteratorObjectType: c.getGlobalAsyncIteratorObjectType,
@@ -6097,10 +6102,17 @@ func (c *Checker) getIterationTypesOfIterableSlow(t *Type, r *IterationTypesReso
60976102
if IsTypeAny(methodType) {
60986103
return IterationTypes{c.anyType, c.anyType, c.anyType}
60996104
}
6100-
if signatures := c.getSignaturesOfType(methodType, SignatureKindCall); len(signatures) != 0 {
6101-
iteratorType := c.getIntersectionType(core.Map(signatures, c.getReturnTypeOfSignature))
6105+
allSignatures := c.getSignaturesOfType(methodType, SignatureKindCall)
6106+
validSignatures := core.Filter(allSignatures, func(sig *Signature) bool {
6107+
return c.getMinArgumentCount(sig) == 0
6108+
})
6109+
if len(validSignatures) != 0 {
6110+
iteratorType := c.getIntersectionType(core.Map(validSignatures, c.getReturnTypeOfSignature))
61026111
return c.getIterationTypesOfIteratorWorker(iteratorType, r, errorNode, diagnosticOutput)
61036112
}
6113+
if errorNode != nil && len(allSignatures) != 0 {
6114+
c.checkTypeAssignableTo(t, r.getGlobalIterableTypeChecked(), errorNode, nil)
6115+
}
61046116
}
61056117
return IterationTypes{}
61066118
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
asyncIteratorExtraParameters.ts(11,27): error TS2322: Type '{ [Symbol.asyncIterator](_: number): AsyncGenerator<number, void, unknown>; }' is not assignable to type 'AsyncIterable<T, TReturn, TNext>'.
2+
Types of property '[Symbol.asyncIterator]' are incompatible.
3+
Type '(_: number) => AsyncGenerator<number, void, unknown>' is not assignable to type '() => AsyncIterator<T, TReturn, TNext>'.
4+
Target signature provides too few arguments. Expected 1 or more, but got 0.
5+
asyncIteratorExtraParameters.ts(11,27): error TS2504: Type '{ [Symbol.asyncIterator](_: number): AsyncGenerator<number, void, unknown>; }' must have a '[Symbol.asyncIterator]()' method that returns an async iterator.
6+
asyncIteratorExtraParameters.ts(13,12): error TS2322: Type '{ [Symbol.asyncIterator](_: number): AsyncGenerator<number, void, unknown>; }' is not assignable to type 'AsyncIterable<T, TReturn, TNext>'.
7+
Types of property '[Symbol.asyncIterator]' are incompatible.
8+
Type '(_: number) => AsyncGenerator<number, void, unknown>' is not assignable to type '() => AsyncIterator<T, TReturn, TNext>'.
9+
Target signature provides too few arguments. Expected 1 or more, but got 0.
10+
asyncIteratorExtraParameters.ts(13,12): error TS2504: Type '{ [Symbol.asyncIterator](_: number): AsyncGenerator<number, void, unknown>; }' must have a '[Symbol.asyncIterator]()' method that returns an async iterator.
11+
12+
13+
==== asyncIteratorExtraParameters.ts (4 errors) ====
14+
// https://github.com/microsoft/TypeScript/issues/57130
15+
const iter = {
16+
async *[Symbol.asyncIterator](_: number) {
17+
yield 0;
18+
}
19+
};
20+
21+
declare function g(...args: any): any;
22+
23+
async function* f() {
24+
for await (const _ of iter);
25+
~~~~
26+
!!! error TS2322: Type '{ [Symbol.asyncIterator](_: number): AsyncGenerator<number, void, unknown>; }' is not assignable to type 'AsyncIterable<T, TReturn, TNext>'.
27+
!!! error TS2322: Types of property '[Symbol.asyncIterator]' are incompatible.
28+
!!! error TS2322: Type '(_: number) => AsyncGenerator<number, void, unknown>' is not assignable to type '() => AsyncIterator<T, TReturn, TNext>'.
29+
!!! error TS2322: Target signature provides too few arguments. Expected 1 or more, but got 0.
30+
~~~~
31+
!!! error TS2504: Type '{ [Symbol.asyncIterator](_: number): AsyncGenerator<number, void, unknown>; }' must have a '[Symbol.asyncIterator]()' method that returns an async iterator.
32+
33+
yield* iter;
34+
~~~~
35+
!!! error TS2322: Type '{ [Symbol.asyncIterator](_: number): AsyncGenerator<number, void, unknown>; }' is not assignable to type 'AsyncIterable<T, TReturn, TNext>'.
36+
!!! error TS2322: Types of property '[Symbol.asyncIterator]' are incompatible.
37+
!!! error TS2322: Type '(_: number) => AsyncGenerator<number, void, unknown>' is not assignable to type '() => AsyncIterator<T, TReturn, TNext>'.
38+
!!! error TS2322: Target signature provides too few arguments. Expected 1 or more, but got 0.
39+
~~~~
40+
!!! error TS2504: Type '{ [Symbol.asyncIterator](_: number): AsyncGenerator<number, void, unknown>; }' must have a '[Symbol.asyncIterator]()' method that returns an async iterator.
41+
}
42+
Lines changed: 37 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,49 @@
11
--- old.asyncIteratorExtraParameters.errors.txt
22
+++ new.asyncIteratorExtraParameters.errors.txt
33
@@= skipped -0, +0 lines =@@
4-
-asyncIteratorExtraParameters.ts(11,27): error TS2504: Type '{ [Symbol.asyncIterator](_: number): AsyncGenerator<number, void, unknown>; }' must have a '[Symbol.asyncIterator]()' method that returns an async iterator.
5-
-asyncIteratorExtraParameters.ts(13,12): error TS2504: Type '{ [Symbol.asyncIterator](_: number): AsyncGenerator<number, void, unknown>; }' must have a '[Symbol.asyncIterator]()' method that returns an async iterator.
6-
-
7-
-
4+
+asyncIteratorExtraParameters.ts(11,27): error TS2322: Type '{ [Symbol.asyncIterator](_: number): AsyncGenerator<number, void, unknown>; }' is not assignable to type 'AsyncIterable<T, TReturn, TNext>'.
5+
+ Types of property '[Symbol.asyncIterator]' are incompatible.
6+
+ Type '(_: number) => AsyncGenerator<number, void, unknown>' is not assignable to type '() => AsyncIterator<T, TReturn, TNext>'.
7+
+ Target signature provides too few arguments. Expected 1 or more, but got 0.
8+
asyncIteratorExtraParameters.ts(11,27): error TS2504: Type '{ [Symbol.asyncIterator](_: number): AsyncGenerator<number, void, unknown>; }' must have a '[Symbol.asyncIterator]()' method that returns an async iterator.
9+
+asyncIteratorExtraParameters.ts(13,12): error TS2322: Type '{ [Symbol.asyncIterator](_: number): AsyncGenerator<number, void, unknown>; }' is not assignable to type 'AsyncIterable<T, TReturn, TNext>'.
10+
+ Types of property '[Symbol.asyncIterator]' are incompatible.
11+
+ Type '(_: number) => AsyncGenerator<number, void, unknown>' is not assignable to type '() => AsyncIterator<T, TReturn, TNext>'.
12+
+ Target signature provides too few arguments. Expected 1 or more, but got 0.
13+
asyncIteratorExtraParameters.ts(13,12): error TS2504: Type '{ [Symbol.asyncIterator](_: number): AsyncGenerator<number, void, unknown>; }' must have a '[Symbol.asyncIterator]()' method that returns an async iterator.
14+
15+
816
-==== asyncIteratorExtraParameters.ts (2 errors) ====
9-
- // https://github.com/microsoft/TypeScript/issues/57130
10-
- const iter = {
11-
- async *[Symbol.asyncIterator](_: number) {
12-
- yield 0;
13-
- }
14-
- };
15-
-
16-
- declare function g(...args: any): any;
17-
-
18-
- async function* f() {
19-
- for await (const _ of iter);
20-
- ~~~~
21-
-!!! error TS2504: Type '{ [Symbol.asyncIterator](_: number): AsyncGenerator<number, void, unknown>; }' must have a '[Symbol.asyncIterator]()' method that returns an async iterator.
17+
+==== asyncIteratorExtraParameters.ts (4 errors) ====
18+
// https://github.com/microsoft/TypeScript/issues/57130
19+
const iter = {
20+
async *[Symbol.asyncIterator](_: number) {
21+
@@= skipped -14, +22 lines =@@
22+
async function* f() {
23+
for await (const _ of iter);
24+
~~~~
25+
+!!! error TS2322: Type '{ [Symbol.asyncIterator](_: number): AsyncGenerator<number, void, unknown>; }' is not assignable to type 'AsyncIterable<T, TReturn, TNext>'.
26+
+!!! error TS2322: Types of property '[Symbol.asyncIterator]' are incompatible.
27+
+!!! error TS2322: Type '(_: number) => AsyncGenerator<number, void, unknown>' is not assignable to type '() => AsyncIterator<T, TReturn, TNext>'.
28+
+!!! error TS2322: Target signature provides too few arguments. Expected 1 or more, but got 0.
29+
+ ~~~~
30+
!!! error TS2504: Type '{ [Symbol.asyncIterator](_: number): AsyncGenerator<number, void, unknown>; }' must have a '[Symbol.asyncIterator]()' method that returns an async iterator.
2231
-!!! related TS2322 asyncIteratorExtraParameters.ts:11:27: Type '{ [Symbol.asyncIterator](_: number): AsyncGenerator<number, void, unknown>; }' is not assignable to type 'AsyncIterable<T, TReturn, TNext>'.
2332
- Types of property '[Symbol.asyncIterator]' are incompatible.
2433
- Type '(_: number) => AsyncGenerator<number, void, unknown>' is not assignable to type '() => AsyncIterator<T, TReturn, TNext>'.
2534
- Target signature provides too few arguments. Expected 1 or more, but got 0.
26-
-
27-
- yield* iter;
28-
- ~~~~
29-
-!!! error TS2504: Type '{ [Symbol.asyncIterator](_: number): AsyncGenerator<number, void, unknown>; }' must have a '[Symbol.asyncIterator]()' method that returns an async iterator.
35+
36+
yield* iter;
37+
~~~~
38+
+!!! error TS2322: Type '{ [Symbol.asyncIterator](_: number): AsyncGenerator<number, void, unknown>; }' is not assignable to type 'AsyncIterable<T, TReturn, TNext>'.
39+
+!!! error TS2322: Types of property '[Symbol.asyncIterator]' are incompatible.
40+
+!!! error TS2322: Type '(_: number) => AsyncGenerator<number, void, unknown>' is not assignable to type '() => AsyncIterator<T, TReturn, TNext>'.
41+
+!!! error TS2322: Target signature provides too few arguments. Expected 1 or more, but got 0.
42+
+ ~~~~
43+
!!! error TS2504: Type '{ [Symbol.asyncIterator](_: number): AsyncGenerator<number, void, unknown>; }' must have a '[Symbol.asyncIterator]()' method that returns an async iterator.
3044
-!!! related TS2322 asyncIteratorExtraParameters.ts:13:12: Type '{ [Symbol.asyncIterator](_: number): AsyncGenerator<number, void, unknown>; }' is not assignable to type 'AsyncIterable<T, TReturn, TNext>'.
3145
- Types of property '[Symbol.asyncIterator]' are incompatible.
3246
- Type '(_: number) => AsyncGenerator<number, void, unknown>' is not assignable to type '() => AsyncIterator<T, TReturn, TNext>'.
3347
- Target signature provides too few arguments. Expected 1 or more, but got 0.
34-
- }
35-
-
36-
+<no content>
48+
}
49+
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
iteratorExtraParameters.ts(11,21): error TS2322: Type '{ [Symbol.iterator](_: number): Generator<number, void, unknown>; }' is not assignable to type 'Iterable<T, TReturn, TNext>'.
2+
Types of property '[Symbol.iterator]' are incompatible.
3+
Type '(_: number) => Generator<number, void, unknown>' is not assignable to type '() => Iterator<T, TReturn, TNext>'.
4+
Target signature provides too few arguments. Expected 1 or more, but got 0.
5+
iteratorExtraParameters.ts(11,21): error TS2488: Type '{ [Symbol.iterator](_: number): Generator<number, void, unknown>; }' must have a '[Symbol.iterator]()' method that returns an iterator.
6+
iteratorExtraParameters.ts(13,12): error TS2322: Type '{ [Symbol.iterator](_: number): Generator<number, void, unknown>; }' is not assignable to type 'Iterable<T, TReturn, TNext>'.
7+
Types of property '[Symbol.iterator]' are incompatible.
8+
Type '(_: number) => Generator<number, void, unknown>' is not assignable to type '() => Iterator<T, TReturn, TNext>'.
9+
Target signature provides too few arguments. Expected 1 or more, but got 0.
10+
iteratorExtraParameters.ts(13,12): error TS2488: Type '{ [Symbol.iterator](_: number): Generator<number, void, unknown>; }' must have a '[Symbol.iterator]()' method that returns an iterator.
11+
iteratorExtraParameters.ts(15,9): error TS2322: Type '{ [Symbol.iterator](_: number): Generator<number, void, unknown>; }' is not assignable to type 'Iterable<T, TReturn, TNext>'.
12+
Types of property '[Symbol.iterator]' are incompatible.
13+
Type '(_: number) => Generator<number, void, unknown>' is not assignable to type '() => Iterator<T, TReturn, TNext>'.
14+
Target signature provides too few arguments. Expected 1 or more, but got 0.
15+
iteratorExtraParameters.ts(15,9): error TS2488: Type '{ [Symbol.iterator](_: number): Generator<number, void, unknown>; }' must have a '[Symbol.iterator]()' method that returns an iterator.
16+
iteratorExtraParameters.ts(17,10): error TS2322: Type '{ [Symbol.iterator](_: number): Generator<number, void, unknown>; }' is not assignable to type 'Iterable<T, TReturn, TNext>'.
17+
Types of property '[Symbol.iterator]' are incompatible.
18+
Type '(_: number) => Generator<number, void, unknown>' is not assignable to type '() => Iterator<T, TReturn, TNext>'.
19+
Target signature provides too few arguments. Expected 1 or more, but got 0.
20+
iteratorExtraParameters.ts(17,10): error TS2488: Type '{ [Symbol.iterator](_: number): Generator<number, void, unknown>; }' must have a '[Symbol.iterator]()' method that returns an iterator.
21+
22+
23+
==== iteratorExtraParameters.ts (8 errors) ====
24+
// https://github.com/microsoft/TypeScript/issues/57130
25+
const iter = {
26+
*[Symbol.iterator](_: number) {
27+
yield 0;
28+
}
29+
};
30+
31+
declare function g(...args: any): any;
32+
33+
function* f() {
34+
for (const _ of iter);
35+
~~~~
36+
!!! error TS2322: Type '{ [Symbol.iterator](_: number): Generator<number, void, unknown>; }' is not assignable to type 'Iterable<T, TReturn, TNext>'.
37+
!!! error TS2322: Types of property '[Symbol.iterator]' are incompatible.
38+
!!! error TS2322: Type '(_: number) => Generator<number, void, unknown>' is not assignable to type '() => Iterator<T, TReturn, TNext>'.
39+
!!! error TS2322: Target signature provides too few arguments. Expected 1 or more, but got 0.
40+
~~~~
41+
!!! error TS2488: Type '{ [Symbol.iterator](_: number): Generator<number, void, unknown>; }' must have a '[Symbol.iterator]()' method that returns an iterator.
42+
43+
yield* iter;
44+
~~~~
45+
!!! error TS2322: Type '{ [Symbol.iterator](_: number): Generator<number, void, unknown>; }' is not assignable to type 'Iterable<T, TReturn, TNext>'.
46+
!!! error TS2322: Types of property '[Symbol.iterator]' are incompatible.
47+
!!! error TS2322: Type '(_: number) => Generator<number, void, unknown>' is not assignable to type '() => Iterator<T, TReturn, TNext>'.
48+
!!! error TS2322: Target signature provides too few arguments. Expected 1 or more, but got 0.
49+
~~~~
50+
!!! error TS2488: Type '{ [Symbol.iterator](_: number): Generator<number, void, unknown>; }' must have a '[Symbol.iterator]()' method that returns an iterator.
51+
52+
[...iter]
53+
~~~~
54+
!!! error TS2322: Type '{ [Symbol.iterator](_: number): Generator<number, void, unknown>; }' is not assignable to type 'Iterable<T, TReturn, TNext>'.
55+
!!! error TS2322: Types of property '[Symbol.iterator]' are incompatible.
56+
!!! error TS2322: Type '(_: number) => Generator<number, void, unknown>' is not assignable to type '() => Iterator<T, TReturn, TNext>'.
57+
!!! error TS2322: Target signature provides too few arguments. Expected 1 or more, but got 0.
58+
~~~~
59+
!!! error TS2488: Type '{ [Symbol.iterator](_: number): Generator<number, void, unknown>; }' must have a '[Symbol.iterator]()' method that returns an iterator.
60+
61+
g(...iter);
62+
~~~~
63+
!!! error TS2322: Type '{ [Symbol.iterator](_: number): Generator<number, void, unknown>; }' is not assignable to type 'Iterable<T, TReturn, TNext>'.
64+
!!! error TS2322: Types of property '[Symbol.iterator]' are incompatible.
65+
!!! error TS2322: Type '(_: number) => Generator<number, void, unknown>' is not assignable to type '() => Iterator<T, TReturn, TNext>'.
66+
!!! error TS2322: Target signature provides too few arguments. Expected 1 or more, but got 0.
67+
~~~~
68+
!!! error TS2488: Type '{ [Symbol.iterator](_: number): Generator<number, void, unknown>; }' must have a '[Symbol.iterator]()' method that returns an iterator.
69+
}
70+

0 commit comments

Comments
 (0)