summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEarlopain <[email protected]>2025-03-30 13:28:36 +0200
committergit <[email protected]>2025-04-02 20:51:54 +0000
commit334c261cc9ee125c4c4bfc65dec2e571af8944a2 (patch)
tree1189aaa43216b50dc44ac5922128072bc6a39e2d
parentfe9ebb245644a38392fd26b5ec18efd8e549b154 (diff)
[ruby/prism] Fix parser translator when splatting in pattern matching pin
Because it ends up treating it as a local variable, and `a.x` is not a valid local variable name. I'm not big on pattern matching, but conceptually it makes sense to me to treat anything inside ^() to not be pattern matching syntax? https://github.com/ruby/prism/commit/80dbd85c45
-rw-r--r--lib/prism/translation/parser/compiler.rb3
-rw-r--r--test/prism/fixtures/patterns.txt4
2 files changed, 6 insertions, 1 deletions
diff --git a/lib/prism/translation/parser/compiler.rb b/lib/prism/translation/parser/compiler.rb
index acf4e77ee4..1beccc30a1 100644
--- a/lib/prism/translation/parser/compiler.rb
+++ b/lib/prism/translation/parser/compiler.rb
@@ -1481,7 +1481,8 @@ module Prism
# foo => ^(bar)
# ^^^^^^
def visit_pinned_expression_node(node)
- expression = builder.begin(token(node.lparen_loc), visit(node.expression), token(node.rparen_loc))
+ parts = node.expression.accept(copy_compiler(in_pattern: false)) # Don't treat * and similar as match_rest
+ expression = builder.begin(token(node.lparen_loc), parts, token(node.rparen_loc))
builder.pin(token(node.operator_loc), expression)
end
diff --git a/test/prism/fixtures/patterns.txt b/test/prism/fixtures/patterns.txt
index 09584e43eb..449dac619b 100644
--- a/test/prism/fixtures/patterns.txt
+++ b/test/prism/fixtures/patterns.txt
@@ -218,3 +218,7 @@ a in b, and c
a in b, or c
(a in b,) and c
(a in b,) or c
+
+x => ^([*a.x])
+x => ^([**a.x])
+x => ^({ a: })