Feature #12387
closedripper: new parser event for kwrest parameter
Description
Ripper does not handle unnamed kwrest parameter well.
$ ruby -rpp -rripper -e'pp Ripper.sexp("def a(*x, **y) end")'
[:program,
[[:def,
[:@ident, "a", [1, 4]],
[:paren,
[:params,
nil,
nil,
[:rest_param, [:@ident, "x", [1, 7]]],
nil,
nil,
[:@ident, "y", [1, 12]],
nil]],
[:bodystmt, [[:void_stmt]], nil, nil, nil]]]]
$ ruby -rpp -rripper -e'pp Ripper.sexp("def a(*, **) end")'
[:program,
[[:def,
[:@ident, "a", [1, 4]],
[:paren, [:params, nil, nil, [:rest_param, nil], nil, nil, 183, nil]],
[:bodystmt, [[:void_stmt]], nil, nil, nil]]]]
I expected something meaningful instead of the mysterious number 183. This comes from internal_id() (in parse.y).
There is already 'rest_param' paraer event for non-keyword rest params, so I suggest adding new event 'kwrest_param'. They should work in the same way.
I've attached a patch. With this the parse result will be:
$ ruby -rpp -rripper -e'pp Ripper.sexp("def a(*x, **y) end")'
[:program,
[[:def,
[:@ident, "a", [1, 4]],
[:paren,
[:params,
nil,
nil,
[:rest_param, [:@ident, "x", [1, 7]]],
nil,
nil,
[:kwrest_param, [:@ident, "y", [1, 12]]],
nil]],
[:bodystmt, [[:void_stmt]], nil, nil, nil]]]]
$ ruby -rpp -rripper -e'pp Ripper.sexp("def a(*, **) end")'
[:program,
[[:def,
[:@ident, "a", [1, 4]],
[:paren,
[:params,
nil,
nil,
[:rest_param, nil],
nil,
nil,
[:kwrest_param, nil],
nil]],
[:bodystmt, [[:void_stmt]], nil, nil, nil]]]]
Files
Updated by nobu (Nobuyoshi Nakada) about 7 years ago
- Status changed from Open to Assigned
- Assignee set to rhenium (Kazuki Yamaguchi)
Seems OK.
Updated by Anonymous over 6 years ago
- Status changed from Assigned to Closed
Applied in changeset trunk|r59382.
ripper: add kwrest_param parser event
-
parse.y (f_kwrest): Dispatch kwrest_param event. This is especially
useful for unnamed kwrest parameter for which we expose the internal
ID currently. [ruby-core:75528] [Feature #12387] -
test/ripper/dummyparser.rb (on_kwrest_param): Add handler for
kwrest_param parser event. -
test/ripper/test_parser_events.rb (test_params): Adapt to the change
in DummyParser.
(test_kwrest_param): Test that kwrest_param event handler is called.
Updated by rhenium (Kazuki Yamaguchi) over 6 years ago
nobu (Nobuyoshi Nakada) wrote:
Seems OK.
Thanks, committed as r59382.