Skip to content

Commit

Permalink
[ruby/prism] Implement remaining interpolated nodes in ripper transla…
Browse files Browse the repository at this point in the history
  • Loading branch information
kddnewton authored and matzbot committed Mar 6, 2024
1 parent 32c22a7 commit 751b4d3
Showing 1 changed file with 42 additions and 22 deletions.
64 changes: 42 additions & 22 deletions lib/prism/translation/ripper.rb
Expand Up @@ -796,13 +796,19 @@ def visit_else_node(node)
# "foo #{bar}"
# ^^^^^^
def visit_embedded_statements_node(node)
visit(node.statements)
statements = visit(node.statements)

bounds(node.location)
on_string_embexpr(statements)
end

# "foo #@bar"
# ^^^^^
def visit_embedded_variable_node(node)
raise NoMethodError, __method__
variable = visit(node.variable)

bounds(node.location)
on_string_dvar(variable)
end

# Visit an EnsureNode node.
Expand Down Expand Up @@ -1123,22 +1129,37 @@ def visit_interpolated_match_last_line_node(node)
# /foo #{bar}/
# ^^^^^^^^^^^^
def visit_interpolated_regular_expression_node(node)
raise NoMethodError, __method__
bounds(node.parts.first.location)
parts =
node.parts.inject(on_regexp_new) do |content, part|
on_regexp_add(content, visit_string_content(part))
end

bounds(node.location)
on_regexp_literal(parts)
end

# "foo #{bar}"
# ^^^^^^^^^^^^
def visit_interpolated_string_node(node)
contents = visit_string_contents(node.parts)
bounds(node.parts.first.location)
parts =
node.parts.inject(on_string_content) do |content, part|
on_string_add(content, visit_string_content(part))
end

bounds(node.location)
on_string_literal(contents)
on_string_literal(parts)
end

# :"foo #{bar}"
# ^^^^^^^^^^^^^
def visit_interpolated_symbol_node(node)
contents = visit_string_contents(node.parts)
bounds(node.parts.first.location)
parts =
node.parts.inject(on_string_content) do |content, part|
on_string_add(content, visit_string_content(part))
end

bounds(node.location)
on_dyna_symbol(contents)
Expand All @@ -1147,24 +1168,23 @@ def visit_interpolated_symbol_node(node)
# `foo #{bar}`
# ^^^^^^^^^^^^
def visit_interpolated_x_string_node(node)
raise NoMethodError, __method__
bounds(node.parts.first.location)
parts =
node.parts.inject(on_xstring_new) do |content, part|
on_xstring_add(content, visit_string_content(part))
end

bounds(node.location)
on_xstring_literal(parts)
end

# Visit the contents of a string-like node.
private def visit_string_contents(parts)
parts.inject(on_string_content) do |content, part|
on_string_add(
content,
case part
when StringNode
bounds(part.content_loc)
on_tstring_content(part.content)
when EmbeddedStatementsNode
on_string_embexpr(visit(part))
else
raise
end
)
# Visit an individual part of a string-like node.
private def visit_string_content(part)
if part.is_a?(StringNode)
bounds(part.content_loc)
on_tstring_content(part.content)
else
visit(part)
end
end

Expand Down

0 comments on commit 751b4d3

Please sign in to comment.