diff --git a/lib/parser/ruby31.y b/lib/parser/ruby31.y index 3d1455888..73a28428f 100644 --- a/lib/parser/ruby31.y +++ b/lib/parser/ruby31.y @@ -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]) @@ -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]) diff --git a/test/test_parser.rb b/test/test_parser.rb index 4ab976c37..ac851e0bc 100644 --- a/test/test_parser.rb +++ b/test/test_parser.rb @@ -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