@@ -50,13 +50,46 @@ def call(minuend = @minuend, context: nil)
5050
5151 context = _ = [ context , decl . name ]
5252 children = call ( decl . each_decl . to_a , context : context ) +
53- decl . each_member . reject { |m | member_exist? ( owner , m , context : context ) }
53+ decl . each_member . filter_map { |m | subtract_member ( owner , m , context : context ) }
5454 children = filter_redundant_access_modifiers ( children )
5555 return nil if children . empty?
5656
5757 update_decl ( decl , members : children )
5858 end
5959
60+ private def subtract_member ( owner , member , context :)
61+ if member . is_a? ( AST ::Members ::AttrAccessor )
62+ reader_exists = method_exist? ( owner , member . name , member . kind )
63+ writer_exists = method_exist? ( owner , :"#{ member . name } =" , member . kind )
64+
65+ case
66+ when reader_exists && writer_exists
67+ nil
68+ when reader_exists
69+ accessor_part ( member , AST ::Members ::AttrWriter )
70+ when writer_exists
71+ accessor_part ( member , AST ::Members ::AttrReader )
72+ else
73+ member
74+ end
75+ else
76+ member unless member_exist? ( owner , member , context : context )
77+ end
78+ end
79+
80+ private def accessor_part ( member , member_class )
81+ member_class . new (
82+ name : member . name ,
83+ type : member . type ,
84+ ivar_name : member . ivar_name ,
85+ kind : member . kind ,
86+ annotations : member . annotations ,
87+ location : member . location ,
88+ comment : member . comment ,
89+ visibility : member . visibility
90+ )
91+ end
92+
6093 private def member_exist? ( owner , member , context :)
6194 case member
6295 when AST ::Members ::MethodDefinition
@@ -67,9 +100,6 @@ def call(minuend = @minuend, context: nil)
67100 method_exist? ( owner , member . name , member . kind )
68101 when AST ::Members ::AttrWriter
69102 method_exist? ( owner , :"#{ member . name } =" , member . kind )
70- when AST ::Members ::AttrAccessor
71- # TODO: It unexpectedly removes attr_accessor even if either reader or writer does not exist in the subtrahend.
72- method_exist? ( owner , member . name , member . kind ) || method_exist? ( owner , :"#{ member . name } =" , member . kind )
73103 when AST ::Members ::InstanceVariable
74104 ivar_exist? ( owner , member . name , :instance )
75105 when AST ::Members ::ClassInstanceVariable
0 commit comments