@@ -654,6 +654,7 @@ def _visit_overloaded_func_def(self, defn: OverloadedFuncDef) -> None:
654654 assert isinstance (defn .items [0 ], Decorator )
655655 self .visit_decorator (defn .items [0 ])
656656 if defn .items [0 ].var .is_settable_property :
657+ # TODO: here and elsewhere we assume setter immediately follows getter.
657658 assert isinstance (defn .items [1 ], Decorator )
658659 # Perform a reduced visit just to infer the actual setter type.
659660 self .visit_decorator_inner (defn .items [1 ], skip_first_item = True )
@@ -673,9 +674,15 @@ def _visit_overloaded_func_def(self, defn: OverloadedFuncDef) -> None:
673674 # TODO: keep precise type for callables with tricky but valid signatures.
674675 setter_type = fallback_setter_type
675676 defn .items [0 ].var .setter_type = setter_type
676- for fdef in defn .items :
677+ for i , fdef in enumerate ( defn .items ) :
677678 assert isinstance (fdef , Decorator )
678- if not defn .is_property :
679+ if defn .is_property :
680+ assert isinstance (defn .items [0 ], Decorator )
681+ settable = defn .items [0 ].var .is_settable_property
682+ # Do not visit the second time the items we checked above.
683+ if (settable and i > 1 ) or (not settable and i > 0 ):
684+ self .check_func_item (fdef .func , name = fdef .func .name , allow_empty = True )
685+ else :
679686 # Perform full check for real overloads to infer type of all decorated
680687 # overload variants.
681688 self .visit_decorator_inner (fdef , allow_empty = True )
0 commit comments