From a0da841e70c5bdb39c2c88bb3798eaa41e1f1ec6 Mon Sep 17 00:00:00 2001 From: Oskar Eichler <62393985+OskarEichler@users.noreply.github.com> Date: Sat, 29 Aug 2026 18:43:07 +0200 Subject: [PATCH 1/3] Preserve visibility when sorting members --- lib/rbs/sorter.rb | 35 ++++++++++++++++------------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/lib/rbs/sorter.rb b/lib/rbs/sorter.rb index 99ef0cb018..e06e49a881 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,10 @@ 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 else - partitioned[:instance_attributes] << member.update(visibility: nil) + key = member.visibility == :private ? :private_instance_attributes : :public_instance_attributes + partitioned[key] << member.update(visibility: nil) end when Members::MethodDefinition case member.kind @@ -104,11 +107,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 +145,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 +171,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]) From 0dea864c641136537a2dd56803e4f909f471875d Mon Sep 17 00:00:00 2001 From: Oskar Eichler <62393985+OskarEichler@users.noreply.github.com> Date: Sat, 29 Aug 2026 18:51:49 +0200 Subject: [PATCH 2/3] Type sorter visibility partitions --- lib/rbs/sorter.rb | 5 +++-- sig/sorter.rbs | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/rbs/sorter.rb b/lib/rbs/sorter.rb index e06e49a881..4e276c3778 100644 --- a/lib/rbs/sorter.rb +++ b/lib/rbs/sorter.rb @@ -97,9 +97,10 @@ def sort_decl(decl) when Members::AttrAccessor, Members::AttrWriter, Members::AttrReader if member.kind == :singleton partitioned[:singleton_attributes] << member + elsif member.visibility == :private + partitioned[:private_instance_attributes] << member.update(visibility: nil) else - key = member.visibility == :private ? :private_instance_attributes : :public_instance_attributes - partitioned[key] << member.update(visibility: nil) + partitioned[:public_instance_attributes] << member.update(visibility: nil) end when Members::MethodDefinition case member.kind diff --git a/sig/sorter.rbs b/sig/sorter.rbs index a8a38fa9ab..a776b6f025 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], From 864b5ad1abea3f55eff1bd34f9e10ea1639b4c11 Mon Sep 17 00:00:00 2001 From: Oskar Eichler Date: Sun, 30 Aug 2026 16:01:27 +0700 Subject: [PATCH 3/3] Cover sorted visibility preservation --- test/rbs/sorter_test.rb | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/test/rbs/sorter_test.rb b/test/rbs/sorter_test.rb index 8803365e0e..3da9b6e4a2 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