diff --git a/doc/AST_FORMAT.md b/doc/AST_FORMAT.md index c8c793a22..24bb0d775 100644 --- a/doc/AST_FORMAT.md +++ b/doc/AST_FORMAT.md @@ -266,6 +266,30 @@ Format: ~~~~~~~~~~ expression (pair) ~~~ +#### With local variable + +Format: + +~~~ +(pair (sym :foo) (lvar :foo)) +"{foo:}" + ^ operator (pair) + ~~~ expression (sym) + ~~~ expression (lvar) +~~~ + +#### With method call + +Format: + +~~~ +(pair (sym :puts) (send nil :puts)) +"{puts:}" + ^ operator (pair) + ~~~~ expression (sym) + ~~~~ expression (send) +~~~ + #### Plain Format: diff --git a/lib/parser/builders/default.rb b/lib/parser/builders/default.rb index 4ed33b9c2..1fd122d40 100644 --- a/lib/parser/builders/default.rb +++ b/lib/parser/builders/default.rb @@ -518,6 +518,15 @@ def pair_quoted(begin_t, parts, end_t, value) n(:pair, [ key, value ], pair_map) end + def pair_label(key_t) + key_l = loc(key_t) + value_l = key_l.adjust(end_pos: -1) + + ident = n(:ident, [ value(key_t).to_sym ], Source::Map::Variable.new(value_l)) + value = accessible(ident) + result = pair_keyword(key_t, value) + end + def kwsplat(dstar_t, arg) n(:kwsplat, [ arg ], unary_op_map(dstar_t, arg)) diff --git a/lib/parser/ruby31.y b/lib/parser/ruby31.y index cc0b51e03..2c0eb6e6b 100644 --- a/lib/parser/ruby31.y +++ b/lib/parser/ruby31.y @@ -3100,8 +3100,7 @@ f_opt_paren_args: f_paren_args } | tLABEL { - value = @builder.call_method(nil, nil, val[0]) - result = @builder.pair_keyword(val[0], value) + result = @builder.pair_label(val[0]) } | tSTRING_BEG string_contents tLABEL_END arg_value { diff --git a/test/test_parser.rb b/test/test_parser.rb index 4a71e1e7a..1f0e36575 100644 --- a/test/test_parser.rb +++ b/test/test_parser.rb @@ -10073,16 +10073,24 @@ def test_private_endless_method_command_syntax def test_value_omission assert_parses( s(:hash, - s(:pair, s(:sym, :a), s(:send, nil, :a)), - s(:pair, s(:sym, :b), s(:send, nil, :b))), - %q{{a:, b:}}, - %q{^ begin - | ^ end - | ^ operator (pair) - | ~ expression (pair.sym) - | ~~ expression (pair.send) - | ~~ expression (pair) - |~~~~~~~~ expression}, + s(:pair, s(:sym, :puts), s(:send, nil, :puts))), + %q{{puts:}}, + %q{ ^ operator (pair) + | ~~~~ expression (pair.sym) + | ~~~~ expression (pair.send) + | ~~~~ selector (pair.send) + | ~~~~~ expression (pair)}, + SINCE_3_1) + + assert_parses( + s(:hash, + s(:pair, s(:sym, :foo), s(:lvar, :foo))), + %q{{foo:}}, + %q{ ^ operator (pair) + | ~~~ expression (pair.sym) + | ~~~ expression (pair.lvar) + | ~~~ name (pair.lvar) + | ~~~~ expression (pair)}, SINCE_3_1) end