ruby_parser 3.20.2 → 3.20.3

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
@@ -408,6 +408,7 @@ rule
408
408
  defs_head: k_def singleton dot_or_colon
409
409
  {
410
410
  lexer.lex_state = EXPR_FNAME
411
+ self.in_argdef = true
411
412
  }
412
413
  def_name
413
414
  {
@@ -1619,6 +1620,7 @@ rule
1619
1620
  k_def: kDEF
1620
1621
  {
1621
1622
  self.comments.push self.lexer.comments
1623
+ self.in_argdef = true
1622
1624
  }
1623
1625
  k_do: kDO
1624
1626
  k_do_block: kDO_BLOCK
@@ -1734,7 +1736,7 @@ rule
1734
1736
  f_any_kwrest: f_kwrest
1735
1737
  | f_no_kwarg
1736
1738
 
1737
- f_eq: tEQL # TODO: self.in_argdef = false
1739
+ f_eq: { self.in_argdef = false } tEQL
1738
1740
 
1739
1741
  block_args_tail: f_block_kwarg tCOMMA f_kwrest opt_f_block_arg
1740
1742
  {
@@ -1838,6 +1840,7 @@ opt_block_args_tail: tCOMMA block_args_tail
1838
1840
  {
1839
1841
  # TODO: current_arg = 0
1840
1842
  result = args val
1843
+ self.in_argdef = false
1841
1844
  }
1842
1845
  | tOROP
1843
1846
  {
@@ -1849,6 +1852,7 @@ opt_block_args_tail: tCOMMA block_args_tail
1849
1852
  {
1850
1853
  # TODO: current_arg = 0
1851
1854
  result = args val
1855
+ self.in_argdef = false
1852
1856
  }
1853
1857
 
1854
1858
  opt_bv_decl: opt_nl
@@ -1898,10 +1902,12 @@ opt_block_args_tail: tCOMMA block_args_tail
1898
1902
 
1899
1903
  f_larglist: tLPAREN2 f_args opt_bv_decl rparen
1900
1904
  {
1905
+ self.in_argdef = false
1901
1906
  result = args val
1902
1907
  }
1903
1908
  | f_args
1904
1909
  {
1910
+ self.in_argdef = false
1905
1911
  result = val[0]
1906
1912
  result = 0 if result == s(:args)
1907
1913
  }
@@ -3064,11 +3070,13 @@ keyword_variable: kNIL { (_, line), = val; result = s(:nil).line line }
3064
3070
  f_opt_paren_args: f_paren_args
3065
3071
  | none
3066
3072
  {
3073
+ self.in_argdef = false
3067
3074
  result = end_args val
3068
3075
  }
3069
3076
 
3070
3077
  f_paren_args: tLPAREN2 f_args rparen
3071
3078
  {
3079
+ self.in_argdef = false
3072
3080
  result = end_args val
3073
3081
  }
3074
3082
 
@@ -3076,10 +3084,12 @@ f_opt_paren_args: f_paren_args
3076
3084
  | {
3077
3085
  result = self.in_kwarg
3078
3086
  self.in_kwarg = true
3087
+ self.in_argdef = true
3079
3088
  self.lexer.lex_state |= EXPR_LABEL
3080
3089
  }
3081
3090
  f_args term
3082
3091
  {
3092
+ self.in_argdef = false
3083
3093
  result = end_args val
3084
3094
  }
3085
3095
 
@@ -3236,6 +3246,14 @@ f_opt_paren_args: f_paren_args
3236
3246
  }
3237
3247
 
3238
3248
  f_label: tLABEL
3249
+ {
3250
+ label, = val
3251
+ # arg_var(p, formal_argument(p, $1));
3252
+ # p->cur_arg = get_id($1);
3253
+ # p->max_numparam = ORDINAL_PARAM;
3254
+ self.in_argdef = false
3255
+ result = label
3256
+ }
3239
3257
 
3240
3258
  f_kw: f_label arg_value
3241
3259
  {
@@ -3244,6 +3262,7 @@ f_opt_paren_args: f_paren_args
3244
3262
 
3245
3263
  identifier = label.to_sym
3246
3264
  self.env[identifier] = :lvar
3265
+ self.in_argdef = true
3247
3266
 
3248
3267
  kwarg = s(:kwarg, identifier, arg).line line
3249
3268
  result = s(:array, kwarg).line line
@@ -3254,6 +3273,7 @@ f_opt_paren_args: f_paren_args
3254
3273
 
3255
3274
  id = label.to_sym
3256
3275
  self.env[id] = :lvar
3276
+ self.in_argdef = true
3257
3277
 
3258
3278
  result = s(:array, s(:kwarg, id).line(line)).line line
3259
3279
  }
@@ -3264,6 +3284,7 @@ f_opt_paren_args: f_paren_args
3264
3284
  (label, line), expr = val
3265
3285
  id = label.to_sym
3266
3286
  self.env[id] = :lvar
3287
+ self.in_argdef = true
3267
3288
 
3268
3289
  result = s(:array, s(:kwarg, id, expr).line(line)).line line
3269
3290
  }
@@ -3273,6 +3294,7 @@ f_opt_paren_args: f_paren_args
3273
3294
  (label, line), = val
3274
3295
  id = label.to_sym
3275
3296
  self.env[id] = :lvar
3297
+ self.in_argdef = true
3276
3298
 
3277
3299
  result = s(:array, s(:kwarg, id).line(line)).line line
3278
3300
  }
@@ -3320,10 +3342,10 @@ f_opt_paren_args: f_paren_args
3320
3342
  arg_value
3321
3343
  {
3322
3344
  lhs, _, rhs = val
3345
+ self.in_argdef = true
3323
3346
  result = self.assignable lhs, rhs
3324
3347
  # TODO: detect duplicate names
3325
3348
  # TODO? p->cur_arg = 0;
3326
- # TODO? p->ctxt.in_argdef = 1;
3327
3349
  }
3328
3350
 
3329
3351
  f_block_opt: f_arg_asgn
@@ -3331,9 +3353,9 @@ f_opt_paren_args: f_paren_args
3331
3353
  primary_value
3332
3354
  {
3333
3355
  lhs, _, rhs = val
3356
+ self.in_argdef = true
3334
3357
  result = self.assignable lhs, rhs
3335
3358
  # TODO? p->cur_arg = 0;
3336
- # TODO? p->ctxt.in_argdef = 1;
3337
3359
  }
3338
3360
 
3339
3361
  f_block_optarg: f_block_opt
data/lib/ruby3_parser.yy CHANGED
@@ -426,6 +426,7 @@ rule
426
426
  defs_head: k_def singleton dot_or_colon
427
427
  {
428
428
  lexer.lex_state = EXPR_FNAME
429
+ self.in_argdef = true
429
430
  }
430
431
  def_name
431
432
  {
@@ -1643,6 +1644,7 @@ rule
1643
1644
  k_def: kDEF
1644
1645
  {
1645
1646
  self.comments.push self.lexer.comments
1647
+ self.in_argdef = true
1646
1648
  }
1647
1649
  k_do: kDO
1648
1650
  k_do_block: kDO_BLOCK
@@ -1759,7 +1761,7 @@ rule
1759
1761
  | f_no_kwarg
1760
1762
 
1761
1763
  #if V > 30
1762
- f_eq: tEQL # TODO: self.in_argdef = false
1764
+ f_eq: { self.in_argdef = false } tEQL
1763
1765
  #endif
1764
1766
 
1765
1767
  block_args_tail: f_block_kwarg tCOMMA f_kwrest opt_f_block_arg
@@ -1864,6 +1866,7 @@ opt_block_args_tail: tCOMMA block_args_tail
1864
1866
  {
1865
1867
  # TODO: current_arg = 0
1866
1868
  result = args val
1869
+ self.in_argdef = false
1867
1870
  }
1868
1871
  | tOROP
1869
1872
  {
@@ -1875,6 +1878,7 @@ opt_block_args_tail: tCOMMA block_args_tail
1875
1878
  {
1876
1879
  # TODO: current_arg = 0
1877
1880
  result = args val
1881
+ self.in_argdef = false
1878
1882
  }
1879
1883
 
1880
1884
  opt_bv_decl: opt_nl
@@ -1924,10 +1928,12 @@ opt_block_args_tail: tCOMMA block_args_tail
1924
1928
 
1925
1929
  f_larglist: tLPAREN2 f_args opt_bv_decl rparen
1926
1930
  {
1931
+ self.in_argdef = false
1927
1932
  result = args val
1928
1933
  }
1929
1934
  | f_args
1930
1935
  {
1936
+ self.in_argdef = false
1931
1937
  result = val[0]
1932
1938
  result = 0 if result == s(:args)
1933
1939
  }
@@ -3134,11 +3140,13 @@ keyword_variable: kNIL { (_, line), = val; result = s(:nil).line line }
3134
3140
  f_opt_paren_args: f_paren_args
3135
3141
  | none
3136
3142
  {
3143
+ self.in_argdef = false
3137
3144
  result = end_args val
3138
3145
  }
3139
3146
 
3140
3147
  f_paren_args: tLPAREN2 f_args rparen
3141
3148
  {
3149
+ self.in_argdef = false
3142
3150
  result = end_args val
3143
3151
  }
3144
3152
  #if V == 30
@@ -3156,10 +3164,12 @@ f_opt_paren_args: f_paren_args
3156
3164
  | {
3157
3165
  result = self.in_kwarg
3158
3166
  self.in_kwarg = true
3167
+ self.in_argdef = true
3159
3168
  self.lexer.lex_state |= EXPR_LABEL
3160
3169
  }
3161
3170
  f_args term
3162
3171
  {
3172
+ self.in_argdef = false
3163
3173
  result = end_args val
3164
3174
  }
3165
3175
 
@@ -3318,6 +3328,14 @@ f_opt_paren_args: f_paren_args
3318
3328
  }
3319
3329
 
3320
3330
  f_label: tLABEL
3331
+ {
3332
+ label, = val
3333
+ # arg_var(p, formal_argument(p, $1));
3334
+ # p->cur_arg = get_id($1);
3335
+ # p->max_numparam = ORDINAL_PARAM;
3336
+ self.in_argdef = false
3337
+ result = label
3338
+ }
3321
3339
 
3322
3340
  f_kw: f_label arg_value
3323
3341
  {
@@ -3326,6 +3344,7 @@ f_opt_paren_args: f_paren_args
3326
3344
 
3327
3345
  identifier = label.to_sym
3328
3346
  self.env[identifier] = :lvar
3347
+ self.in_argdef = true
3329
3348
 
3330
3349
  kwarg = s(:kwarg, identifier, arg).line line
3331
3350
  result = s(:array, kwarg).line line
@@ -3336,6 +3355,7 @@ f_opt_paren_args: f_paren_args
3336
3355
 
3337
3356
  id = label.to_sym
3338
3357
  self.env[id] = :lvar
3358
+ self.in_argdef = true
3339
3359
 
3340
3360
  result = s(:array, s(:kwarg, id).line(line)).line line
3341
3361
  }
@@ -3346,6 +3366,7 @@ f_opt_paren_args: f_paren_args
3346
3366
  (label, line), expr = val
3347
3367
  id = label.to_sym
3348
3368
  self.env[id] = :lvar
3369
+ self.in_argdef = true
3349
3370
 
3350
3371
  result = s(:array, s(:kwarg, id, expr).line(line)).line line
3351
3372
  }
@@ -3355,6 +3376,7 @@ f_opt_paren_args: f_paren_args
3355
3376
  (label, line), = val
3356
3377
  id = label.to_sym
3357
3378
  self.env[id] = :lvar
3379
+ self.in_argdef = true
3358
3380
 
3359
3381
  result = s(:array, s(:kwarg, id).line(line)).line line
3360
3382
  }
@@ -3406,10 +3428,10 @@ f_opt_paren_args: f_paren_args
3406
3428
  arg_value
3407
3429
  {
3408
3430
  lhs, _, rhs = val
3431
+ self.in_argdef = true
3409
3432
  result = self.assignable lhs, rhs
3410
3433
  # TODO: detect duplicate names
3411
3434
  # TODO? p->cur_arg = 0;
3412
- # TODO? p->ctxt.in_argdef = 1;
3413
3435
  }
3414
3436
 
3415
3437
  f_block_opt: f_arg_asgn
@@ -3421,9 +3443,9 @@ f_opt_paren_args: f_paren_args
3421
3443
  primary_value
3422
3444
  {
3423
3445
  lhs, _, rhs = val
3446
+ self.in_argdef = true
3424
3447
  result = self.assignable lhs, rhs
3425
3448
  # TODO? p->cur_arg = 0;
3426
- # TODO? p->ctxt.in_argdef = 1;
3427
3449
  }
3428
3450
 
3429
3451
  f_block_optarg: f_block_opt
data/lib/ruby_lexer.rb CHANGED
@@ -117,7 +117,7 @@ class RubyLexer
117
117
 
118
118
  def initialize _ = nil
119
119
  @lex_state = nil # remove one warning under $DEBUG
120
- self.lex_state = EXPR_NONE
120
+ @lex_state = EXPR_NONE
121
121
 
122
122
  self.cond = RubyParserStuff::StackState.new(:cond, $DEBUG)
123
123
  self.cmdarg = RubyParserStuff::StackState.new(:cmdarg, $DEBUG)
@@ -355,8 +355,14 @@ class RubyLexer
355
355
  end
356
356
  end
357
357
 
358
- def process_dots text
359
- tokens = ruby27plus? && is_beg? ? BTOKENS : TOKENS
358
+ def process_dots text # parse32.y:10216
359
+ is_beg = self.is_beg?
360
+ self.lex_state = EXPR_BEG
361
+
362
+ return result EXPR_ENDARG, :tBDOT3, text if
363
+ parser.in_argdef && text == "..." # TODO: version check?
364
+
365
+ tokens = ruby27plus? && is_beg ? BTOKENS : TOKENS
360
366
 
361
367
  result EXPR_BEG, tokens[text], text
362
368
  end
@@ -689,7 +695,7 @@ class RubyLexer
689
695
  return process_token_keyword keyword if keyword
690
696
  end
691
697
 
692
- # matching: compare/parse30.y:9039
698
+ # matching: compare/parse32.y:9031
693
699
  state = if lex_state =~ EXPR_BEG_ANY|EXPR_ARG_ANY|EXPR_DOT then
694
700
  cmd_state ? EXPR_CMDARG : EXPR_ARG
695
701
  elsif lex_state =~ EXPR_FNAME then
@@ -711,7 +717,7 @@ class RubyLexer
711
717
  end
712
718
 
713
719
  def process_token_keyword keyword
714
- # matching MIDDLE of parse_ident in compare/parse23.y:8046
720
+ # matching MIDDLE of parse_ident in compare/parse32.y:9695
715
721
  state = lex_state
716
722
 
717
723
  return result(EXPR_ENDFN, keyword.id0, token) if lex_state =~ EXPR_FNAME
@@ -720,7 +726,7 @@ class RubyLexer
720
726
  self.command_start = true if lex_state =~ EXPR_BEG
721
727
 
722
728
  case
723
- when keyword.id0 == :kDO then # parse26.y line 7591
729
+ when keyword.id0 == :kDO then # parse32.y line 9712
724
730
  case
725
731
  when lambda_beginning? then
726
732
  self.lpar_beg = nil # lambda_beginning? == FALSE in the body of "-> do ... end"
@@ -892,7 +898,7 @@ class RubyLexer
892
898
  end
893
899
 
894
900
  def inspect
895
- return "Value(0)" if n.zero? # HACK?
901
+ return "EXPR_NONE" if n.zero? # HACK?
896
902
 
897
903
  names.map { |v, k| k if self =~ v }.
898
904
  compact.
@@ -30,9 +30,9 @@ class Sexp
30
30
  end
31
31
 
32
32
  module RubyParserStuff
33
- VERSION = "3.20.2"
33
+ VERSION = "3.20.3"
34
34
 
35
- attr_accessor :lexer, :in_def, :in_single, :file
35
+ attr_accessor :lexer, :in_def, :in_single, :file, :in_argdef
36
36
  attr_accessor :in_kwarg
37
37
  attr_reader :env, :comments
38
38
 
@@ -122,6 +122,7 @@ module RubyParserStuff
122
122
  self.lexer = RubyLexer.new v && v.to_i
123
123
  self.lexer.parser = self
124
124
  self.in_kwarg = false
125
+ self.in_argdef = false
125
126
 
126
127
  @env = RubyParserStuff::Environment.new
127
128
  @comments = []
@@ -5556,6 +5556,14 @@ module TestRubyParserShared31Plus
5556
5556
  assert_case_in rb, pt
5557
5557
  end
5558
5558
 
5559
+ def test_defn_forward_args__no_parens
5560
+ rb = "def f ...\n m(...)\nend"
5561
+ pt = s(:defn, :f, s(:args, s(:forward_args)),
5562
+ s(:call, nil, :m, s(:forward_args).line(2)).line(2))
5563
+
5564
+ assert_parse rb, pt
5565
+ end
5566
+
5559
5567
  def test_case_in_carat_nonlocal_vars
5560
5568
  processor.env[:a] = :lvar
5561
5569
 
data/tools/munge.rb CHANGED
@@ -174,6 +174,10 @@ ARGF.each_line do |line|
174
174
  last_token = token
175
175
  when /^Reading a token: / then
176
176
  next # skip
177
+ when /^Reading a token$/ then # wtf?
178
+ next # skip
179
+ when /^(?:add_delayed_token|parser_dispatch)/ then # dunno what this is yet
180
+ next # skip
177
181
  when /^read\s+:(\w+)/ then # read :tNL(tNL) nil
178
182
  token = munge $1
179
183
  next if last_token == token
@@ -212,7 +216,9 @@ ARGF.each_line do |line|
212
216
  reduce_line = nil
213
217
  stack.clear
214
218
  when /^reduce/ then # ruby_parser side
215
- puts munge line.chomp
219
+ s = munge line.chomp
220
+ next if s =~ /reduce\s+(\w+) --> \1/
221
+ puts s
216
222
  puts
217
223
  when /^(\w+_stack)\.(\w+)/ then
218
224
  # TODO: make pretty, but still informative w/ line numbers etc
@@ -223,7 +229,7 @@ ARGF.each_line do |line|
223
229
  # puts line
224
230
  # TODO: make pretty, but still informative w/ line numbers etc
225
231
  puts line.gsub("true", "1").gsub("false", "0")
226
- when /^lex_state: :?([\w|]+) -> :?([\w|]+)(?: (?:at|from) (.*))?/ then
232
+ when /^lex_state: :?([\w|()]+) -> :?([\w|]+)(?: (?:at|from) (.*))?/ then
227
233
  a, b, c = $1.upcase, $2.upcase, $3
228
234
  a.gsub!(/EXPR_/, "")
229
235
  b.gsub!(/EXPR_/, "")
data/tools/ripper.rb CHANGED
@@ -21,18 +21,20 @@ end
21
21
  ARGV.each do |path|
22
22
  src = path == "-" ? $stdin.read : File.read(path)
23
23
 
24
- sexp = if $b then
25
- Ripper.sexp src
26
- else
27
- rip = MySexpBuilder.new src
28
- rip.yydebug = $d
29
- rip.parse
30
-
31
- if rip.error? then
32
- warn "skipping"
33
- next
34
- end
35
- end
24
+ sexp = nil
25
+
26
+ if $b then
27
+ sexp = Ripper.sexp src
28
+ else
29
+ rip = MySexpBuilder.new src
30
+ rip.yydebug = $d
31
+ sexp = rip.parse
32
+
33
+ if rip.error? then
34
+ warn "skipping"
35
+ next
36
+ end
37
+ end
36
38
 
37
39
  puts "accept"
38
40
 
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby_parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.20.2
4
+ version: 3.20.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Davis
@@ -29,7 +29,7 @@ cert_chain:
29
29
  ROfWo9Uyp8ba/j9eVG14KkYRaLydAY1MNQk2yd3R5CGfeOpD1kttxjoypoUJ2dOG
30
30
  nsNBRuQJ1UfiCG97a6DNm+Fr
31
31
  -----END CERTIFICATE-----
32
- date: 2023-06-06 00:00:00.000000000 Z
32
+ date: 2023-07-12 00:00:00.000000000 Z
33
33
  dependencies:
34
34
  - !ruby/object:Gem::Dependency
35
35
  name: sexp_processor
metadata.gz.sig CHANGED
Binary file