ruby_parser 3.20.0 → 3.20.1

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/ruby32_parser.y CHANGED
@@ -221,6 +221,7 @@ rule
221
221
  | lhs tEQL mrhs
222
222
  {
223
223
  lhs, _, rhs = val
224
+
224
225
  result = new_assign lhs, s(:svalue, rhs).line(rhs.line)
225
226
  }
226
227
  | mlhs tEQL mrhs_arg kRESCUE_MOD stmt
@@ -1130,8 +1131,10 @@ rule
1130
1131
 
1131
1132
  paren_args: tLPAREN2 opt_call_args rparen
1132
1133
  {
1133
- _, args, _ = val
1134
+ _, args, (_, line_max) = val
1135
+
1134
1136
  result = args
1137
+ result.line_max = line_max if args
1135
1138
  }
1136
1139
  | tLPAREN2 args tCOMMA args_forward rparen
1137
1140
  {
@@ -1359,12 +1362,14 @@ rule
1359
1362
  {
1360
1363
  result = wrap :colon3, val[1]
1361
1364
  }
1362
- | tLBRACK { result = lexer.lineno } aref_args tRBRACK
1365
+ | tLBRACK { result = lexer.lineno } aref_args rbracket
1363
1366
  {
1364
- _, line, args, _ = val
1367
+ _, line, args, (_, line_max) = val
1368
+
1365
1369
  result = args || s(:array)
1366
1370
  result.sexp_type = :array # aref_args is :args
1367
1371
  result.line line
1372
+ result.line_max = line_max
1368
1373
  }
1369
1374
  | tLBRACE
1370
1375
  {
@@ -1953,13 +1958,19 @@ opt_block_args_tail: tCOMMA block_args_tail
1953
1958
  {
1954
1959
  call, args = val
1955
1960
 
1956
- result = call.concat args.sexp_body if args
1961
+ result = call
1962
+
1963
+ if args then
1964
+ call.concat args.sexp_body
1965
+ result.line_max = args.line_max
1966
+ end
1957
1967
  }
1958
1968
  | primary_value call_op operation2 opt_paren_args
1959
1969
  {
1960
- recv, call_op, (op, _line), args = val
1970
+ recv, call_op, (op, op_line), args = val
1961
1971
 
1962
1972
  result = new_call recv, op.to_sym, args, call_op
1973
+ result.line_max = op_line unless args
1963
1974
  }
1964
1975
  | primary_value tCOLON2 operation2 paren_args
1965
1976
  {
@@ -2716,15 +2727,17 @@ opt_block_args_tail: tCOMMA block_args_tail
2716
2727
 
2717
2728
  words: tWORDS_BEG tSPACE tSTRING_END
2718
2729
  {
2719
- (_, line), _, _ = val
2730
+ (_, line), _, (_, line_max) = val
2720
2731
 
2721
2732
  result = s(:array).line line
2733
+ result.line_max = line_max
2722
2734
  }
2723
2735
  | tWORDS_BEG word_list tSTRING_END
2724
2736
  {
2725
- (_, line), list, _ = val
2737
+ (_, line), list, (_, line_max) = val
2726
2738
 
2727
2739
  result = list.line line
2740
+ result.line_max = line_max
2728
2741
  }
2729
2742
 
2730
2743
  word_list: none
@@ -2744,15 +2757,17 @@ opt_block_args_tail: tCOMMA block_args_tail
2744
2757
 
2745
2758
  symbols: tSYMBOLS_BEG tSPACE tSTRING_END
2746
2759
  {
2747
- (_, line), _, _ = val
2760
+ (_, line), _, (_, line_max) = val
2748
2761
 
2749
2762
  result = s(:array).line line
2763
+ result.line_max = line_max
2750
2764
  }
2751
2765
  | tSYMBOLS_BEG symbol_list tSTRING_END
2752
2766
  {
2753
- (_, line), list, _, = val
2754
- list.line line
2755
- result = list
2767
+ (_, line), list, (_, line_max), = val
2768
+
2769
+ result = list.line line
2770
+ result.line_max = line_max
2756
2771
  }
2757
2772
 
2758
2773
  symbol_list: none
@@ -2767,28 +2782,32 @@ opt_block_args_tail: tCOMMA block_args_tail
2767
2782
 
2768
2783
  qwords: tQWORDS_BEG tSPACE tSTRING_END
2769
2784
  {
2770
- (_, line), _, _ = val
2785
+ (_, line), _, (_, line_max) = val
2771
2786
 
2772
2787
  result = s(:array).line line
2788
+ result.line_max = line_max
2773
2789
  }
2774
2790
  | tQWORDS_BEG qword_list tSTRING_END
2775
2791
  {
2776
- (_, line), list, _ = val
2792
+ (_, line), list, (_, line_max) = val
2777
2793
 
2778
2794
  result = list.line line
2795
+ result.line_max = line_max
2779
2796
  }
2780
2797
 
2781
2798
  qsymbols: tQSYMBOLS_BEG tSPACE tSTRING_END
2782
2799
  {
2783
- (_, line), _, _ = val
2800
+ (_, line), _, (_, line_max) = val
2784
2801
 
2785
2802
  result = s(:array).line line
2803
+ result.line_max = line_max
2786
2804
  }
2787
2805
  | tQSYMBOLS_BEG qsym_list tSTRING_END
2788
2806
  {
2789
- (_, line), list, _ = val
2807
+ (_, line), list, (_, line_max) = val
2790
2808
 
2791
2809
  result = list.line line
2810
+ result.line_max = line_max
2792
2811
  }
2793
2812
 
2794
2813
  qword_list: none
@@ -3210,7 +3229,14 @@ f_opt_paren_args: f_paren_args
3210
3229
  result = s(:args, list).line list.line
3211
3230
  end
3212
3231
 
3213
- result << (Sexp === item ? item : item.first)
3232
+ if Sexp === item then
3233
+ line_max = item.line_max
3234
+ else
3235
+ item, line_max = item
3236
+ end
3237
+
3238
+ result << item
3239
+ result.line_max = line_max
3214
3240
  }
3215
3241
 
3216
3242
  f_label: tLABEL
data/lib/ruby3_parser.yy CHANGED
@@ -229,6 +229,7 @@ rule
229
229
  | lhs tEQL mrhs
230
230
  {
231
231
  lhs, _, rhs = val
232
+
232
233
  result = new_assign lhs, s(:svalue, rhs).line(rhs.line)
233
234
  }
234
235
  | mlhs tEQL mrhs_arg kRESCUE_MOD stmt
@@ -1148,8 +1149,10 @@ rule
1148
1149
 
1149
1150
  paren_args: tLPAREN2 opt_call_args rparen
1150
1151
  {
1151
- _, args, _ = val
1152
+ _, args, (_, line_max) = val
1153
+
1152
1154
  result = args
1155
+ result.line_max = line_max if args
1153
1156
  }
1154
1157
  | tLPAREN2 args tCOMMA args_forward rparen
1155
1158
  {
@@ -1379,12 +1382,14 @@ rule
1379
1382
  {
1380
1383
  result = wrap :colon3, val[1]
1381
1384
  }
1382
- | tLBRACK { result = lexer.lineno } aref_args tRBRACK
1385
+ | tLBRACK { result = lexer.lineno } aref_args rbracket
1383
1386
  {
1384
- _, line, args, _ = val
1387
+ _, line, args, (_, line_max) = val
1388
+
1385
1389
  result = args || s(:array)
1386
1390
  result.sexp_type = :array # aref_args is :args
1387
1391
  result.line line
1392
+ result.line_max = line_max
1388
1393
  }
1389
1394
  | tLBRACE
1390
1395
  {
@@ -1975,13 +1980,19 @@ opt_block_args_tail: tCOMMA block_args_tail
1975
1980
  {
1976
1981
  call, args = val
1977
1982
 
1978
- result = call.concat args.sexp_body if args
1983
+ result = call
1984
+
1985
+ if args then
1986
+ call.concat args.sexp_body
1987
+ result.line_max = args.line_max
1988
+ end
1979
1989
  }
1980
1990
  | primary_value call_op operation2 opt_paren_args
1981
1991
  {
1982
- recv, call_op, (op, _line), args = val
1992
+ recv, call_op, (op, op_line), args = val
1983
1993
 
1984
1994
  result = new_call recv, op.to_sym, args, call_op
1995
+ result.line_max = op_line unless args
1985
1996
  }
1986
1997
  | primary_value tCOLON2 operation2 paren_args
1987
1998
  {
@@ -2751,15 +2762,17 @@ opt_block_args_tail: tCOMMA block_args_tail
2751
2762
 
2752
2763
  words: tWORDS_BEG tSPACE tSTRING_END
2753
2764
  {
2754
- (_, line), _, _ = val
2765
+ (_, line), _, (_, line_max) = val
2755
2766
 
2756
2767
  result = s(:array).line line
2768
+ result.line_max = line_max
2757
2769
  }
2758
2770
  | tWORDS_BEG word_list tSTRING_END
2759
2771
  {
2760
- (_, line), list, _ = val
2772
+ (_, line), list, (_, line_max) = val
2761
2773
 
2762
2774
  result = list.line line
2775
+ result.line_max = line_max
2763
2776
  }
2764
2777
 
2765
2778
  word_list: none
@@ -2779,15 +2792,17 @@ opt_block_args_tail: tCOMMA block_args_tail
2779
2792
 
2780
2793
  symbols: tSYMBOLS_BEG tSPACE tSTRING_END
2781
2794
  {
2782
- (_, line), _, _ = val
2795
+ (_, line), _, (_, line_max) = val
2783
2796
 
2784
2797
  result = s(:array).line line
2798
+ result.line_max = line_max
2785
2799
  }
2786
2800
  | tSYMBOLS_BEG symbol_list tSTRING_END
2787
2801
  {
2788
- (_, line), list, _, = val
2789
- list.line line
2790
- result = list
2802
+ (_, line), list, (_, line_max), = val
2803
+
2804
+ result = list.line line
2805
+ result.line_max = line_max
2791
2806
  }
2792
2807
 
2793
2808
  symbol_list: none
@@ -2802,28 +2817,32 @@ opt_block_args_tail: tCOMMA block_args_tail
2802
2817
 
2803
2818
  qwords: tQWORDS_BEG tSPACE tSTRING_END
2804
2819
  {
2805
- (_, line), _, _ = val
2820
+ (_, line), _, (_, line_max) = val
2806
2821
 
2807
2822
  result = s(:array).line line
2823
+ result.line_max = line_max
2808
2824
  }
2809
2825
  | tQWORDS_BEG qword_list tSTRING_END
2810
2826
  {
2811
- (_, line), list, _ = val
2827
+ (_, line), list, (_, line_max) = val
2812
2828
 
2813
2829
  result = list.line line
2830
+ result.line_max = line_max
2814
2831
  }
2815
2832
 
2816
2833
  qsymbols: tQSYMBOLS_BEG tSPACE tSTRING_END
2817
2834
  {
2818
- (_, line), _, _ = val
2835
+ (_, line), _, (_, line_max) = val
2819
2836
 
2820
2837
  result = s(:array).line line
2838
+ result.line_max = line_max
2821
2839
  }
2822
2840
  | tQSYMBOLS_BEG qsym_list tSTRING_END
2823
2841
  {
2824
- (_, line), list, _ = val
2842
+ (_, line), list, (_, line_max) = val
2825
2843
 
2826
2844
  result = list.line line
2845
+ result.line_max = line_max
2827
2846
  }
2828
2847
 
2829
2848
  qword_list: none
@@ -3259,7 +3278,14 @@ f_opt_paren_args: f_paren_args
3259
3278
  result = s(:args, list).line list.line
3260
3279
  end
3261
3280
 
3262
- result << (Sexp === item ? item : item.first)
3281
+ if Sexp === item then
3282
+ line_max = item.line_max
3283
+ else
3284
+ item, line_max = item
3285
+ end
3286
+
3287
+ result << item
3288
+ result.line_max = line_max
3263
3289
  }
3264
3290
 
3265
3291
  f_label: tLABEL
data/lib/ruby_parser.yy CHANGED
@@ -253,6 +253,7 @@ rule
253
253
  | lhs tEQL mrhs
254
254
  {
255
255
  lhs, _, rhs = val
256
+
256
257
  result = new_assign lhs, s(:svalue, rhs).line(rhs.line)
257
258
  }
258
259
  #if V == 20
@@ -1107,8 +1108,10 @@ rule
1107
1108
 
1108
1109
  paren_args: tLPAREN2 opt_call_args rparen
1109
1110
  {
1110
- _, args, _ = val
1111
+ _, args, (_, line_max) = val
1112
+
1111
1113
  result = args
1114
+ result.line_max = line_max if args
1112
1115
  }
1113
1116
  #if V >= 27
1114
1117
  | tLPAREN2 args tCOMMA args_forward rparen
@@ -1335,12 +1338,14 @@ rule
1335
1338
  {
1336
1339
  result = wrap :colon3, val[1]
1337
1340
  }
1338
- | tLBRACK { result = lexer.lineno } aref_args tRBRACK
1341
+ | tLBRACK { result = lexer.lineno } aref_args rbracket
1339
1342
  {
1340
- _, line, args, _ = val
1343
+ _, line, args, (_, line_max) = val
1344
+
1341
1345
  result = args || s(:array)
1342
1346
  result.sexp_type = :array # aref_args is :args
1343
1347
  result.line line
1348
+ result.line_max = line_max
1344
1349
  }
1345
1350
  | tLBRACE
1346
1351
  {
@@ -1942,13 +1947,19 @@ opt_block_args_tail: tCOMMA block_args_tail
1942
1947
  {
1943
1948
  call, args = val
1944
1949
 
1945
- result = call.concat args.sexp_body if args
1950
+ result = call
1951
+
1952
+ if args then
1953
+ call.concat args.sexp_body
1954
+ result.line_max = args.line_max
1955
+ end
1946
1956
  }
1947
1957
  | primary_value call_op operation2 opt_paren_args
1948
1958
  {
1949
- recv, call_op, (op, _line), args = val
1959
+ recv, call_op, (op, op_line), args = val
1950
1960
 
1951
1961
  result = new_call recv, op.to_sym, args, call_op
1962
+ result.line_max = op_line unless args
1952
1963
  }
1953
1964
  | primary_value tCOLON2 operation2 paren_args
1954
1965
  {
@@ -2674,15 +2685,17 @@ opt_block_args_tail: tCOMMA block_args_tail
2674
2685
 
2675
2686
  words: tWORDS_BEG tSPACE tSTRING_END
2676
2687
  {
2677
- (_, line), _, _ = val
2688
+ (_, line), _, (_, line_max) = val
2678
2689
 
2679
2690
  result = s(:array).line line
2691
+ result.line_max = line_max
2680
2692
  }
2681
2693
  | tWORDS_BEG word_list tSTRING_END
2682
2694
  {
2683
- (_, line), list, _ = val
2695
+ (_, line), list, (_, line_max) = val
2684
2696
 
2685
2697
  result = list.line line
2698
+ result.line_max = line_max
2686
2699
  }
2687
2700
 
2688
2701
  word_list: none
@@ -2702,15 +2715,17 @@ opt_block_args_tail: tCOMMA block_args_tail
2702
2715
 
2703
2716
  symbols: tSYMBOLS_BEG tSPACE tSTRING_END
2704
2717
  {
2705
- (_, line), _, _ = val
2718
+ (_, line), _, (_, line_max) = val
2706
2719
 
2707
2720
  result = s(:array).line line
2721
+ result.line_max = line_max
2708
2722
  }
2709
2723
  | tSYMBOLS_BEG symbol_list tSTRING_END
2710
2724
  {
2711
- (_, line), list, _, = val
2712
- list.line line
2713
- result = list
2725
+ (_, line), list, (_, line_max), = val
2726
+
2727
+ result = list.line line
2728
+ result.line_max = line_max
2714
2729
  }
2715
2730
 
2716
2731
  symbol_list: none
@@ -2725,28 +2740,32 @@ opt_block_args_tail: tCOMMA block_args_tail
2725
2740
 
2726
2741
  qwords: tQWORDS_BEG tSPACE tSTRING_END
2727
2742
  {
2728
- (_, line), _, _ = val
2743
+ (_, line), _, (_, line_max) = val
2729
2744
 
2730
2745
  result = s(:array).line line
2746
+ result.line_max = line_max
2731
2747
  }
2732
2748
  | tQWORDS_BEG qword_list tSTRING_END
2733
2749
  {
2734
- (_, line), list, _ = val
2750
+ (_, line), list, (_, line_max) = val
2735
2751
 
2736
2752
  result = list.line line
2753
+ result.line_max = line_max
2737
2754
  }
2738
2755
 
2739
2756
  qsymbols: tQSYMBOLS_BEG tSPACE tSTRING_END
2740
2757
  {
2741
- (_, line), _, _ = val
2758
+ (_, line), _, (_, line_max) = val
2742
2759
 
2743
2760
  result = s(:array).line line
2761
+ result.line_max = line_max
2744
2762
  }
2745
2763
  | tQSYMBOLS_BEG qsym_list tSTRING_END
2746
2764
  {
2747
- (_, line), list, _ = val
2765
+ (_, line), list, (_, line_max) = val
2748
2766
 
2749
2767
  result = list.line line
2768
+ result.line_max = line_max
2750
2769
  }
2751
2770
 
2752
2771
  qword_list: none
@@ -3197,7 +3216,14 @@ keyword_variable: kNIL { result = s(:nil).line lexer.lineno }
3197
3216
  result = s(:args, list).line list.line
3198
3217
  end
3199
3218
 
3200
- result << (Sexp === item ? item : item.first)
3219
+ if Sexp === item then
3220
+ line_max = item.line_max
3221
+ else
3222
+ item, line_max = item
3223
+ end
3224
+
3225
+ result << item
3226
+ result.line_max = line_max
3201
3227
  }
3202
3228
 
3203
3229
  #if V == 20
@@ -3449,7 +3475,15 @@ keyword_variable: kNIL { result = s(:nil).line lexer.lineno }
3449
3475
  opt_terms: | terms
3450
3476
  opt_nl: | tNL
3451
3477
  rparen: opt_nl tRPAREN
3478
+ {
3479
+ _, close = val
3480
+ result = [close, lexer.lineno]
3481
+ }
3452
3482
  rbracket: opt_nl tRBRACK
3483
+ {
3484
+ _, close = val
3485
+ result = [close, lexer.lineno]
3486
+ }
3453
3487
  #if V >= 27
3454
3488
  rbrace: opt_nl tRCURLY
3455
3489
  #endif
@@ -18,7 +18,7 @@ class Sexp
18
18
  end
19
19
 
20
20
  ##
21
- # Returns the maximum line number of the children of self.
21
+ # Returns the minimum line number of the children of self.
22
22
 
23
23
  def line_min
24
24
  @line_min ||= [self.deep_each.map(&:line).min, self.line].compact.min
@@ -30,7 +30,7 @@ class Sexp
30
30
  end
31
31
 
32
32
  module RubyParserStuff
33
- VERSION = "3.20.0"
33
+ VERSION = "3.20.1"
34
34
 
35
35
  attr_accessor :lexer, :in_def, :in_single, :file
36
36
  attr_accessor :in_kwarg
@@ -153,6 +153,7 @@ module RubyParserStuff
153
153
  result.line lexer.lineno
154
154
  else
155
155
  result.line ss.first.line
156
+ result.line_max = ss.first.line_max
156
157
  end
157
158
 
158
159
  args.each do |arg|
@@ -330,9 +331,8 @@ module RubyParserStuff
330
331
  end
331
332
 
332
333
  args.each do |arg|
333
- if arg.instance_of? Array and arg.size == 2 and arg.last.is_a? Numeric then
334
- arg = arg.first
335
- end
334
+ # ruby 3.0+ TODO: next if arg in [String, Integer] # eg ["(", 1]
335
+ next if arg.class == Array && arg.map(&:class) == [String, Integer]
336
336
 
337
337
  case arg
338
338
  when Sexp then
@@ -794,6 +794,7 @@ module RubyParserStuff
794
794
  case lhs.sexp_type
795
795
  when :lasgn, :iasgn, :cdecl, :cvdecl, :gasgn, :cvasgn, :attrasgn, :safe_attrasgn then
796
796
  lhs << rhs
797
+ lhs.line_max = rhs.line_max
797
798
  when :const then
798
799
  lhs.sexp_type = :cdecl
799
800
  lhs << rhs
@@ -885,12 +886,13 @@ module RubyParserStuff
885
886
  # TODO: need a test with f(&b) to produce block_pass
886
887
  # TODO: need a test with f(&b) { } to produce warning
887
888
 
888
- if args
889
+ if args then
889
890
  if ARG_TYPES[args.sexp_type] then
890
891
  result.concat args.sexp_body
891
892
  else
892
893
  result << args
893
894
  end
895
+ result.line_max = args.line_max
894
896
  end
895
897
 
896
898
  # line = result.grep(Sexp).map(&:line).compact.min
@@ -927,7 +929,7 @@ module RubyParserStuff
927
929
 
928
930
  def new_class val
929
931
  # TODO: get line from class keyword
930
- line, path, superclass, body = val[1], val[2], val[3], val[5]
932
+ _, line, path, superclass, _, body, (_, line_max) = val
931
933
 
932
934
  path = path.first if path.instance_of? Array
933
935
 
@@ -942,6 +944,7 @@ module RubyParserStuff
942
944
  end
943
945
 
944
946
  result.line = line
947
+ result.line_max = line_max
945
948
  result.comments = self.comments.pop
946
949
  result
947
950
  end
@@ -970,13 +973,14 @@ module RubyParserStuff
970
973
  end
971
974
 
972
975
  def new_defn val
973
- _, (name, line), in_def, args, body, _ = val
976
+ _, (name, line), in_def, args, body, (_, line_max) = val
974
977
 
975
978
  body ||= s(:nil).line line
976
979
 
977
980
  args.line line
978
981
 
979
982
  result = s(:defn, name.to_sym, args).line line
983
+ result.line_max = line_max
980
984
 
981
985
  if body.sexp_type == :block then
982
986
  result.push(*body.sexp_body)
@@ -1033,13 +1037,14 @@ module RubyParserStuff
1033
1037
  end
1034
1038
 
1035
1039
  def new_defs val
1036
- _, recv, (name, line), in_def, args, body, _ = val
1040
+ _, recv, (name, line), in_def, args, body, (_, line_max) = val
1037
1041
 
1038
1042
  body ||= s(:nil).line line
1039
1043
 
1040
1044
  args.line line
1041
1045
 
1042
1046
  result = s(:defs, recv, name.to_sym, args).line line
1047
+ result.line_max = line_max
1043
1048
 
1044
1049
  # TODO: remove_begin
1045
1050
  # TODO: reduce_nodes
@@ -1204,12 +1209,12 @@ module RubyParserStuff
1204
1209
  end
1205
1210
 
1206
1211
  def new_module val
1207
- # TODO: get line from module keyword
1208
- line, path, body = val[1], val[2], val[4]
1212
+ (_, line_min), _, path, _, body, (_, line_max) = val
1209
1213
 
1210
1214
  path = path.first if path.instance_of? Array
1211
1215
 
1212
- result = s(:module, path).line line
1216
+ result = s(:module, path).line line_min
1217
+ result.line_max = line_max
1213
1218
 
1214
1219
  if body then # REFACTOR?
1215
1220
  if body.sexp_type == :block then
@@ -1291,9 +1296,10 @@ module RubyParserStuff
1291
1296
  end
1292
1297
 
1293
1298
  def new_regexp val
1294
- (_, line), node, (options, _) = val
1299
+ (_, line), node, (options, line_max) = val
1295
1300
 
1296
1301
  node ||= s(:str, "").line line
1302
+ node.line_max = line_max
1297
1303
 
1298
1304
  o, k = 0, nil
1299
1305
  options.split(//).uniq.each do |c| # FIX: this has a better home