brakeman 5.1.2 → 5.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES.md +21 -0
  3. data/bundle/load.rb +2 -2
  4. data/bundle/ruby/2.7.0/gems/{parallel-1.21.0 → parallel-1.22.1}/MIT-LICENSE.txt +0 -0
  5. data/bundle/ruby/2.7.0/gems/{parallel-1.21.0 → parallel-1.22.1}/lib/parallel/processor_count.rb +2 -3
  6. data/bundle/ruby/2.7.0/gems/parallel-1.22.1/lib/parallel/version.rb +4 -0
  7. data/bundle/ruby/2.7.0/gems/{parallel-1.21.0 → parallel-1.22.1}/lib/parallel.rb +84 -4
  8. data/bundle/ruby/2.7.0/gems/{ruby_parser-3.18.0 → ruby_parser-3.19.1}/History.rdoc +40 -0
  9. data/bundle/ruby/2.7.0/gems/{ruby_parser-3.18.0 → ruby_parser-3.19.1}/Manifest.txt +2 -0
  10. data/bundle/ruby/2.7.0/gems/{ruby_parser-3.18.0 → ruby_parser-3.19.1}/README.rdoc +8 -6
  11. data/bundle/ruby/2.7.0/gems/{ruby_parser-3.18.0 → ruby_parser-3.19.1}/compare/normalize.rb +0 -0
  12. data/bundle/ruby/2.7.0/gems/{ruby_parser-3.18.0 → ruby_parser-3.19.1}/debugging.md +0 -0
  13. data/bundle/ruby/2.7.0/gems/{ruby_parser-3.18.0 → ruby_parser-3.19.1}/gauntlet.md +19 -18
  14. data/bundle/ruby/2.7.0/gems/{ruby_parser-3.18.0 → ruby_parser-3.19.1}/lib/rp_extensions.rb +0 -0
  15. data/bundle/ruby/2.7.0/gems/{ruby_parser-3.18.0 → ruby_parser-3.19.1}/lib/rp_stringscanner.rb +0 -0
  16. data/bundle/ruby/2.7.0/gems/ruby_parser-3.19.1/lib/ruby20_parser.rb +10973 -0
  17. data/bundle/ruby/2.7.0/gems/{ruby_parser-3.18.0 → ruby_parser-3.19.1}/lib/ruby20_parser.y +23 -30
  18. data/bundle/ruby/2.7.0/gems/ruby_parser-3.19.1/lib/ruby21_parser.rb +10980 -0
  19. data/bundle/ruby/2.7.0/gems/{ruby_parser-3.18.0 → ruby_parser-3.19.1}/lib/ruby21_parser.y +23 -30
  20. data/bundle/ruby/2.7.0/gems/ruby_parser-3.19.1/lib/ruby22_parser.rb +11123 -0
  21. data/bundle/ruby/2.7.0/gems/{ruby_parser-3.18.0 → ruby_parser-3.19.1}/lib/ruby22_parser.y +23 -30
  22. data/bundle/ruby/2.7.0/gems/ruby_parser-3.19.1/lib/ruby23_parser.rb +11132 -0
  23. data/bundle/ruby/2.7.0/gems/{ruby_parser-3.18.0 → ruby_parser-3.19.1}/lib/ruby23_parser.y +23 -30
  24. data/bundle/ruby/2.7.0/gems/ruby_parser-3.19.1/lib/ruby24_parser.rb +11231 -0
  25. data/bundle/ruby/2.7.0/gems/{ruby_parser-3.18.0 → ruby_parser-3.19.1}/lib/ruby24_parser.y +23 -30
  26. data/bundle/ruby/2.7.0/gems/ruby_parser-3.19.1/lib/ruby25_parser.rb +11231 -0
  27. data/bundle/ruby/2.7.0/gems/{ruby_parser-3.18.0 → ruby_parser-3.19.1}/lib/ruby25_parser.y +23 -30
  28. data/bundle/ruby/2.7.0/gems/ruby_parser-3.19.1/lib/ruby26_parser.rb +11253 -0
  29. data/bundle/ruby/2.7.0/gems/{ruby_parser-3.18.0 → ruby_parser-3.19.1}/lib/ruby26_parser.y +23 -30
  30. data/bundle/ruby/2.7.0/gems/ruby_parser-3.19.1/lib/ruby27_parser.rb +12980 -0
  31. data/bundle/ruby/2.7.0/gems/{ruby_parser-3.18.0 → ruby_parser-3.19.1}/lib/ruby27_parser.y +28 -44
  32. data/bundle/ruby/2.7.0/gems/ruby_parser-3.19.1/lib/ruby30_parser.rb +13242 -0
  33. data/bundle/ruby/2.7.0/gems/{ruby_parser-3.18.0 → ruby_parser-3.19.1}/lib/ruby30_parser.y +77 -93
  34. data/bundle/ruby/2.7.0/gems/ruby_parser-3.19.1/lib/ruby31_parser.rb +13622 -0
  35. data/bundle/ruby/2.7.0/gems/{ruby_parser-3.18.0/lib/ruby3_parser.yy → ruby_parser-3.19.1/lib/ruby31_parser.y} +121 -107
  36. data/bundle/ruby/2.7.0/gems/ruby_parser-3.19.1/lib/ruby3_parser.yy +3536 -0
  37. data/bundle/ruby/2.7.0/gems/{ruby_parser-3.18.0 → ruby_parser-3.19.1}/lib/ruby_lexer.rb +0 -0
  38. data/bundle/ruby/2.7.0/gems/{ruby_parser-3.18.0 → ruby_parser-3.19.1}/lib/ruby_lexer.rex +0 -0
  39. data/bundle/ruby/2.7.0/gems/{ruby_parser-3.18.0 → ruby_parser-3.19.1}/lib/ruby_lexer.rex.rb +0 -0
  40. data/bundle/ruby/2.7.0/gems/{ruby_parser-3.18.0 → ruby_parser-3.19.1}/lib/ruby_lexer_strings.rb +0 -0
  41. data/bundle/ruby/2.7.0/gems/{ruby_parser-3.18.0 → ruby_parser-3.19.1}/lib/ruby_parser.rb +2 -0
  42. data/bundle/ruby/2.7.0/gems/{ruby_parser-3.18.0 → ruby_parser-3.19.1}/lib/ruby_parser.yy +28 -44
  43. data/bundle/ruby/2.7.0/gems/{ruby_parser-3.18.0 → ruby_parser-3.19.1}/lib/ruby_parser_extras.rb +55 -2
  44. data/bundle/ruby/2.7.0/gems/{ruby_parser-3.18.0 → ruby_parser-3.19.1}/tools/munge.rb +0 -0
  45. data/bundle/ruby/2.7.0/gems/{ruby_parser-3.18.0 → ruby_parser-3.19.1}/tools/ripper.rb +0 -0
  46. data/lib/brakeman/checks/base_check.rb +10 -0
  47. data/lib/brakeman/checks/check_eol_rails.rb +23 -0
  48. data/lib/brakeman/checks/check_eol_ruby.rb +26 -0
  49. data/lib/brakeman/checks/check_sql.rb +6 -4
  50. data/lib/brakeman/checks/check_symbol_dos.rb +1 -1
  51. data/lib/brakeman/checks/check_unsafe_reflection.rb +7 -2
  52. data/lib/brakeman/checks/eol_check.rb +47 -0
  53. data/lib/brakeman/options.rb +8 -0
  54. data/lib/brakeman/processors/alias_processor.rb +17 -1
  55. data/lib/brakeman/processors/gem_processor.rb +3 -0
  56. data/lib/brakeman/processors/lib/rails3_route_processor.rb +2 -0
  57. data/lib/brakeman/scanner.rb +3 -1
  58. data/lib/brakeman/tracker/config.rb +8 -1
  59. data/lib/brakeman/version.rb +1 -1
  60. data/lib/brakeman/warning_codes.rb +4 -0
  61. metadata +48 -43
  62. data/bundle/ruby/2.7.0/gems/parallel-1.21.0/lib/parallel/version.rb +0 -4
  63. data/bundle/ruby/2.7.0/gems/ruby_parser-3.18.0/lib/ruby20_parser.rb +0 -7122
  64. data/bundle/ruby/2.7.0/gems/ruby_parser-3.18.0/lib/ruby21_parser.rb +0 -7176
  65. data/bundle/ruby/2.7.0/gems/ruby_parser-3.18.0/lib/ruby22_parser.rb +0 -7222
  66. data/bundle/ruby/2.7.0/gems/ruby_parser-3.18.0/lib/ruby23_parser.rb +0 -7231
  67. data/bundle/ruby/2.7.0/gems/ruby_parser-3.18.0/lib/ruby24_parser.rb +0 -7262
  68. data/bundle/ruby/2.7.0/gems/ruby_parser-3.18.0/lib/ruby25_parser.rb +0 -7262
  69. data/bundle/ruby/2.7.0/gems/ruby_parser-3.18.0/lib/ruby26_parser.rb +0 -7281
  70. data/bundle/ruby/2.7.0/gems/ruby_parser-3.18.0/lib/ruby27_parser.rb +0 -8511
  71. data/bundle/ruby/2.7.0/gems/ruby_parser-3.18.0/lib/ruby30_parser.rb +0 -8741
@@ -1,10 +1,6 @@
1
1
  # -*- racc -*-
2
2
 
3
- #if V == 30
4
- class Ruby30Parser
5
- #else
6
- fail "version not specified or supported on code generation"
7
- #endif
3
+ class Ruby31Parser
8
4
 
9
5
  token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS
10
6
  kTHEN kELSIF kELSE kCASE kWHEN kWHILE kUNTIL kFOR kBREAK kNEXT
@@ -84,7 +80,7 @@ rule
84
80
  | klBEGIN
85
81
  {
86
82
  if (self.in_def || self.in_single > 0) then
87
- debug 11
83
+ debug 1
88
84
  yyerror "BEGIN in method"
89
85
  end
90
86
  self.env.extend
@@ -139,7 +135,7 @@ rule
139
135
  | error stmt
140
136
  {
141
137
  result = val[1]
142
- debug 12
138
+ debug 2
143
139
  }
144
140
 
145
141
  stmt_or_begin: stmt
@@ -211,7 +207,7 @@ rule
211
207
  (_, line), _, stmt, _ = val
212
208
 
213
209
  if (self.in_def || self.in_single > 0) then
214
- debug 13
210
+ debug 3
215
211
  yyerror "END in method; use at_exit"
216
212
  end
217
213
 
@@ -286,6 +282,22 @@ rule
286
282
 
287
283
  result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line
288
284
  }
285
+ | defn_head f_opt_paren_args tEQL command
286
+ {
287
+ result = new_endless_defn val
288
+ }
289
+ | defn_head f_opt_paren_args tEQL command kRESCUE_MOD arg
290
+ {
291
+ result = new_endless_defn val
292
+ }
293
+ | defs_head f_opt_paren_args tEQL command
294
+ {
295
+ result = new_endless_defs val
296
+ }
297
+ | defs_head f_opt_paren_args tEQL command kRESCUE_MOD arg
298
+ {
299
+ result = new_endless_defs val
300
+ }
289
301
  | backref tOP_ASGN command_rhs
290
302
  {
291
303
  self.backref_assign_error val[0]
@@ -339,7 +351,7 @@ rule
339
351
  self.in_kwarg = true
340
352
  self.env.extend
341
353
  }
342
- p_expr
354
+ p_top_expr_body
343
355
  {
344
356
  lhs, _, in_kwarg, rhs = val
345
357
 
@@ -359,7 +371,7 @@ rule
359
371
  self.in_kwarg = true
360
372
  self.env.extend
361
373
  }
362
- p_expr
374
+ p_top_expr_body
363
375
  {
364
376
  self.env.unextend
365
377
 
@@ -679,7 +691,7 @@ rule
679
691
  | primary_value tCOLON2 tCONSTANT
680
692
  {
681
693
  if (self.in_def || self.in_single > 0) then
682
- debug 14
694
+ debug 4
683
695
  yyerror "dynamic constant assignment"
684
696
  end
685
697
 
@@ -691,7 +703,7 @@ rule
691
703
  | tCOLON3 tCONSTANT
692
704
  {
693
705
  if (self.in_def || self.in_single > 0) then
694
- debug 15
706
+ debug 5
695
707
  yyerror "dynamic constant assignment"
696
708
  end
697
709
 
@@ -718,7 +730,7 @@ rule
718
730
 
719
731
  result = self.assignable var
720
732
 
721
- debug 16
733
+ debug 6
722
734
  }
723
735
  | primary_value tLBRACK2 opt_call_args rbracket
724
736
  {
@@ -749,7 +761,7 @@ rule
749
761
  expr, _, (id, _line) = val
750
762
 
751
763
  if (self.in_def || self.in_single > 0) then
752
- debug 17
764
+ debug 7
753
765
  yyerror "dynamic constant assignment"
754
766
  end
755
767
 
@@ -761,7 +773,7 @@ rule
761
773
  _, (id, l) = val
762
774
 
763
775
  if (self.in_def || self.in_single > 0) then
764
- debug 18
776
+ debug 8
765
777
  yyerror "dynamic constant assignment"
766
778
  end
767
779
 
@@ -780,8 +792,7 @@ rule
780
792
 
781
793
  cpath: tCOLON3 cname
782
794
  {
783
- _, (name, line) = val
784
- result = s(:colon3, name.to_sym).line line
795
+ result = wrap :colon3, val[1]
785
796
  }
786
797
  | cname
787
798
  {
@@ -806,9 +817,7 @@ rule
806
817
 
807
818
  fitem: fname
808
819
  {
809
- (id, line), = val
810
-
811
- result = s(:lit, id.to_sym).line line
820
+ result = wrap :lit, val[0]
812
821
  }
813
822
  | symbol
814
823
 
@@ -877,9 +886,9 @@ rule
877
886
  }
878
887
  | tCOLON3 tCONSTANT tOP_ASGN arg_rhs
879
888
  {
880
- _, (lhs, line), op, rhs = val
889
+ _, lhs, op, rhs = val
881
890
 
882
- lhs = s(:colon3, lhs.to_sym).line line
891
+ lhs = wrap :colon3, lhs
883
892
  result = new_const_op_asgn [lhs, op, rhs]
884
893
  }
885
894
  | backref tOP_ASGN arg_rhs
@@ -962,8 +971,8 @@ rule
962
971
  }
963
972
  | tUMINUS_NUM simple_numeric tPOW arg
964
973
  {
965
- _, (num, line), _, arg = val
966
- lit = s(:lit, num).line line
974
+ _, num, _, arg = val
975
+ lit = wrap :lit, num
967
976
  result = new_call(new_call(lit, :"**", argl(arg)), :"-@")
968
977
 
969
978
  }
@@ -1056,46 +1065,19 @@ rule
1056
1065
  }
1057
1066
  | defn_head f_opt_paren_args tEQL arg
1058
1067
  {
1059
- (name, line, in_def), args, _, body = val
1060
-
1061
- result = s(:defn, name, args, body).line line
1062
-
1063
- local_pop in_def
1064
- endless_method_name result
1068
+ result = new_endless_defn val
1065
1069
  }
1066
1070
  | defn_head f_opt_paren_args tEQL arg kRESCUE_MOD arg
1067
1071
  {
1068
- (name, line, in_def), args, _, body, _, resbody = val
1069
-
1070
- result = s(:defn, name, args,
1071
- new_rescue(body,
1072
- new_resbody(s(:array).line(line),
1073
- resbody))).line line
1074
-
1075
- local_pop in_def
1076
- endless_method_name result
1072
+ result = new_endless_defn val
1077
1073
  }
1078
1074
  | defs_head f_opt_paren_args tEQL arg
1079
1075
  {
1080
- (recv, (name, line, in_def)), args, _, body = val
1081
-
1082
- result = s(:defs, recv, name, args, body).line(line)
1083
-
1084
- self.in_single -= 1
1085
- local_pop in_def
1086
- endless_method_name result
1076
+ result = new_endless_defs val
1087
1077
  }
1088
1078
  | defs_head f_opt_paren_args tEQL arg kRESCUE_MOD arg
1089
1079
  {
1090
- (recv, (name, line, in_def)), args, _, body, _, resbody = val
1091
-
1092
- result = s(:defs, recv, name, args,
1093
- new_rescue(body,
1094
- new_resbody(s(:array).line(line),
1095
- resbody))).line line
1096
-
1097
- local_pop in_def
1098
- endless_method_name result
1080
+ result = new_endless_defs val
1099
1081
  }
1100
1082
  | primary
1101
1083
 
@@ -1251,6 +1233,11 @@ rule
1251
1233
  _, arg = val
1252
1234
  result = s(:block_pass, arg).line arg.line
1253
1235
  }
1236
+ | tAMPER
1237
+ {
1238
+ (_, line), = val
1239
+ result = s(:block_pass).line line
1240
+ }
1254
1241
 
1255
1242
  opt_block_arg: tCOMMA block_arg
1256
1243
  {
@@ -1370,9 +1357,7 @@ rule
1370
1357
  }
1371
1358
  | tCOLON3 tCONSTANT
1372
1359
  {
1373
- _, (id, line) = val
1374
-
1375
- result = s(:colon3, id.to_sym).line line
1360
+ result = wrap :colon3, val[1]
1376
1361
  }
1377
1362
  | tLBRACK { result = lexer.lineno } aref_args tRBRACK
1378
1363
  {
@@ -1396,15 +1381,21 @@ rule
1396
1381
  }
1397
1382
  | kYIELD tLPAREN2 call_args rparen
1398
1383
  {
1399
- result = new_yield val[2]
1384
+ (_, line), _, args, _ = val
1385
+
1386
+ result = new_yield(args).line line
1400
1387
  }
1401
1388
  | kYIELD tLPAREN2 rparen
1402
1389
  {
1403
- result = new_yield
1390
+ (_, line), _, _ = val
1391
+
1392
+ result = new_yield.line line
1404
1393
  }
1405
1394
  | kYIELD
1406
1395
  {
1407
- result = new_yield
1396
+ (_, line), = val
1397
+
1398
+ result = new_yield.line line
1408
1399
  }
1409
1400
  | kDEFINED opt_nl tLPAREN2 expr rparen
1410
1401
  {
@@ -1419,7 +1410,7 @@ rule
1419
1410
  }
1420
1411
  | kNOT tLPAREN2 rparen
1421
1412
  {
1422
- debug 19
1413
+ debug 9
1423
1414
  }
1424
1415
  | fcall brace_block
1425
1416
  {
@@ -1729,6 +1720,8 @@ rule
1729
1720
  f_any_kwrest: f_kwrest
1730
1721
  | f_no_kwarg
1731
1722
 
1723
+ f_eq: tEQL # TODO: self.in_argdef = false
1724
+
1732
1725
  block_args_tail: f_block_kwarg tCOMMA f_kwrest opt_f_block_arg
1733
1726
  {
1734
1727
  result = call_args val
@@ -1859,8 +1852,7 @@ opt_block_args_tail: tCOMMA block_args_tail
1859
1852
 
1860
1853
  bvar: tIDENTIFIER
1861
1854
  {
1862
- (id, line), = val
1863
- result = s(:shadow, id.to_sym).line line
1855
+ result = wrap :shadow, val[0]
1864
1856
  }
1865
1857
  | f_bad_arg
1866
1858
 
@@ -2199,6 +2191,7 @@ opt_block_args_tail: tCOMMA block_args_tail
2199
2191
  p_lbracket: tLBRACK2 { push_pktbl }
2200
2192
 
2201
2193
  p_expr_basic: p_value
2194
+ | p_variable
2202
2195
  | p_const p_lparen p_args tRPAREN
2203
2196
  {
2204
2197
  lhs, _, args, _ = val
@@ -2474,7 +2467,7 @@ opt_block_args_tail: tCOMMA block_args_tail
2474
2467
  assignable [lhs.value, lhs.line]
2475
2468
  else
2476
2469
  # TODO or done?
2477
- debug 666
2470
+ debug 10
2478
2471
  end
2479
2472
 
2480
2473
  # TODO PAIR -> LIST ?
@@ -2483,9 +2476,12 @@ opt_block_args_tail: tCOMMA block_args_tail
2483
2476
 
2484
2477
  p_kw_label: tLABEL
2485
2478
  {
2486
- (id, line), = val
2487
-
2488
- result = s(:lit, id.to_sym).line line
2479
+ result = wrap :lit, val[0]
2480
+ }
2481
+ | tSTRING_BEG string_contents tLABEL_END
2482
+ {
2483
+ # you can't actually get here the way I lex labels
2484
+ debug 11
2489
2485
  }
2490
2486
 
2491
2487
  p_kwrest: kwrest_mark tIDENTIFIER
@@ -2545,8 +2541,8 @@ opt_block_args_tail: tCOMMA block_args_tail
2545
2541
 
2546
2542
  result = s(:dot3, v1, nil).line v1.line
2547
2543
  }
2548
- | p_variable
2549
2544
  | p_var_ref
2545
+ | p_expr_ref
2550
2546
  | p_const
2551
2547
  | tBDOT2 p_primitive
2552
2548
  {
@@ -2580,26 +2576,31 @@ opt_block_args_tail: tCOMMA block_args_tail
2580
2576
 
2581
2577
  p_variable: tIDENTIFIER
2582
2578
  {
2583
- (id, line), = val
2584
-
2585
2579
  # TODO: error_duplicate_pattern_variable(p, $1, &@1);
2586
2580
  # TODO: assignable(p, $1, 0, &@$);
2587
- result = s(:lvar, id.to_sym).line line
2581
+ result = wrap :lvar, val[0]
2588
2582
  }
2589
2583
 
2590
2584
  p_var_ref: tCARET tIDENTIFIER
2591
2585
  {
2592
- _, (id, line) = val
2593
-
2594
2586
  # TODO: check id against env for lvar or dvar
2587
+ result = wrap :lvar, val[1]
2588
+ }
2589
+ | tCARET nonlocal_var
2590
+ {
2591
+ _, var = val
2592
+ result = var
2593
+ }
2595
2594
 
2596
- result = s(:lvar, id.to_sym).line line
2595
+ p_expr_ref: tCARET tLPAREN expr_value rparen
2596
+ {
2597
+ _, _, expr, _ = val
2598
+ result = expr # TODO? s(:begin, expr).line expr.line
2597
2599
  }
2598
2600
 
2599
2601
  p_const: tCOLON3 cname
2600
2602
  {
2601
- _, (id, line) = val
2602
- result = s(:colon3, id.to_sym).line line
2603
+ result = wrap :colon3, val[1]
2603
2604
  }
2604
2605
  | p_const tCOLON2 cname
2605
2606
  {
@@ -2611,8 +2612,7 @@ opt_block_args_tail: tCOMMA block_args_tail
2611
2612
  | tCONSTANT
2612
2613
  {
2613
2614
  # TODO $$ = gettable(p, $1, &@$);
2614
- (id, line), = val
2615
- result = s(:const, id.to_sym).line line
2615
+ result = wrap :const, val[0]
2616
2616
  }
2617
2617
  ######################################################################
2618
2618
 
@@ -2670,7 +2670,7 @@ opt_block_args_tail: tCOMMA block_args_tail
2670
2670
 
2671
2671
  string: tCHAR
2672
2672
  {
2673
- debug 36
2673
+ debug 12
2674
2674
  }
2675
2675
  | string1
2676
2676
  | string string1
@@ -2891,25 +2891,22 @@ regexp_contents: none
2891
2891
  when nil then
2892
2892
  result = s(:evstr).line line
2893
2893
  else
2894
- debug 37
2894
+ debug 13
2895
2895
  raise "unknown string body: #{stmt.inspect}"
2896
2896
  end
2897
2897
  }
2898
2898
 
2899
2899
  string_dvar: tGVAR
2900
2900
  {
2901
- (id, line), = val
2902
- result = s(:gvar, id.to_sym).line line
2901
+ result = wrap :gvar, val[0]
2903
2902
  }
2904
2903
  | tIVAR
2905
2904
  {
2906
- (id, line), = val
2907
- result = s(:ivar, id.to_sym).line line
2905
+ result = wrap :ivar, val[0]
2908
2906
  }
2909
2907
  | tCVAR
2910
2908
  {
2911
- (id, line), = val
2912
- result = s(:cvar, id.to_sym).line line
2909
+ result = wrap :cvar, val[0]
2913
2910
  }
2914
2911
  | backref
2915
2912
 
@@ -2918,17 +2915,13 @@ regexp_contents: none
2918
2915
 
2919
2916
  ssym: tSYMBEG sym
2920
2917
  {
2921
- _, (id, line) = val
2922
-
2923
2918
  lexer.lex_state = EXPR_END
2924
- result = s(:lit, id.to_sym).line line
2919
+ result = wrap :lit, val[1]
2925
2920
  }
2926
2921
  | tSYMBOL
2927
2922
  {
2928
- (id, line), = val
2929
-
2930
2923
  lexer.lex_state = EXPR_END
2931
- result = s(:lit, id.to_sym).line line
2924
+ result = wrap :lit, val[0]
2932
2925
  }
2933
2926
 
2934
2927
  sym: fname | tIVAR | tGVAR | tCVAR
@@ -2949,7 +2942,7 @@ regexp_contents: none
2949
2942
  when :evstr then
2950
2943
  result = s(:dsym, "", result).line result.line
2951
2944
  else
2952
- debug 38
2945
+ debug 14
2953
2946
  end
2954
2947
  }
2955
2948
 
@@ -2965,6 +2958,10 @@ regexp_contents: none
2965
2958
  | tRATIONAL
2966
2959
  | tIMAGINARY
2967
2960
 
2961
+ nonlocal_var: tIVAR { result = wrap :ivar, val[0] }
2962
+ | tGVAR { result = wrap :gvar, val[0] }
2963
+ | tCVAR { result = wrap :cvar, val[0] }
2964
+
2968
2965
  user_variable: tIDENTIFIER
2969
2966
  | tIVAR
2970
2967
  | tGVAR
@@ -3009,7 +3006,7 @@ keyword_variable: kNIL { result = s(:nil).line lexer.lineno }
3009
3006
  | keyword_variable
3010
3007
  {
3011
3008
  result = self.assignable val[0]
3012
- debug 39
3009
+ debug 15
3013
3010
  }
3014
3011
 
3015
3012
  backref: tNTH_REF
@@ -3039,16 +3036,11 @@ keyword_variable: kNIL { result = s(:nil).line lexer.lineno }
3039
3036
 
3040
3037
  f_opt_paren_args: f_paren_args
3041
3038
  | none
3042
-
3043
- f_paren_args: tLPAREN2 f_args rparen
3044
3039
  {
3045
3040
  result = end_args val
3046
3041
  }
3047
- | tLPAREN2 f_arg tCOMMA args_forward rparen
3048
- {
3049
- result = end_args val
3050
- }
3051
- | tLPAREN2 args_forward rparen
3042
+
3043
+ f_paren_args: tLPAREN2 f_args rparen
3052
3044
  {
3053
3045
  result = end_args val
3054
3046
  }
@@ -3077,6 +3069,7 @@ f_opt_paren_args: f_paren_args
3077
3069
  result = args val
3078
3070
  }
3079
3071
  | f_block_arg
3072
+ | args_forward
3080
3073
 
3081
3074
  opt_args_tail: tCOMMA args_tail
3082
3075
  {
@@ -3287,17 +3280,25 @@ f_opt_paren_args: f_paren_args
3287
3280
  result = [id, lexer.lineno] # TODO: tPOW/tDSTAR include lineno
3288
3281
  }
3289
3282
 
3290
- f_opt: f_arg_asgn tEQL arg_value
3283
+ f_opt: f_arg_asgn
3284
+ f_eq
3285
+ arg_value
3291
3286
  {
3292
3287
  lhs, _, rhs = val
3293
3288
  result = self.assignable lhs, rhs
3294
3289
  # TODO: detect duplicate names
3290
+ # TODO? p->cur_arg = 0;
3291
+ # TODO? p->ctxt.in_argdef = 1;
3295
3292
  }
3296
3293
 
3297
- f_block_opt: f_arg_asgn tEQL primary_value
3294
+ f_block_opt: f_arg_asgn
3295
+ f_eq
3296
+ primary_value
3298
3297
  {
3299
3298
  lhs, _, rhs = val
3300
3299
  result = self.assignable lhs, rhs
3300
+ # TODO? p->cur_arg = 0;
3301
+ # TODO? p->ctxt.in_argdef = 1;
3301
3302
  }
3302
3303
 
3303
3304
  f_block_optarg: f_block_opt
@@ -3349,6 +3350,12 @@ f_opt_paren_args: f_paren_args
3349
3350
  self.env[identifier] = :lvar
3350
3351
  result = ["&#{identifier}".to_sym, line]
3351
3352
  }
3353
+ | blkarg_mark
3354
+ {
3355
+ (_, line), = val
3356
+
3357
+ result = [:&, line]
3358
+ }
3352
3359
 
3353
3360
  opt_f_block_arg: tCOMMA f_block_arg
3354
3361
  {
@@ -3395,10 +3402,17 @@ f_opt_paren_args: f_paren_args
3395
3402
  }
3396
3403
  | tLABEL arg_value
3397
3404
  {
3398
- (label, line), arg = val
3405
+ label, arg = val
3406
+
3407
+ lit = wrap :lit, label
3408
+ result = s(:array, lit, arg).line lit.line
3409
+ }
3410
+ | tLABEL
3411
+ {
3412
+ lit = wrap :lit, val[0]
3413
+ arg = nil
3399
3414
 
3400
- lit = s(:lit, label.to_sym).line line
3401
- result = s(:array, lit, arg).line line
3415
+ result = s(:array, lit, arg).line lit.line
3402
3416
  }
3403
3417
  | tSTRING_BEG string_contents tLABEL_END arg_value
3404
3418
  {