Skip to content

Commit 8c54563

Browse files
committed
+ Refactored 1.9 args handling
[git-p4: depot-paths = "//src/ruby_parser/dev/": change = 6727]
1 parent 7f69c73 commit 8c54563

File tree

2 files changed

+56
-37
lines changed

2 files changed

+56
-37
lines changed

lib/ruby19_parser.y

+18-37
Original file line numberDiff line numberDiff line change
@@ -1659,86 +1659,67 @@ xstring_contents: none
16591659

16601660
f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_f_block_arg
16611661
{
1662-
result = args val[0], val[2], val[4], val[5]
1662+
result = args19 val
16631663
}
16641664
| f_arg tCOMMA f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg
16651665
{
1666-
result = val[0]
1667-
val[2][1..-1].each do |lasgn| # FIX clean sexp iter
1668-
raise "wtf? #{lasgn.inspect}" unless lasgn[0] == :lasgn
1669-
result << lasgn[1]
1670-
end
1671-
result << val[4]
1672-
result << val[6].last
1673-
result << :"&#{val[7].last}" if val[7]
1674-
result << val[2]
1675-
result
1666+
result = args19 val
16761667
}
1677-
| f_arg tCOMMA f_optarg opt_f_block_arg
1668+
| f_arg tCOMMA f_optarg opt_f_block_arg
16781669
{
1679-
result = args val[0], val[2], nil, val[3]
1670+
result = args19 val
16801671
}
16811672
| f_arg tCOMMA f_optarg tCOMMA f_arg opt_f_block_arg
16821673
{
1683-
result = args val[0], val[2], val[4].last, val[5]
1674+
result = args19 val
16841675
}
1685-
| f_arg tCOMMA f_rest_arg opt_f_block_arg
1676+
| f_arg tCOMMA f_rest_arg opt_f_block_arg
16861677
{
1687-
result = args val[0], nil, val[2], val[3]
1678+
result = args19 val
16881679
}
16891680
| f_arg opt_f_block_arg
16901681
{
1691-
result = args val[0], nil, nil, val[1]
1682+
result = args19 val
16921683
}
16931684
| f_arg tCOMMA f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg
16941685
{
1695-
result = args val[0], val[2], val[4], val[7], val[6]
1686+
result = args19 val
16961687
}
16971688
| f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg
16981689
{
1699-
result = args val[0], nil, val[2], val[5], val[4]
1690+
result = args19 val
17001691
}
17011692
| f_optarg tCOMMA f_rest_arg opt_f_block_arg
17021693
{
1703-
result = args nil, val[0], val[2], val[3]
1694+
result = args19 val
17041695
}
17051696
| f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg
17061697
{
1707-
result = s(:args)
1708-
val[0][1..-1].each do |lasgn| # FIX clean sexp iter
1709-
raise "wtf? #{lasgn.inspect}" unless lasgn[0] == :lasgn
1710-
result << lasgn[1]
1711-
end
1712-
1713-
result << val[2]
1714-
result << val[4].last
1715-
result << :"&#{val[5].last}" if val[5]
1716-
result << val[0]
1717-
result
1698+
result = args19 val
17181699
}
17191700
| f_optarg opt_f_block_arg
17201701
{
1721-
result = args nil, val[0], nil, val[1]
1702+
result = args19 val
17221703
}
17231704
| f_rest_arg opt_f_block_arg
17241705
{
1725-
result = args nil, nil, val[0], val[1]
1706+
result = args19 val
17261707
}
17271708
| f_optarg tCOMMA f_arg opt_f_block_arg
17281709
{
1729-
result = args nil, val[0], val[2].last, val[3]
1710+
result = args19 val
17301711
}
17311712
| f_rest_arg tCOMMA f_arg opt_f_block_arg
17321713
{
1733-
result = args nil, nil, val[0], val[3], val[2]
1714+
result = args19 val
17341715
}
17351716
| f_block_arg
17361717
{
1737-
result = args nil, nil, nil, val[0]
1718+
result = args19 val
17381719
}
17391720
|
17401721
{
1741-
result = args nil, nil, nil, nil
1722+
result = args19 val
17421723
}
17431724

17441725
f_norm_arg: tCONSTANT

lib/ruby_parser_extras.rb

+38
Original file line numberDiff line numberDiff line change
@@ -149,13 +149,51 @@ def args arg, optarg, rest_arg, block_arg, post_arg = nil
149149
end
150150

151151
result << rest_arg if rest_arg
152+
152153
result << :"&#{block_arg.last}" if block_arg
153154
result << optarg if optarg # TODO? huh - processed above as well
154155
post_arg[1..-1].each {|pa| result << pa } if post_arg
155156

156157
result
157158
end
158159

160+
def args19 vals # TODO: migrate to args once 1.8 tests pass as well
161+
result = s(:args)
162+
block = nil
163+
164+
vals.each do |val|
165+
case val
166+
when Sexp then
167+
case val.first
168+
when :args then
169+
val[1..-1].each do |name|
170+
result << name
171+
end
172+
when :block_arg then
173+
result << :"&#{val.last}"
174+
when :block then
175+
block = val
176+
val[1..-1].each do |lasgn| # FIX clean sexp iter
177+
raise "wtf? #{val.inspect}" unless lasgn[0] == :lasgn
178+
result << lasgn[1]
179+
end
180+
else
181+
raise "unhandled sexp: #{val.inspect}"
182+
end
183+
when Symbol then
184+
result << val
185+
when ",", nil then
186+
# ignore
187+
else
188+
raise "unhandled val: #{val.inspect} in #{vals.inspect}"
189+
end
190+
end
191+
192+
result << block if block
193+
194+
result
195+
end
196+
159197
def aryset receiver, index
160198
index[0] = :arglist if index[0] == :array
161199
s(:attrasgn, receiver, :"[]=", index)

0 commit comments

Comments
 (0)