@@ -168,6 +168,79 @@ async def f() -> None:
168
168
reveal_type(z) # E: Revealed type is 'Union[builtins.int, builtins.str]'
169
169
[builtins fixtures/async_await.pyi]
170
170
171
+ [case testAsyncForComprehension]
172
+ # flags: --fast-parser --python-version 3.6
173
+ from typing import Generic, Iterable, TypeVar, AsyncIterator, Tuple
174
+
175
+ T = TypeVar('T')
176
+
177
+ class asyncify(Generic[T], AsyncIterator[T]):
178
+ def __init__(self, iterable: Iterable[T]) -> None:
179
+ self.iterable = iter(iterable)
180
+ def __aiter__(self) -> AsyncIterator[T]:
181
+ return self
182
+ async def __anext__(self) -> T:
183
+ try:
184
+ return next(self.iterable)
185
+ except StopIteration:
186
+ raise StopAsyncIteration
187
+
188
+ async def listcomp(obj: Iterable[int]):
189
+ lst = [i async for i in asyncify(obj)]
190
+ reveal_type(lst) # E: Revealed type is 'builtins.list[builtins.int*]'
191
+ lst2 = [i async for i in asyncify(obj) for j in obj]
192
+ reveal_type(lst2) # E: Revealed type is 'builtins.list[builtins.int*]'
193
+
194
+ async def setcomp(obj: Iterable[int]):
195
+ lst = {i async for i in asyncify(obj)}
196
+ reveal_type(lst) # E: Revealed type is 'builtins.set[builtins.int*]'
197
+
198
+ async def dictcomp(obj: Iterable[Tuple[int, str]]):
199
+ lst = {i: j async for i, j in asyncify(obj)}
200
+ reveal_type(lst) # E: Revealed type is 'builtins.dict[builtins.int*, builtins.str*]'
201
+
202
+ async def generatorexp(obj: Iterable[int]):
203
+ lst = (i async for i in asyncify(obj))
204
+ reveal_type(lst) # E: Revealed type is 'typing.AsyncIterator[builtins.int*]'
205
+ lst2 = (i async for i in asyncify(obj) for i in obj)
206
+ reveal_type(lst2) # E: Revealed type is 'typing.AsyncIterator[builtins.int*]'
207
+
208
+ [builtins fixtures/async_await.pyi]
209
+
210
+ [case testAsyncForComprehensionErrors]
211
+ # flags: --fast-parser --python-version 3.6
212
+ from typing import Generic, Iterable, TypeVar, AsyncIterator, Tuple
213
+
214
+ T = TypeVar('T')
215
+
216
+ class asyncify(Generic[T], AsyncIterator[T]):
217
+ def __init__(self, iterable: Iterable[T]) -> None:
218
+ self.iterable = iter(iterable)
219
+ def __aiter__(self) -> AsyncIterator[T]:
220
+ return self
221
+ async def __anext__(self) -> T:
222
+ try:
223
+ return next(self.iterable)
224
+ except StopIteration:
225
+ raise StopAsyncIteration
226
+
227
+ async def wrong_iterable(obj: Iterable[int]):
228
+ [i async for i in obj]
229
+ [i for i in asyncify(obj)]
230
+ {i: i async for i in obj}
231
+ {i: i for i in asyncify(obj)}
232
+
233
+ [out]
234
+ main:18: error: AsyncIterable expected
235
+ main:18: error: Iterable[int] has no attribute "__aiter__"; maybe "__iter__"?
236
+ main:19: error: Iterable expected
237
+ main:19: error: asyncify[int] has no attribute "__iter__"; maybe "__aiter__"?
238
+ main:20: error: AsyncIterable expected
239
+ main:20: error: Iterable[int] has no attribute "__aiter__"; maybe "__iter__"?
240
+ main:21: error: Iterable expected
241
+ main:21: error: asyncify[int] has no attribute "__iter__"; maybe "__aiter__"?
242
+ [builtins fixtures/async_await.pyi]
243
+
171
244
[case testAsyncWith]
172
245
# flags: --fast-parser
173
246
class C:
0 commit comments