Skip to content

Commit f2e6ed3

Browse files
committed
Preserve missing accessor halves when subtracting
1 parent 5de6ecd commit f2e6ed3

1 file changed

Lines changed: 34 additions & 4 deletions

File tree

lib/rbs/subtractor.rb

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)