Skip to content

Commit 0c1edb8

Browse files
authored
Merge pull request #755 from Shopify/at-fix-abstract
Clear last_sigs when returning early on abstract
2 parents 0bfaf25 + a04c7d4 commit 0c1edb8

3 files changed

Lines changed: 27 additions & 12 deletions

File tree

lib/spoom/sorbet/translate/sorbet_sigs_to_rbs_comments.rb

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -41,26 +41,25 @@ def visit_singleton_class_node(node)
4141
# @override
4242
#: (Prism::DefNode) -> void
4343
def visit_def_node(node)
44-
return if @last_sigs.empty?
45-
return if @last_sigs.any? { |_, sig| sig.is_abstract }
44+
last_sigs = collect_last_sigs
45+
return if last_sigs.empty?
46+
return if last_sigs.any? { |_, sig| sig.is_abstract }
4647

47-
apply_member_annotations(@last_sigs)
48+
apply_member_annotations(last_sigs)
4849

4950
# Build the RBI::Method node so we can print the method signature as RBS.
5051
builder = RBI::Parser::TreeBuilder.new(@ruby_contents, comments: [], file: @file)
5152
builder.visit(node)
5253
rbi_node = builder.tree.nodes.first #: as RBI::Method
5354

54-
@last_sigs.each do |node, sig|
55+
last_sigs.each do |node, sig|
5556
out = StringIO.new
5657
p = RBI::RBSPrinter.new(out: out, indent: node.location.start_column, positional_names: @positional_names)
5758
p.print("#: ")
5859
p.send(:print_method_sig, rbi_node, sig)
5960
p.print("\n")
6061
@rewriter << Source::Replace.new(node.location.start_offset, node.location.end_offset, out.string)
6162
end
62-
63-
@last_sigs.clear
6463
end
6564

6665
# @override
@@ -155,25 +154,24 @@ def visit_attr(node)
155154
raise Error, "Expected attr_reader, attr_writer, or attr_accessor"
156155
end
157156

158-
return if @last_sigs.empty?
159-
return if @last_sigs.any? { |_, sig| sig.is_abstract }
157+
last_sigs = collect_last_sigs
158+
return if last_sigs.empty?
159+
return if last_sigs.any? { |_, sig| sig.is_abstract }
160160

161-
apply_member_annotations(@last_sigs)
161+
apply_member_annotations(last_sigs)
162162

163163
builder = RBI::Parser::TreeBuilder.new(@ruby_contents, comments: [], file: @file)
164164
builder.visit(node)
165165
rbi_node = builder.tree.nodes.first #: as RBI::Attr
166166

167-
@last_sigs.each do |node, sig|
167+
last_sigs.each do |node, sig|
168168
out = StringIO.new
169169
p = RBI::RBSPrinter.new(out: out, indent: node.location.start_column, positional_names: @positional_names)
170170
p.print("#: ")
171171
p.print_attr_sig(rbi_node, sig)
172172
p.print("\n")
173173
@rewriter << Source::Replace.new(node.location.start_offset, node.location.end_offset, out.string)
174174
end
175-
176-
@last_sigs.clear
177175
end
178176

179177
#: (Prism::CallNode node) -> void
@@ -336,6 +334,14 @@ def delete_extend_t_generics
336334

337335
@extend_t_generics.clear
338336
end
337+
338+
# Collects the last signatures visited and clears the current list
339+
#: -> Array[[Prism::CallNode, RBI::Sig]]
340+
def collect_last_sigs
341+
last_sigs = @last_sigs
342+
@last_sigs = []
343+
last_sigs
344+
end
339345
end
340346
end
341347
end

rbi/spoom.rbi

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2995,6 +2995,9 @@ class Spoom::Sorbet::Translate::SorbetSigsToRBSComments < ::Spoom::Sorbet::Trans
29952995
sig { params(node: ::Prism::ConstantWriteNode).returns(::String) }
29962996
def build_type_member_string(node); end
29972997

2998+
sig { returns(T::Array[[::Prism::CallNode, ::RBI::Sig]]) }
2999+
def collect_last_sigs; end
3000+
29983001
sig { void }
29993002
def delete_extend_t_generics; end
30003003

test/spoom/sorbet/translate/sorbet_sigs_to_rbs_comments_test.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,11 +76,17 @@ def test_does_not_translate_to_rbs_abstract_methods
7676
contents = <<~RB
7777
sig { abstract.void }
7878
def foo; end
79+
80+
sig { void }
81+
def bar; end
7982
RB
8083

8184
assert_equal(<<~RBS, sorbet_sigs_to_rbs_comments(contents))
8285
sig { abstract.void }
8386
def foo; end
87+
88+
#: -> void
89+
def bar; end
8490
RBS
8591
end
8692

0 commit comments

Comments
 (0)