diff --git a/lib/rbs/sorter.rb b/lib/rbs/sorter.rb index 99ef0cb01..4e276c377 100644 --- a/lib/rbs/sorter.rb +++ b/lib/rbs/sorter.rb @@ -42,7 +42,8 @@ def sort_decl(decl) class_instance_variables: [], instance_variables: [], singleton_attributes: [], - instance_attributes: [], + public_instance_attributes: [], + private_instance_attributes: [], module_functions: [], singleton_new_methods: [], public_singleton_methods: [], @@ -64,7 +65,8 @@ def sort_decl(decl) when Members::Private :private when Members::MethodDefinition, Members::AttrReader, Members::AttrWriter, Members::AttrAccessor - visibility_annotated_members << member.update(visibility: member.visibility || current_visibility) + visibility = member.kind == :instance ? member.visibility || current_visibility : member.visibility + visibility_annotated_members << member.update(visibility: visibility) current_visibility else visibility_annotated_members << member @@ -94,9 +96,11 @@ def sort_decl(decl) partitioned[:instance_variables] << member when Members::AttrAccessor, Members::AttrWriter, Members::AttrReader if member.kind == :singleton - partitioned[:singleton_attributes] << member.update(visibility: nil) + partitioned[:singleton_attributes] << member + elsif member.visibility == :private + partitioned[:private_instance_attributes] << member.update(visibility: nil) else - partitioned[:instance_attributes] << member.update(visibility: nil) + partitioned[:public_instance_attributes] << member.update(visibility: nil) end when Members::MethodDefinition case member.kind @@ -104,11 +108,11 @@ def sort_decl(decl) partitioned[:module_functions] << member.update(visibility: nil) when :singleton if member.name == :new - partitioned[:singleton_new_methods] << member.update(visibility: nil) - elsif member.visibility == :public - partitioned[:public_singleton_methods] << member.update(visibility: nil) + partitioned[:singleton_new_methods] << member + elsif member.visibility == :private + partitioned[:private_singleton_methods] << member else - partitioned[:private_singleton_methods] << member.update(visibility: nil) + partitioned[:public_singleton_methods] << member end else if member.name == :initialize @@ -142,7 +146,8 @@ def sort_decl(decl) partitioned[:class_instance_variables].sort_by! {|decl| decl.name.to_s } partitioned[:instance_variables].sort_by! {|decl| decl.name.to_s } partitioned[:singleton_attributes].sort_by! {|decl| decl.name.to_s } - partitioned[:instance_attributes].sort_by! {|decl| decl.name.to_s } + partitioned[:public_instance_attributes].sort_by! {|decl| decl.name.to_s } + partitioned[:private_instance_attributes].sort_by! {|decl| decl.name.to_s } partitioned[:module_functions].sort_by! {|decl| decl.name.to_s } partitioned[:public_singleton_methods].sort_by! {|decl| decl.is_a?(Members::MethodDefinition) ? decl.name.to_s : decl.new_name.to_s } partitioned[:private_singleton_methods].sort_by! {|decl| decl.name.to_s } @@ -167,24 +172,17 @@ def sort_decl(decl) members.push(*partitioned[:singleton_new_methods]) members.push(*partitioned[:public_singleton_methods]) - if !partitioned[:private_singleton_methods].empty? - current_visibility = :private - members.push Members::Private.new(location: nil) - end members.push(*partitioned[:private_singleton_methods]) - if current_visibility == :private && !partitioned[:public_instance_methods].empty? - current_visibility = :public - members.push Members::Public.new(location: nil) - end - members.push(*partitioned[:instance_attributes]) + members.push(*partitioned[:public_instance_attributes]) members.push(*partitioned[:instance_initialize_methods]) members.push(*partitioned[:public_instance_methods]) - if current_visibility == :public && !partitioned[:private_instance_methods].empty? + if current_visibility == :public && (!partitioned[:private_instance_attributes].empty? || !partitioned[:private_instance_methods].empty?) current_visibility = :private members.push Members::Private.new(location: nil) end + members.push(*partitioned[:private_instance_attributes]) members.push(*partitioned[:private_instance_methods]) members.push(*partitioned[:other_decls]) diff --git a/sig/sorter.rbs b/sig/sorter.rbs index a8a38fa9a..a776b6f02 100644 --- a/sig/sorter.rbs +++ b/sig/sorter.rbs @@ -25,7 +25,8 @@ module RBS class_instance_variables: Array[AST::Members::ClassInstanceVariable], instance_variables: Array[AST::Members::InstanceVariable], singleton_attributes: Array[AST::Members::AttrAccessor | AST::Members::AttrWriter | AST::Members::AttrReader], - instance_attributes: Array[AST::Members::AttrAccessor | AST::Members::AttrWriter | AST::Members::AttrReader], + public_instance_attributes: Array[AST::Members::AttrAccessor | AST::Members::AttrWriter | AST::Members::AttrReader], + private_instance_attributes: Array[AST::Members::AttrAccessor | AST::Members::AttrWriter | AST::Members::AttrReader], module_functions: Array[AST::Members::MethodDefinition], singleton_new_methods: Array[AST::Members::MethodDefinition], public_singleton_methods: Array[AST::Members::MethodDefinition | AST::Members::Alias], diff --git a/test/rbs/sorter_test.rb b/test/rbs/sorter_test.rb index 8803365e0..3da9b6e4a 100644 --- a/test/rbs/sorter_test.rb +++ b/test/rbs/sorter_test.rb @@ -36,17 +36,13 @@ def self?.modfunc: () -> void attr_accessor self.a: String attr_reader self.b: String attr_writer self.c: String + private attr_reader self.private_singleton: String def self.new: () -> instance alias self.bb self.xx def self.foo: () -> void - def self.pub: () -> void - - private - - def self.prv: () -> void - - public + public def self.pub: () -> void + private def self.prv: () -> void attr_accessor x: String def initialize: () -> void @@ -58,6 +54,7 @@ def pub: () -> void private + attr_reader private_instance: String def prv: () -> void end RUBY_EXPECTED @@ -84,8 +81,12 @@ def self?.modfunc: () -> void attr_writer self.c: String + private attr_reader self.private_singleton: String + attr_accessor x: String + private attr_reader private_instance: String + def self.new: () -> instance def self.foo: () -> void