Skip to content

Commit

Permalink
+ ruby31.y: Add pattern matching pin support for instance/class/globa…
Browse files Browse the repository at this point in the history
…l variables (#813)

Closes #812.

This commit tracks upstream commit ruby/ruby@fa87f72.
  • Loading branch information
koic committed Jul 16, 2021
1 parent 2cfccb9 commit 11c7644
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 0 deletions.
19 changes: 19 additions & 0 deletions lib/parser/ruby31.y
Expand Up @@ -2302,6 +2302,12 @@ opt_block_args_tail:
result = @builder.pin(val[0], lvar)
}
| tCARET nonlocal_var
{
non_lvar = @builder.accessible(val[1])
result = @builder.pin(val[0], non_lvar)
}
p_expr_ref: tCARET tLPAREN expr_value tRPAREN
{
expr = @builder.begin(val[1], val[2], val[3])
Expand Down Expand Up @@ -2579,6 +2585,19 @@ regexp_contents: # nothing
result = @builder.complex(val[0])
}
nonlocal_var: tIVAR
{
result = @builder.ivar(val[0])
}
| tGVAR
{
result = @builder.gvar(val[0])
}
| tCVAR
{
result = @builder.cvar(val[0])
}
user_variable: tIDENTIFIER
{
result = @builder.ident(val[0])
Expand Down
27 changes: 27 additions & 0 deletions test/test_parser.rb
Expand Up @@ -10379,5 +10379,32 @@ def test_pin_expr
| ~ end (in_pattern.pin.begin)
| ~~~~~ expression (in_pattern.pin.begin)},
SINCE_3_1)

assert_parses_pattern_match(
s(:in_pattern,
s(:pin,
s(:ivar, :@a)), nil, nil),
%q{in ^@a},
%q{ ~ selector (in_pattern.pin)
| ~~~ expression (in_pattern.pin)},
SINCE_3_1)

assert_parses_pattern_match(
s(:in_pattern,
s(:pin,
s(:cvar, :@@TestPatternMatching)), nil, nil),
%q{in ^@@TestPatternMatching},
%q{ ~ selector (in_pattern.pin)
| ~~~~~~~~~~~~~~~~~~~~~~ expression (in_pattern.pin)},
SINCE_3_1)

assert_parses_pattern_match(
s(:in_pattern,
s(:pin,
s(:gvar, :$TestPatternMatching)), nil, nil),
%q{in ^$TestPatternMatching},
%q{ ~ selector (in_pattern.pin)
| ~~~~~~~~~~~~~~~~~~~~~ expression (in_pattern.pin)},
SINCE_3_1)
end
end

0 comments on commit 11c7644

Please sign in to comment.