ruby_parser 3.8.1 → 3.8.2
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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +2 -2
- data/History.txt +7 -0
- data/lib/ruby18_parser.rb +1 -1
- data/lib/ruby19_parser.rb +1 -1
- data/lib/ruby20_parser.rb +2365 -2360
- data/lib/ruby20_parser.y +33 -24
- data/lib/ruby21_parser.rb +2480 -2478
- data/lib/ruby21_parser.y +33 -24
- data/lib/ruby22_parser.rb +2405 -2398
- data/lib/ruby22_parser.y +33 -24
- data/lib/ruby23_parser.rb +3198 -3286
- data/lib/ruby23_parser.y +34 -55
- data/lib/ruby_parser.yy +36 -69
- data/lib/ruby_parser_extras.rb +43 -3
- data/test/test_ruby_parser.rb +42 -1
- metadata +4 -18
- metadata.gz.sig +0 -0
data/lib/ruby23_parser.y
CHANGED
@@ -185,13 +185,21 @@ rule
|
|
185
185
|
{
|
186
186
|
result = s(:op_asgn1, val[0], val[2], val[4].to_sym, val[5])
|
187
187
|
}
|
188
|
-
| primary_value
|
188
|
+
| primary_value call_op tIDENTIFIER tOP_ASGN command_call
|
189
189
|
{
|
190
190
|
result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym)
|
191
|
+
if val[1] == '&.'
|
192
|
+
result[0] = :safe_op_asgn
|
193
|
+
end
|
194
|
+
result.line = val[0].line
|
191
195
|
}
|
192
|
-
| primary_value
|
196
|
+
| primary_value call_op tCONSTANT tOP_ASGN command_call
|
193
197
|
{
|
194
198
|
result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym)
|
199
|
+
if val[1] == '&.'
|
200
|
+
result[0] = :safe_op_asgn
|
201
|
+
end
|
202
|
+
result.line = val[0].line
|
195
203
|
}
|
196
204
|
| primary_value tCOLON2 tCONSTANT tOP_ASGN command_call
|
197
205
|
{
|
@@ -297,19 +305,14 @@ rule
|
|
297
305
|
result.insert 1, operation
|
298
306
|
end
|
299
307
|
}
|
300
|
-
| primary_value
|
308
|
+
| primary_value call_op operation2 command_args =tLOWEST
|
301
309
|
{
|
302
|
-
result = new_call val[0], val[2].to_sym, val[3]
|
310
|
+
result = new_call val[0], val[2].to_sym, val[3], val[1]
|
303
311
|
}
|
304
|
-
| primary_value
|
305
|
-
{
|
306
|
-
result = new_call val[0], val[2].to_sym, val[3]
|
307
|
-
result[0] = :safe_call
|
308
|
-
}
|
309
|
-
| primary_value tDOT operation2 command_args cmd_brace_block
|
312
|
+
| primary_value call_op operation2 command_args cmd_brace_block
|
310
313
|
{
|
311
314
|
recv, _, msg, args, block = val
|
312
|
-
call = new_call recv, msg.to_sym, args
|
315
|
+
call = new_call recv, msg.to_sym, args, val[1]
|
313
316
|
|
314
317
|
block_dup_check call, block
|
315
318
|
|
@@ -451,25 +454,17 @@ rule
|
|
451
454
|
{
|
452
455
|
result = self.aryset val[0], val[2]
|
453
456
|
}
|
454
|
-
| primary_value
|
457
|
+
| primary_value call_op tIDENTIFIER
|
455
458
|
{
|
456
|
-
result =
|
457
|
-
}
|
458
|
-
| primary_value tLONELY tIDENTIFIER
|
459
|
-
{
|
460
|
-
result = s(:attrasgnx, val[0], :"#{val[2]}=")
|
459
|
+
result = new_attrasgn val[0], val[2], val[1]
|
461
460
|
}
|
462
461
|
| primary_value tCOLON2 tIDENTIFIER
|
463
462
|
{
|
464
463
|
result = s(:attrasgn, val[0], :"#{val[2]}=")
|
465
464
|
}
|
466
|
-
| primary_value
|
465
|
+
| primary_value call_op tCONSTANT
|
467
466
|
{
|
468
|
-
result =
|
469
|
-
}
|
470
|
-
| primary_value tLONELY tCONSTANT
|
471
|
-
{
|
472
|
-
result = s(:attrasgnx, val[0], :"#{val[2]}=")
|
467
|
+
result = new_attrasgn val[0], val[2], val[1]
|
473
468
|
}
|
474
469
|
| primary_value tCOLON2 tCONSTANT
|
475
470
|
{
|
@@ -507,25 +502,17 @@ rule
|
|
507
502
|
{
|
508
503
|
result = self.aryset val[0], val[2]
|
509
504
|
}
|
510
|
-
| primary_value
|
511
|
-
{
|
512
|
-
result = s(:attrasgn, val[0], :"#{val[2]}=")
|
513
|
-
}
|
514
|
-
| primary_value tLONELY tIDENTIFIER
|
505
|
+
| primary_value call_op tIDENTIFIER # REFACTOR
|
515
506
|
{
|
516
|
-
result =
|
507
|
+
result = new_attrasgn val[0], val[2], val[1]
|
517
508
|
}
|
518
509
|
| primary_value tCOLON2 tIDENTIFIER
|
519
510
|
{
|
520
511
|
result = s(:attrasgn, val[0], :"#{val[2]}=")
|
521
512
|
}
|
522
|
-
| primary_value
|
513
|
+
| primary_value call_op tCONSTANT # REFACTOR?
|
523
514
|
{
|
524
|
-
result =
|
525
|
-
}
|
526
|
-
| primary_value tLONELY tCONSTANT
|
527
|
-
{
|
528
|
-
result = s(:safe_attrasgn, val[0], :"#{val[2]}=")
|
515
|
+
result = new_attrasgn val[0], val[2], val[1]
|
529
516
|
}
|
530
517
|
| primary_value tCOLON2 tCONSTANT
|
531
518
|
{
|
@@ -642,13 +629,13 @@ rule
|
|
642
629
|
val[2][0] = :arglist if val[2]
|
643
630
|
result = s(:op_asgn1, val[0], val[2], val[4].to_sym, val[5])
|
644
631
|
}
|
645
|
-
| primary_value
|
632
|
+
| primary_value call_op tIDENTIFIER tOP_ASGN arg
|
646
633
|
{
|
647
|
-
result =
|
634
|
+
result = new_op_asgn2 val
|
648
635
|
}
|
649
|
-
| primary_value
|
636
|
+
| primary_value call_op tCONSTANT tOP_ASGN arg
|
650
637
|
{
|
651
|
-
result =
|
638
|
+
result = new_op_asgn2 val
|
652
639
|
}
|
653
640
|
| primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg
|
654
641
|
{
|
@@ -1567,14 +1554,9 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1567
1554
|
args = self.call_args val[2..-1]
|
1568
1555
|
result = val[0].concat args[1..-1]
|
1569
1556
|
}
|
1570
|
-
| primary_value
|
1571
|
-
{
|
1572
|
-
result = new_call val[0], val[2].to_sym, val[3]
|
1573
|
-
}
|
1574
|
-
| primary_value tLONELY operation2 opt_paren_args
|
1557
|
+
| primary_value call_op operation2 opt_paren_args
|
1575
1558
|
{
|
1576
|
-
result = new_call val[0], val[2].to_sym, val[3]
|
1577
|
-
result[0] = :safe_call
|
1559
|
+
result = new_call val[0], val[2].to_sym, val[3], val[1]
|
1578
1560
|
}
|
1579
1561
|
| primary_value tCOLON2 operation2 paren_args
|
1580
1562
|
{
|
@@ -1584,14 +1566,9 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1584
1566
|
{
|
1585
1567
|
result = new_call val[0], val[2].to_sym
|
1586
1568
|
}
|
1587
|
-
| primary_value
|
1569
|
+
| primary_value call_op paren_args
|
1588
1570
|
{
|
1589
|
-
result = new_call val[0], :call, val[2]
|
1590
|
-
}
|
1591
|
-
| primary_value tLONELY paren_args
|
1592
|
-
{
|
1593
|
-
result = new_call val[0], :call, val[2]
|
1594
|
-
result[0] = :safe_call
|
1571
|
+
result = new_call val[0], :call, val[2], val[1]
|
1595
1572
|
}
|
1596
1573
|
| primary_value tCOLON2 paren_args
|
1597
1574
|
{
|
@@ -1868,7 +1845,7 @@ regexp_contents: none
|
|
1868
1845
|
result = lexer.lex_strterm
|
1869
1846
|
|
1870
1847
|
lexer.lex_strterm = nil
|
1871
|
-
lexer.lex_state = :expr_beg
|
1848
|
+
lexer.lex_state = :expr_beg # TODO: expr_value ?
|
1872
1849
|
}
|
1873
1850
|
string_dvar
|
1874
1851
|
{
|
@@ -1889,7 +1866,7 @@ regexp_contents: none
|
|
1889
1866
|
lexer.brace_nest = 0
|
1890
1867
|
lexer.string_nest = 0
|
1891
1868
|
|
1892
|
-
lexer.lex_state = :
|
1869
|
+
lexer.lex_state = :expr_value
|
1893
1870
|
}
|
1894
1871
|
compstmt tRCURLY
|
1895
1872
|
{
|
@@ -2398,6 +2375,8 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
2398
2375
|
operation2: tIDENTIFIER | tCONSTANT | tFID | op
|
2399
2376
|
operation3: tIDENTIFIER | tFID | op
|
2400
2377
|
dot_or_colon: tDOT | tCOLON2
|
2378
|
+
call_op: tDOT
|
2379
|
+
| tLONELY
|
2401
2380
|
opt_terms: | terms
|
2402
2381
|
opt_nl: | tNL
|
2403
2382
|
rparen: opt_nl tRPAREN
|
data/lib/ruby_parser.yy
CHANGED
@@ -195,13 +195,21 @@ rule
|
|
195
195
|
{
|
196
196
|
result = s(:op_asgn1, val[0], val[2], val[4].to_sym, val[5])
|
197
197
|
}
|
198
|
-
| primary_value
|
198
|
+
| primary_value call_op tIDENTIFIER tOP_ASGN command_call
|
199
199
|
{
|
200
200
|
result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym)
|
201
|
+
if val[1] == '&.'
|
202
|
+
result[0] = :safe_op_asgn
|
203
|
+
end
|
204
|
+
result.line = val[0].line
|
201
205
|
}
|
202
|
-
| primary_value
|
206
|
+
| primary_value call_op tCONSTANT tOP_ASGN command_call
|
203
207
|
{
|
204
208
|
result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym)
|
209
|
+
if val[1] == '&.'
|
210
|
+
result[0] = :safe_op_asgn
|
211
|
+
end
|
212
|
+
result.line = val[0].line
|
205
213
|
}
|
206
214
|
| primary_value tCOLON2 tCONSTANT tOP_ASGN command_call
|
207
215
|
{
|
@@ -313,21 +321,14 @@ rule
|
|
313
321
|
result.insert 1, operation
|
314
322
|
end
|
315
323
|
}
|
316
|
-
| primary_value
|
324
|
+
| primary_value call_op operation2 command_args =tLOWEST
|
317
325
|
{
|
318
|
-
result = new_call val[0], val[2].to_sym, val[3]
|
326
|
+
result = new_call val[0], val[2].to_sym, val[3], val[1]
|
319
327
|
}
|
320
|
-
|
321
|
-
| primary_value tLONELY operation2 command_args =tLOWEST
|
322
|
-
{
|
323
|
-
result = new_call val[0], val[2].to_sym, val[3]
|
324
|
-
result[0] = :safe_call
|
325
|
-
}
|
326
|
-
#endif
|
327
|
-
| primary_value tDOT operation2 command_args cmd_brace_block
|
328
|
+
| primary_value call_op operation2 command_args cmd_brace_block
|
328
329
|
{
|
329
330
|
recv, _, msg, args, block = val
|
330
|
-
call = new_call recv, msg.to_sym, args
|
331
|
+
call = new_call recv, msg.to_sym, args, val[1]
|
331
332
|
|
332
333
|
block_dup_check call, block
|
333
334
|
|
@@ -469,30 +470,18 @@ rule
|
|
469
470
|
{
|
470
471
|
result = self.aryset val[0], val[2]
|
471
472
|
}
|
472
|
-
| primary_value
|
473
|
-
{
|
474
|
-
result = s(:attrasgn, val[0], :"#{val[2]}=")
|
475
|
-
}
|
476
|
-
#if defined(RUBY23)
|
477
|
-
| primary_value tLONELY tIDENTIFIER
|
473
|
+
| primary_value call_op tIDENTIFIER
|
478
474
|
{
|
479
|
-
result =
|
475
|
+
result = new_attrasgn val[0], val[2], val[1]
|
480
476
|
}
|
481
|
-
#endif
|
482
477
|
| primary_value tCOLON2 tIDENTIFIER
|
483
478
|
{
|
484
479
|
result = s(:attrasgn, val[0], :"#{val[2]}=")
|
485
480
|
}
|
486
|
-
| primary_value
|
481
|
+
| primary_value call_op tCONSTANT
|
487
482
|
{
|
488
|
-
result =
|
483
|
+
result = new_attrasgn val[0], val[2], val[1]
|
489
484
|
}
|
490
|
-
#if defined(RUBY23)
|
491
|
-
| primary_value tLONELY tCONSTANT
|
492
|
-
{
|
493
|
-
result = s(:attrasgnx, val[0], :"#{val[2]}=")
|
494
|
-
}
|
495
|
-
#endif
|
496
485
|
| primary_value tCOLON2 tCONSTANT
|
497
486
|
{
|
498
487
|
if (self.in_def || self.in_single > 0) then
|
@@ -529,30 +518,18 @@ rule
|
|
529
518
|
{
|
530
519
|
result = self.aryset val[0], val[2]
|
531
520
|
}
|
532
|
-
| primary_value
|
533
|
-
{
|
534
|
-
result = s(:attrasgn, val[0], :"#{val[2]}=")
|
535
|
-
}
|
536
|
-
#if defined(RUBY23)
|
537
|
-
| primary_value tLONELY tIDENTIFIER
|
521
|
+
| primary_value call_op tIDENTIFIER # REFACTOR
|
538
522
|
{
|
539
|
-
result =
|
523
|
+
result = new_attrasgn val[0], val[2], val[1]
|
540
524
|
}
|
541
|
-
#endif
|
542
525
|
| primary_value tCOLON2 tIDENTIFIER
|
543
526
|
{
|
544
527
|
result = s(:attrasgn, val[0], :"#{val[2]}=")
|
545
528
|
}
|
546
|
-
| primary_value
|
547
|
-
{
|
548
|
-
result = s(:attrasgn, val[0], :"#{val[2]}=")
|
549
|
-
}
|
550
|
-
#if defined(RUBY23)
|
551
|
-
| primary_value tLONELY tCONSTANT
|
529
|
+
| primary_value call_op tCONSTANT # REFACTOR?
|
552
530
|
{
|
553
|
-
result =
|
531
|
+
result = new_attrasgn val[0], val[2], val[1]
|
554
532
|
}
|
555
|
-
#endif
|
556
533
|
| primary_value tCOLON2 tCONSTANT
|
557
534
|
{
|
558
535
|
if (self.in_def || self.in_single > 0) then
|
@@ -671,13 +648,13 @@ rule
|
|
671
648
|
val[2][0] = :arglist if val[2]
|
672
649
|
result = s(:op_asgn1, val[0], val[2], val[4].to_sym, val[5])
|
673
650
|
}
|
674
|
-
| primary_value
|
651
|
+
| primary_value call_op tIDENTIFIER tOP_ASGN arg
|
675
652
|
{
|
676
|
-
result =
|
653
|
+
result = new_op_asgn2 val
|
677
654
|
}
|
678
|
-
| primary_value
|
655
|
+
| primary_value call_op tCONSTANT tOP_ASGN arg
|
679
656
|
{
|
680
|
-
result =
|
657
|
+
result = new_op_asgn2 val
|
681
658
|
}
|
682
659
|
| primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg
|
683
660
|
{
|
@@ -1606,17 +1583,10 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1606
1583
|
args = self.call_args val[2..-1]
|
1607
1584
|
result = val[0].concat args[1..-1]
|
1608
1585
|
}
|
1609
|
-
| primary_value
|
1610
|
-
{
|
1611
|
-
result = new_call val[0], val[2].to_sym, val[3]
|
1612
|
-
}
|
1613
|
-
#if defined(RUBY23)
|
1614
|
-
| primary_value tLONELY operation2 opt_paren_args
|
1586
|
+
| primary_value call_op operation2 opt_paren_args
|
1615
1587
|
{
|
1616
|
-
result = new_call val[0], val[2].to_sym, val[3]
|
1617
|
-
result[0] = :safe_call
|
1588
|
+
result = new_call val[0], val[2].to_sym, val[3], val[1]
|
1618
1589
|
}
|
1619
|
-
#endif
|
1620
1590
|
| primary_value tCOLON2 operation2 paren_args
|
1621
1591
|
{
|
1622
1592
|
result = new_call val[0], val[2].to_sym, val[3]
|
@@ -1625,17 +1595,10 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1625
1595
|
{
|
1626
1596
|
result = new_call val[0], val[2].to_sym
|
1627
1597
|
}
|
1628
|
-
| primary_value
|
1598
|
+
| primary_value call_op paren_args
|
1629
1599
|
{
|
1630
|
-
result = new_call val[0], :call, val[2]
|
1600
|
+
result = new_call val[0], :call, val[2], val[1]
|
1631
1601
|
}
|
1632
|
-
#if defined(RUBY23)
|
1633
|
-
| primary_value tLONELY paren_args
|
1634
|
-
{
|
1635
|
-
result = new_call val[0], :call, val[2]
|
1636
|
-
result[0] = :safe_call
|
1637
|
-
}
|
1638
|
-
#endif
|
1639
1602
|
| primary_value tCOLON2 paren_args
|
1640
1603
|
{
|
1641
1604
|
result = new_call val[0], :call, val[2]
|
@@ -1911,7 +1874,7 @@ regexp_contents: none
|
|
1911
1874
|
result = lexer.lex_strterm
|
1912
1875
|
|
1913
1876
|
lexer.lex_strterm = nil
|
1914
|
-
lexer.lex_state = :expr_beg
|
1877
|
+
lexer.lex_state = :expr_beg # TODO: expr_value ?
|
1915
1878
|
}
|
1916
1879
|
string_dvar
|
1917
1880
|
{
|
@@ -1932,7 +1895,7 @@ regexp_contents: none
|
|
1932
1895
|
lexer.brace_nest = 0
|
1933
1896
|
lexer.string_nest = 0
|
1934
1897
|
|
1935
|
-
lexer.lex_state = :
|
1898
|
+
lexer.lex_state = :expr_value
|
1936
1899
|
}
|
1937
1900
|
compstmt tRCURLY
|
1938
1901
|
{
|
@@ -2479,6 +2442,10 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
2479
2442
|
operation2: tIDENTIFIER | tCONSTANT | tFID | op
|
2480
2443
|
operation3: tIDENTIFIER | tFID | op
|
2481
2444
|
dot_or_colon: tDOT | tCOLON2
|
2445
|
+
call_op: tDOT
|
2446
|
+
#if defined(RUBY23)
|
2447
|
+
| tLONELY
|
2448
|
+
#endif
|
2482
2449
|
opt_terms: | terms
|
2483
2450
|
opt_nl: | tNL
|
2484
2451
|
rparen: opt_nl tRPAREN
|
data/lib/ruby_parser_extras.rb
CHANGED
@@ -91,7 +91,7 @@ class RPStringScanner < StringScanner
|
|
91
91
|
end
|
92
92
|
|
93
93
|
module RubyParserStuff
|
94
|
-
VERSION = "3.8.
|
94
|
+
VERSION = "3.8.2" unless constants.include? "VERSION" # SIGH
|
95
95
|
|
96
96
|
attr_accessor :lexer, :in_def, :in_single, :file
|
97
97
|
attr_reader :env, :comments
|
@@ -557,8 +557,15 @@ module RubyParserStuff
|
|
557
557
|
end
|
558
558
|
end
|
559
559
|
|
560
|
-
def new_call recv, meth, args = nil
|
561
|
-
result =
|
560
|
+
def new_call recv, meth, args = nil, call_op = :'.'
|
561
|
+
result = case call_op.to_sym
|
562
|
+
when :'.'
|
563
|
+
s(:call, recv, meth)
|
564
|
+
when :'&.'
|
565
|
+
s(:safe_call, recv, meth)
|
566
|
+
else
|
567
|
+
raise "unknown call operator: `#{type.inspect}`"
|
568
|
+
end
|
562
569
|
|
563
570
|
# TODO: need a test with f(&b) to produce block_pass
|
564
571
|
# TODO: need a test with f(&b) { } to produce warning
|
@@ -577,6 +584,22 @@ module RubyParserStuff
|
|
577
584
|
result
|
578
585
|
end
|
579
586
|
|
587
|
+
def new_attrasgn recv, meth, call_op
|
588
|
+
meth = :"#{meth}="
|
589
|
+
|
590
|
+
result = case call_op.to_sym
|
591
|
+
when :'.'
|
592
|
+
s(:attrasgn, recv, meth)
|
593
|
+
when :'&.'
|
594
|
+
s(:safe_attrasgn, recv, meth)
|
595
|
+
else
|
596
|
+
raise "unknown call operator: `#{type.inspect}`"
|
597
|
+
end
|
598
|
+
|
599
|
+
result.line = recv.line
|
600
|
+
result
|
601
|
+
end
|
602
|
+
|
580
603
|
def new_case expr, body, line
|
581
604
|
result = s(:case, expr)
|
582
605
|
|
@@ -745,6 +768,23 @@ module RubyParserStuff
|
|
745
768
|
result
|
746
769
|
end
|
747
770
|
|
771
|
+
def new_op_asgn2 val
|
772
|
+
recv, call_op, meth, op, arg = val
|
773
|
+
meth = :"#{meth}="
|
774
|
+
|
775
|
+
result = case call_op.to_sym
|
776
|
+
when :'.'
|
777
|
+
s(:op_asgn2, recv, meth, op.to_sym, arg)
|
778
|
+
when :'&.'
|
779
|
+
s(:safe_op_asgn2, recv, meth, op.to_sym, arg)
|
780
|
+
else
|
781
|
+
raise "unknown call operator: `#{type.inspect}`"
|
782
|
+
end
|
783
|
+
|
784
|
+
result.line = recv.line
|
785
|
+
result
|
786
|
+
end
|
787
|
+
|
748
788
|
def new_regexp val
|
749
789
|
node = val[1] || s(:str, '')
|
750
790
|
options = val[2]
|