Repository: ruby/prism
Pull request #2855 (2024-06-01 17:51:03)

Properly destructure procarg0 in parser translation


Patch:
diff --git a/lib/prism/translation/parser/compiler.rb b/lib/prism/translation/parser/compiler.rb
index 816c8841..df5917ab 100644
--- a/lib/prism/translation/parser/compiler.rb
+++ b/lib/prism/translation/parser/compiler.rb
@@ -1390,12 +1390,12 @@ module Prism
 
           if node.requireds.any?
             node.requireds.each do |required|
-              if required.is_a?(RequiredParameterNode)
-                params << visit(required)
-              else
-                compiler = copy_compiler(in_destructure: true)
-                params << required.accept(compiler)
-              end
+              params <<
+                if required.is_a?(RequiredParameterNode)
+                  visit(required)
+                else
+                  required.accept(copy_compiler(in_destructure: true))
+                end
             end
           end
 
@@ -1404,12 +1404,12 @@ module Prism
 
           if node.posts.any?
             node.posts.each do |post|
-              if post.is_a?(RequiredParameterNode)
-                params << visit(post)
-              else
-                compiler = copy_compiler(in_destructure: true)
-                params << post.accept(compiler)
-              end
+              params <<
+                if post.is_a?(RequiredParameterNode)
+                  visit(post)
+                else
+                  post.accept(copy_compiler(in_destructure: true))
+                end
             end
           end
 
@@ -2004,7 +2004,8 @@ module Prism
                   token(parameters.opening_loc),
                   if procarg0?(parameters.parameters)
                     parameter = parameters.parameters.requireds.first
-                    [builder.procarg0(visit(parameter))].concat(visit_all(parameters.locals))
+                    visited = parameter.is_a?(RequiredParameterNode) ? visit(parameter) : parameter.accept(copy_compiler(in_destructure: true))
+                    [builder.procarg0(visited)].concat(visit_all(parameters.locals))
                   else
                     visit(parameters)
                   end,


Test patch:
diff --git a/test/prism/ruby/parser_test.rb b/test/prism/ruby/parser_test.rb
index d5787a0c..d0e3288d 100644
--- a/test/prism/ruby/parser_test.rb
+++ b/test/prism/ruby/parser_test.rb
@@ -52,11 +52,6 @@ module Prism
       "spanning_heredoc.txt",
       "spanning_heredoc_newlines.txt",
       "unescaping.txt",
-      "seattlerb/block_decomp_anon_splat_arg.txt",
-      "seattlerb/block_decomp_arg_splat_arg.txt",
-      "seattlerb/block_decomp_arg_splat.txt",
-      "seattlerb/block_decomp_splat.txt",
-      "seattlerb/block_paren_splat.txt",
       "seattlerb/bug190.txt",
       "seattlerb/heredoc_nested.txt",
       "seattlerb/heredoc_with_carriage_return_escapes_windows.txt",
@@ -69,7 +64,6 @@ module Prism
       "seattlerb/pctW_lineno.txt",
       "seattlerb/regexp_esc_C_slash.txt",
       "seattlerb/TestRubyParserShared.txt",
-      "unparser/corpus/literal/block.txt",
       "unparser/corpus/literal/literal.txt",
       "unparser/corpus/literal/pattern.txt",
       "unparser/corpus/semantic/dstr.txt",