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/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
- result = block_var val[0], nil, nil
1215
+ args, = val
1216
+
1217
+ result = block_var args
1217
1218
  }
1218
1219
  | f_marg_list tCOMMA tSTAR f_norm_arg
1219
1220
  {
1220
- result = block_var val[0], val[3], nil
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
- raise "no10\non: #{val.inspect}"
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
- raise "no11\non: #{val.inspect}"
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
- raise "no12\non: #{val.inspect}"
1239
+ args, _, _, _, args2 = val
1240
+
1241
+ result = block_var args, :*, args2
1233
1242
  }
1234
1243
  | tSTAR f_norm_arg
1235
1244
  {
1236
- raise "no13\non: #{val.inspect}"
1245
+ _, splat = val
1246
+
1247
+ result = block_var :"*#{splat}"
1237
1248
  }
1238
1249
  | tSTAR f_norm_arg tCOMMA f_marg_list
1239
1250
  {
1240
- raise "no14\non: #{val.inspect}"
1251
+ _, splat, _, args = val
1252
+
1253
+ result = block_var :"*#{splat}", args
1241
1254
  }
1242
1255
  | tSTAR
1243
1256
  {
1244
- raise "no15\non: #{val.inspect}"
1257
+ result = block_var :*
1245
1258
  }
1246
1259
  | tSTAR tCOMMA f_marg_list
1247
1260
  {
1248
- raise "no16\non: #{val.inspect}"
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 = block_args19 val, "1"
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 = block_args19 val, "2"
1272
+ result = args val
1258
1273
  }
1259
1274
  | f_arg tCOMMA f_block_optarg opt_f_block_arg
1260
1275
  {
1261
- arg, _, opt, block = val
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 = block_args19 val, "4"
1280
+ result = args val
1271
1281
  }
1272
1282
  | f_arg tCOMMA f_rest_arg opt_f_block_arg
1273
1283
  {
1274
- result = block_args19 val, "5"
1284
+ result = args val
1275
1285
  }
1276
1286
  | f_arg tCOMMA
1277
1287
  {
1278
- result = block_args19 val, "6"
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 = block_args19 val, "7"
1292
+ result = args val
1283
1293
  }
1284
1294
  | f_arg opt_f_block_arg
1285
1295
  {
1286
- result = block_args19 val, "8"
1296
+ result = args val
1287
1297
  }
1288
1298
  | f_block_optarg tCOMMA f_rest_arg opt_f_block_arg
1289
1299
  {
1290
- result = block_args19 val, "9"
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 = block_args19 val, "10"
1304
+ result = args val
1295
1305
  }
1296
1306
  | f_block_optarg opt_f_block_arg
1297
1307
  {
1298
- opt, block = val
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 = block_args19 val, "12"
1312
+ result = args val
1308
1313
  }
1309
1314
  | f_rest_arg opt_f_block_arg
1310
1315
  {
1311
- result = block_args19 val, "13"
1316
+ result = args val
1312
1317
  }
1313
1318
  | f_rest_arg tCOMMA f_arg opt_f_block_arg
1314
1319
  {
1315
- rest, _, args, block = val
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 = block_args19 val, "15"
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
- case val[0].size
1366
- when 1
1367
- args = 0
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 = s(:iter, call, args, val[1])
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
- vars = val[2]
1404
+ args = val[2]
1409
1405
  body = val[4]
1410
- result = new_iter nil, vars, body
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
- # REFACTOR
1490
- args = val[2]
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[2]
1508
- body = val[4]
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[1], val[2], val[4], val[5]
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
- if (val[1] != nil) then
1558
- result = val[1]
1559
- else
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 rescue body: #{val[2].inspect}"
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__ { result = s(:str, "Unsupported!") }
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 = args19 val
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 = args19 val
1836
+ result = args val
1834
1837
  }
1835
1838
  | f_arg tCOMMA f_optarg opt_f_block_arg
1836
1839
  {
1837
- result = args19 val
1840
+ result = args val
1838
1841
  }
1839
1842
  | f_arg tCOMMA f_optarg tCOMMA f_arg opt_f_block_arg
1840
1843
  {
1841
- result = args19 val
1844
+ result = args val
1842
1845
  }
1843
1846
  | f_arg tCOMMA f_rest_arg opt_f_block_arg
1844
1847
  {
1845
- result = args19 val
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 = args19 val
1852
+ result = args val
1850
1853
  }
1851
1854
  | f_arg opt_f_block_arg
1852
1855
  {
1853
- result = args19 val
1856
+ result = args val
1854
1857
  }
1855
1858
  | f_optarg tCOMMA f_rest_arg opt_f_block_arg
1856
1859
  {
1857
- result = args19 val
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 = args19 val
1864
+ result = args val
1862
1865
  }
1863
1866
  | f_optarg opt_f_block_arg
1864
1867
  {
1865
- result = args19 val
1868
+ result = args val
1866
1869
  }
1867
1870
  | f_optarg tCOMMA f_arg opt_f_block_arg
1868
1871
  {
1869
- result = args19 val
1872
+ result = args val
1870
1873
  }
1871
1874
  | f_rest_arg opt_f_block_arg
1872
1875
  {
1873
- result = args19 val
1876
+ result = args val
1874
1877
  }
1875
1878
  | f_rest_arg tCOMMA f_arg opt_f_block_arg
1876
1879
  {
1877
- result = args19 val
1880
+ result = args val
1878
1881
  }
1879
1882
  | f_block_arg
1880
1883
  {
1881
- result = args19 val
1884
+ result = args val
1882
1885
  }
1883
1886
  |
1884
1887
  {
1885
- result = args19 val
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].to_sym
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
- val[0] << val[2]
1938
- result = val[0]
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 = s(:block_arg, identifier.to_sym)
2001
+ result = "&#{identifier}".to_sym
1995
2002
  }
1996
2003
 
1997
2004
  opt_f_block_arg: tCOMMA f_block_arg
@@ -85,7 +85,7 @@ class RPStringScanner < StringScanner
85
85
  end
86
86
 
87
87
  module RubyParserStuff
88
- VERSION = '3.0.0.a9' unless constants.include? "VERSION" # SIGH
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 block_var ary, splat, block
119
- ary ||= s(:array)
120
-
121
- if splat then
122
- if splat == s(:splat) then
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
- ary << s(:splat, splat)
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
- if block then
130
- block[-1] = :"&#{block[-1]}"
131
- ary << block
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 args arg, optarg, rest_arg, block_arg, post_arg = nil
144
- arg ||= s(:args)
143
+ def block_var18 ary, splat, block
144
+ ary ||= s(:array)
145
145
 
146
- result = arg
147
- if optarg then
148
- optarg[1..-1].each do |lasgn| # FIX clean sexp iter
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
- result << rest_arg if rest_arg
151
+ ary << "&#{block[1]}".to_sym if block
155
152
 
156
- result << :"&#{block_arg.last}" if block_arg
157
- result << optarg if optarg # TODO? huh - processed above as well
158
- post_arg[1..-1].each {|pa| result << pa } if post_arg
159
-
160
- result
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 args19 vals # TODO: migrate to args once 1.8 tests pass as well
160
+ def args args
164
161
  result = s(:args)
165
- block = nil
166
162
 
167
- vals.each do |val|
168
- case val
163
+ args.each do |arg|
164
+ case arg
169
165
  when Sexp then
170
- case val.first
171
- when :args then
172
- val[1..-1].each do |name|
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 << :"&#{val.last}"
177
- when :block then
178
- block = val
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 sexp: #{val.inspect}"
174
+ raise "unhandled: #{arg.inspect}"
187
175
  end
188
176
  when Symbol then
189
- result << val
177
+ result << arg
190
178
  when ",", nil then
191
179
  # ignore
192
180
  else
193
- raise "unhandled val: #{val.inspect} in #{vals.inspect}"
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