Skip to content

Commit 129ed94

Browse files
committed
Implement remaining interpolated nodes in ripper translation
1 parent b2dc35d commit 129ed94

File tree

1 file changed

+42
-22
lines changed

1 file changed

+42
-22
lines changed

lib/prism/translation/ripper.rb

Lines changed: 42 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -796,13 +796,19 @@ def visit_else_node(node)
796796
# "foo #{bar}"
797797
# ^^^^^^
798798
def visit_embedded_statements_node(node)
799-
visit(node.statements)
799+
statements = visit(node.statements)
800+
801+
bounds(node.location)
802+
on_string_embexpr(statements)
800803
end
801804

802805
# "foo #@bar"
803806
# ^^^^^
804807
def visit_embedded_variable_node(node)
805-
raise NoMethodError, __method__
808+
variable = visit(node.variable)
809+
810+
bounds(node.location)
811+
on_string_dvar(variable)
806812
end
807813

808814
# Visit an EnsureNode node.
@@ -1123,22 +1129,37 @@ def visit_interpolated_match_last_line_node(node)
11231129
# /foo #{bar}/
11241130
# ^^^^^^^^^^^^
11251131
def visit_interpolated_regular_expression_node(node)
1126-
raise NoMethodError, __method__
1132+
bounds(node.parts.first.location)
1133+
parts =
1134+
node.parts.inject(on_regexp_new) do |content, part|
1135+
on_regexp_add(content, visit_string_content(part))
1136+
end
1137+
1138+
bounds(node.location)
1139+
on_regexp_literal(parts)
11271140
end
11281141

11291142
# "foo #{bar}"
11301143
# ^^^^^^^^^^^^
11311144
def visit_interpolated_string_node(node)
1132-
contents = visit_string_contents(node.parts)
1145+
bounds(node.parts.first.location)
1146+
parts =
1147+
node.parts.inject(on_string_content) do |content, part|
1148+
on_string_add(content, visit_string_content(part))
1149+
end
11331150

11341151
bounds(node.location)
1135-
on_string_literal(contents)
1152+
on_string_literal(parts)
11361153
end
11371154

11381155
# :"foo #{bar}"
11391156
# ^^^^^^^^^^^^^
11401157
def visit_interpolated_symbol_node(node)
1141-
contents = visit_string_contents(node.parts)
1158+
bounds(node.parts.first.location)
1159+
parts =
1160+
node.parts.inject(on_string_content) do |content, part|
1161+
on_string_add(content, visit_string_content(part))
1162+
end
11421163

11431164
bounds(node.location)
11441165
on_dyna_symbol(contents)
@@ -1147,24 +1168,23 @@ def visit_interpolated_symbol_node(node)
11471168
# `foo #{bar}`
11481169
# ^^^^^^^^^^^^
11491170
def visit_interpolated_x_string_node(node)
1150-
raise NoMethodError, __method__
1171+
bounds(node.parts.first.location)
1172+
parts =
1173+
node.parts.inject(on_xstring_new) do |content, part|
1174+
on_xstring_add(content, visit_string_content(part))
1175+
end
1176+
1177+
bounds(node.location)
1178+
on_xstring_literal(parts)
11511179
end
11521180

1153-
# Visit the contents of a string-like node.
1154-
private def visit_string_contents(parts)
1155-
parts.inject(on_string_content) do |content, part|
1156-
on_string_add(
1157-
content,
1158-
case part
1159-
when StringNode
1160-
bounds(part.content_loc)
1161-
on_tstring_content(part.content)
1162-
when EmbeddedStatementsNode
1163-
on_string_embexpr(visit(part))
1164-
else
1165-
raise
1166-
end
1167-
)
1181+
# Visit an individual part of a string-like node.
1182+
private def visit_string_content(part)
1183+
if part.is_a?(StringNode)
1184+
bounds(part.content_loc)
1185+
on_tstring_content(part.content)
1186+
else
1187+
visit(part)
11681188
end
11691189
end
11701190

0 commit comments

Comments
 (0)