Project

General

Profile

Actions

Feature #12387

closed

ripper: new parser event for kwrest parameter

Added by rhenium (Kazuki Yamaguchi) almost 8 years ago. Updated over 6 years ago.

Status:
Closed
Target version:
-
[ruby-core:75528]

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.

Actions #2

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.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0