Project

General

Profile

Actions

Feature #12387

closed

ripper: new parser event for kwrest parameter

Added by rhenium (Kazuki Yamaguchi) almost 8 years ago. Updated almost 7 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

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0