|
41 | 41 | from mypy.errorcodes import TYPE_VAR, UNUSED_AWAITABLE, UNUSED_COROUTINE, ErrorCode
|
42 | 42 | from mypy.errors import Errors, ErrorWatcher, report_internal_error
|
43 | 43 | from mypy.expandtype import expand_self_type, expand_type, expand_type_by_instance
|
44 |
| -from mypy.join import join_types |
45 | 44 | from mypy.literals import Key, extract_var_from_literal_hash, literal, literal_hash
|
46 | 45 | from mypy.maptype import map_instance_to_supertype
|
47 | 46 | from mypy.meet import is_overlapping_erased_types, is_overlapping_types
|
@@ -4653,42 +4652,32 @@ def analyze_async_iterable_item_type(self, expr: Expression) -> tuple[Type, Type
|
4653 | 4652 |
|
4654 | 4653 | def analyze_iterable_item_type(self, expr: Expression) -> tuple[Type, Type]:
|
4655 | 4654 | """Analyse iterable expression and return iterator and iterator item types."""
|
4656 |
| - echk = self.expr_checker |
4657 |
| - iterable = get_proper_type(echk.accept(expr)) |
4658 |
| - iterator = echk.check_method_call_by_name("__iter__", iterable, [], [], expr)[0] |
4659 |
| - |
| 4655 | + iterator, iterable = self.analyze_iterable_item_type_without_expression( |
| 4656 | + self.expr_checker.accept(expr), context=expr |
| 4657 | + ) |
4660 | 4658 | int_type = self.analyze_range_native_int_type(expr)
|
4661 | 4659 | if int_type:
|
4662 | 4660 | return iterator, int_type
|
4663 |
| - |
4664 |
| - if ( |
4665 |
| - isinstance(iterable, TupleType) |
4666 |
| - and iterable.partial_fallback.type.fullname == "builtins.tuple" |
4667 |
| - ): |
4668 |
| - return iterator, tuple_fallback(iterable).args[0] |
4669 |
| - else: |
4670 |
| - # Non-tuple iterable. |
4671 |
| - return iterator, echk.check_method_call_by_name("__next__", iterator, [], [], expr)[0] |
| 4661 | + return iterator, iterable |
4672 | 4662 |
|
4673 | 4663 | def analyze_iterable_item_type_without_expression(
|
4674 | 4664 | self, type: Type, context: Context
|
4675 | 4665 | ) -> tuple[Type, Type]:
|
4676 | 4666 | """Analyse iterable type and return iterator and iterator item types."""
|
4677 | 4667 | echk = self.expr_checker
|
| 4668 | + iterable: Type |
4678 | 4669 | iterable = get_proper_type(type)
|
4679 | 4670 | iterator = echk.check_method_call_by_name("__iter__", iterable, [], [], context)[0]
|
4680 | 4671 |
|
4681 |
| - if isinstance(iterable, TupleType): |
4682 |
| - joined: Type = UninhabitedType() |
4683 |
| - for item in iterable.items: |
4684 |
| - joined = join_types(joined, item) |
4685 |
| - return iterator, joined |
| 4672 | + if ( |
| 4673 | + isinstance(iterable, TupleType) |
| 4674 | + and iterable.partial_fallback.type.fullname == "builtins.tuple" |
| 4675 | + ): |
| 4676 | + return iterator, tuple_fallback(iterable).args[0] |
4686 | 4677 | else:
|
4687 | 4678 | # Non-tuple iterable.
|
4688 |
| - return ( |
4689 |
| - iterator, |
4690 |
| - echk.check_method_call_by_name("__next__", iterator, [], [], context)[0], |
4691 |
| - ) |
| 4679 | + iterable = echk.check_method_call_by_name("__next__", iterator, [], [], context)[0] |
| 4680 | + return iterator, iterable |
4692 | 4681 |
|
4693 | 4682 | def analyze_range_native_int_type(self, expr: Expression) -> Type | None:
|
4694 | 4683 | """Try to infer native int item type from arguments to range(...).
|
|
0 commit comments