Project

General

Profile

Backport #2232

Ripper Handling of multiple left hand side [PATCH]

Added by akeep (Andy Keep) almost 10 years ago. Updated over 8 years ago.

Status:
Closed
Priority:
Normal
[ruby-core:26163]

Description

=begin
Right now ripper doesn't properly handling multiple assignment when a variable follows a starred variable in a multiple assignment.

For instance say I have:

a, *b, c = [1, 2, 3, 4]
=> [1, 2, 3, 4]
a
=> 1
b
=> [2, 3]
c
=> 4

Unfortunately Ripper parses "a, *b, c = [1, 2, 3, 4]" as:

Ripper.sexp "a, *b, c = [1, 2, 3, 4]"
=> [:program, [[:massign, [:mlhs_add_star, [[:ident, "a", [1, 0]]], [:ident, "b", [1, 4]]], [:array, [[:int, "1", [1, 12]], [:int, "2", [1, 15]], [:int, "3", [1, 18]], [:int, "4", [1, 21]]]]]]]

Note that "c" is completely missing above.

The cuprit seems to be:

    | mlhs_head tSTAR mlhs_node ',' mlhs_post
        {
        /*%%%*/
        $$ = NEW_MASGN($1, NEW_POSTARG($3,$5));
        /*%
        $$ = mlhs_add_star($1, $3);
        %*/
        }

Where the mlhs_post is ignored.

I've got a patch that adds the line:

        $$ = mlhs_add($1, $5);

(and changes the line above to $1 = mlhs_add_star($1, $3))

With this change we get a, b and c, but I'm not sure if my approach is the right one.

Anyway, see included patch.
=end


Files

parse.y.mlhs_star_patch (363 Bytes) parse.y.mlhs_star_patch Patch to fix Ripper handling of multiple left hand side with a * on a middle term akeep (Andy Keep), 10/20/2009 12:23 AM

History

#1

Updated by nobu (Nobuyoshi Nakada) almost 10 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

=begin
This issue was solved with changeset r25404.
Andy, thank you for your reporting of the issue.
You have greatfully contributed toward Ruby.
May Ruby be with you.

=end

#2

Updated by nobu (Nobuyoshi Nakada) almost 10 years ago

  • Status changed from Closed to Assigned
  • Assignee set to yugui (Yuki Sonoda)

=begin

=end

#3

Updated by yugui (Yuki Sonoda) almost 10 years ago

  • Status changed from Assigned to Closed

=begin
This issue was solved with changeset r26012.
Andy, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.

=end

Also available in: Atom PDF