summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Newton <kddnewton@gmail.com>2024-03-05 21:06:52 -0500
committergit <svn-admin@ruby-lang.org>2024-03-06 16:42:49 +0000
commit7ee404a24a2a74a1e78666c31cffc2f18607e51f (patch)
tree5636749ec495ed634b7195d98c7b996f94d6ae92
parent7273c4dd60aa8e61e29053042d085cabc3246e23 (diff)
[ruby/prism] Implement special array literals for ripper translation
https://github.com/ruby/prism/commit/a5c3d634ef
-rw-r--r--lib/prism/translation/ripper.rb61
-rw-r--r--test/prism/ripper_test.rb26
2 files changed, 60 insertions, 27 deletions
diff --git a/lib/prism/translation/ripper.rb b/lib/prism/translation/ripper.rb
index 1d16ca1ca8..bda6478bf2 100644
--- a/lib/prism/translation/ripper.rb
+++ b/lib/prism/translation/ripper.rb
@@ -239,7 +239,66 @@ module Prism
# []
# ^^
def visit_array_node(node)
- elements = visit_arguments(node.elements) unless node.elements.empty?
+ bounds(node.location)
+ elements =
+ case node.opening
+ when /^%w/
+ node.elements.inject(on_qwords_new) do |qwords, element|
+ bounds(element.location)
+ on_qwords_add(qwords, on_tstring_content(element.content))
+ end
+ when /^%i/
+ node.elements.inject(on_qsymbols_new) do |qsymbols, element|
+ bounds(element.location)
+ on_qsymbols_add(qsymbols, on_tstring_content(element.value))
+ end
+ when /^%W/
+ node.elements.inject(on_words_new) do |words, element|
+ bounds(element.location)
+ word =
+ if element.is_a?(StringNode)
+ on_word_add(on_word_new, on_tstring_content(element.content))
+ else
+ element.parts.inject(on_word_new) do |word, part|
+ word_part =
+ if part.is_a?(StringNode)
+ bounds(part.location)
+ on_tstring_content(part.content)
+ else
+ visit(part)
+ end
+
+ on_word_add(word, word_part)
+ end
+ end
+
+ on_words_add(words, word)
+ end
+ when /^%I/
+ node.elements.inject(on_symbols_new) do |symbols, element|
+ bounds(element.location)
+ symbol =
+ if element.is_a?(SymbolNode)
+ on_word_add(on_word_new, on_tstring_content(element.value))
+ else
+ element.parts.inject(on_word_new) do |word, part|
+ word_part =
+ if part.is_a?(StringNode)
+ bounds(part.location)
+ on_tstring_content(part.content)
+ else
+ visit(part)
+ end
+
+ on_word_add(word, word_part)
+ end
+ end
+
+ on_symbols_add(symbols, symbol)
+ end
+ else
+ visit_arguments(node.elements) unless node.elements.empty?
+ end
bounds(node.location)
on_array(elements)
diff --git a/test/prism/ripper_test.rb b/test/prism/ripper_test.rb
index 00a3056b94..86c7b3b027 100644
--- a/test/prism/ripper_test.rb
+++ b/test/prism/ripper_test.rb
@@ -43,7 +43,6 @@ module Prism
rescue.txt
return.txt
seattlerb/TestRubyParserShared.txt
- seattlerb/array_lits_trailing_calls.txt
seattlerb/begin_rescue_else_ensure_bodies.txt
seattlerb/begin_rescue_else_ensure_no_bodies.txt
seattlerb/block_break.txt
@@ -115,8 +114,6 @@ module Prism
seattlerb/heredoc_with_only_carriage_returns.txt
seattlerb/heredoc_with_only_carriage_returns_windows.txt
seattlerb/if_elsif.txt
- seattlerb/interpolated_symbol_array_line_breaks.txt
- seattlerb/interpolated_word_array_line_breaks.txt
seattlerb/lambda_do_vs_brace.txt
seattlerb/lasgn_middle_splat.txt
seattlerb/magic_encoding_comment.txt
@@ -141,8 +138,6 @@ module Prism
seattlerb/mlhs_mid_anonsplat.txt
seattlerb/mlhs_mid_splat.txt
seattlerb/module_comments.txt
- seattlerb/non_interpolated_symbol_array_line_breaks.txt
- seattlerb/non_interpolated_word_array_line_breaks.txt
seattlerb/parse_if_not_canonical.txt
seattlerb/parse_if_not_noncanonical.txt
seattlerb/parse_line_defn_complex.txt
@@ -158,18 +153,10 @@ module Prism
seattlerb/parse_pattern_051.txt
seattlerb/parse_pattern_058.txt
seattlerb/parse_pattern_076.txt
- seattlerb/pctW_lineno.txt
seattlerb/pct_nl.txt
- seattlerb/pct_w_heredoc_interp_nested.txt
- seattlerb/qWords_space.txt
- seattlerb/qsymbols.txt
- seattlerb/qsymbols_empty.txt
- seattlerb/qsymbols_empty_space.txt
- seattlerb/qsymbols_interp.txt
seattlerb/quoted_symbol_hash_arg.txt
seattlerb/quoted_symbol_keys.txt
seattlerb/qw_escape_term.txt
- seattlerb/qwords_empty.txt
seattlerb/read_escape_unicode_curlies.txt
seattlerb/read_escape_unicode_h4.txt
seattlerb/regexp_esc_C_slash.txt
@@ -189,13 +176,7 @@ module Prism
seattlerb/str_lit_concat_bad_encodings.txt
seattlerb/str_newline_hash_line_number.txt
seattlerb/str_single_double_escaped_newline.txt
- seattlerb/symbol_list.txt
- seattlerb/symbols.txt
- seattlerb/symbols_empty.txt
- seattlerb/symbols_empty_space.txt
- seattlerb/symbols_interp.txt
seattlerb/thingy.txt
- seattlerb/words_interp.txt
seattlerb/yield_call_assocs.txt
seattlerb/yield_empty_parens.txt
single_method_call_with_bang.txt
@@ -250,12 +231,6 @@ module Prism
whitequark/args_block_pass.txt
whitequark/args_cmd.txt
whitequark/args_star.txt
- whitequark/array_symbols.txt
- whitequark/array_symbols_empty.txt
- whitequark/array_symbols_interp.txt
- whitequark/array_words.txt
- whitequark/array_words_empty.txt
- whitequark/array_words_interp.txt
whitequark/asgn_mrhs.txt
whitequark/break_block.txt
whitequark/bug_480.txt
@@ -283,7 +258,6 @@ module Prism
whitequark/hash_label_end.txt
whitequark/if_else.txt
whitequark/if_elsif.txt
- whitequark/interp_digit_var.txt
whitequark/kwbegin_compstmt.txt
whitequark/kwoptarg_with_kwrestarg_and_forwarded_args.txt
whitequark/lvar_injecting_match.txt