@@ -647,11 +647,14 @@ def process_name_expr_decorator(self, expr: NameExpr, context: Decorator) -> boo
647
647
'asyncio.coroutines' ,
648
648
'types' ):
649
649
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' ):
652
651
self .add_decorator (name )
653
652
self .import_tracker .require_name (name )
654
653
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
655
658
return is_abstract
656
659
657
660
def refers_to_fullname (self , name : str , fullname : str ) -> bool :
@@ -674,8 +677,13 @@ def process_member_expr_decorator(self, expr: MemberExpr, context: Decorator) ->
674
677
(expr .expr .name == 'abc' or
675
678
self .import_tracker .reverse_alias .get ('abc' )) and
676
679
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 ))
679
687
is_abstract = True
680
688
elif expr .name == 'coroutine' :
681
689
if (isinstance (expr .expr , MemberExpr ) and
0 commit comments