Skip to content

Commit 32a0046

Browse files
authored
Merge pull request #972 from Shopify/at-rbs-translate-preserve-rbs-sig
Preserve multiline sigs when translating to RBS
2 parents 9c632ec + 85e6697 commit 32a0046

9 files changed

Lines changed: 267 additions & 117 deletions

File tree

Gemfile.lock

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ PATH
44
spoom (1.8.3)
55
erubi (>= 1.10.0)
66
prism (>= 0.28.0)
7-
rbi (>= 0.3.14)
7+
rbi (>= 0.3.15)
88
rbs (>= 4.0.0.dev.5)
99
rexml (>= 3.2.6)
1010
sorbet-static-and-runtime (>= 0.5.10187)
@@ -57,7 +57,7 @@ GEM
5757
racc (1.8.1)
5858
rainbow (3.1.1)
5959
rake (13.4.2)
60-
rbi (0.3.14)
60+
rbi (0.3.15)
6161
prism (~> 1.0)
6262
rbs (>= 4.0.1)
6363
rbs (4.0.3)

lib/spoom/cli/srb/sigs.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ class Sigs < Thor
1717
aliases: :p,
1818
desc: "Use positional names when translating from RBI to RBS",
1919
default: true
20+
option :preserve_multiline_signatures,
21+
type: :boolean,
22+
desc: "Preserve multiline sig formatting when translating from RBI to RBS",
23+
default: true
2024
option :include_rbi_files, type: :boolean, desc: "Include RBI files", default: false
2125
option :max_line_length, type: :numeric, desc: "Max line length (pass 0 to disable)", default: 120
2226
option :translate_generics, type: :boolean, desc: "Translate generics", default: false
@@ -53,6 +57,7 @@ def translate(*paths)
5357
contents,
5458
file: file,
5559
positional_names: options[:positional_names],
60+
preserve_multiline_signatures: options[:preserve_multiline_signatures],
5661
max_line_length: max_line_length,
5762
translate_generics: options[:translate_generics],
5863
translate_helpers: options[:translate_helpers],

lib/spoom/sorbet/translate.rb

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,17 @@ def strip_sorbet_sigs(ruby_contents, file:)
3030
#| String,
3131
#| file: String,
3232
#| ?positional_names: bool,
33+
#| ?preserve_multiline_signatures: bool,
3334
#| ?max_line_length: Integer?,
3435
#| ?translate_generics: bool,
3536
#| ?translate_helpers: bool,
3637
#| ?translate_abstract_methods: bool
3738
#| ) -> String
3839
def sorbet_sigs_to_rbs_comments(
39-
ruby_contents, file:, positional_names: true, max_line_length: nil,
40+
ruby_contents, file:,
41+
positional_names: true,
42+
preserve_multiline_signatures: true,
43+
max_line_length: nil,
4044
translate_generics: true,
4145
translate_helpers: true,
4246
translate_abstract_methods: true
@@ -45,6 +49,7 @@ def sorbet_sigs_to_rbs_comments(
4549
ruby_contents,
4650
file: file,
4751
positional_names: positional_names,
52+
preserve_multiline_signatures: preserve_multiline_signatures,
4853
max_line_length: max_line_length,
4954
translate_generics: translate_generics,
5055
translate_helpers: translate_helpers,

lib/spoom/sorbet/translate/sorbet_sigs_to_rbs_comments.rb

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ class SorbetSigsToRBSComments < Translator
1111
#| String,
1212
#| file: String,
1313
#| positional_names: bool,
14+
#| ?preserve_multiline_signatures: bool,
1415
#| ?max_line_length: Integer?,
1516
#| ?translate_generics: bool,
1617
#| ?translate_helpers: bool,
@@ -20,6 +21,7 @@ def initialize(
2021
ruby_contents,
2122
file:,
2223
positional_names:,
24+
preserve_multiline_signatures: true,
2325
max_line_length: nil,
2426
translate_generics: true,
2527
translate_helpers: true,
@@ -34,6 +36,8 @@ def initialize(
3436
@extend_t_helpers = [] #: Array[Prism::CallNode]
3537
@extend_t_generics = [] #: Array[Prism::CallNode]
3638
@seen_mixes_in_class_methods = false #: bool
39+
40+
@preserve_multiline_signatures = preserve_multiline_signatures
3741
@max_line_length = max_line_length #: Integer?
3842

3943
@translate_generics = translate_generics #: bool
@@ -75,7 +79,12 @@ def visit_def_node(node)
7579
last_sigs.each do |node, sig|
7680
next if sig.is_abstract && !@translate_abstract_methods
7781

78-
out = rbs_print(node.location.start_column) do |printer|
82+
preserve_multiline_signatures = !!(@preserve_multiline_signatures && sig.loc&.multiline?)
83+
84+
out = rbs_print(
85+
node.location.start_column,
86+
preserve_multiline_signatures: preserve_multiline_signatures,
87+
) do |printer|
7988
printer.print_method_sig(rbi_node, sig)
8089
end
8190
@rewriter << Source::Replace.new(node.location.start_offset, node.location.end_offset, out)
@@ -204,7 +213,7 @@ def visit_attr(node)
204213
rbi_node = builder.tree.nodes.first #: as RBI::Attr
205214

206215
last_sigs.each do |node, sig|
207-
out = rbs_print(node.location.start_column) do |printer|
216+
out = rbs_print(node.location.start_column, preserve_multiline_signatures: false) do |printer|
208217
printer.print_attr_sig(rbi_node, sig)
209218
end
210219
@rewriter << Source::Replace.new(node.location.start_offset, node.location.end_offset, out)
@@ -387,10 +396,16 @@ def collect_last_sigs
387396
last_sigs
388397
end
389398

390-
#: (Integer) { (RBI::RBSPrinter) -> void } -> String
391-
def rbs_print(indent, &block)
399+
#: (Integer, preserve_multiline_signatures: bool) { (RBI::RBSPrinter) -> void } -> String
400+
def rbs_print(indent, preserve_multiline_signatures:, &block)
392401
out = StringIO.new
393-
p = RBI::RBSPrinter.new(out: out, positional_names: @positional_names, max_line_length: @max_line_length)
402+
403+
p = RBI::RBSPrinter.new(
404+
out: out,
405+
positional_names: @positional_names,
406+
max_line_length: @max_line_length,
407+
force_multiline_signatures: preserve_multiline_signatures,
408+
)
394409
block.call(p)
395410
string = out.string
396411

rbi/spoom.rbi

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2949,13 +2949,14 @@ module Spoom::Sorbet::Translate
29492949
ruby_contents: ::String,
29502950
file: ::String,
29512951
positional_names: T::Boolean,
2952+
preserve_multiline_signatures: T::Boolean,
29522953
max_line_length: T.nilable(::Integer),
29532954
translate_generics: T::Boolean,
29542955
translate_helpers: T::Boolean,
29552956
translate_abstract_methods: T::Boolean
29562957
).returns(::String)
29572958
end
2958-
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
2959+
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
29592960

29602961
sig { params(ruby_contents: ::String, file: ::String).returns(::String) }
29612962
def strip_sorbet_sigs(ruby_contents, file:); end
@@ -3324,13 +3325,14 @@ class Spoom::Sorbet::Translate::SorbetSigsToRBSComments < ::Spoom::Sorbet::Trans
33243325
ruby_contents: ::String,
33253326
file: ::String,
33263327
positional_names: T::Boolean,
3328+
preserve_multiline_signatures: T::Boolean,
33273329
max_line_length: T.nilable(::Integer),
33283330
translate_generics: T::Boolean,
33293331
translate_helpers: T::Boolean,
33303332
translate_abstract_methods: T::Boolean
33313333
).void
33323334
end
3333-
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
3335+
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
33343336

33353337
sig { override.params(node: ::Prism::CallNode).void }
33363338
def visit_call_node(node); end
@@ -3375,8 +3377,14 @@ class Spoom::Sorbet::Translate::SorbetSigsToRBSComments < ::Spoom::Sorbet::Trans
33753377
sig { void }
33763378
def delete_extend_t_helpers; end
33773379

3378-
sig { params(indent: ::Integer, block: T.proc.params(arg0: ::RBI::RBSPrinter).void).returns(::String) }
3379-
def rbs_print(indent, &block); end
3380+
sig do
3381+
params(
3382+
indent: ::Integer,
3383+
preserve_multiline_signatures: T::Boolean,
3384+
block: T.proc.params(arg0: ::RBI::RBSPrinter).void
3385+
).returns(::String)
3386+
end
3387+
def rbs_print(indent, preserve_multiline_signatures:, &block); end
33803388

33813389
sig { params(node: ::Prism::CallNode).void }
33823390
def visit_attr(node); end

0 commit comments

Comments
 (0)