Skip to content

Commit

Permalink
- ruby31.y: emit hash labels that are local variables as locals if va…
Browse files Browse the repository at this point in the history
…lue is omitted.
  • Loading branch information
iliabylich committed Sep 24, 2021
1 parent 61bf873 commit 0affe79
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 12 deletions.
24 changes: 24 additions & 0 deletions doc/AST_FORMAT.md
Expand Up @@ -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:
Expand Down
9 changes: 9 additions & 0 deletions lib/parser/builders/default.rb
Expand Up @@ -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))
Expand Down
3 changes: 1 addition & 2 deletions lib/parser/ruby31.y
Expand Up @@ -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
{
Expand Down
28 changes: 18 additions & 10 deletions test/test_parser.rb
Expand Up @@ -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

Expand Down

0 comments on commit 0affe79

Please sign in to comment.