Skip to content

Commit 7d3cb71

Browse files
authored
Merge pull request #965 from Shopify/vs_allow_skipping_abstract_method_translation
Allow skipping abstract method translation
2 parents 5a2371b + c10907d commit 7d3cb71

5 files changed

Lines changed: 104 additions & 9 deletions

File tree

lib/spoom/rbs.rb

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,12 @@ def initialize(string, location)
6868
end
6969
end
7070

71-
class Annotation < Comment; end
71+
class Annotation < Comment
72+
#: () -> bool
73+
def abstract?
74+
@string == "@abstract"
75+
end
76+
end
7277

7378
class Signature < Comment
7479
# Locations of the `#|` continuation comment lines that make up a multiline signature,

lib/spoom/sorbet/translate/rbs_comments_to_sorbet_sigs/base_translator.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ def initialize(
2525
end #: Integer?
2626

2727
@overloads_strategy = options.overloads_strategy #: Symbol
28+
@translate_abstract_methods = options.translate_abstract_methods #: bool
2829
@type_translator = RBI::RBS::TypeTranslator.new #: RBI::RBS::TypeTranslator
2930
end
3031

@@ -141,6 +142,7 @@ def visit_attr(node)
141142
def rewrite_def(def_node, comments)
142143
return if comments.empty?
143144
return if comments.signatures.empty?
145+
return if !@translate_abstract_methods && comments.method_annotations.any?(&:abstract?)
144146

145147
signatures = apply_overloads_strategy(
146148
comments.signatures,

lib/spoom/sorbet/translate/rbs_comments_to_sorbet_sigs/options.rb

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,18 @@ class Options
4747
#: BaseRBIFormat
4848
attr_reader :output_format
4949

50+
#: bool
51+
attr_reader :translate_abstract_methods
52+
5053
#: (
5154
#| ?overloads_strategy: Symbol,
5255
#| ?output_format: BaseRBIFormat,
56+
#| ?translate_abstract_methods: bool,
5357
#| ) -> void
5458
def initialize(
5559
overloads_strategy: :translate_all,
56-
output_format: HumanReadableRBIFormat.default
60+
output_format: HumanReadableRBIFormat.default,
61+
translate_abstract_methods: true
5762
)
5863
unless ALLOWED_OVERLOAD_STRATEGIES.include?(overloads_strategy)
5964
raise ArgumentError, "Unknown overloads_strategy: #{overloads_strategy.inspect}. " \
@@ -62,6 +67,7 @@ def initialize(
6267

6368
@overloads_strategy = overloads_strategy
6469
@output_format = output_format
70+
@translate_abstract_methods = translate_abstract_methods
6571

6672
freeze
6773
end

rbi/spoom.rbi

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2578,7 +2578,11 @@ end
25782578
module Spoom::PrismTypes; end
25792579
Spoom::PrismTypes::AnyScopeNode = T.type_alias { T.any(::Prism::ClassNode, ::Prism::ModuleNode, ::Prism::SingletonClassNode) }
25802580
module Spoom::RBS; end
2581-
class Spoom::RBS::Annotation < ::Spoom::RBS::Comment; end
2581+
2582+
class Spoom::RBS::Annotation < ::Spoom::RBS::Comment
2583+
sig { returns(T::Boolean) }
2584+
def abstract?; end
2585+
end
25822586

25832587
class Spoom::RBS::Comment
25842588
sig { params(string: ::String, location: ::Prism::Location).void }
@@ -3209,17 +3213,21 @@ class Spoom::Sorbet::Translate::RBSCommentsToSorbetSigs::Options
32093213
sig do
32103214
params(
32113215
overloads_strategy: ::Symbol,
3212-
output_format: ::Spoom::Sorbet::Translate::RBSCommentsToSorbetSigs::BaseRBIFormat
3216+
output_format: ::Spoom::Sorbet::Translate::RBSCommentsToSorbetSigs::BaseRBIFormat,
3217+
translate_abstract_methods: T::Boolean
32133218
).void
32143219
end
3215-
def initialize(overloads_strategy: T.unsafe(nil), output_format: T.unsafe(nil)); end
3220+
def initialize(overloads_strategy: T.unsafe(nil), output_format: T.unsafe(nil), translate_abstract_methods: T.unsafe(nil)); end
32163221

32173222
sig { returns(::Spoom::Sorbet::Translate::RBSCommentsToSorbetSigs::BaseRBIFormat) }
32183223
def output_format; end
32193224

32203225
sig { returns(::Symbol) }
32213226
def overloads_strategy; end
32223227

3228+
sig { returns(T::Boolean) }
3229+
def translate_abstract_methods; end
3230+
32233231
class << self
32243232
sig { returns(::Spoom::Sorbet::Translate::RBSCommentsToSorbetSigs::Options) }
32253233
def default; end

test/spoom/sorbet/translate/rbs_comments_to_sorbet_sigs_test.rb

Lines changed: 78 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,66 @@ def bar; end
147147
)
148148
end
149149

150+
def test_translate_to_rbi_skipping_abstract_methods
151+
assert_rewrites_rbs(
152+
from: <<~RUBY,
153+
# @abstract
154+
class Foo
155+
# @abstract
156+
#: -> String
157+
def bar; end
158+
end
159+
160+
# @abstract
161+
module Baz
162+
# @abstract
163+
#: -> String
164+
def qux; end
165+
end
166+
RUBY
167+
168+
to_pretty_format_for_humans: <<~RUBY,
169+
class Foo
170+
extend T::Helpers
171+
172+
abstract!
173+
174+
# @abstract
175+
#: -> String
176+
def bar; end
177+
end
178+
179+
module Baz
180+
extend T::Helpers
181+
182+
abstract!
183+
184+
# @abstract
185+
#: -> String
186+
def qux; end
187+
end
188+
RUBY
189+
190+
to_line_matched_format_for_machines: <<~RUBY,
191+
# RBS_REWRITTEN_ANNOTATION: @abstract
192+
class Foo; extend T::Helpers; abstract!
193+
# @abstract
194+
#: -> String
195+
def bar; end
196+
end
197+
198+
# RBS_REWRITTEN_ANNOTATION: @abstract
199+
module Baz; extend T::Helpers; abstract!
200+
# @abstract
201+
#: -> String
202+
def qux; end
203+
end
204+
RUBY
205+
206+
translate_abstract_methods: false,
207+
)
208+
end
209+
150210
def test_translate_to_rbi_method_sigs_without_runtime
151211
assert_rewrites_rbs(
152212
from: <<~RUBY,
@@ -1280,13 +1340,23 @@ def foo; end
12801340

12811341
private
12821342

1283-
#: (String, ?max_line_length: Integer?, ?overloads_strategy: Symbol) -> String
1284-
def rbs_comments_to_sorbet_sigs(ruby_contents, max_line_length: nil, overloads_strategy: :translate_all)
1343+
#: (String,
1344+
#| ?max_line_length: Integer?,
1345+
#| ?overloads_strategy: Symbol,
1346+
#| ?translate_abstract_methods: bool
1347+
#| ) -> String
1348+
def rbs_comments_to_sorbet_sigs(
1349+
ruby_contents,
1350+
max_line_length: nil,
1351+
overloads_strategy: :translate_all,
1352+
translate_abstract_methods: true
1353+
)
12851354
RBSCommentsToSorbetSigs::HumanReadableTranslator.new(
12861355
ruby_contents,
12871356
file: "test.rb",
12881357
options: RBSCommentsToSorbetSigs::Options.new(
12891358
overloads_strategy:,
1359+
translate_abstract_methods:,
12901360
output_format: RBSCommentsToSorbetSigs::HumanReadableRBIFormat.new(
12911361
max_line_length:,
12921362
),
@@ -1299,14 +1369,16 @@ def rbs_comments_to_sorbet_sigs(ruby_contents, max_line_length: nil, overloads_s
12991369
#| to_pretty_format_for_humans: String,
13001370
#| to_line_matched_format_for_machines: String | Symbol,
13011371
#| ?max_line_length: Integer?,
1302-
#| ?overloads_strategy: Symbol
1372+
#| ?overloads_strategy: Symbol,
1373+
#| ?translate_abstract_methods: bool
13031374
#| ) -> void
13041375
def assert_rewrites_rbs(
13051376
from:,
13061377
to_pretty_format_for_humans:,
13071378
to_line_matched_format_for_machines:,
13081379
max_line_length: nil,
1309-
overloads_strategy: :translate_all
1380+
overloads_strategy: :translate_all,
1381+
translate_abstract_methods: true
13101382
)
13111383
source_with_rbs = from
13121384
expected_pretty_format = to_pretty_format_for_humans
@@ -1317,6 +1389,7 @@ def assert_rewrites_rbs(
13171389
source_with_rbs,
13181390
max_line_length:,
13191391
overloads_strategy:,
1392+
translate_abstract_methods:,
13201393
)
13211394

13221395
assert_equal(expected_pretty_format, rewritten_output)
@@ -1347,6 +1420,7 @@ def assert_rewrites_rbs(
13471420
file: "test.rb",
13481421
options: RBSCommentsToSorbetSigs::Options.new(
13491422
overloads_strategy:,
1423+
translate_abstract_methods:,
13501424
output_format: RBSCommentsToSorbetSigs::LineMatchedRBIFormat.default,
13511425
),
13521426
).rewrite

0 commit comments

Comments
 (0)