ruby_parser 3.20.2 → 3.20.3

Sign up to get free protection for your applications and to get access to all the features.
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