ruby_parser 3.0.0.a9 → 3.0.0.a10
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of ruby_parser might be problematic. Click here for more details.
- data.tar.gz.sig +0 -0
- data/History.txt +13 -0
- data/lib/ruby18_parser.rb +23 -23
- data/lib/ruby18_parser.y +23 -23
- data/lib/ruby19_parser.rb +98 -91
- data/lib/ruby19_parser.y +98 -91
- data/lib/ruby_parser_extras.rb +50 -120
- data/test/test_ruby_parser.rb +310 -106
- metadata +4 -4
- metadata.gz.sig +0 -0
data/lib/ruby19_parser.y
CHANGED
@@ -260,6 +260,8 @@ rule
|
|
260
260
|
compstmt tRCURLY
|
261
261
|
{
|
262
262
|
result = new_iter nil, val[2], val[4]
|
263
|
+
result.line = val[1]
|
264
|
+
|
263
265
|
self.env.unextend
|
264
266
|
}
|
265
267
|
|
@@ -994,7 +996,7 @@ rule
|
|
994
996
|
}
|
995
997
|
| tLAMBDA lambda
|
996
998
|
{
|
997
|
-
result = val[1]
|
999
|
+
result = val[1] # TODO: fix lineno
|
998
1000
|
}
|
999
1001
|
| kIF expr_value then compstmt if_tail kEND
|
1000
1002
|
{
|
@@ -1194,9 +1196,6 @@ rule
|
|
1194
1196
|
}
|
1195
1197
|
|
1196
1198
|
f_marg: f_norm_arg
|
1197
|
-
{
|
1198
|
-
result = assignable val[0]
|
1199
|
-
}
|
1200
1199
|
| tLPAREN f_margs rparen
|
1201
1200
|
{
|
1202
1201
|
result = val[1]
|
@@ -1213,114 +1212,116 @@ rule
|
|
1213
1212
|
|
1214
1213
|
f_margs: f_marg_list
|
1215
1214
|
{
|
1216
|
-
|
1215
|
+
args, = val
|
1216
|
+
|
1217
|
+
result = block_var args
|
1217
1218
|
}
|
1218
1219
|
| f_marg_list tCOMMA tSTAR f_norm_arg
|
1219
1220
|
{
|
1220
|
-
|
1221
|
+
args, _, _, splat = val
|
1222
|
+
|
1223
|
+
result = block_var args, "*#{splat}".to_sym
|
1221
1224
|
}
|
1222
1225
|
| f_marg_list tCOMMA tSTAR f_norm_arg tCOMMA f_marg_list
|
1223
1226
|
{
|
1224
|
-
|
1227
|
+
args, _, _, splat, _, args2 = val
|
1228
|
+
|
1229
|
+
result = block_var args, "*#{splat}".to_sym, args2
|
1225
1230
|
}
|
1226
1231
|
| f_marg_list tCOMMA tSTAR
|
1227
1232
|
{
|
1228
|
-
|
1233
|
+
args, _, _ = val
|
1234
|
+
|
1235
|
+
result = block_var args, :*
|
1229
1236
|
}
|
1230
1237
|
| f_marg_list tCOMMA tSTAR tCOMMA f_marg_list
|
1231
1238
|
{
|
1232
|
-
|
1239
|
+
args, _, _, _, args2 = val
|
1240
|
+
|
1241
|
+
result = block_var args, :*, args2
|
1233
1242
|
}
|
1234
1243
|
| tSTAR f_norm_arg
|
1235
1244
|
{
|
1236
|
-
|
1245
|
+
_, splat = val
|
1246
|
+
|
1247
|
+
result = block_var :"*#{splat}"
|
1237
1248
|
}
|
1238
1249
|
| tSTAR f_norm_arg tCOMMA f_marg_list
|
1239
1250
|
{
|
1240
|
-
|
1251
|
+
_, splat, _, args = val
|
1252
|
+
|
1253
|
+
result = block_var :"*#{splat}", args
|
1241
1254
|
}
|
1242
1255
|
| tSTAR
|
1243
1256
|
{
|
1244
|
-
|
1257
|
+
result = block_var :*
|
1245
1258
|
}
|
1246
1259
|
| tSTAR tCOMMA f_marg_list
|
1247
1260
|
{
|
1248
|
-
|
1261
|
+
_, _, args = val
|
1262
|
+
|
1263
|
+
result = block_var :*, args
|
1249
1264
|
}
|
1250
1265
|
|
1251
1266
|
block_param: f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg opt_f_block_arg
|
1252
1267
|
{
|
1253
|
-
result =
|
1268
|
+
result = args val
|
1254
1269
|
}
|
1255
1270
|
| f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg
|
1256
1271
|
{
|
1257
|
-
result =
|
1272
|
+
result = args val
|
1258
1273
|
}
|
1259
1274
|
| f_arg tCOMMA f_block_optarg opt_f_block_arg
|
1260
1275
|
{
|
1261
|
-
|
1262
|
-
|
1263
|
-
result = arg
|
1264
|
-
result.concat opt[1..-1].map { |s| s[1] }
|
1265
|
-
result << "&#{block.last}".to_sym if block
|
1266
|
-
result << opt
|
1276
|
+
result = args val
|
1267
1277
|
}
|
1268
1278
|
| f_arg tCOMMA f_block_optarg tCOMMA f_arg opt_f_block_arg
|
1269
1279
|
{
|
1270
|
-
result =
|
1280
|
+
result = args val
|
1271
1281
|
}
|
1272
1282
|
| f_arg tCOMMA f_rest_arg opt_f_block_arg
|
1273
1283
|
{
|
1274
|
-
result =
|
1284
|
+
result = args val
|
1275
1285
|
}
|
1276
1286
|
| f_arg tCOMMA
|
1277
1287
|
{
|
1278
|
-
result =
|
1288
|
+
result = args val
|
1279
1289
|
}
|
1280
1290
|
| f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg
|
1281
1291
|
{
|
1282
|
-
result =
|
1292
|
+
result = args val
|
1283
1293
|
}
|
1284
1294
|
| f_arg opt_f_block_arg
|
1285
1295
|
{
|
1286
|
-
result =
|
1296
|
+
result = args val
|
1287
1297
|
}
|
1288
1298
|
| f_block_optarg tCOMMA f_rest_arg opt_f_block_arg
|
1289
1299
|
{
|
1290
|
-
result =
|
1300
|
+
result = args val
|
1291
1301
|
}
|
1292
1302
|
| f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg
|
1293
1303
|
{
|
1294
|
-
result =
|
1304
|
+
result = args val
|
1295
1305
|
}
|
1296
1306
|
| f_block_optarg opt_f_block_arg
|
1297
1307
|
{
|
1298
|
-
|
1299
|
-
|
1300
|
-
result = s(:args)
|
1301
|
-
result.concat opt[1..-1].map { |s| s[1] }
|
1302
|
-
result << "&#{block.last}".to_sym if block
|
1303
|
-
result << opt
|
1308
|
+
result = args val
|
1304
1309
|
}
|
1305
1310
|
| f_block_optarg tCOMMA f_arg opt_f_block_arg
|
1306
1311
|
{
|
1307
|
-
result =
|
1312
|
+
result = args val
|
1308
1313
|
}
|
1309
1314
|
| f_rest_arg opt_f_block_arg
|
1310
1315
|
{
|
1311
|
-
result =
|
1316
|
+
result = args val
|
1312
1317
|
}
|
1313
1318
|
| f_rest_arg tCOMMA f_arg opt_f_block_arg
|
1314
1319
|
{
|
1315
|
-
|
1316
|
-
|
1317
|
-
result = args
|
1318
|
-
result[1,0] = rest
|
1319
|
-
result << "&#{block.last}".to_sym if block
|
1320
|
+
result = args val
|
1320
1321
|
}
|
1321
1322
|
| f_block_arg
|
1322
1323
|
{
|
1323
|
-
result =
|
1324
|
+
result = args val
|
1324
1325
|
}
|
1325
1326
|
|
1326
1327
|
opt_block_param: none
|
@@ -1362,23 +1363,18 @@ rule
|
|
1362
1363
|
|
1363
1364
|
lambda: f_larglist lambda_body
|
1364
1365
|
{
|
1365
|
-
|
1366
|
-
|
1367
|
-
|
1368
|
-
when 2
|
1369
|
-
args = s(:lasgn, val[0][1])
|
1370
|
-
else
|
1371
|
-
vars = val[0][1..-1].map { |name| s(:lasgn, name) }
|
1372
|
-
args = s(:masgn, s(:array, *vars))
|
1373
|
-
end
|
1366
|
+
args, body = val
|
1367
|
+
|
1368
|
+
args = 0 if args == s(:args)
|
1374
1369
|
|
1375
1370
|
call = new_call nil, :lambda
|
1376
|
-
result =
|
1371
|
+
result = new_iter call, args, body
|
1377
1372
|
}
|
1378
1373
|
|
1379
1374
|
f_larglist: tLPAREN2 f_args opt_bv_decl rparen
|
1380
1375
|
{
|
1381
1376
|
result = val[1]
|
1377
|
+
raise "not yet: #{val.inspect}" if val[2]
|
1382
1378
|
}
|
1383
1379
|
| f_args
|
1384
1380
|
{
|
@@ -1405,9 +1401,9 @@ rule
|
|
1405
1401
|
}
|
1406
1402
|
compstmt kEND
|
1407
1403
|
{
|
1408
|
-
|
1404
|
+
args = val[2]
|
1409
1405
|
body = val[4]
|
1410
|
-
result = new_iter nil,
|
1406
|
+
result = new_iter nil, args, body
|
1411
1407
|
result.line = val[1]
|
1412
1408
|
|
1413
1409
|
self.env.unextend
|
@@ -1486,12 +1482,12 @@ rule
|
|
1486
1482
|
}
|
1487
1483
|
compstmt tRCURLY
|
1488
1484
|
{
|
1489
|
-
|
1490
|
-
|
1491
|
-
body = val[4]
|
1485
|
+
_, line, args, _, body, _ = val
|
1486
|
+
|
1492
1487
|
result = new_iter nil, args, body
|
1488
|
+
result.line = line
|
1489
|
+
|
1493
1490
|
self.env.unextend
|
1494
|
-
result.line = val[1]
|
1495
1491
|
}
|
1496
1492
|
| kDO
|
1497
1493
|
{
|
@@ -1504,11 +1500,12 @@ rule
|
|
1504
1500
|
}
|
1505
1501
|
compstmt kEND
|
1506
1502
|
{
|
1507
|
-
args = val
|
1508
|
-
|
1503
|
+
_, line, args, _, body, _ = val
|
1504
|
+
|
1509
1505
|
result = new_iter nil, args, body
|
1506
|
+
result.line = line
|
1507
|
+
|
1510
1508
|
self.env.unextend
|
1511
|
-
result.line = val[1]
|
1512
1509
|
}
|
1513
1510
|
|
1514
1511
|
case_body: kWHEN
|
@@ -1526,7 +1523,7 @@ rule
|
|
1526
1523
|
|
1527
1524
|
opt_rescue: kRESCUE exc_list exc_var then compstmt opt_rescue
|
1528
1525
|
{
|
1529
|
-
klasses, var, body, rest = val
|
1526
|
+
_, klasses, var, _, body, rest = val
|
1530
1527
|
|
1531
1528
|
klasses ||= s(:array)
|
1532
1529
|
klasses << node_assign(var, s(:gvar, :"$!")) if var
|
@@ -1554,11 +1551,9 @@ rule
|
|
1554
1551
|
|
1555
1552
|
opt_ensure: kENSURE compstmt
|
1556
1553
|
{
|
1557
|
-
|
1558
|
-
|
1559
|
-
|
1560
|
-
result = s(:nil)
|
1561
|
-
end
|
1554
|
+
_, body = val
|
1555
|
+
|
1556
|
+
result = body || s(:nil)
|
1562
1557
|
}
|
1563
1558
|
| none
|
1564
1559
|
|
@@ -1707,7 +1702,7 @@ regexp_contents: none
|
|
1707
1702
|
when nil then
|
1708
1703
|
result = s(:evstr)
|
1709
1704
|
else
|
1710
|
-
raise "unknown
|
1705
|
+
raise "unknown string body: #{val[2].inspect}"
|
1711
1706
|
end
|
1712
1707
|
}
|
1713
1708
|
|
@@ -1770,7 +1765,15 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
1770
1765
|
| kFALSE { result = s(:false) }
|
1771
1766
|
| k__FILE__ { result = s(:str, self.file) }
|
1772
1767
|
| k__LINE__ { result = s(:lit, lexer.src.current_line) }
|
1773
|
-
| k__ENCODING__
|
1768
|
+
| k__ENCODING__
|
1769
|
+
{
|
1770
|
+
result =
|
1771
|
+
if defined? Encoding then
|
1772
|
+
s(:const, Encoding::UTF_8)
|
1773
|
+
else
|
1774
|
+
s(:str, "Unsupported!")
|
1775
|
+
end
|
1776
|
+
}
|
1774
1777
|
|
1775
1778
|
var_ref: user_variable
|
1776
1779
|
{
|
@@ -1826,63 +1829,63 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
1826
1829
|
|
1827
1830
|
f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_f_block_arg
|
1828
1831
|
{
|
1829
|
-
result =
|
1832
|
+
result = args val
|
1830
1833
|
}
|
1831
1834
|
| f_arg tCOMMA f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg
|
1832
1835
|
{
|
1833
|
-
result =
|
1836
|
+
result = args val
|
1834
1837
|
}
|
1835
1838
|
| f_arg tCOMMA f_optarg opt_f_block_arg
|
1836
1839
|
{
|
1837
|
-
result =
|
1840
|
+
result = args val
|
1838
1841
|
}
|
1839
1842
|
| f_arg tCOMMA f_optarg tCOMMA f_arg opt_f_block_arg
|
1840
1843
|
{
|
1841
|
-
result =
|
1844
|
+
result = args val
|
1842
1845
|
}
|
1843
1846
|
| f_arg tCOMMA f_rest_arg opt_f_block_arg
|
1844
1847
|
{
|
1845
|
-
result =
|
1848
|
+
result = args val
|
1846
1849
|
}
|
1847
1850
|
| f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg
|
1848
1851
|
{
|
1849
|
-
result =
|
1852
|
+
result = args val
|
1850
1853
|
}
|
1851
1854
|
| f_arg opt_f_block_arg
|
1852
1855
|
{
|
1853
|
-
result =
|
1856
|
+
result = args val
|
1854
1857
|
}
|
1855
1858
|
| f_optarg tCOMMA f_rest_arg opt_f_block_arg
|
1856
1859
|
{
|
1857
|
-
result =
|
1860
|
+
result = args val
|
1858
1861
|
}
|
1859
1862
|
| f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg
|
1860
1863
|
{
|
1861
|
-
result =
|
1864
|
+
result = args val
|
1862
1865
|
}
|
1863
1866
|
| f_optarg opt_f_block_arg
|
1864
1867
|
{
|
1865
|
-
result =
|
1868
|
+
result = args val
|
1866
1869
|
}
|
1867
1870
|
| f_optarg tCOMMA f_arg opt_f_block_arg
|
1868
1871
|
{
|
1869
|
-
result =
|
1872
|
+
result = args val
|
1870
1873
|
}
|
1871
1874
|
| f_rest_arg opt_f_block_arg
|
1872
1875
|
{
|
1873
|
-
result =
|
1876
|
+
result = args val
|
1874
1877
|
}
|
1875
1878
|
| f_rest_arg tCOMMA f_arg opt_f_block_arg
|
1876
1879
|
{
|
1877
|
-
result =
|
1880
|
+
result = args val
|
1878
1881
|
}
|
1879
1882
|
| f_block_arg
|
1880
1883
|
{
|
1881
|
-
result =
|
1884
|
+
result = args val
|
1882
1885
|
}
|
1883
1886
|
|
|
1884
1887
|
{
|
1885
|
-
result =
|
1888
|
+
result = args val
|
1886
1889
|
}
|
1887
1890
|
|
1888
1891
|
f_bad_arg: tCONSTANT
|
@@ -1912,9 +1915,6 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
1912
1915
|
}
|
1913
1916
|
|
1914
1917
|
f_arg_item: f_norm_arg
|
1915
|
-
# { # TODO
|
1916
|
-
# result = assignable val[0]
|
1917
|
-
# }
|
1918
1918
|
| tLPAREN f_margs rparen
|
1919
1919
|
{
|
1920
1920
|
result = val[1]
|
@@ -1925,7 +1925,7 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
1925
1925
|
case val[0]
|
1926
1926
|
when Symbol then
|
1927
1927
|
result = s(:args)
|
1928
|
-
result << val[0]
|
1928
|
+
result << val[0]
|
1929
1929
|
when Sexp then
|
1930
1930
|
result = val[0]
|
1931
1931
|
else
|
@@ -1934,8 +1934,15 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
1934
1934
|
}
|
1935
1935
|
| f_arg tCOMMA f_arg_item
|
1936
1936
|
{
|
1937
|
-
|
1938
|
-
|
1937
|
+
list, _, item = val
|
1938
|
+
|
1939
|
+
if list.sexp_type == :args then
|
1940
|
+
result = list
|
1941
|
+
else
|
1942
|
+
result = s(:args, list)
|
1943
|
+
end
|
1944
|
+
|
1945
|
+
result << item
|
1939
1946
|
}
|
1940
1947
|
|
1941
1948
|
f_opt: tIDENTIFIER tEQL arg_value
|
@@ -1991,7 +1998,7 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
1991
1998
|
identifier = val[1].to_sym
|
1992
1999
|
|
1993
2000
|
self.env[identifier] = :lvar
|
1994
|
-
result =
|
2001
|
+
result = "&#{identifier}".to_sym
|
1995
2002
|
}
|
1996
2003
|
|
1997
2004
|
opt_f_block_arg: tCOMMA f_block_arg
|
data/lib/ruby_parser_extras.rb
CHANGED
@@ -85,7 +85,7 @@ class RPStringScanner < StringScanner
|
|
85
85
|
end
|
86
86
|
|
87
87
|
module RubyParserStuff
|
88
|
-
VERSION = '3.0.0.
|
88
|
+
VERSION = '3.0.0.a10' unless constants.include? "VERSION" # SIGH
|
89
89
|
|
90
90
|
attr_accessor :lexer, :in_def, :in_single, :file
|
91
91
|
attr_reader :env, :comments
|
@@ -115,154 +115,76 @@ module RubyParserStuff
|
|
115
115
|
node1
|
116
116
|
end
|
117
117
|
|
118
|
-
def
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
ary << splat
|
118
|
+
def clean_mlhs sexp
|
119
|
+
case sexp.sexp_type
|
120
|
+
when :masgn then
|
121
|
+
if sexp.size == 2 and sexp[1].sexp_type == :array then
|
122
|
+
s(:masgn, *sexp[1][1..-1].map { |sub| clean_mlhs sub })
|
124
123
|
else
|
125
|
-
|
124
|
+
sexp
|
126
125
|
end
|
126
|
+
when :gasgn, :iasgn, :lasgn, :cvasgn then
|
127
|
+
if sexp.size == 2 then
|
128
|
+
sexp.last
|
129
|
+
else
|
130
|
+
sexp # optional value
|
131
|
+
end
|
132
|
+
else
|
133
|
+
raise "unsupported type: #{sexp.inspect}"
|
127
134
|
end
|
135
|
+
end
|
128
136
|
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
end
|
133
|
-
|
134
|
-
result = if ary.length > 2 or ary.splat then
|
135
|
-
s(:masgn, ary)
|
136
|
-
else
|
137
|
-
ary.last
|
138
|
-
end
|
139
|
-
|
137
|
+
def block_var *args
|
138
|
+
result = self.args args
|
139
|
+
result[0] = :masgn
|
140
140
|
result
|
141
141
|
end
|
142
142
|
|
143
|
-
def
|
144
|
-
|
143
|
+
def block_var18 ary, splat, block
|
144
|
+
ary ||= s(:array)
|
145
145
|
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
raise "wtf? #{lasgn.inspect}" unless lasgn[0] == :lasgn
|
150
|
-
result << lasgn[1]
|
151
|
-
end
|
146
|
+
if splat then
|
147
|
+
splat = splat[1] unless Symbol === splat
|
148
|
+
ary << "*#{splat}".to_sym
|
152
149
|
end
|
153
150
|
|
154
|
-
|
151
|
+
ary << "&#{block[1]}".to_sym if block
|
155
152
|
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
153
|
+
if ary.length > 2 or ary.splat then # HACK
|
154
|
+
s(:masgn, *ary[1..-1])
|
155
|
+
else
|
156
|
+
ary.last
|
157
|
+
end
|
161
158
|
end
|
162
159
|
|
163
|
-
def
|
160
|
+
def args args
|
164
161
|
result = s(:args)
|
165
|
-
block = nil
|
166
162
|
|
167
|
-
|
168
|
-
case
|
163
|
+
args.each do |arg|
|
164
|
+
case arg
|
169
165
|
when Sexp then
|
170
|
-
case
|
171
|
-
when :args then
|
172
|
-
|
173
|
-
result << name
|
174
|
-
end
|
166
|
+
case arg.sexp_type
|
167
|
+
when :args, :block, :array then
|
168
|
+
result.concat arg[1..-1]
|
175
169
|
when :block_arg then
|
176
|
-
result << :"&#{
|
177
|
-
when :
|
178
|
-
|
179
|
-
val[1..-1].each do |lasgn| # FIX clean sexp iter
|
180
|
-
raise "wtf? #{val.inspect}" unless lasgn[0] == :lasgn
|
181
|
-
result << lasgn[1]
|
182
|
-
end
|
183
|
-
when :lasgn then
|
184
|
-
result << val
|
170
|
+
result << :"&#{arg.last}"
|
171
|
+
when :masgn then
|
172
|
+
result << arg
|
185
173
|
else
|
186
|
-
raise "unhandled
|
174
|
+
raise "unhandled: #{arg.inspect}"
|
187
175
|
end
|
188
176
|
when Symbol then
|
189
|
-
result <<
|
177
|
+
result << arg
|
190
178
|
when ",", nil then
|
191
179
|
# ignore
|
192
180
|
else
|
193
|
-
raise "unhandled
|
181
|
+
raise "unhandled: #{arg.inspect}"
|
194
182
|
end
|
195
183
|
end
|
196
184
|
|
197
|
-
result << block if block
|
198
|
-
|
199
185
|
result
|
200
186
|
end
|
201
187
|
|
202
|
-
def block_args19 val, id
|
203
|
-
# HACK OMG THIS CODE IS SOOO UGLY! CLEAN ME
|
204
|
-
untested = %w[1 2 3 4 7 9 10 12 14]
|
205
|
-
raise "no block_args19 #{id}\non: #{val.inspect}" if untested.include? id
|
206
|
-
|
207
|
-
r = s(:array)
|
208
|
-
|
209
|
-
val.compact.each do |v|
|
210
|
-
next if %w[,].include? v
|
211
|
-
case v
|
212
|
-
when Sexp then
|
213
|
-
case v.first
|
214
|
-
when :args then
|
215
|
-
r.concat v[1..-1].map { |s| # FIX: this is a smell
|
216
|
-
case s
|
217
|
-
when Symbol then
|
218
|
-
s(:lasgn, s)
|
219
|
-
when Sexp then
|
220
|
-
s
|
221
|
-
else
|
222
|
-
raise "unhandled type: #{s.inspect}"
|
223
|
-
end
|
224
|
-
}
|
225
|
-
when :block_arg then
|
226
|
-
r << s(:lasgn, :"&#{v.last}")
|
227
|
-
when :lasgn then
|
228
|
-
r << s(:masgn, s(:array, v))
|
229
|
-
when :masgn then
|
230
|
-
r << v
|
231
|
-
else
|
232
|
-
raise "block_args19 #{id} unhandled sexp type:: #{v.inspect}"
|
233
|
-
end
|
234
|
-
when Symbol
|
235
|
-
case v.to_s
|
236
|
-
when /^\*(.+)/ then
|
237
|
-
r << s(:splat, s(:lasgn, $1.to_sym))
|
238
|
-
when /^\*/ then
|
239
|
-
r << s(:splat)
|
240
|
-
else
|
241
|
-
raise "block_args19 #{id} unhandled symbol type:: #{v.inspect}"
|
242
|
-
end
|
243
|
-
else
|
244
|
-
raise "block_args19 #{id} unhandled type:: #{v.inspect}"
|
245
|
-
end
|
246
|
-
end
|
247
|
-
|
248
|
-
if r.size > 2 then
|
249
|
-
r = s(:masgn, r)
|
250
|
-
elsif r.size == 2 then
|
251
|
-
case r.last.first
|
252
|
-
when :splat then
|
253
|
-
r = s(:masgn, r)
|
254
|
-
when :lasgn, :masgn then
|
255
|
-
r = r.last
|
256
|
-
else
|
257
|
-
raise "oh noes!: #{r.inspect}"
|
258
|
-
end
|
259
|
-
else
|
260
|
-
raise "totally borked: #{r.inspect}"
|
261
|
-
end
|
262
|
-
|
263
|
-
r
|
264
|
-
end
|
265
|
-
|
266
188
|
def aryset receiver, index
|
267
189
|
s(:attrasgn, receiver, :"[]=", *index[1..-1])
|
268
190
|
end
|
@@ -683,10 +605,18 @@ module RubyParserStuff
|
|
683
605
|
end
|
684
606
|
|
685
607
|
def new_iter call, args, body
|
608
|
+
body ||= nil
|
609
|
+
|
610
|
+
args ||= s(:args)
|
611
|
+
args = s(:args, args) if Symbol === args
|
612
|
+
|
686
613
|
result = s(:iter)
|
687
614
|
result << call if call
|
688
615
|
result << args
|
689
616
|
result << body if body
|
617
|
+
|
618
|
+
args[0] = :args unless args == 0
|
619
|
+
|
690
620
|
result
|
691
621
|
end
|
692
622
|
|