Skip to content

Commit b283a72

Browse files
committed
Fix up regression in ruby parser translation
1 parent ab774bd commit b283a72

File tree

3 files changed

+63
-11
lines changed

3 files changed

+63
-11
lines changed

lib/prism/translation/ruby_parser.rb

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -881,6 +881,7 @@ def visit_interpolated_x_string_node(node)
881881
# Visit the interpolated content of the string-like node.
882882
private def visit_interpolated_parts(parts)
883883
visited = []
884+
884885
parts.each do |part|
885886
result = visit(part)
886887

@@ -892,6 +893,7 @@ def visit_interpolated_x_string_node(node)
892893
else
893894
visited << result
894895
end
896+
visited << :space
895897
elsif result[0] == :dstr
896898
if !visited.empty? && part.parts[0].is_a?(StringNode)
897899
# If we are in the middle of an implicitly concatenated string,
@@ -907,8 +909,9 @@ def visit_interpolated_x_string_node(node)
907909
end
908910

909911
state = :beginning #: :beginning | :string_content | :interpolated_content
912+
results = []
910913

911-
visited.each_with_object([]) do |result, results|
914+
visited.each_with_index do |result, index|
912915
case state
913916
when :beginning
914917
if result.is_a?(String)
@@ -923,7 +926,9 @@ def visit_interpolated_x_string_node(node)
923926
state = :interpolated_content
924927
end
925928
when :string_content
926-
if result.is_a?(String)
929+
if result == :space
930+
# continue
931+
elsif result.is_a?(String)
927932
results[0] << result
928933
elsif result.is_a?(Array) && result[0] == :str
929934
results[0] << result[1]
@@ -932,14 +937,18 @@ def visit_interpolated_x_string_node(node)
932937
state = :interpolated_content
933938
end
934939
when :interpolated_content
935-
if result.is_a?(Array) && result[0] == :str && results[-1][0] == :str && (results[-1].line_max == result.line)
940+
if result == :space
941+
# continue
942+
elsif visited[index - 1] != :space && result.is_a?(Array) && result[0] == :str && results[-1][0] == :str && (results[-1].line_max == result.line)
936943
results[-1][1] << result[1]
937944
results[-1].line_max = result.line_max
938945
else
939946
results << result
940947
end
941948
end
942949
end
950+
951+
results
943952
end
944953

945954
# -> { it }

test/prism/fixtures/strings.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,3 +103,5 @@
103103
%^#$^#
104104

105105
%@#@#
106+
107+
"#{"#{B} C"} D"

test/prism/snapshots/strings.txt

Lines changed: 49 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)