summaryrefslogtreecommitdiff
path: root/lib/prism
diff options
context:
space:
mode:
authorKevin Newton <kddnewton@gmail.com>2024-03-05 07:09:21 -0500
committergit <svn-admin@ruby-lang.org>2024-03-06 16:42:39 +0000
commit751b4d34bc4b3e652eeef247ea76bf3c7f309896 (patch)
tree05f31edb915ed5020b487ed26df5a110576e5011 /lib/prism
parent32c22a71e8e5ee14361690489fc6ab5d1cd11cba (diff)
[ruby/prism] Implement remaining interpolated nodes in ripper translation
https://github.com/ruby/prism/commit/129ed94cb5
Diffstat (limited to 'lib/prism')
-rw-r--r--lib/prism/translation/ripper.rb64
1 files changed, 42 insertions, 22 deletions
diff --git a/lib/prism/translation/ripper.rb b/lib/prism/translation/ripper.rb
index f0b169c9b3..98dde07714 100644
--- a/lib/prism/translation/ripper.rb
+++ b/lib/prism/translation/ripper.rb
@@ -796,13 +796,19 @@ module Prism
# "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.
@@ -1123,22 +1129,37 @@ module Prism
# /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)
@@ -1147,24 +1168,23 @@ module Prism
# `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