@@ -647,11 +647,14 @@ def process_name_expr_decorator(self, expr: NameExpr, context: Decorator) -> boo
647647 'asyncio.coroutines' ,
648648 'types' ):
649649 self .add_coroutine_decorator (context .func , name , name )
650- elif any (self .refers_to_fullname (name , target )
651- for target in ('abc.abstractmethod' , 'abc.abstractproperty' )):
650+ elif self .refers_to_fullname (name , 'abc.abstractmethod' ):
652651 self .add_decorator (name )
653652 self .import_tracker .require_name (name )
654653 is_abstract = True
654+ elif self .refers_to_fullname (name , 'abc.abstractproperty' ):
655+ self .add_decorator ('property' )
656+ self .add_decorator ('abc.abstractmethod' )
657+ is_abstract = True
655658 return is_abstract
656659
657660 def refers_to_fullname (self , name : str , fullname : str ) -> bool :
@@ -674,8 +677,13 @@ def process_member_expr_decorator(self, expr: MemberExpr, context: Decorator) ->
674677 (expr .expr .name == 'abc' or
675678 self .import_tracker .reverse_alias .get ('abc' )) and
676679 expr .name in ('abstractmethod' , 'abstractproperty' )):
677- self .import_tracker .require_name (expr .expr .name )
678- self .add_decorator ('%s.%s' % (expr .expr .name , expr .name ))
680+ if expr .name == 'abstractproperty' :
681+ self .import_tracker .require_name (expr .expr .name )
682+ self .add_decorator ('%s' % ('property' ))
683+ self .add_decorator ('%s.%s' % (expr .expr .name , 'abstractmethod' ))
684+ else :
685+ self .import_tracker .require_name (expr .expr .name )
686+ self .add_decorator ('%s.%s' % (expr .expr .name , expr .name ))
679687 is_abstract = True
680688 elif expr .name == 'coroutine' :
681689 if (isinstance (expr .expr , MemberExpr ) and
0 commit comments