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.
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 tDOT tIDENTIFIER tOP_ASGN command_call
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 tDOT tCONSTANT tOP_ASGN command_call
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 tDOT operation2 command_args =tLOWEST
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 tLONELY operation2 command_args =tLOWEST
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 tDOT tIDENTIFIER
457
+ | primary_value call_op tIDENTIFIER
455
458
  {
456
- result = s(:attrasgn, val[0], :"#{val[2]}=")
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 tDOT tCONSTANT
465
+ | primary_value call_op tCONSTANT
467
466
  {
468
- result = s(:attrasgn, val[0], :"#{val[2]}=")
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 tDOT tIDENTIFIER # REFACTOR
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 = s(:safe_attrasgn, val[0], :"#{val[2]}=")
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 tDOT tCONSTANT # REFACTOR?
513
+ | primary_value call_op tCONSTANT # REFACTOR?
523
514
  {
524
- result = s(:attrasgn, val[0], :"#{val[2]}=")
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 tDOT tIDENTIFIER tOP_ASGN arg
632
+ | primary_value call_op tIDENTIFIER tOP_ASGN arg
646
633
  {
647
- result = s(:op_asgn2, val[0], :"#{val[2]}=", val[3].to_sym, val[4])
634
+ result = new_op_asgn2 val
648
635
  }
649
- | primary_value tDOT tCONSTANT tOP_ASGN arg
636
+ | primary_value call_op tCONSTANT tOP_ASGN arg
650
637
  {
651
- result = s(:op_asgn2, val[0], :"#{val[2]}=", val[3].to_sym, val[4])
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 tDOT operation2 opt_paren_args
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 tDOT paren_args
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 = :expr_beg
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 tDOT tIDENTIFIER tOP_ASGN command_call
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 tDOT tCONSTANT tOP_ASGN command_call
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 tDOT operation2 command_args =tLOWEST
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
- #if defined(RUBY23)
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 tDOT tIDENTIFIER
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 = s(:attrasgnx, val[0], :"#{val[2]}=")
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 tDOT tCONSTANT
481
+ | primary_value call_op tCONSTANT
487
482
  {
488
- result = s(:attrasgn, val[0], :"#{val[2]}=")
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 tDOT tIDENTIFIER # REFACTOR
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 = s(:safe_attrasgn, val[0], :"#{val[2]}=")
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 tDOT tCONSTANT # REFACTOR?
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 = s(:safe_attrasgn, val[0], :"#{val[2]}=")
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 tDOT tIDENTIFIER tOP_ASGN arg
651
+ | primary_value call_op tIDENTIFIER tOP_ASGN arg
675
652
  {
676
- result = s(:op_asgn2, val[0], :"#{val[2]}=", val[3].to_sym, val[4])
653
+ result = new_op_asgn2 val
677
654
  }
678
- | primary_value tDOT tCONSTANT tOP_ASGN arg
655
+ | primary_value call_op tCONSTANT tOP_ASGN arg
679
656
  {
680
- result = s(:op_asgn2, val[0], :"#{val[2]}=", val[3].to_sym, val[4])
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 tDOT operation2 opt_paren_args
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 tDOT paren_args
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 = :expr_beg
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
@@ -91,7 +91,7 @@ class RPStringScanner < StringScanner
91
91
  end
92
92
 
93
93
  module RubyParserStuff
94
- VERSION = "3.8.1" unless constants.include? "VERSION" # SIGH
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 = s(:call, recv, meth)
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]