|
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