From 751b4d34bc4b3e652eeef247ea76bf3c7f309896 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Tue, 5 Mar 2024 07:09:21 -0500 Subject: [ruby/prism] Implement remaining interpolated nodes in ripper translation https://github.com/ruby/prism/commit/129ed94cb5 --- lib/prism/translation/ripper.rb | 64 +++++++++++++++++++++++++++-------------- 1 file changed, 42 insertions(+), 22 deletions(-) (limited to 'lib') 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 -- cgit v1.2.3