diff --git a/lib/rbs/prototype/rb.rb b/lib/rbs/prototype/rb.rb index 8e3562db4..943d7754e 100644 --- a/lib/rbs/prototype/rb.rb +++ b/lib/rbs/prototype/rb.rb @@ -315,9 +315,16 @@ def process(node, decls:, comments:, context:) else args.each do |arg| if arg && (name = literal_to_symbol(arg)) - if (i, _ = find_def_index_by_name(decls, name)) + if (i, defn = find_def_index_by_name(decls, name)) current = current_accessibility(decls, i) if current != accessibility + if defn.is_a?(AST::Members::AttrAccessor) + reader = build_attribute_member(AST::Members::AttrReader, defn) + writer = build_attribute_member(AST::Members::AttrWriter, defn) + targeted, remaining = name == defn.name ? [reader, writer] : [writer, reader] + decls[i, 1] = [targeted, remaining] + end + decls.insert(i + 1, current) decls.insert(i, accessibility) end @@ -791,6 +798,8 @@ def find_def_index_by_name(decls, name) decl.name == name when AST::Members::AttrWriter :"#{decl.name}=" == name + when AST::Members::AttrAccessor + decl.name == name || :"#{decl.name}=" == name end end @@ -802,6 +811,19 @@ def find_def_index_by_name(decls, name) end end + def build_attribute_member(klass, member) + klass.new( + name: member.name, + type: member.type, + ivar_name: member.ivar_name, + kind: member.kind, + annotations: member.annotations, + location: member.location, + comment: member.comment, + visibility: member.visibility + ) + end + def sort_members!(decls) i = 0 orders = { diff --git a/sig/prototype/rb.rbs b/sig/prototype/rb.rbs index e575fc4ee..ab7dd700f 100644 --- a/sig/prototype/rb.rbs +++ b/sig/prototype/rb.rbs @@ -90,6 +90,8 @@ module RBS def find_def_index_by_name: (Array[decl] decls, Symbol name) -> [Integer, AST::Members::MethodDefinition | AST::Members::AttrReader | AST::Members::AttrWriter]? + def build_attribute_member: (singleton(AST::Members::AttrReader) | singleton(AST::Members::AttrWriter) klass, AST::Members::AttrAccessor member) -> (AST::Members::AttrReader | AST::Members::AttrWriter) + def sort_members!: (Array[decl] decls) -> void end end