prism 0.27.0 → 0.28.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +26 -1
  3. data/config.yml +39 -27
  4. data/docs/configuration.md +1 -0
  5. data/ext/prism/api_node.c +814 -807
  6. data/ext/prism/extension.c +5 -3
  7. data/ext/prism/extension.h +1 -1
  8. data/include/prism/ast.h +38 -16
  9. data/include/prism/diagnostic.h +12 -5
  10. data/include/prism/options.h +2 -2
  11. data/include/prism/parser.h +10 -0
  12. data/include/prism/static_literals.h +8 -6
  13. data/include/prism/version.h +2 -2
  14. data/lib/prism/dot_visitor.rb +22 -6
  15. data/lib/prism/dsl.rb +8 -8
  16. data/lib/prism/ffi.rb +3 -3
  17. data/lib/prism/inspect_visitor.rb +2156 -0
  18. data/lib/prism/lex_compat.rb +1 -1
  19. data/lib/prism/mutation_compiler.rb +2 -2
  20. data/lib/prism/node.rb +589 -1715
  21. data/lib/prism/node_ext.rb +34 -5
  22. data/lib/prism/parse_result.rb +78 -0
  23. data/lib/prism/pattern.rb +12 -6
  24. data/lib/prism/polyfill/byteindex.rb +13 -0
  25. data/lib/prism/polyfill/unpack1.rb +14 -0
  26. data/lib/prism/reflection.rb +13 -13
  27. data/lib/prism/serialize.rb +21 -14
  28. data/lib/prism/translation/parser/compiler.rb +2 -2
  29. data/lib/prism/translation/parser.rb +6 -6
  30. data/lib/prism/translation/ripper.rb +13 -9
  31. data/lib/prism/translation/ruby_parser.rb +4 -4
  32. data/lib/prism.rb +2 -1
  33. data/prism.gemspec +36 -38
  34. data/rbi/prism/compiler.rbi +3 -5
  35. data/rbi/prism/inspect_visitor.rbi +12 -0
  36. data/rbi/prism/node.rbi +354 -319
  37. data/rbi/prism/parse_result.rbi +23 -0
  38. data/rbi/prism/translation/ripper.rbi +1 -11
  39. data/sig/prism/dsl.rbs +3 -3
  40. data/sig/prism/inspect_visitor.rbs +22 -0
  41. data/sig/prism/node.rbs +64 -47
  42. data/sig/prism/parse_result.rbs +12 -0
  43. data/src/diagnostic.c +38 -24
  44. data/src/node.c +41 -16
  45. data/src/options.c +2 -2
  46. data/src/prettyprint.c +61 -18
  47. data/src/prism.c +607 -185
  48. data/src/serialize.c +5 -2
  49. data/src/static_literals.c +120 -34
  50. data/src/token_type.c +4 -4
  51. metadata +7 -9
  52. data/lib/prism/node_inspector.rb +0 -68
  53. data/lib/prism/polyfill/string.rb +0 -12
  54. data/rbi/prism/desugar_compiler.rbi +0 -5
  55. data/rbi/prism/mutation_compiler.rbi +0 -5
  56. data/rbi/prism/translation/parser/compiler.rbi +0 -13
  57. data/rbi/prism/translation/ripper/ripper_compiler.rbi +0 -5
  58. data/rbi/prism/translation/ruby_parser.rbi +0 -11
@@ -143,11 +143,12 @@ module Prism
143
143
  current = self #: node?
144
144
 
145
145
  while current.is_a?(ConstantPathNode)
146
- child = current.child
147
- if child.is_a?(MissingNode)
146
+ name = current.name
147
+ if name.nil?
148
148
  raise MissingNodesInConstantPathError, "Constant path contains missing nodes. Cannot compute full name"
149
149
  end
150
- parts.unshift(child.name)
150
+
151
+ parts.unshift(name)
151
152
  current = current.parent
152
153
  end
153
154
 
@@ -162,6 +163,20 @@ module Prism
162
163
  def full_name
163
164
  full_name_parts.join("::")
164
165
  end
166
+
167
+ # Previously, we had a child node on this class that contained either a
168
+ # constant read or a missing node. To not cause a breaking change, we
169
+ # continue to supply that API.
170
+ def child
171
+ warn(<<~MSG, category: :deprecated)
172
+ DEPRECATED: ConstantPathNode#child is deprecated and will be removed \
173
+ in the next major version. Use \
174
+ ConstantPathNode#name/ConstantPathNode#name_loc instead. Called from \
175
+ #{caller(1, 1)&.first}.
176
+ MSG
177
+
178
+ name ? ConstantReadNode.new(source, name, name_loc) : MissingNode.new(source, location)
179
+ end
165
180
  end
166
181
 
167
182
  class ConstantPathTargetNode < Node
@@ -179,17 +194,31 @@ module Prism
179
194
  raise ConstantPathNode::DynamicPartsInConstantPathError, "Constant target path contains dynamic parts. Cannot compute full name"
180
195
  end
181
196
 
182
- if child.is_a?(MissingNode)
197
+ if name.nil?
183
198
  raise ConstantPathNode::MissingNodesInConstantPathError, "Constant target path contains missing nodes. Cannot compute full name"
184
199
  end
185
200
 
186
- parts.push(child.name)
201
+ parts.push(name)
187
202
  end
188
203
 
189
204
  # Returns the full name of this constant path. For example: "Foo::Bar"
190
205
  def full_name
191
206
  full_name_parts.join("::")
192
207
  end
208
+
209
+ # Previously, we had a child node on this class that contained either a
210
+ # constant read or a missing node. To not cause a breaking change, we
211
+ # continue to supply that API.
212
+ def child
213
+ warn(<<~MSG, category: :deprecated)
214
+ DEPRECATED: ConstantPathTargetNode#child is deprecated and will be \
215
+ removed in the next major version. Use \
216
+ ConstantPathTargetNode#name/ConstantPathTargetNode#name_loc instead. \
217
+ Called from #{caller(1, 1)&.first}.
218
+ MSG
219
+
220
+ name ? ConstantReadNode.new(source, name, name_loc) : MissingNode.new(source, location)
221
+ end
193
222
  end
194
223
 
195
224
  class ConstantTargetNode < Node
@@ -5,6 +5,14 @@ module Prism
5
5
  # conjunction with locations to allow them to resolve line numbers and source
6
6
  # ranges.
7
7
  class Source
8
+ # Create a new source object with the given source code. This method should
9
+ # be used instead of `new` and it will return either a `Source` or a
10
+ # specialized and more performant `ASCIISource` if no multibyte characters
11
+ # are present in the source code.
12
+ def self.for(source, start_line = 1, offsets = [])
13
+ source.ascii_only? ? ASCIISource.new(source, start_line, offsets): new(source, start_line, offsets)
14
+ end
15
+
8
16
  # The source code that this source object represents.
9
17
  attr_reader :source
10
18
 
@@ -27,6 +35,11 @@ module Prism
27
35
  source.encoding
28
36
  end
29
37
 
38
+ # Returns the lines of the source code as an array of strings.
39
+ def lines
40
+ source.lines
41
+ end
42
+
30
43
  # Perform a byteslice on the source code using the given byte offset and
31
44
  # byte length.
32
45
  def slice(byte_offset, length)
@@ -45,6 +58,12 @@ module Prism
45
58
  offsets[find_line(byte_offset)]
46
59
  end
47
60
 
61
+ # Returns the byte offset of the end of the line corresponding to the given
62
+ # byte offset.
63
+ def line_end(byte_offset)
64
+ offsets[find_line(byte_offset) + 1] || source.bytesize
65
+ end
66
+
48
67
  # Return the column number for the given byte offset.
49
68
  def column(byte_offset)
50
69
  byte_offset - line_start(byte_offset)
@@ -100,6 +119,39 @@ module Prism
100
119
  end
101
120
  end
102
121
 
122
+ # Specialized version of Prism::Source for source code that includes ASCII
123
+ # characters only. This class is used to apply performance optimizations that
124
+ # cannot be applied to sources that include multibyte characters. Sources that
125
+ # include multibyte characters are represented by the Prism::Source class.
126
+ class ASCIISource < Source
127
+ # Return the character offset for the given byte offset.
128
+ def character_offset(byte_offset)
129
+ byte_offset
130
+ end
131
+
132
+ # Return the column number in characters for the given byte offset.
133
+ def character_column(byte_offset)
134
+ byte_offset - line_start(byte_offset)
135
+ end
136
+
137
+ # Returns the offset from the start of the file for the given byte offset
138
+ # counting in code units for the given encoding.
139
+ #
140
+ # This method is tested with UTF-8, UTF-16, and UTF-32. If there is the
141
+ # concept of code units that differs from the number of characters in other
142
+ # encodings, it is not captured here.
143
+ def code_units_offset(byte_offset, encoding)
144
+ byte_offset
145
+ end
146
+
147
+ # Specialized version of `code_units_column` that does not depend on
148
+ # `code_units_offset`, which is a more expensive operation. This is
149
+ # essentialy the same as `Prism::Source#column`.
150
+ def code_units_column(byte_offset, encoding)
151
+ byte_offset - line_start(byte_offset)
152
+ end
153
+ end
154
+
103
155
  # This represents a location in the source.
104
156
  class Location
105
157
  # A Source object that is used to determine more information from the given
@@ -171,11 +223,25 @@ module Prism
171
223
  "#<Prism::Location @start_offset=#{@start_offset} @length=#{@length} start_line=#{start_line}>"
172
224
  end
173
225
 
226
+ # Returns all of the lines of the source code associated with this location.
227
+ def source_lines
228
+ source.lines
229
+ end
230
+
174
231
  # The source code that this location represents.
175
232
  def slice
176
233
  source.slice(start_offset, length)
177
234
  end
178
235
 
236
+ # The source code that this location represents starting from the beginning
237
+ # of the line that this location starts on to the end of the line that this
238
+ # location ends on.
239
+ def slice_lines
240
+ line_start = source.line_start(start_offset)
241
+ line_end = source.line_end(end_offset)
242
+ source.slice(line_start, line_end - line_start)
243
+ end
244
+
179
245
  # The character offset from the beginning of the source where this location
180
246
  # starts.
181
247
  def start_character_offset
@@ -281,6 +347,18 @@ module Prism
281
347
 
282
348
  Location.new(source, start_offset, other.end_offset - start_offset)
283
349
  end
350
+
351
+ # Join this location with the first occurrence of the string in the source
352
+ # that occurs after this location on the same line, and return the new
353
+ # location. This will raise an error if the string does not exist.
354
+ def adjoin(string)
355
+ line_suffix = source.slice(end_offset, source.line_end(end_offset) - end_offset)
356
+
357
+ line_suffix_index = line_suffix.byteindex(string)
358
+ raise "Could not find #{string}" if line_suffix_index.nil?
359
+
360
+ Location.new(source, start_offset, length + line_suffix_index + string.bytesize)
361
+ end
284
362
  end
285
363
 
286
364
  # This represents a comment that was encountered during parsing. It is the
data/lib/prism/pattern.rb CHANGED
@@ -149,7 +149,10 @@ module Prism
149
149
  parent = node.parent
150
150
 
151
151
  if parent.is_a?(ConstantReadNode) && parent.slice == "Prism"
152
- compile_node(node.child)
152
+ name = node.name
153
+ raise CompilationError, node.inspect if name.nil?
154
+
155
+ compile_constant_name(node, name)
153
156
  else
154
157
  compile_error(node)
155
158
  end
@@ -158,14 +161,17 @@ module Prism
158
161
  # in ConstantReadNode
159
162
  # in String
160
163
  def compile_constant_read_node(node)
161
- value = node.slice
164
+ compile_constant_name(node, node.name)
165
+ end
162
166
 
163
- if Prism.const_defined?(value, false)
164
- clazz = Prism.const_get(value)
167
+ # Compile a name associated with a constant.
168
+ def compile_constant_name(node, name)
169
+ if Prism.const_defined?(name, false)
170
+ clazz = Prism.const_get(name)
165
171
 
166
172
  ->(other) { clazz === other }
167
- elsif Object.const_defined?(value, false)
168
- clazz = Object.const_get(value)
173
+ elsif Object.const_defined?(name, false)
174
+ clazz = Object.const_get(name)
169
175
 
170
176
  ->(other) { clazz === other }
171
177
  else
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Polyfill for String#byteindex, which didn't exist until Ruby 3.2.
4
+ if !("".respond_to?(:byteindex))
5
+ String.include(
6
+ Module.new {
7
+ def byteindex(needle, offset = 0)
8
+ charindex = index(needle, offset)
9
+ slice(0...charindex).bytesize if charindex
10
+ end
11
+ }
12
+ )
13
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Polyfill for String#unpack1 with the offset parameter. Not all Ruby engines
4
+ # have Method#parameters implemented, so we check the arity instead if
5
+ # necessary.
6
+ if (unpack1 = String.instance_method(:unpack1)).respond_to?(:parameters) ? unpack1.parameters.none? { |_, name| name == :offset } : (unpack1.arity == 1)
7
+ String.prepend(
8
+ Module.new {
9
+ def unpack1(format, offset: 0) # :nodoc:
10
+ offset == 0 ? super(format) : self[offset..].unpack1(format) # steep:ignore
11
+ end
12
+ }
13
+ )
14
+ end
@@ -112,7 +112,7 @@ module Prism
112
112
  when :and_node
113
113
  [NodeField.new(:left), NodeField.new(:right), LocationField.new(:operator_loc)]
114
114
  when :arguments_node
115
- [FlagsField.new(:flags, [:contains_keyword_splat?]), NodeListField.new(:arguments)]
115
+ [FlagsField.new(:flags, [:contains_keywords?, :contains_keyword_splat?]), NodeListField.new(:arguments)]
116
116
  when :array_node
117
117
  [FlagsField.new(:flags, [:contains_splat?]), NodeListField.new(:elements), OptionalLocationField.new(:opening_loc), OptionalLocationField.new(:closing_loc)]
118
118
  when :array_pattern_node
@@ -176,13 +176,13 @@ module Prism
176
176
  when :constant_path_and_write_node
177
177
  [NodeField.new(:target), LocationField.new(:operator_loc), NodeField.new(:value)]
178
178
  when :constant_path_node
179
- [OptionalNodeField.new(:parent), NodeField.new(:child), LocationField.new(:delimiter_loc)]
179
+ [OptionalNodeField.new(:parent), OptionalConstantField.new(:name), LocationField.new(:delimiter_loc), LocationField.new(:name_loc)]
180
180
  when :constant_path_operator_write_node
181
181
  [NodeField.new(:target), LocationField.new(:operator_loc), NodeField.new(:value), ConstantField.new(:operator)]
182
182
  when :constant_path_or_write_node
183
183
  [NodeField.new(:target), LocationField.new(:operator_loc), NodeField.new(:value)]
184
184
  when :constant_path_target_node
185
- [OptionalNodeField.new(:parent), NodeField.new(:child), LocationField.new(:delimiter_loc)]
185
+ [OptionalNodeField.new(:parent), OptionalConstantField.new(:name), LocationField.new(:delimiter_loc), LocationField.new(:name_loc)]
186
186
  when :constant_path_write_node
187
187
  [NodeField.new(:target), LocationField.new(:operator_loc), NodeField.new(:value)]
188
188
  when :constant_read_node
@@ -266,7 +266,7 @@ module Prism
266
266
  when :instance_variable_write_node
267
267
  [ConstantField.new(:name), LocationField.new(:name_loc), NodeField.new(:value), LocationField.new(:operator_loc)]
268
268
  when :integer_node
269
- [FlagsField.new(:flags, [:binary?, :decimal?, :octal?, :hexadecimal?]), Integer.new(:value)]
269
+ [FlagsField.new(:flags, [:binary?, :decimal?, :octal?, :hexadecimal?]), IntegerField.new(:value)]
270
270
  when :interpolated_match_last_line_node
271
271
  [FlagsField.new(:flags, [:ignore_case?, :extended?, :multi_line?, :once?, :euc_jp?, :ascii_8bit?, :windows_31j?, :utf_8?, :forced_utf8_encoding?, :forced_binary_encoding?, :forced_us_ascii_encoding?]), LocationField.new(:opening_loc), NodeListField.new(:parts), LocationField.new(:closing_loc)]
272
272
  when :interpolated_regular_expression_node
@@ -286,17 +286,17 @@ module Prism
286
286
  when :lambda_node
287
287
  [ConstantListField.new(:locals), LocationField.new(:operator_loc), LocationField.new(:opening_loc), LocationField.new(:closing_loc), OptionalNodeField.new(:parameters), OptionalNodeField.new(:body)]
288
288
  when :local_variable_and_write_node
289
- [LocationField.new(:name_loc), LocationField.new(:operator_loc), NodeField.new(:value), ConstantField.new(:name), Integer.new(:depth)]
289
+ [LocationField.new(:name_loc), LocationField.new(:operator_loc), NodeField.new(:value), ConstantField.new(:name), IntegerField.new(:depth)]
290
290
  when :local_variable_operator_write_node
291
- [LocationField.new(:name_loc), LocationField.new(:operator_loc), NodeField.new(:value), ConstantField.new(:name), ConstantField.new(:operator), Integer.new(:depth)]
291
+ [LocationField.new(:name_loc), LocationField.new(:operator_loc), NodeField.new(:value), ConstantField.new(:name), ConstantField.new(:operator), IntegerField.new(:depth)]
292
292
  when :local_variable_or_write_node
293
- [LocationField.new(:name_loc), LocationField.new(:operator_loc), NodeField.new(:value), ConstantField.new(:name), Integer.new(:depth)]
293
+ [LocationField.new(:name_loc), LocationField.new(:operator_loc), NodeField.new(:value), ConstantField.new(:name), IntegerField.new(:depth)]
294
294
  when :local_variable_read_node
295
- [ConstantField.new(:name), Integer.new(:depth)]
295
+ [ConstantField.new(:name), IntegerField.new(:depth)]
296
296
  when :local_variable_target_node
297
- [ConstantField.new(:name), Integer.new(:depth)]
297
+ [ConstantField.new(:name), IntegerField.new(:depth)]
298
298
  when :local_variable_write_node
299
- [ConstantField.new(:name), Integer.new(:depth), LocationField.new(:name_loc), NodeField.new(:value), LocationField.new(:operator_loc)]
299
+ [ConstantField.new(:name), IntegerField.new(:depth), LocationField.new(:name_loc), NodeField.new(:value), LocationField.new(:operator_loc)]
300
300
  when :match_last_line_node
301
301
  [FlagsField.new(:flags, [:ignore_case?, :extended?, :multi_line?, :once?, :euc_jp?, :ascii_8bit?, :windows_31j?, :utf_8?, :forced_utf8_encoding?, :forced_binary_encoding?, :forced_us_ascii_encoding?]), LocationField.new(:opening_loc), LocationField.new(:content_loc), LocationField.new(:closing_loc), StringField.new(:unescaped)]
302
302
  when :match_predicate_node
@@ -320,9 +320,9 @@ module Prism
320
320
  when :no_keywords_parameter_node
321
321
  [LocationField.new(:operator_loc), LocationField.new(:keyword_loc)]
322
322
  when :numbered_parameters_node
323
- [Integer.new(:maximum)]
323
+ [IntegerField.new(:maximum)]
324
324
  when :numbered_reference_read_node
325
- [Integer.new(:number)]
325
+ [IntegerField.new(:number)]
326
326
  when :optional_keyword_parameter_node
327
327
  [FlagsField.new(:flags, [:repeated_parameter?]), ConstantField.new(:name), LocationField.new(:name_loc), NodeField.new(:value)]
328
328
  when :optional_parameter_node
@@ -364,7 +364,7 @@ module Prism
364
364
  when :retry_node
365
365
  []
366
366
  when :return_node
367
- [LocationField.new(:keyword_loc), OptionalNodeField.new(:arguments)]
367
+ [FlagsField.new(:flags, [:redundant?]), LocationField.new(:keyword_loc), OptionalNodeField.new(:arguments)]
368
368
  when :self_node
369
369
  []
370
370
  when :shareable_constant_node
@@ -7,7 +7,7 @@ if you are looking to modify the template
7
7
  =end
8
8
 
9
9
  require "stringio"
10
- require_relative "polyfill/string"
10
+ require_relative "polyfill/unpack1"
11
11
 
12
12
  module Prism
13
13
  # A module responsible for deserializing parse results.
@@ -18,7 +18,7 @@ module Prism
18
18
 
19
19
  # The minor version of prism that we are expecting to find in the serialized
20
20
  # strings.
21
- MINOR_VERSION = 27
21
+ MINOR_VERSION = 28
22
22
 
23
23
  # The patch version of prism that we are expecting to find in the serialized
24
24
  # strings.
@@ -27,7 +27,7 @@ module Prism
27
27
  # Deserialize the AST represented by the given string into a parse result.
28
28
  def self.load(input, serialized)
29
29
  input = input.dup
30
- source = Source.new(input)
30
+ source = Source.for(input)
31
31
  loader = Loader.new(source, serialized)
32
32
  result = loader.load_result
33
33
 
@@ -249,12 +249,13 @@ module Prism
249
249
  :hash_rocket,
250
250
  :hash_term,
251
251
  :hash_value,
252
+ :heredoc_identifier,
252
253
  :heredoc_term,
253
254
  :incomplete_question_mark,
254
255
  :incomplete_variable_class,
255
- :incomplete_variable_class_3_3_0,
256
+ :incomplete_variable_class_3_3,
256
257
  :incomplete_variable_instance,
257
- :incomplete_variable_instance_3_3_0,
258
+ :incomplete_variable_instance_3_3,
258
259
  :instance_variable_bare,
259
260
  :invalid_block_exit,
260
261
  :invalid_character,
@@ -269,14 +270,16 @@ module Prism
269
270
  :invalid_number_decimal,
270
271
  :invalid_number_hexadecimal,
271
272
  :invalid_number_octal,
272
- :invalid_number_underscore,
273
+ :invalid_number_underscore_inner,
274
+ :invalid_number_underscore_trailing,
273
275
  :invalid_percent,
274
276
  :invalid_printable_character,
275
277
  :invalid_retry_after_else,
276
278
  :invalid_retry_after_ensure,
277
279
  :invalid_retry_without_rescue,
280
+ :invalid_symbol,
278
281
  :invalid_variable_global,
279
- :invalid_variable_global_3_3_0,
282
+ :invalid_variable_global_3_3,
280
283
  :invalid_yield,
281
284
  :it_not_allowed_numbered,
282
285
  :it_not_allowed_ordinary,
@@ -320,6 +323,7 @@ module Prism
320
323
  :parameter_star,
321
324
  :parameter_unexpected_fwd,
322
325
  :parameter_wild_loose_comma,
326
+ :parameter_unexpected_no_kw,
323
327
  :pattern_capture_duplicate,
324
328
  :pattern_expression_after_bracket,
325
329
  :pattern_expression_after_comma,
@@ -373,6 +377,9 @@ module Prism
373
377
  :unary_receiver,
374
378
  :undef_argument,
375
379
  :unexpected_block_argument,
380
+ :unexpected_index_block,
381
+ :unexpected_index_keywords,
382
+ :unexpected_safe_navigation,
376
383
  :unexpected_token_close_context,
377
384
  :unexpected_token_ignore,
378
385
  :until_term,
@@ -391,7 +398,7 @@ module Prism
391
398
  :comparison_after_comparison,
392
399
  :dot_dot_dot_eol,
393
400
  :equal_in_conditional,
394
- :equal_in_conditional_3_3_0,
401
+ :equal_in_conditional_3_3,
395
402
  :end_in_method,
396
403
  :duplicated_hash_key,
397
404
  :duplicated_when_clause,
@@ -721,7 +728,7 @@ module Prism
721
728
  source, load_node, load_location, load_node, location)
722
729
  when 37 then
723
730
  ConstantPathNode.new(
724
- source, load_optional_node, load_node, load_location, location)
731
+ source, load_optional_node, load_optional_constant, load_location, load_location, location)
725
732
  when 38 then
726
733
  ConstantPathOperatorWriteNode.new(
727
734
  source, load_node, load_location, load_node, load_required_constant, location)
@@ -730,7 +737,7 @@ module Prism
730
737
  source, load_node, load_location, load_node, location)
731
738
  when 40 then
732
739
  ConstantPathTargetNode.new(
733
- source, load_optional_node, load_node, load_location, location)
740
+ source, load_optional_node, load_optional_constant, load_location, load_location, location)
734
741
  when 41 then
735
742
  ConstantPathWriteNode.new(
736
743
  source, load_node, load_location, load_node, location)
@@ -1004,7 +1011,7 @@ module Prism
1004
1011
  source, location)
1005
1012
  when 131 then
1006
1013
  ReturnNode.new(
1007
- source, load_location, load_optional_node, location)
1014
+ source, load_varuint, load_location, load_optional_node, location)
1008
1015
  when 132 then
1009
1016
  SelfNode.new(
1010
1017
  source, location)
@@ -1256,7 +1263,7 @@ module Prism
1256
1263
  -> {
1257
1264
  location = load_location
1258
1265
  ConstantPathNode.new(
1259
- source, load_optional_node, load_node, load_location, location)
1266
+ source, load_optional_node, load_optional_constant, load_location, load_location, location)
1260
1267
  },
1261
1268
  -> {
1262
1269
  location = load_location
@@ -1271,7 +1278,7 @@ module Prism
1271
1278
  -> {
1272
1279
  location = load_location
1273
1280
  ConstantPathTargetNode.new(
1274
- source, load_optional_node, load_node, load_location, location)
1281
+ source, load_optional_node, load_optional_constant, load_location, load_location, location)
1275
1282
  },
1276
1283
  -> {
1277
1284
  location = load_location
@@ -1727,7 +1734,7 @@ module Prism
1727
1734
  -> {
1728
1735
  location = load_location
1729
1736
  ReturnNode.new(
1730
- source, load_location, load_optional_node, location)
1737
+ source, load_varuint, load_location, load_optional_node, location)
1731
1738
  },
1732
1739
  -> {
1733
1740
  location = load_location
@@ -483,13 +483,13 @@ module Prism
483
483
  if node.parent.nil?
484
484
  builder.const_global(
485
485
  token(node.delimiter_loc),
486
- [node.child.name, srange(node.child.location)]
486
+ [node.name, srange(node.name_loc)]
487
487
  )
488
488
  else
489
489
  builder.const_fetch(
490
490
  visit(node.parent),
491
491
  token(node.delimiter_loc),
492
- [node.child.name, srange(node.child.location)]
492
+ [node.name, srange(node.name_loc)]
493
493
  )
494
494
  end
495
495
  end
@@ -46,7 +46,7 @@ module Prism
46
46
  source = source_buffer.source
47
47
 
48
48
  offset_cache = build_offset_cache(source)
49
- result = unwrap(Prism.parse(source, filepath: source_buffer.name, version: convert_for_prism(version)), offset_cache)
49
+ result = unwrap(Prism.parse(source, filepath: source_buffer.name, version: convert_for_prism(version), scopes: [[]]), offset_cache)
50
50
 
51
51
  build_ast(result.value, offset_cache)
52
52
  ensure
@@ -59,7 +59,7 @@ module Prism
59
59
  source = source_buffer.source
60
60
 
61
61
  offset_cache = build_offset_cache(source)
62
- result = unwrap(Prism.parse(source, filepath: source_buffer.name, version: convert_for_prism(version)), offset_cache)
62
+ result = unwrap(Prism.parse(source, filepath: source_buffer.name, version: convert_for_prism(version), scopes: [[]]), offset_cache)
63
63
 
64
64
  [
65
65
  build_ast(result.value, offset_cache),
@@ -78,7 +78,7 @@ module Prism
78
78
  offset_cache = build_offset_cache(source)
79
79
  result =
80
80
  begin
81
- unwrap(Prism.parse_lex(source, filepath: source_buffer.name, version: convert_for_prism(version)), offset_cache)
81
+ unwrap(Prism.parse_lex(source, filepath: source_buffer.name, version: convert_for_prism(version), scopes: [[]]), offset_cache)
82
82
  rescue ::Parser::SyntaxError
83
83
  raise if !recover
84
84
  end
@@ -149,17 +149,17 @@ module Prism
149
149
  Diagnostic.new(:error, :endless_setter, {}, diagnostic_location, [])
150
150
  when :embdoc_term
151
151
  Diagnostic.new(:error, :embedded_document, {}, diagnostic_location, [])
152
- when :incomplete_variable_class, :incomplete_variable_class_3_3_0
152
+ when :incomplete_variable_class, :incomplete_variable_class_3_3
153
153
  location = location.copy(length: location.length + 1)
154
154
  diagnostic_location = build_range(location, offset_cache)
155
155
 
156
156
  Diagnostic.new(:error, :cvar_name, { name: location.slice }, diagnostic_location, [])
157
- when :incomplete_variable_instance, :incomplete_variable_instance_3_3_0
157
+ when :incomplete_variable_instance, :incomplete_variable_instance_3_3
158
158
  location = location.copy(length: location.length + 1)
159
159
  diagnostic_location = build_range(location, offset_cache)
160
160
 
161
161
  Diagnostic.new(:error, :ivar_name, { name: location.slice }, diagnostic_location, [])
162
- when :invalid_variable_global, :invalid_variable_global_3_3_0
162
+ when :invalid_variable_global, :invalid_variable_global_3_3
163
163
  Diagnostic.new(:error, :gvar_name, { name: location.slice }, diagnostic_location, [])
164
164
  when :module_in_method
165
165
  Diagnostic.new(:error, :module_in_def, {}, diagnostic_location, [])
@@ -1456,16 +1456,16 @@ module Prism
1456
1456
  # ^^^^^^^^
1457
1457
  def visit_constant_path_node(node)
1458
1458
  if node.parent.nil?
1459
- bounds(node.child.location)
1460
- child = on_const(node.child.name.to_s)
1459
+ bounds(node.name_loc)
1460
+ child = on_const(node.name.to_s)
1461
1461
 
1462
1462
  bounds(node.location)
1463
1463
  on_top_const_ref(child)
1464
1464
  else
1465
1465
  parent = visit(node.parent)
1466
1466
 
1467
- bounds(node.child.location)
1468
- child = on_const(node.child.name.to_s)
1467
+ bounds(node.name_loc)
1468
+ child = on_const(node.name.to_s)
1469
1469
 
1470
1470
  bounds(node.location)
1471
1471
  on_const_path_ref(parent, child)
@@ -1488,16 +1488,16 @@ module Prism
1488
1488
  # Visit a constant path that is part of a write node.
1489
1489
  private def visit_constant_path_write_node_target(node)
1490
1490
  if node.parent.nil?
1491
- bounds(node.child.location)
1492
- child = on_const(node.child.name.to_s)
1491
+ bounds(node.name_loc)
1492
+ child = on_const(node.name.to_s)
1493
1493
 
1494
1494
  bounds(node.location)
1495
1495
  on_top_const_field(child)
1496
1496
  else
1497
1497
  parent = visit(node.parent)
1498
1498
 
1499
- bounds(node.child.location)
1500
- child = on_const(node.child.name.to_s)
1499
+ bounds(node.name_loc)
1500
+ child = on_const(node.name.to_s)
1501
1501
 
1502
1502
  bounds(node.location)
1503
1503
  on_const_path_field(parent, child)
@@ -3267,7 +3267,11 @@ module Prism
3267
3267
 
3268
3268
  # Lazily initialize the parse result.
3269
3269
  def result
3270
- @result ||= Prism.parse(source)
3270
+ @result ||=
3271
+ begin
3272
+ scopes = RUBY_VERSION >= "3.3.0" ? [] : [[]]
3273
+ Prism.parse(source, scopes: scopes)
3274
+ end
3271
3275
  end
3272
3276
 
3273
3277
  ##########################################################################
@@ -442,9 +442,9 @@ module Prism
442
442
  # ^^^^^^^^
443
443
  def visit_constant_path_node(node)
444
444
  if node.parent.nil?
445
- s(node, :colon3, node.child.name)
445
+ s(node, :colon3, node.name)
446
446
  else
447
- s(node, :colon2, visit(node.parent), node.child.name)
447
+ s(node, :colon2, visit(node.parent), node.name)
448
448
  end
449
449
  end
450
450
 
@@ -1536,13 +1536,13 @@ module Prism
1536
1536
  # Parse the given source and translate it into the seattlerb/ruby_parser
1537
1537
  # gem's Sexp format.
1538
1538
  def parse(source, filepath = "(string)")
1539
- translate(Prism.parse(source, filepath: filepath), filepath)
1539
+ translate(Prism.parse(source, filepath: filepath, scopes: [[]]), filepath)
1540
1540
  end
1541
1541
 
1542
1542
  # Parse the given file and translate it into the seattlerb/ruby_parser
1543
1543
  # gem's Sexp format.
1544
1544
  def parse_file(filepath)
1545
- translate(Prism.parse_file(filepath), filepath)
1545
+ translate(Prism.parse_file(filepath, scopes: [[]]), filepath)
1546
1546
  end
1547
1547
 
1548
1548
  class << self
data/lib/prism.rb CHANGED
@@ -18,10 +18,10 @@ module Prism
18
18
  autoload :Dispatcher, "prism/dispatcher"
19
19
  autoload :DotVisitor, "prism/dot_visitor"
20
20
  autoload :DSL, "prism/dsl"
21
+ autoload :InspectVisitor, "prism/inspect_visitor"
21
22
  autoload :LexCompat, "prism/lex_compat"
22
23
  autoload :LexRipper, "prism/lex_compat"
23
24
  autoload :MutationCompiler, "prism/mutation_compiler"
24
- autoload :NodeInspector, "prism/node_inspector"
25
25
  autoload :Pack, "prism/pack"
26
26
  autoload :Pattern, "prism/pattern"
27
27
  autoload :Reflection, "prism/reflection"
@@ -67,6 +67,7 @@ module Prism
67
67
  end
68
68
  end
69
69
 
70
+ require_relative "prism/polyfill/byteindex"
70
71
  require_relative "prism/node"
71
72
  require_relative "prism/node_ext"
72
73
  require_relative "prism/parse_result"