Bug #4364
closedRipper loses MLHS variables in the presence of an LHS splat
Description
=begin
Ripper.sexp currently mis-parses the following LHS forms:
*b, c = ...
*, a = ...
a, *, b = ...
Specifically, in all 3 cases, the variables after the splat are not present in the resulting AST. The cause is simply missing mlhs_add calls in parse.y.
Here is the output of the trunk Ripper.sexp:
pp Ripper.sexp('*, b = 1, 2, 3')
[:program,
[[:massign,
[:mlhs_add_star, [], nil],
[:mrhs_new_from_args,
[[:@int, "1", [1, 7]], [:@int, "2", [1, 10]]],
[:@int, "3", [1, 13]]]]]]
pp Ripper.sexp('*b, c = 1, 2, 3')
[:program,
[[:massign,
[:mlhs_add_star, [], [:@ident, "b", [1, 1]]],
[:mrhs_new_from_args,
[[:@int, "1", [1, 8]], [:@int, "2", [1, 11]]],
[:@int, "3", [1, 14]]]]]]
pp Ripper.sexp('a, *, c = 1, 2, 3')
[:program,
[[:massign,
[:mlhs_add_star, [[:@ident, "a", [1, 0]]], nil],
[:mrhs_new_from_args,
[[:@int, "1", [1, 10]], [:@int, "2", [1, 13]]],
[:@int, "3", [1, 16]]]]]]
And here is it after the patch I am including:
require 'ripper'
require 'pp'
pp Ripper.sexp('*, b = 1, 2, 3')
[:program,
[[:massign,
[:mlhs_add_star, [], nil, [[:@ident, "b", [1, 3]]]],
[:mrhs_new_from_args,
[[:@int, "1", [1, 7]], [:@int, "2", [1, 10]]],
[:@int, "3", [1, 13]]]]]]
pp Ripper.sexp('*b, c = 1, 2, 3, 4')
[:program,
[[:massign,
[:mlhs_add_star, [], [:@ident, "b", [1, 1]], [[:@ident, "c", [1, 4]]]],
[:mrhs_new_from_args,
[[:@int, "1", [1, 8]], [:@int, "2", [1, 11]], [:@int, "3", [1, 14]]],
[:@int, "4", [1, 17]]]]]]
pp Ripper.sexp('a, *, b, c = 1, 2, 3, 4')
[:program,
[[:massign,
[:mlhs_add_star,
[[:@ident, "a", [1, 0]]],
nil,
[[:@ident, "b", [1, 6]], [:@ident, "c", [1, 9]]]],
[:mrhs_new_from_args,
[[:@int, "1", [1, 13]], [:@int, "2", [1, 16]], [:@int, "3", [1, 19]]],
[:@int, "4", [1, 22]]]]]]
I based the new output on the results of the one case that does parse successfully (this is for both versions):
pp Ripper.sexp('a, b, *c, d, e = 1, 2, 3, 4, 5, 6')
[:program,
[[:massign,
[:mlhs_add_star,
[[:@ident, "a", [1, 0]], [:@ident, "b", [1, 3]]],
[:@ident, "c", [1, 7]],
[[:@ident, "d", [1, 10]], [:@ident, "e", [1, 13]]]],
[:mrhs_new_from_args,
[[:@int, "1", [1, 17]],
[:@int, "2", [1, 20]],
[:@int, "3", [1, 23]],
[:@int, "4", [1, 26]],
[:@int, "5", [1, 29]]],
[:@int, "6", [1, 32]]]]]]
=end
Files