@@ -2050,6 +2050,12 @@ def check_method_or_accessor_override_for_base(
20502050 def check_setter_type_override (
20512051 self , defn : OverloadedFuncDef , base_attr : SymbolTableNode , base : TypeInfo
20522052 ) -> None :
2053+ """Check override of a setter type of a mutable attribute.
2054+
2055+ Currently, this should be only called when either base node or the current node
2056+ is a custom settable property (i.e. where setter type is different from getter type).
2057+ Note that this check is contravariant.
2058+ """
20532059 base_node = base_attr .node
20542060 assert isinstance (base_node , (OverloadedFuncDef , Var ))
20552061 original_type = get_raw_setter_type (base_node )
@@ -2154,6 +2160,7 @@ def check_method_override_for_base_with_name(
21542160 original_type = self .bind_and_map_method (base_attr , original_type , defn .info , base )
21552161 if original_node and is_property (original_node ):
21562162 original_type = get_property_type (original_type )
2163+
21572164 if isinstance (original_node , Var ):
21582165 expanded_type = map_type_from_supertype (original_type , defn .info , base )
21592166 expanded_type = expand_self_type (
@@ -3557,6 +3564,7 @@ def lvalue_type_from_base(
35573564 base_type = get_proper_type (base_type .arg_types [0 ])
35583565 else :
35593566 base_type = base_type .items [0 ].ret_type
3567+
35603568 return base_type , base_node
35613569
35623570 def check_compatibility_classvar_super (
@@ -5224,10 +5232,6 @@ def visit_decorator_inner(self, e: Decorator, allow_empty: bool = False) -> None
52245232 if not allow_empty :
52255233 self .fail (message_registry .MULTIPLE_OVERLOADS_REQUIRED , e )
52265234 continue
5227- if refers_to_fullname (d , "abc.abstractmethod" ):
5228- # Normally these would be removed, except for abstract settable properties,
5229- # where it is non-trivial to remove.
5230- continue
52315235 dec = self .expr_checker .accept (d )
52325236 temp = self .temp_node (sig , context = d )
52335237 fullname = None
@@ -8800,6 +8804,7 @@ def get_raw_setter_type(defn: OverloadedFuncDef | Var) -> ProperType:
88008804 first_item = defn .items [0 ]
88018805 assert isinstance (first_item , Decorator )
88028806 var = first_item .var
8807+ # TODO: handle synthetic properties here and elsewhere.
88038808 assert var .setter_type is not None
88048809 return var .setter_type
88058810
0 commit comments