|
28 | 28 | Type, AnyType, CallableType, FunctionLike, Overloaded, TupleType, TypedDictType,
|
29 | 29 | Instance, NoneTyp, ErrorType, strip_type, TypeType,
|
30 | 30 | UnionType, TypeVarId, TypeVarType, PartialType, DeletedType, UninhabitedType, TypeVarDef,
|
31 |
| - true_only, false_only, function_type, is_named_instance, union_items |
| 31 | + true_only, false_only, function_type, is_named_instance |
32 | 32 | )
|
33 | 33 | from mypy.sametypes import is_same_type, is_same_types
|
34 | 34 | from mypy.messages import MessageBuilder
|
@@ -812,45 +812,44 @@ def check_overlapping_op_methods(self,
|
812 | 812 | # of x in __radd__ would not be A, the methods could be
|
813 | 813 | # non-overlapping.
|
814 | 814 |
|
815 |
| - for forward_item in union_items(forward_type): |
816 |
| - if isinstance(forward_item, CallableType): |
817 |
| - # TODO check argument kinds |
818 |
| - if len(forward_item.arg_types) < 1: |
819 |
| - # Not a valid operator method -- can't succeed anyway. |
820 |
| - return |
| 815 | + if isinstance(forward_type, CallableType): |
| 816 | + # TODO check argument kinds |
| 817 | + if len(forward_type.arg_types) < 1: |
| 818 | + # Not a valid operator method -- can't succeed anyway. |
| 819 | + return |
821 | 820 |
|
822 |
| - # Construct normalized function signatures corresponding to the |
823 |
| - # operator methods. The first argument is the left operand and the |
824 |
| - # second operand is the right argument -- we switch the order of |
825 |
| - # the arguments of the reverse method. |
826 |
| - forward_tweaked = CallableType( |
827 |
| - [forward_base, forward_item.arg_types[0]], |
828 |
| - [nodes.ARG_POS] * 2, |
829 |
| - [None] * 2, |
830 |
| - forward_item.ret_type, |
831 |
| - forward_item.fallback, |
832 |
| - name=forward_item.name) |
833 |
| - reverse_args = reverse_type.arg_types |
834 |
| - reverse_tweaked = CallableType( |
835 |
| - [reverse_args[1], reverse_args[0]], |
836 |
| - [nodes.ARG_POS] * 2, |
837 |
| - [None] * 2, |
838 |
| - reverse_type.ret_type, |
839 |
| - fallback=self.named_type('builtins.function'), |
840 |
| - name=reverse_type.name) |
841 |
| - |
842 |
| - if is_unsafe_overlapping_signatures(forward_tweaked, |
843 |
| - reverse_tweaked): |
844 |
| - self.msg.operator_method_signatures_overlap( |
845 |
| - reverse_class.name(), reverse_name, |
846 |
| - forward_base.type.name(), forward_name, context) |
847 |
| - elif isinstance(forward_item, Overloaded): |
848 |
| - for item in forward_item.items(): |
849 |
| - self.check_overlapping_op_methods( |
850 |
| - reverse_type, reverse_name, reverse_class, |
851 |
| - item, forward_name, forward_base, context) |
852 |
| - elif not isinstance(forward_item, AnyType): |
853 |
| - self.msg.forward_operator_not_callable(forward_name, context) |
| 821 | + # Construct normalized function signatures corresponding to the |
| 822 | + # operator methods. The first argument is the left operand and the |
| 823 | + # second operand is the right argument -- we switch the order of |
| 824 | + # the arguments of the reverse method. |
| 825 | + forward_tweaked = CallableType( |
| 826 | + [forward_base, forward_type.arg_types[0]], |
| 827 | + [nodes.ARG_POS] * 2, |
| 828 | + [None] * 2, |
| 829 | + forward_type.ret_type, |
| 830 | + forward_type.fallback, |
| 831 | + name=forward_type.name) |
| 832 | + reverse_args = reverse_type.arg_types |
| 833 | + reverse_tweaked = CallableType( |
| 834 | + [reverse_args[1], reverse_args[0]], |
| 835 | + [nodes.ARG_POS] * 2, |
| 836 | + [None] * 2, |
| 837 | + reverse_type.ret_type, |
| 838 | + fallback=self.named_type('builtins.function'), |
| 839 | + name=reverse_type.name) |
| 840 | + |
| 841 | + if is_unsafe_overlapping_signatures(forward_tweaked, |
| 842 | + reverse_tweaked): |
| 843 | + self.msg.operator_method_signatures_overlap( |
| 844 | + reverse_class.name(), reverse_name, |
| 845 | + forward_base.type.name(), forward_name, context) |
| 846 | + elif isinstance(forward_type, Overloaded): |
| 847 | + for item in forward_type.items(): |
| 848 | + self.check_overlapping_op_methods( |
| 849 | + reverse_type, reverse_name, reverse_class, |
| 850 | + item, forward_name, forward_base, context) |
| 851 | + elif not isinstance(forward_type, AnyType): |
| 852 | + self.msg.forward_operator_not_callable(forward_name, context) |
854 | 853 |
|
855 | 854 | def check_inplace_operator_method(self, defn: FuncBase) -> None:
|
856 | 855 | """Check an inplace operator method such as __iadd__.
|
|
0 commit comments