diff --git a/Gemfile.lock b/Gemfile.lock index 1b8f67dd..d0516926 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -4,7 +4,7 @@ PATH spoom (1.8.3) erubi (>= 1.10.0) prism (>= 0.28.0) - rbi (>= 0.3.14) + rbi (>= 0.3.15) rbs (>= 4.0.0.dev.5) rexml (>= 3.2.6) sorbet-static-and-runtime (>= 0.5.10187) @@ -57,7 +57,7 @@ GEM racc (1.8.1) rainbow (3.1.1) rake (13.4.2) - rbi (0.3.14) + rbi (0.3.15) prism (~> 1.0) rbs (>= 4.0.1) rbs (4.0.3) diff --git a/lib/spoom/cli/srb/sigs.rb b/lib/spoom/cli/srb/sigs.rb index 078744bc..22f303a3 100644 --- a/lib/spoom/cli/srb/sigs.rb +++ b/lib/spoom/cli/srb/sigs.rb @@ -17,6 +17,10 @@ class Sigs < Thor aliases: :p, desc: "Use positional names when translating from RBI to RBS", default: true + option :preserve_multiline_signatures, + type: :boolean, + desc: "Preserve multiline sig formatting when translating from RBI to RBS", + default: true option :include_rbi_files, type: :boolean, desc: "Include RBI files", default: false option :max_line_length, type: :numeric, desc: "Max line length (pass 0 to disable)", default: 120 option :translate_generics, type: :boolean, desc: "Translate generics", default: false @@ -53,6 +57,7 @@ def translate(*paths) contents, file: file, positional_names: options[:positional_names], + preserve_multiline_signatures: options[:preserve_multiline_signatures], max_line_length: max_line_length, translate_generics: options[:translate_generics], translate_helpers: options[:translate_helpers], diff --git a/lib/spoom/sorbet/translate.rb b/lib/spoom/sorbet/translate.rb index 23c2e393..96029ac2 100644 --- a/lib/spoom/sorbet/translate.rb +++ b/lib/spoom/sorbet/translate.rb @@ -30,13 +30,17 @@ def strip_sorbet_sigs(ruby_contents, file:) #| String, #| file: String, #| ?positional_names: bool, + #| ?preserve_multiline_signatures: bool, #| ?max_line_length: Integer?, #| ?translate_generics: bool, #| ?translate_helpers: bool, #| ?translate_abstract_methods: bool #| ) -> String def sorbet_sigs_to_rbs_comments( - ruby_contents, file:, positional_names: true, max_line_length: nil, + ruby_contents, file:, + positional_names: true, + preserve_multiline_signatures: true, + max_line_length: nil, translate_generics: true, translate_helpers: true, translate_abstract_methods: true @@ -45,6 +49,7 @@ def sorbet_sigs_to_rbs_comments( ruby_contents, file: file, positional_names: positional_names, + preserve_multiline_signatures: preserve_multiline_signatures, max_line_length: max_line_length, translate_generics: translate_generics, translate_helpers: translate_helpers, diff --git a/lib/spoom/sorbet/translate/sorbet_sigs_to_rbs_comments.rb b/lib/spoom/sorbet/translate/sorbet_sigs_to_rbs_comments.rb index f7232957..91608d88 100644 --- a/lib/spoom/sorbet/translate/sorbet_sigs_to_rbs_comments.rb +++ b/lib/spoom/sorbet/translate/sorbet_sigs_to_rbs_comments.rb @@ -11,6 +11,7 @@ class SorbetSigsToRBSComments < Translator #| String, #| file: String, #| positional_names: bool, + #| ?preserve_multiline_signatures: bool, #| ?max_line_length: Integer?, #| ?translate_generics: bool, #| ?translate_helpers: bool, @@ -20,6 +21,7 @@ def initialize( ruby_contents, file:, positional_names:, + preserve_multiline_signatures: true, max_line_length: nil, translate_generics: true, translate_helpers: true, @@ -34,6 +36,8 @@ def initialize( @extend_t_helpers = [] #: Array[Prism::CallNode] @extend_t_generics = [] #: Array[Prism::CallNode] @seen_mixes_in_class_methods = false #: bool + + @preserve_multiline_signatures = preserve_multiline_signatures @max_line_length = max_line_length #: Integer? @translate_generics = translate_generics #: bool @@ -75,7 +79,12 @@ def visit_def_node(node) last_sigs.each do |node, sig| next if sig.is_abstract && !@translate_abstract_methods - out = rbs_print(node.location.start_column) do |printer| + preserve_multiline_signatures = !!(@preserve_multiline_signatures && sig.loc&.multiline?) + + out = rbs_print( + node.location.start_column, + preserve_multiline_signatures: preserve_multiline_signatures, + ) do |printer| printer.print_method_sig(rbi_node, sig) end @rewriter << Source::Replace.new(node.location.start_offset, node.location.end_offset, out) @@ -204,7 +213,7 @@ def visit_attr(node) rbi_node = builder.tree.nodes.first #: as RBI::Attr last_sigs.each do |node, sig| - out = rbs_print(node.location.start_column) do |printer| + out = rbs_print(node.location.start_column, preserve_multiline_signatures: false) do |printer| printer.print_attr_sig(rbi_node, sig) end @rewriter << Source::Replace.new(node.location.start_offset, node.location.end_offset, out) @@ -387,10 +396,16 @@ def collect_last_sigs last_sigs end - #: (Integer) { (RBI::RBSPrinter) -> void } -> String - def rbs_print(indent, &block) + #: (Integer, preserve_multiline_signatures: bool) { (RBI::RBSPrinter) -> void } -> String + def rbs_print(indent, preserve_multiline_signatures:, &block) out = StringIO.new - p = RBI::RBSPrinter.new(out: out, positional_names: @positional_names, max_line_length: @max_line_length) + + p = RBI::RBSPrinter.new( + out: out, + positional_names: @positional_names, + max_line_length: @max_line_length, + force_multiline_signatures: preserve_multiline_signatures, + ) block.call(p) string = out.string diff --git a/rbi/spoom.rbi b/rbi/spoom.rbi index 921eb97a..f8c40361 100644 --- a/rbi/spoom.rbi +++ b/rbi/spoom.rbi @@ -2949,13 +2949,14 @@ module Spoom::Sorbet::Translate ruby_contents: ::String, file: ::String, positional_names: T::Boolean, + preserve_multiline_signatures: T::Boolean, max_line_length: T.nilable(::Integer), translate_generics: T::Boolean, translate_helpers: T::Boolean, translate_abstract_methods: T::Boolean ).returns(::String) end - def sorbet_sigs_to_rbs_comments(ruby_contents, file:, positional_names: T.unsafe(nil), max_line_length: T.unsafe(nil), translate_generics: T.unsafe(nil), translate_helpers: T.unsafe(nil), translate_abstract_methods: T.unsafe(nil)); end + def sorbet_sigs_to_rbs_comments(ruby_contents, file:, positional_names: T.unsafe(nil), preserve_multiline_signatures: T.unsafe(nil), max_line_length: T.unsafe(nil), translate_generics: T.unsafe(nil), translate_helpers: T.unsafe(nil), translate_abstract_methods: T.unsafe(nil)); end sig { params(ruby_contents: ::String, file: ::String).returns(::String) } def strip_sorbet_sigs(ruby_contents, file:); end @@ -3324,13 +3325,14 @@ class Spoom::Sorbet::Translate::SorbetSigsToRBSComments < ::Spoom::Sorbet::Trans ruby_contents: ::String, file: ::String, positional_names: T::Boolean, + preserve_multiline_signatures: T::Boolean, max_line_length: T.nilable(::Integer), translate_generics: T::Boolean, translate_helpers: T::Boolean, translate_abstract_methods: T::Boolean ).void end - def initialize(ruby_contents, file:, positional_names:, max_line_length: T.unsafe(nil), translate_generics: T.unsafe(nil), translate_helpers: T.unsafe(nil), translate_abstract_methods: T.unsafe(nil)); end + def initialize(ruby_contents, file:, positional_names:, preserve_multiline_signatures: T.unsafe(nil), max_line_length: T.unsafe(nil), translate_generics: T.unsafe(nil), translate_helpers: T.unsafe(nil), translate_abstract_methods: T.unsafe(nil)); end sig { override.params(node: ::Prism::CallNode).void } def visit_call_node(node); end @@ -3375,8 +3377,14 @@ class Spoom::Sorbet::Translate::SorbetSigsToRBSComments < ::Spoom::Sorbet::Trans sig { void } def delete_extend_t_helpers; end - sig { params(indent: ::Integer, block: T.proc.params(arg0: ::RBI::RBSPrinter).void).returns(::String) } - def rbs_print(indent, &block); end + sig do + params( + indent: ::Integer, + preserve_multiline_signatures: T::Boolean, + block: T.proc.params(arg0: ::RBI::RBSPrinter).void + ).returns(::String) + end + def rbs_print(indent, preserve_multiline_signatures:, &block); end sig { params(node: ::Prism::CallNode).void } def visit_attr(node); end diff --git a/sorbet/rbi/gems/rbi@0.3.13.rbi b/sorbet/rbi/gems/rbi@0.3.15.rbi similarity index 97% rename from sorbet/rbi/gems/rbi@0.3.13.rbi rename to sorbet/rbi/gems/rbi@0.3.15.rbi index dd7d020b..ccc4a036 100644 --- a/sorbet/rbi/gems/rbi@0.3.13.rbi +++ b/sorbet/rbi/gems/rbi@0.3.15.rbi @@ -517,11 +517,11 @@ class RBI::File end def print(out: T.unsafe(nil), indent: T.unsafe(nil), print_locs: T.unsafe(nil), max_line_length: T.unsafe(nil)); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1236 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1245 sig { params(out: T.any(::IO, ::StringIO), indent: ::Integer, print_locs: T::Boolean).void } def rbs_print(out: T.unsafe(nil), indent: T.unsafe(nil), print_locs: T.unsafe(nil)); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1242 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1251 sig { params(indent: ::Integer, print_locs: T::Boolean).returns(::String) } def rbs_string(indent: T.unsafe(nil), print_locs: T.unsafe(nil)); end @@ -892,11 +892,15 @@ class RBI::Loc sig { params(other: ::RBI::Loc).returns(::RBI::Loc) } def join(other); end - # pkg:gem/rbi#lib/rbi/loc.rb:61 + # pkg:gem/rbi#lib/rbi/loc.rb:52 + sig { returns(T::Boolean) } + def multiline?; end + + # pkg:gem/rbi#lib/rbi/loc.rb:68 sig { returns(T.nilable(::String)) } def source; end - # pkg:gem/rbi#lib/rbi/loc.rb:52 + # pkg:gem/rbi#lib/rbi/loc.rb:59 sig { returns(::String) } def to_s; end @@ -1216,7 +1220,7 @@ class RBI::Node end def print(out: T.unsafe(nil), indent: T.unsafe(nil), print_locs: T.unsafe(nil), max_line_length: T.unsafe(nil)); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1251 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1260 sig do params( out: T.any(::IO, ::StringIO), @@ -1227,7 +1231,7 @@ class RBI::Node end def rbs_print(out: T.unsafe(nil), indent: T.unsafe(nil), print_locs: T.unsafe(nil), positional_names: T.unsafe(nil)); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1257 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1266 sig { params(indent: ::Integer, print_locs: T::Boolean, positional_names: T::Boolean).returns(::String) } def rbs_string(indent: T.unsafe(nil), print_locs: T.unsafe(nil), positional_names: T.unsafe(nil)); end @@ -2178,23 +2182,24 @@ end # pkg:gem/rbi#lib/rbi/rbs_printer.rb:5 class RBI::RBSPrinter < ::RBI::Visitor - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:30 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:31 sig do params( out: T.any(::IO, ::StringIO), indent: ::Integer, print_locs: T::Boolean, positional_names: T::Boolean, - max_line_length: T.nilable(::Integer) + max_line_length: T.nilable(::Integer), + force_multiline_signatures: T::Boolean ).void end - def initialize(out: T.unsafe(nil), indent: T.unsafe(nil), print_locs: T.unsafe(nil), positional_names: T.unsafe(nil), max_line_length: T.unsafe(nil)); end + def initialize(out: T.unsafe(nil), indent: T.unsafe(nil), print_locs: T.unsafe(nil), positional_names: T.unsafe(nil), max_line_length: T.unsafe(nil), force_multiline_signatures: T.unsafe(nil)); end # pkg:gem/rbi#lib/rbi/rbs_printer.rb:15 sig { returns(::Integer) } def current_indent; end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:49 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:58 sig { void } def dedent; end @@ -2204,7 +2209,7 @@ class RBI::RBSPrinter < ::RBI::Visitor # pkg:gem/rbi#lib/rbi/rbs_printer.rb:9 def in_visibility_group=(_arg0); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:44 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:53 sig { void } def indent; end @@ -2225,11 +2230,11 @@ class RBI::RBSPrinter < ::RBI::Visitor # Print a string without indentation nor `\n` at the end. # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:55 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:64 sig { params(string: ::String).void } def print(string); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:302 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:311 sig { params(node: ::RBI::Attr, sig: ::RBI::Sig).void } def print_attr_sig(node, sig); end @@ -2240,329 +2245,329 @@ class RBI::RBSPrinter < ::RBI::Visitor # pkg:gem/rbi#lib/rbi/rbs_printer.rb:9 def print_locs=(_arg0); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:400 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:409 sig { params(node: ::RBI::Method, sig: ::RBI::Sig).void } def print_method_sig(node, sig); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:417 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:426 sig { params(node: ::RBI::Method, sig: ::RBI::Sig).void } def print_method_sig_inline(node, sig); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:479 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:488 sig { params(node: ::RBI::Method, sig: ::RBI::Sig).void } def print_method_sig_multiline(node, sig); end # Print a string with indentation and `\n` at the end. # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:75 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:84 sig { params(string: ::String).void } def printl(string); end # Print a string without indentation but with a `\n` at the end. # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:61 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:70 sig { params(string: T.nilable(::String)).void } def printn(string = T.unsafe(nil)); end # Print a string with indentation but without a `\n` at the end. # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:68 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:77 sig { params(string: T.nilable(::String)).void } def printt(string = T.unsafe(nil)); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:82 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:91 sig { override.params(nodes: T::Array[::RBI::Node]).void } def visit_all(nodes); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:680 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:689 sig { override.params(node: ::RBI::Arg).void } def visit_arg(node); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:270 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:279 sig { params(node: ::RBI::Attr).void } def visit_attr(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:253 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:262 sig { override.params(node: ::RBI::AttrAccessor).void } def visit_attr_accessor(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:259 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:268 sig { override.params(node: ::RBI::AttrReader).void } def visit_attr_reader(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:265 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:274 sig { override.params(node: ::RBI::AttrWriter).void } def visit_attr_writer(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:124 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:133 sig { override.params(node: ::RBI::BlankLine).void } def visit_blank_line(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:612 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:621 sig { override.params(node: ::RBI::BlockParam).void } def visit_block_param(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:144 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:153 sig { override.params(node: ::RBI::Class).void } def visit_class(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:107 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:116 sig { override.params(node: ::RBI::Comment).void } def visit_comment(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:816 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:825 sig { override.params(node: ::RBI::ConflictTree).void } def visit_conflict_tree(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:237 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:246 sig { override.params(node: ::RBI::Const).void } def visit_const(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:624 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:633 sig { override.params(node: ::RBI::Extend).void } def visit_extend(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:94 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:103 sig { override.params(file: ::RBI::File).void } def visit_file(file); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:789 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:798 sig { override.params(node: ::RBI::Group).void } def visit_group(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:777 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:786 sig { override.params(node: ::RBI::Helper).void } def visit_helper(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:618 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:627 sig { override.params(node: ::RBI::Include).void } def visit_include(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:686 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:695 sig { override.params(node: ::RBI::KwArg).void } def visit_kw_arg(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:600 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:609 sig { override.params(node: ::RBI::KwOptParam).void } def visit_kw_opt_param(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:594 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:603 sig { override.params(node: ::RBI::KwParam).void } def visit_kw_param(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:606 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:615 sig { override.params(node: ::RBI::KwRestParam).void } def visit_kw_rest_param(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:325 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:334 sig { override.params(node: ::RBI::Method).void } def visit_method(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:783 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:792 sig { override.params(node: ::RBI::MixesInClassMethods).void } def visit_mixes_in_class_methods(node); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:629 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:638 sig { params(node: ::RBI::Mixin).void } def visit_mixin(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:138 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:147 sig { override.params(node: ::RBI::Module).void } def visit_module(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:574 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:583 sig { override.params(node: ::RBI::OptParam).void } def visit_opt_param(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:659 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:668 sig { override.params(node: ::RBI::Private).void } def visit_private(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:653 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:662 sig { override.params(node: ::RBI::Protected).void } def visit_protected(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:647 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:656 sig { override.params(node: ::RBI::Public).void } def visit_public(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:564 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:573 sig { override.params(node: ::RBI::ReqParam).void } def visit_req_param(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:810 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:819 sig { override.params(node: ::RBI::RequiresAncestor).void } def visit_requires_ancestor(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:584 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:593 sig { override.params(node: ::RBI::RestParam).void } def visit_rest_param(node); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:161 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:170 sig { params(node: ::RBI::Scope).void } def visit_scope(node); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:224 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:233 sig { params(node: ::RBI::Scope).void } def visit_scope_body(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:826 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:835 sig { override.params(node: ::RBI::ScopeConflict).void } def visit_scope_conflict(node); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:171 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:180 sig { params(node: ::RBI::Scope).void } def visit_scope_header(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:674 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:683 sig { override.params(node: ::RBI::Send).void } def visit_send(node); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:545 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:554 sig { params(node: ::RBI::Sig).void } def visit_sig(node); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:558 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:567 sig { params(node: ::RBI::SigParam).void } def visit_sig_param(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:156 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:165 sig { override.params(node: ::RBI::SingletonClass).void } def visit_singleton_class(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:150 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:159 sig { override.params(node: ::RBI::Struct).void } def visit_struct(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:743 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:752 sig { override.params(node: ::RBI::TEnum).void } def visit_tenum(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:749 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:758 sig { override.params(node: ::RBI::TEnumBlock).void } def visit_tenum_block(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:755 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:764 sig { override.params(node: ::RBI::TEnumValue).void } def visit_tenum_value(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:130 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:139 sig { override.params(node: ::RBI::Tree).void } def visit_tree(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:692 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:701 sig { override.params(node: ::RBI::TStruct).void } def visit_tstruct(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:727 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:736 sig { override.params(node: ::RBI::TStructConst).void } def visit_tstruct_const(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:735 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:744 sig { override.params(node: ::RBI::TStructProp).void } def visit_tstruct_prop(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:771 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:780 sig { override.params(node: ::RBI::TypeMember).void } def visit_type_member(node); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:664 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:673 sig { params(node: ::RBI::Visibility).void } def visit_visibility(node); end # @override # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:796 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:805 sig { override.params(node: ::RBI::VisibilityGroup).void } def visit_visibility_group(node); end private - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:929 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:938 sig { params(node: ::RBI::Node).returns(T::Boolean) } def oneline?(node); end @@ -2570,31 +2575,31 @@ class RBI::RBSPrinter < ::RBI::Visitor # # Returns `nil` is the string is not a `T.let`. # - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:963 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:972 sig { params(code: T.nilable(::String)).returns(T.nilable(::String)) } def parse_t_let(code); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:951 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:960 sig { params(type: T.any(::RBI::Type, ::String)).returns(::RBI::Type) } def parse_type(type); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:842 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:851 sig { params(node: ::RBI::Node).void } def print_blank_line_before(node); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:861 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:870 sig { params(node: ::RBI::Node).void } def print_loc(node); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:903 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:912 sig { params(node: ::RBI::Param, last: T::Boolean).void } def print_param_comment_leading_space(node, last:); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:867 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:876 sig { params(node: ::RBI::Method, param: ::RBI::SigParam).void } def print_sig_param(node, param); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:921 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:930 sig { params(node: ::RBI::SigParam, last: T::Boolean).void } def print_sig_param_comment_leading_space(node, last:); end end @@ -4057,7 +4062,7 @@ class RBI::Type sig { abstract.returns(::RBI::Type) } def normalize; end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1266 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1275 sig { returns(::String) } def rbs_string; end @@ -5150,99 +5155,99 @@ class RBI::TypeMember < ::RBI::NodeWithComments def value; end end -# pkg:gem/rbi#lib/rbi/rbs_printer.rb:984 +# pkg:gem/rbi#lib/rbi/rbs_printer.rb:993 class RBI::TypePrinter - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:989 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:998 sig { params(max_line_length: T.nilable(::Integer)).void } def initialize(max_line_length: T.unsafe(nil)); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:986 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:995 sig { returns(::String) } def string; end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:995 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1004 sig { params(node: ::RBI::Type).void } def visit(node); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1117 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1126 sig { params(type: ::RBI::Type::All).void } def visit_all(type); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1127 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1136 sig { params(type: ::RBI::Type::Any).void } def visit_any(type); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1062 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1071 sig { params(type: ::RBI::Type::Anything).void } def visit_anything(type); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1087 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1096 sig { params(type: ::RBI::Type::AttachedClass).void } def visit_attached_class(type); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1046 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1055 sig { params(type: ::RBI::Type::Boolean).void } def visit_boolean(type); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1194 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1203 sig { params(type: ::RBI::Type::Class).void } def visit_class(type); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1105 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1114 sig { params(type: ::RBI::Type::ClassOf).void } def visit_class_of(type); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1051 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1060 sig { params(type: ::RBI::Type::Generic).void } def visit_generic(type); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1201 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1210 sig { params(type: ::RBI::Type::Module).void } def visit_module(type); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1092 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1101 sig { params(type: ::RBI::Type::Nilable).void } def visit_nilable(type); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1072 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1081 sig { params(type: ::RBI::Type::NoReturn).void } def visit_no_return(type); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1167 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1176 sig { params(type: ::RBI::Type::Proc).void } def visit_proc(type); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1082 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1091 sig { params(type: ::RBI::Type::SelfType).void } def visit_self_type(type); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1147 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1156 sig { params(type: ::RBI::Type::Shape).void } def visit_shape(type); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1041 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1050 sig { params(type: ::RBI::Type::Simple).void } def visit_simple(type); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1137 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1146 sig { params(type: ::RBI::Type::Tuple).void } def visit_tuple(type); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1189 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1198 sig { params(type: ::RBI::Type::TypeParameter).void } def visit_type_parameter(type); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1077 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1086 sig { params(type: ::RBI::Type::Untyped).void } def visit_untyped(type); end - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1067 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1076 sig { params(type: ::RBI::Type::Void).void } def visit_void(type); end private - # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1210 + # pkg:gem/rbi#lib/rbi/rbs_printer.rb:1219 sig { params(type_name: ::String).returns(::String) } def translate_t_type(type_name); end end diff --git a/spoom.gemspec b/spoom.gemspec index 7ca275f2..957beb05 100644 --- a/spoom.gemspec +++ b/spoom.gemspec @@ -33,7 +33,7 @@ Gem::Specification.new do |spec| spec.add_dependency("erubi", ">= 1.10.0") spec.add_dependency("prism", ">= 0.28.0") - spec.add_dependency("rbi", ">= 0.3.14") + spec.add_dependency("rbi", ">= 0.3.15") spec.add_dependency("rbs", ">= 4.0.0.dev.5") spec.add_dependency("rexml", ">= 3.2.6") spec.add_dependency("sorbet-static-and-runtime", ">= 0.5.10187") diff --git a/test/spoom/cli/srb/sigs_test.rb b/test/spoom/cli/srb/sigs_test.rb index 831bb886..7782844d 100644 --- a/test/spoom/cli/srb/sigs_test.rb +++ b/test/spoom/cli/srb/sigs_test.rb @@ -258,6 +258,53 @@ def foo(param1:, param2:); end RB end + def test_translate_to_rbs_preserves_multiline_signatures_by_default + @project.write!("file.rb", <<~RB) + sig do + params( + a: A, + b: B + ).void + end + def foo(a, b); end + RB + + result = @project.spoom("srb sigs translate --no-color") + + assert_empty(result.err) + assert(result.status) + + assert_equal(<<~RB, @project.read("file.rb")) + #: ( + #| A a, + #| B b + #| ) -> void + def foo(a, b); end + RB + end + + def test_translate_to_rbs_can_disable_preserving_multiline_signatures + @project.write!("file.rb", <<~RB) + sig do + params( + a: A, + b: B + ).void + end + def foo(a, b); end + RB + + result = @project.spoom("srb sigs translate --no-color --no-preserve-multiline-signatures") + + assert_empty(result.err) + assert(result.status) + + assert_equal(<<~RB, @project.read("file.rb")) + #: (A a, B b) -> void + def foo(a, b); end + RB + end + def test_translate_to_rbs_without_max_line_length @project.write!("file.rb", <<~RB) sig do @@ -269,7 +316,9 @@ def test_translate_to_rbs_without_max_line_length def foo(param1:, param2:); end RB - result = @project.spoom("srb sigs translate --no-color --max-line-length 0") + result = @project.spoom( + "srb sigs translate --no-color --max-line-length 0 --no-preserve-multiline-signatures", + ) assert_empty(result.err) assert(result.status) diff --git a/test/spoom/sorbet/translate/sorbet_sigs_to_rbs_comments_test.rb b/test/spoom/sorbet/translate/sorbet_sigs_to_rbs_comments_test.rb index 453b902d..4573d5d0 100644 --- a/test/spoom/sorbet/translate/sorbet_sigs_to_rbs_comments_test.rb +++ b/test/spoom/sorbet/translate/sorbet_sigs_to_rbs_comments_test.rb @@ -513,11 +513,72 @@ def test_translate_to_rbs_defs_within_send RBS end + def test_translate_to_rbs_keeps_multiline_sigs + contents = <<~RB + sig do + params( + a: A, + b: B + ).void + end + def foo(a, b); end + + sig { params(a: A, b: B).void } + def bar(a, b); end + + sig { params(a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J, k: K, l: L, m: M, n: N, o: O, p: P, q: Q, r: R, s: S, t: T, u: U, v: V, w: W, x: X, y: Y, z: Z).void } + def baz(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z); end + RB + + output = sorbet_sigs_to_rbs_comments(contents, max_line_length: 50) + assert_equal(<<~RBS, output) + #: ( + #| A a, + #| B b + #| ) -> void + def foo(a, b); end + + #: (A a, B b) -> void + def bar(a, b); end + + #: ( + #| A a, + #| B b, + #| C c, + #| D d, + #| E e, + #| F f, + #| G g, + #| H h, + #| I i, + #| J j, + #| K k, + #| L l, + #| M m, + #| N n, + #| O o, + #| P p, + #| Q q, + #| R r, + #| S s, + #| T t, + #| U u, + #| V v, + #| W w, + #| X x, + #| Y y, + #| Z z + #| ) -> void + def baz(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z); end + RBS + end + private #: ( #| String, #| ?positional_names: bool, + #| ?preserve_multiline_signatures: bool, #| ?max_line_length: Integer?, #| ?translate_generics: bool, #| ?translate_helpers: bool, @@ -526,6 +587,7 @@ def test_translate_to_rbs_defs_within_send def sorbet_sigs_to_rbs_comments( ruby_contents, positional_names: true, + preserve_multiline_signatures: true, max_line_length: nil, translate_generics: true, translate_helpers: true, @@ -535,6 +597,7 @@ def sorbet_sigs_to_rbs_comments( ruby_contents, file: "test.rb", positional_names: positional_names, + preserve_multiline_signatures: preserve_multiline_signatures, max_line_length: max_line_length, translate_generics: translate_generics, translate_helpers: translate_helpers,