Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 13 additions & 2 deletions lib/spoom/sorbet/translate/sorbet_assertions_to_rbs_comments.rb
Original file line number Diff line number Diff line change
Expand Up @@ -67,12 +67,17 @@ def maybe_translate_assertion(node)

start_offset = node.location.start_offset
end_offset = node.location.end_offset
@rewriter << Source::Replace.new(start_offset, end_offset - 1, "#{dedent_value(node, value)} #{rbs_annotation}")

@rewriter << if node.name == :bind
Source::Replace.new(start_offset, end_offset - 1, rbs_annotation)
else
Source::Replace.new(start_offset, end_offset - 1, "#{dedent_value(node, value)} #{rbs_annotation}")
end

true
end

#: (Prism::CallNode) -> void
#: (Prism::CallNode) -> String
def build_rbs_annotation(call)
case call.name
when :let
Expand All @@ -83,6 +88,10 @@ def build_rbs_annotation(call)
srb_type = call.arguments&.arguments&.last #: as !nil
rbs_type = RBI::Type.parse_node(srb_type).rbs_string
"#: as #{rbs_type}"
when :bind
srb_type = call.arguments&.arguments&.last #: as !nil
rbs_type = RBI::Type.parse_node(srb_type).rbs_string
"#: self as #{rbs_type}"
when :must
"#: as !nil"
when :unsafe
Expand Down Expand Up @@ -113,6 +122,8 @@ def t_annotation?(node)
case node.name
when :let, :cast
return node.arguments&.arguments&.size == 2
when :bind
return node.arguments&.arguments&.size == 2 && node.arguments&.arguments&.first.is_a?(Prism::SelfNode)
when :must, :unsafe
return node.arguments&.arguments&.size == 1
end
Expand Down
2 changes: 1 addition & 1 deletion rbi/spoom.rbi
Original file line number Diff line number Diff line change
Expand Up @@ -2945,7 +2945,7 @@ class Spoom::Sorbet::Translate::SorbetAssertionsToRBSComments < ::Spoom::Sorbet:
sig { params(node: ::Prism::Node).returns(T::Boolean) }
def at_end_of_line?(node); end

sig { params(call: ::Prism::CallNode).void }
sig { params(call: ::Prism::CallNode).returns(::String) }
def build_rbs_annotation(call); end

sig { params(assign: ::Prism::Node, value: ::Prism::Node).returns(::String) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -498,6 +498,24 @@ def test_doesnt_translate_in_ternary_expressions
assert_equal(rb, rbi_to_rbs(rb))
end

def test_translate_bind
rb = <<~RB
T.bind(self, T.class_of(String))

T.bind(foo, String)

before_enqueue { T.bind(self, String) }
RB

assert_equal(<<~RB, rbi_to_rbs(rb))
#: self as singleton(String)

T.bind(foo, String)

before_enqueue { T.bind(self, String) }
RB
end

private

#: (String) -> String
Expand Down