ruby_parser 3.0.0.a9 → 3.0.0.a10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

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