parser 3.2.2.4 → 3.3.11.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.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +2 -1
  3. data/lib/gauntlet_parser.rb +1 -1
  4. data/lib/parser/all.rb +15 -14
  5. data/lib/parser/ast/processor.rb +3 -1
  6. data/lib/parser/base.rb +3 -0
  7. data/lib/parser/builders/default.rb +40 -10
  8. data/lib/parser/context.rb +2 -0
  9. data/lib/parser/current.rb +37 -19
  10. data/lib/parser/lexer/literal.rb +16 -1
  11. data/lib/parser/lexer-F0.rb +360 -299
  12. data/lib/parser/lexer-F1.rb +634 -564
  13. data/lib/parser/lexer-strings.rb +89 -80
  14. data/lib/parser/macruby.rb +3 -3
  15. data/lib/parser/messages.rb +46 -41
  16. data/lib/parser/meta.rb +11 -3
  17. data/lib/parser/ruby18.rb +3 -3
  18. data/lib/parser/ruby19.rb +3 -3
  19. data/lib/parser/ruby20.rb +3 -3
  20. data/lib/parser/ruby21.rb +3 -3
  21. data/lib/parser/ruby22.rb +3 -3
  22. data/lib/parser/ruby23.rb +3 -3
  23. data/lib/parser/ruby24.rb +3 -3
  24. data/lib/parser/ruby25.rb +3 -3
  25. data/lib/parser/ruby26.rb +3 -3
  26. data/lib/parser/ruby27.rb +5 -4
  27. data/lib/parser/ruby30.rb +5 -4
  28. data/lib/parser/ruby31.rb +5 -4
  29. data/lib/parser/ruby32.rb +5 -4
  30. data/lib/parser/ruby33.rb +6764 -6878
  31. data/lib/parser/ruby34.rb +12597 -0
  32. data/lib/parser/rubymotion.rb +3 -3
  33. data/lib/parser/runner/ruby_parse.rb +3 -3
  34. data/lib/parser/runner/ruby_rewrite.rb +1 -1
  35. data/lib/parser/runner.rb +37 -31
  36. data/lib/parser/source/buffer.rb +6 -1
  37. data/lib/parser/source/tree_rewriter/action.rb +5 -4
  38. data/lib/parser/static_environment.rb +56 -9
  39. data/lib/parser/unknown_encoding_in_magic_comment_error.rb +15 -0
  40. data/lib/parser/version.rb +1 -1
  41. data/lib/parser.rb +54 -53
  42. data/parser.gemspec +1 -1
  43. metadata +8 -16
  44. data/lib/parser/ruby28.rb +0 -8047
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8565383a05692fe05c5f0962a0cb6c4594ad1eaab98f8e1c8b1053ddfa665858
4
- data.tar.gz: 280636e65eab161acc6369cdf992faa4f81a6496ebbbad794a96ee60ea3e4884
3
+ metadata.gz: 4afda76250b018d2a7bae958b16586e067883c0b8073ab4d3935ce85703216e4
4
+ data.tar.gz: 677ddb14e8ec7f44253c1f0ea440eacaeeed18f1d7434d75d94b3300e2d104a6
5
5
  SHA512:
6
- metadata.gz: 8721d3c59c29a9bcb9562b6f0bad1ca119f854873fb3b6f5e550553a6d2fa471afb2d3e1c6c5b1323d5121b36f4070ed0a3bca24866b3dede1682658bbce934f
7
- data.tar.gz: e312e821428e6c15ec871971aabee38cd7c238adfc855ff1a4b70edb31f529e359162c1961141d2ce3fe0d5f6aee3fce009c6a479aaa3909920993af58d3c3f2
6
+ metadata.gz: 7a2f9d421a17d271d990bd68c169aa7e30ce7b1851355f16cc45d90f713e63e6bfb201c44b244d69df76153d72f1574126c300646d87d30f75c90057ca4e5ac3
7
+ data.tar.gz: 8fb7820eefab44373cbfc1a4004ecf5f48040785172f376aecc6c078bbcbe05404f3a2316666ad0320b26d16f162e5a15b843aadbc20fb0e2e693594668ff4f4
data/LICENSE.txt CHANGED
@@ -1,4 +1,5 @@
1
- Copyright (c) 2013-2016 whitequark <whitequark@whitequark.org>
1
+ Copyright (c) 2013-2024 parser project contributors
2
+ Copyright (c) 2013-2016 Catherine <whitequark@whitequark.org>
2
3
 
3
4
  Parts of the source are derived from ruby_parser:
4
5
  Copyright (c) Ryan Davis, seattle.rb
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'gauntlet'
4
- require 'parser/all'
4
+ require_relative 'parser/all'
5
5
  require 'shellwords'
6
6
 
7
7
  class ParserGauntlet < Gauntlet
data/lib/parser/all.rb CHANGED
@@ -1,16 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'parser/ruby18'
4
- require 'parser/ruby19'
5
- require 'parser/ruby20'
6
- require 'parser/ruby21'
7
- require 'parser/ruby22'
8
- require 'parser/ruby23'
9
- require 'parser/ruby24'
10
- require 'parser/ruby25'
11
- require 'parser/ruby26'
12
- require 'parser/ruby27'
13
- require 'parser/ruby30'
14
- require 'parser/ruby31'
15
- require 'parser/ruby32'
16
- require 'parser/ruby33'
3
+ require_relative 'ruby18'
4
+ require_relative 'ruby19'
5
+ require_relative 'ruby20'
6
+ require_relative 'ruby21'
7
+ require_relative 'ruby22'
8
+ require_relative 'ruby23'
9
+ require_relative 'ruby24'
10
+ require_relative 'ruby25'
11
+ require_relative 'ruby26'
12
+ require_relative 'ruby27'
13
+ require_relative 'ruby30'
14
+ require_relative 'ruby31'
15
+ require_relative 'ruby32'
16
+ require_relative 'ruby33'
17
+ require_relative 'ruby34'
@@ -6,7 +6,9 @@ module Parser
6
6
  ##
7
7
  # @api public
8
8
  #
9
- class Processor < ::AST::Processor
9
+ class Processor
10
+ include ::AST::Processor::Mixin
11
+
10
12
  def process_regular_node(node)
11
13
  node.updated(nil, process_all(node))
12
14
  end
data/lib/parser/base.rb CHANGED
@@ -13,6 +13,9 @@ module Parser
13
13
  # @!attribute [r] static_env
14
14
  # @return [Parser::StaticEnvironment]
15
15
  #
16
+ # @!attribute [r] version
17
+ # @return [Integer]
18
+ #
16
19
  class Base < Racc::Parser
17
20
  ##
18
21
  # Parses a string of Ruby code and returns the AST. If the source
@@ -426,7 +426,7 @@ module Parser
426
426
  def regexp_compose(begin_t, parts, end_t, options)
427
427
  begin
428
428
  static_regexp(parts, options)
429
- rescue RegexpError => e
429
+ rescue RegexpError, Encoding::UndefinedConversionError => e
430
430
  diagnostic :error, :invalid_regexp, { :message => e.message },
431
431
  loc(begin_t).join(loc(end_t))
432
432
  end
@@ -524,10 +524,10 @@ module Parser
524
524
 
525
525
  label = value(key_t)
526
526
  value =
527
- if label =~ /\A[[:lower:]]/
528
- n(:ident, [ label.to_sym ], Source::Map::Variable.new(value_l))
529
- else
527
+ if label =~ /\A[[:upper:]]/
530
528
  n(:const, [ nil, label.to_sym ], Source::Map::Constant.new(nil, value_l, value_l))
529
+ else
530
+ n(:ident, [ label.to_sym ], Source::Map::Variable.new(value_l))
531
531
  end
532
532
  pair_keyword(key_t, accessible(value))
533
533
  end
@@ -594,7 +594,13 @@ module Parser
594
594
  end
595
595
 
596
596
  def gvar(token)
597
- n(:gvar, [ value(token).to_sym ],
597
+ gvar_name = value(token)
598
+
599
+ if gvar_name.start_with?('$0') && gvar_name.length > 2
600
+ diagnostic :error, :gvar_name, { :name => gvar_name }, loc(token)
601
+ end
602
+
603
+ n(:gvar, [ gvar_name.to_sym ],
598
604
  variable_map(token))
599
605
  end
600
606
 
@@ -654,6 +660,13 @@ module Parser
654
660
  end
655
661
 
656
662
  unless @parser.static_env.declared?(name)
663
+ if @parser.version == 33 &&
664
+ name == :it &&
665
+ @parser.context.in_block &&
666
+ !@parser.max_numparam_stack.has_ordinary_params?
667
+ diagnostic :warning, :ambiguous_it_call, nil, node.loc.expression
668
+ end
669
+
657
670
  return n(:send, [ nil, name ],
658
671
  var_send_map(node))
659
672
  end
@@ -1107,15 +1120,19 @@ module Parser
1107
1120
  end
1108
1121
 
1109
1122
  def block(method_call, begin_t, args, body, end_t)
1110
- _receiver, _selector, *call_args = *method_call
1111
-
1112
1123
  if method_call.type == :yield
1113
1124
  diagnostic :error, :block_given_to_yield, nil, method_call.loc.keyword, [loc(begin_t)]
1114
1125
  end
1115
1126
 
1116
- last_arg = call_args.last
1127
+ if method_call.type == :super
1128
+ *_args, last_arg = *method_call
1129
+ else
1130
+ _receiver, _selector, *_args, last_arg = *method_call
1131
+ end
1117
1132
  if last_arg && (last_arg.type == :block_pass || last_arg.type == :forwarded_args)
1118
- diagnostic :error, :block_and_blockarg, nil, last_arg.loc.expression, [loc(begin_t)]
1133
+ if (@parser.version == 33 && method_call.type != :super) || @parser.version != 33
1134
+ diagnostic :error, :block_and_blockarg, nil, last_arg.loc.expression, [loc(begin_t)]
1135
+ end
1119
1136
  end
1120
1137
 
1121
1138
  if args.type == :numargs
@@ -1179,6 +1196,10 @@ module Parser
1179
1196
  end
1180
1197
 
1181
1198
  def index_asgn(receiver, lbrack_t, indexes, rbrack_t)
1199
+ if self.class.emit_kwargs
1200
+ rewrite_hash_args_to_kwargs(indexes)
1201
+ end
1202
+
1182
1203
  if self.class.emit_index
1183
1204
  n(:indexasgn, [ receiver, *indexes ],
1184
1205
  index_map(receiver, lbrack_t, rbrack_t))
@@ -2250,11 +2271,20 @@ module Parser
2250
2271
  source
2251
2272
  end
2252
2273
 
2253
- Regexp.new(source, (Regexp::EXTENDED if options.children.include?(:x)))
2274
+ begin
2275
+ old_verbose, $VERBOSE = $VERBOSE, nil
2276
+ Regexp.new(source, (Regexp::EXTENDED if options.children.include?(:x)))
2277
+ ensure
2278
+ $VERBOSE = old_verbose
2279
+ end
2254
2280
  end
2255
2281
 
2256
2282
  def static_regexp_node(node)
2257
2283
  if node.type == :regexp
2284
+ if @parser.version >= 33 && node.children[0..-2].any? { |child| child.type != :str }
2285
+ return nil
2286
+ end
2287
+
2258
2288
  parts, options = node.children[0..-2], node.children[-1]
2259
2289
  static_regexp(parts, options)
2260
2290
  end
@@ -24,6 +24,7 @@ module Parser
24
24
  in_class
25
25
  in_block
26
26
  in_lambda
27
+ cant_return
27
28
  ]
28
29
 
29
30
  def initialize
@@ -38,6 +39,7 @@ module Parser
38
39
  @in_class = false
39
40
  @in_block = false
40
41
  @in_lambda = false
42
+ @cant_return = false
41
43
  end
42
44
 
43
45
  attr_accessor(*FLAGS)
@@ -17,7 +17,7 @@ module Parser
17
17
  warn_syntax_deviation 'parser/ruby20', current_version
18
18
  end
19
19
 
20
- require 'parser/ruby20'
20
+ require_relative 'ruby20'
21
21
  CurrentRuby = Ruby20
22
22
 
23
23
  when /^2\.1\./
@@ -26,7 +26,7 @@ module Parser
26
26
  warn_syntax_deviation 'parser/ruby21', current_version
27
27
  end
28
28
 
29
- require 'parser/ruby21'
29
+ require_relative 'ruby21'
30
30
  CurrentRuby = Ruby21
31
31
 
32
32
  when /^2\.2\./
@@ -35,7 +35,7 @@ module Parser
35
35
  warn_syntax_deviation 'parser/ruby22', current_version
36
36
  end
37
37
 
38
- require 'parser/ruby22'
38
+ require_relative 'ruby22'
39
39
  CurrentRuby = Ruby22
40
40
 
41
41
  when /^2\.3\./
@@ -44,7 +44,7 @@ module Parser
44
44
  warn_syntax_deviation 'parser/ruby23', current_version
45
45
  end
46
46
 
47
- require 'parser/ruby23'
47
+ require_relative 'ruby23'
48
48
  CurrentRuby = Ruby23
49
49
 
50
50
  when /^2\.4\./
@@ -53,7 +53,7 @@ module Parser
53
53
  warn_syntax_deviation 'parser/ruby24', current_version
54
54
  end
55
55
 
56
- require 'parser/ruby24'
56
+ require_relative 'ruby24'
57
57
  CurrentRuby = Ruby24
58
58
 
59
59
  when /^2\.5\./
@@ -62,7 +62,7 @@ module Parser
62
62
  warn_syntax_deviation 'parser/ruby25', current_version
63
63
  end
64
64
 
65
- require 'parser/ruby25'
65
+ require_relative 'ruby25'
66
66
  CurrentRuby = Ruby25
67
67
 
68
68
  when /^2\.6\./
@@ -71,7 +71,7 @@ module Parser
71
71
  warn_syntax_deviation 'parser/ruby26', current_version
72
72
  end
73
73
 
74
- require 'parser/ruby26'
74
+ require_relative 'ruby26'
75
75
  CurrentRuby = Ruby26
76
76
 
77
77
  when /^2\.7\./
@@ -80,49 +80,67 @@ module Parser
80
80
  warn_syntax_deviation 'parser/ruby27', current_version
81
81
  end
82
82
 
83
- require 'parser/ruby27'
83
+ require_relative 'ruby27'
84
84
  CurrentRuby = Ruby27
85
85
 
86
86
  when /^3\.0\./
87
- current_version = '3.0.6'
87
+ current_version = '3.0.7'
88
88
  if RUBY_VERSION != current_version
89
89
  warn_syntax_deviation 'parser/ruby30', current_version
90
90
  end
91
91
 
92
- require 'parser/ruby30'
92
+ require_relative 'ruby30'
93
93
  CurrentRuby = Ruby30
94
94
 
95
95
  when /^3\.1\./
96
- current_version = '3.1.4'
96
+ current_version = '3.1.7'
97
97
  if RUBY_VERSION != current_version
98
98
  warn_syntax_deviation 'parser/ruby31', current_version
99
99
  end
100
100
 
101
- require 'parser/ruby31'
101
+ require_relative 'ruby31'
102
102
  CurrentRuby = Ruby31
103
103
 
104
104
  when /^3\.2\./
105
- current_version = '3.2.2'
105
+ current_version = '3.2.11'
106
106
  if RUBY_VERSION != current_version
107
107
  warn_syntax_deviation 'parser/ruby32', current_version
108
108
  end
109
109
 
110
- require 'parser/ruby32'
110
+ require_relative 'ruby32'
111
111
  CurrentRuby = Ruby32
112
112
 
113
113
  when /^3\.3\./
114
- current_version = '3.3.0-dev'
114
+ current_version = '3.3.11'
115
115
  if RUBY_VERSION != current_version
116
116
  warn_syntax_deviation 'parser/ruby33', current_version
117
117
  end
118
118
 
119
- require 'parser/ruby33'
119
+ require_relative 'ruby33'
120
120
  CurrentRuby = Ruby33
121
121
 
122
+ when /^3\.4\./
123
+ current_version = '3.4.0-dev'
124
+ if RUBY_VERSION != current_version
125
+ warn_syntax_deviation 'parser/ruby34', current_version
126
+ end
127
+
128
+ require_relative 'ruby34'
129
+ CurrentRuby = Ruby34
130
+
122
131
  else # :nocov:
123
132
  # Keep this in sync with released Ruby.
124
- warn_syntax_deviation 'parser/ruby32', '3.2.x'
125
- require 'parser/ruby32'
126
- CurrentRuby = Ruby32
133
+ warn_syntax_deviation 'parser/ruby33', '3.3.x'
134
+ require_relative 'ruby33'
135
+ CurrentRuby = Ruby33
127
136
  end
137
+ # @!parse
138
+ # ##
139
+ # # @api public
140
+ # #
141
+ # # Parser for the running version of Ruby. NOTE: Supports only Ruby <= 3.3. To parse Ruby 3.4+, please use the prism gem. You can also use them in conjunction to support multiple versions using a backwards-compatible AST.
142
+ # #
143
+ # # @see https://ruby.github.io/prism/rb/docs/ruby_api_md.html prism gem documentation
144
+ # # @see https://github.com/whitequark/parser/blob/master/doc/PRISM_TRANSLATION.md Guide to using prism and parser together.
145
+ # class ::Parser::CurrentRuby < ::Parser::Base; end
128
146
  end
@@ -5,6 +5,8 @@ module Parser
5
5
 
6
6
  class Lexer::Literal
7
7
  DELIMITERS = { '(' => ')', '[' => ']', '{' => '}', '<' => '>' }
8
+ SPACE = ' '.ord
9
+ TAB = "\t".ord
8
10
 
9
11
  TYPES = {
10
12
  # type start token interpolate?
@@ -234,7 +236,20 @@ module Parser
234
236
  protected
235
237
 
236
238
  def delimiter?(delimiter)
237
- if @indent
239
+ if heredoc?
240
+ # This heredoc is valid:
241
+ # <<~E
242
+ # E
243
+ # and this:
244
+ # <<~E
245
+ # E
246
+ # but this one is not:
247
+ # <<~' E'
248
+ # E
249
+ # because there are not enough leading spaces in the closing delimiter.
250
+ delimiter.end_with?(@end_delim) &&
251
+ delimiter.sub(/#{Regexp.escape(@end_delim)}\z/, '').bytes.all? { |c| c == SPACE || c == TAB }
252
+ elsif @indent
238
253
  @end_delim == delimiter.lstrip
239
254
  else
240
255
  @end_delim == delimiter