Bug #2232: Ripper Handling of multiple left hand side [PATCH]
http://redmine.ruby-lang.org/issues/show/2232

Author: Andy Keep
Status: Open, Priority: Normal
Category: ext, Target version: 1.9.x
ruby -v: ruby 1.9.2dev (2009-10-19 trunk 25401) [x86_64-darwin10.0.0]

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.


----------------------------------------
http://redmine.ruby-lang.org