prism 0.25.0 → 0.26.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +20 -1
- data/Makefile +17 -14
- data/config.yml +12 -1
- data/docs/configuration.md +1 -0
- data/docs/releasing.md +7 -9
- data/ext/prism/extconf.rb +8 -3
- data/ext/prism/extension.c +28 -2
- data/ext/prism/extension.h +1 -1
- data/include/prism/diagnostic.h +12 -1
- data/include/prism/parser.h +5 -1
- data/include/prism/version.h +2 -2
- data/lib/prism/desugar_compiler.rb +4 -2
- data/lib/prism/ffi.rb +10 -0
- data/lib/prism/node.rb +16 -0
- data/lib/prism/parse_result.rb +5 -0
- data/lib/prism/reflection.rb +421 -0
- data/lib/prism/serialize.rb +13 -2
- data/lib/prism/translation/parser/compiler.rb +48 -11
- data/lib/prism.rb +1 -16
- data/prism.gemspec +7 -3
- data/rbi/prism/node.rbi +453 -0
- data/rbi/prism/parse_result.rbi +3 -0
- data/rbi/prism/reflection.rbi +64 -0
- data/rbi/prism/translation/parser.rbi +11 -0
- data/rbi/prism/translation/parser33.rbi +6 -0
- data/rbi/prism/translation/parser34.rbi +6 -0
- data/rbi/prism.rbi +33 -33
- data/sig/prism/node.rbs +10 -1
- data/sig/prism/parse_result.rbs +1 -0
- data/sig/prism/reflection.rbs +56 -0
- data/sig/prism.rbs +2 -2
- data/src/diagnostic.c +30 -8
- data/src/options.c +30 -19
- data/src/prism.c +404 -67
- data/src/token_type.c +3 -3
- data/src/util/pm_integer.c +14 -8
- metadata +8 -4
- data/include/prism/util/pm_state_stack.h +0 -42
- data/src/util/pm_state_stack.c +0 -25
@@ -0,0 +1,421 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
=begin
|
4
|
+
This file is generated by the templates/template.rb script and should not be
|
5
|
+
modified manually. See templates/lib/prism/reflection.rb.erb
|
6
|
+
if you are looking to modify the template
|
7
|
+
=end
|
8
|
+
|
9
|
+
module Prism
|
10
|
+
# The Reflection module provides the ability to reflect on the structure of
|
11
|
+
# the syntax tree itself, as opposed to looking at a single syntax tree. This
|
12
|
+
# is useful in metaprogramming contexts.
|
13
|
+
module Reflection
|
14
|
+
# A field represents a single piece of data on a node. It is the base class
|
15
|
+
# for all other field types.
|
16
|
+
class Field
|
17
|
+
# The name of the field.
|
18
|
+
attr_reader :name
|
19
|
+
|
20
|
+
# Initializes the field with the given name.
|
21
|
+
def initialize(name)
|
22
|
+
@name = name
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# A node field represents a single child node in the syntax tree. It
|
27
|
+
# resolves to a Prism::Node in Ruby.
|
28
|
+
class NodeField < Field
|
29
|
+
end
|
30
|
+
|
31
|
+
# An optional node field represents a single child node in the syntax tree
|
32
|
+
# that may or may not be present. It resolves to either a Prism::Node or nil
|
33
|
+
# in Ruby.
|
34
|
+
class OptionalNodeField < Field
|
35
|
+
end
|
36
|
+
|
37
|
+
# A node list field represents a list of child nodes in the syntax tree. It
|
38
|
+
# resolves to an array of Prism::Node instances in Ruby.
|
39
|
+
class NodeListField < Field
|
40
|
+
end
|
41
|
+
|
42
|
+
# A constant field represents a constant value on a node. Effectively, it
|
43
|
+
# represents an identifier found within the source. It resolves to a symbol
|
44
|
+
# in Ruby.
|
45
|
+
class ConstantField < Field
|
46
|
+
end
|
47
|
+
|
48
|
+
# An optional constant field represents a constant value on a node that may
|
49
|
+
# or may not be present. It resolves to either a symbol or nil in Ruby.
|
50
|
+
class OptionalConstantField < Field
|
51
|
+
end
|
52
|
+
|
53
|
+
# A constant list field represents a list of constant values on a node. It
|
54
|
+
# resolves to an array of symbols in Ruby.
|
55
|
+
class ConstantListField < Field
|
56
|
+
end
|
57
|
+
|
58
|
+
# A string field represents a string value on a node. It almost always
|
59
|
+
# represents the unescaped value of a string-like literal. It resolves to a
|
60
|
+
# string in Ruby.
|
61
|
+
class StringField < Field
|
62
|
+
end
|
63
|
+
|
64
|
+
# A location field represents the location of some part of the node in the
|
65
|
+
# source code. For example, the location of a keyword or an operator. It
|
66
|
+
# resolves to a Prism::Location in Ruby.
|
67
|
+
class LocationField < Field
|
68
|
+
end
|
69
|
+
|
70
|
+
# An optional location field represents the location of some part of the
|
71
|
+
# node in the source code that may or may not be present. It resolves to
|
72
|
+
# either a Prism::Location or nil in Ruby.
|
73
|
+
class OptionalLocationField < Field
|
74
|
+
end
|
75
|
+
|
76
|
+
# A uint8 field represents an unsigned 8-bit integer value on a node. It
|
77
|
+
# resolves to an Integer in Ruby.
|
78
|
+
class UInt8Field < Field
|
79
|
+
end
|
80
|
+
|
81
|
+
# A uint32 field represents an unsigned 32-bit integer value on a node. It
|
82
|
+
# resolves to an Integer in Ruby.
|
83
|
+
class UInt32Field < Field
|
84
|
+
end
|
85
|
+
|
86
|
+
# A flags field represents a bitset of flags on a node. It resolves to an
|
87
|
+
# integer in Ruby. Note that the flags cannot be accessed directly on the
|
88
|
+
# node because the integer is kept private. Instead, the various flags in
|
89
|
+
# the bitset should be accessed through their query methods.
|
90
|
+
class FlagsField < Field
|
91
|
+
# The names of the flags in the bitset.
|
92
|
+
attr_reader :flags
|
93
|
+
|
94
|
+
# Initializes the flags field with the given name and flags.
|
95
|
+
def initialize(name, flags)
|
96
|
+
super(name)
|
97
|
+
@flags = flags
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
# An integer field represents an arbitrarily-sized integer value. It is used
|
102
|
+
# exclusively to represent the value of an integer literal. It resolves to
|
103
|
+
# an Integer in Ruby.
|
104
|
+
class IntegerField < Field
|
105
|
+
end
|
106
|
+
|
107
|
+
# A double field represents a double-precision floating point value. It is
|
108
|
+
# used exclusively to represent the value of a floating point literal. It
|
109
|
+
# resolves to a Float in Ruby.
|
110
|
+
class DoubleField < Field
|
111
|
+
end
|
112
|
+
|
113
|
+
# Returns the fields for the given node.
|
114
|
+
def self.fields_for(node)
|
115
|
+
case node.type
|
116
|
+
when :alias_global_variable_node
|
117
|
+
[NodeField.new(:new_name), NodeField.new(:old_name), LocationField.new(:keyword_loc)]
|
118
|
+
when :alias_method_node
|
119
|
+
[NodeField.new(:new_name), NodeField.new(:old_name), LocationField.new(:keyword_loc)]
|
120
|
+
when :alternation_pattern_node
|
121
|
+
[NodeField.new(:left), NodeField.new(:right), LocationField.new(:operator_loc)]
|
122
|
+
when :and_node
|
123
|
+
[NodeField.new(:left), NodeField.new(:right), LocationField.new(:operator_loc)]
|
124
|
+
when :arguments_node
|
125
|
+
[FlagsField.new(:flags, [:contains_keyword_splat?]), NodeListField.new(:arguments)]
|
126
|
+
when :array_node
|
127
|
+
[FlagsField.new(:flags, [:contains_splat?]), NodeListField.new(:elements), OptionalLocationField.new(:opening_loc), OptionalLocationField.new(:closing_loc)]
|
128
|
+
when :array_pattern_node
|
129
|
+
[OptionalNodeField.new(:constant), NodeListField.new(:requireds), OptionalNodeField.new(:rest), NodeListField.new(:posts), OptionalLocationField.new(:opening_loc), OptionalLocationField.new(:closing_loc)]
|
130
|
+
when :assoc_node
|
131
|
+
[NodeField.new(:key), NodeField.new(:value), OptionalLocationField.new(:operator_loc)]
|
132
|
+
when :assoc_splat_node
|
133
|
+
[OptionalNodeField.new(:value), LocationField.new(:operator_loc)]
|
134
|
+
when :back_reference_read_node
|
135
|
+
[ConstantField.new(:name)]
|
136
|
+
when :begin_node
|
137
|
+
[OptionalLocationField.new(:begin_keyword_loc), OptionalNodeField.new(:statements), OptionalNodeField.new(:rescue_clause), OptionalNodeField.new(:else_clause), OptionalNodeField.new(:ensure_clause), OptionalLocationField.new(:end_keyword_loc)]
|
138
|
+
when :block_argument_node
|
139
|
+
[OptionalNodeField.new(:expression), LocationField.new(:operator_loc)]
|
140
|
+
when :block_local_variable_node
|
141
|
+
[FlagsField.new(:flags, [:repeated_parameter?]), ConstantField.new(:name)]
|
142
|
+
when :block_node
|
143
|
+
[ConstantListField.new(:locals), OptionalNodeField.new(:parameters), OptionalNodeField.new(:body), LocationField.new(:opening_loc), LocationField.new(:closing_loc)]
|
144
|
+
when :block_parameter_node
|
145
|
+
[FlagsField.new(:flags, [:repeated_parameter?]), OptionalConstantField.new(:name), OptionalLocationField.new(:name_loc), LocationField.new(:operator_loc)]
|
146
|
+
when :block_parameters_node
|
147
|
+
[OptionalNodeField.new(:parameters), NodeListField.new(:locals), OptionalLocationField.new(:opening_loc), OptionalLocationField.new(:closing_loc)]
|
148
|
+
when :break_node
|
149
|
+
[OptionalNodeField.new(:arguments), LocationField.new(:keyword_loc)]
|
150
|
+
when :call_and_write_node
|
151
|
+
[FlagsField.new(:flags, [:safe_navigation?, :variable_call?, :attribute_write?, :ignore_visibility?]), OptionalNodeField.new(:receiver), OptionalLocationField.new(:call_operator_loc), OptionalLocationField.new(:message_loc), ConstantField.new(:read_name), ConstantField.new(:write_name), LocationField.new(:operator_loc), NodeField.new(:value)]
|
152
|
+
when :call_node
|
153
|
+
[FlagsField.new(:flags, [:safe_navigation?, :variable_call?, :attribute_write?, :ignore_visibility?]), OptionalNodeField.new(:receiver), OptionalLocationField.new(:call_operator_loc), ConstantField.new(:name), OptionalLocationField.new(:message_loc), OptionalLocationField.new(:opening_loc), OptionalNodeField.new(:arguments), OptionalLocationField.new(:closing_loc), OptionalNodeField.new(:block)]
|
154
|
+
when :call_operator_write_node
|
155
|
+
[FlagsField.new(:flags, [:safe_navigation?, :variable_call?, :attribute_write?, :ignore_visibility?]), OptionalNodeField.new(:receiver), OptionalLocationField.new(:call_operator_loc), OptionalLocationField.new(:message_loc), ConstantField.new(:read_name), ConstantField.new(:write_name), ConstantField.new(:operator), LocationField.new(:operator_loc), NodeField.new(:value)]
|
156
|
+
when :call_or_write_node
|
157
|
+
[FlagsField.new(:flags, [:safe_navigation?, :variable_call?, :attribute_write?, :ignore_visibility?]), OptionalNodeField.new(:receiver), OptionalLocationField.new(:call_operator_loc), OptionalLocationField.new(:message_loc), ConstantField.new(:read_name), ConstantField.new(:write_name), LocationField.new(:operator_loc), NodeField.new(:value)]
|
158
|
+
when :call_target_node
|
159
|
+
[FlagsField.new(:flags, [:safe_navigation?, :variable_call?, :attribute_write?, :ignore_visibility?]), NodeField.new(:receiver), LocationField.new(:call_operator_loc), ConstantField.new(:name), LocationField.new(:message_loc)]
|
160
|
+
when :capture_pattern_node
|
161
|
+
[NodeField.new(:value), NodeField.new(:target), LocationField.new(:operator_loc)]
|
162
|
+
when :case_match_node
|
163
|
+
[OptionalNodeField.new(:predicate), NodeListField.new(:conditions), OptionalNodeField.new(:consequent), LocationField.new(:case_keyword_loc), LocationField.new(:end_keyword_loc)]
|
164
|
+
when :case_node
|
165
|
+
[OptionalNodeField.new(:predicate), NodeListField.new(:conditions), OptionalNodeField.new(:consequent), LocationField.new(:case_keyword_loc), LocationField.new(:end_keyword_loc)]
|
166
|
+
when :class_node
|
167
|
+
[ConstantListField.new(:locals), LocationField.new(:class_keyword_loc), NodeField.new(:constant_path), OptionalLocationField.new(:inheritance_operator_loc), OptionalNodeField.new(:superclass), OptionalNodeField.new(:body), LocationField.new(:end_keyword_loc), ConstantField.new(:name)]
|
168
|
+
when :class_variable_and_write_node
|
169
|
+
[ConstantField.new(:name), LocationField.new(:name_loc), LocationField.new(:operator_loc), NodeField.new(:value)]
|
170
|
+
when :class_variable_operator_write_node
|
171
|
+
[ConstantField.new(:name), LocationField.new(:name_loc), LocationField.new(:operator_loc), NodeField.new(:value), ConstantField.new(:operator)]
|
172
|
+
when :class_variable_or_write_node
|
173
|
+
[ConstantField.new(:name), LocationField.new(:name_loc), LocationField.new(:operator_loc), NodeField.new(:value)]
|
174
|
+
when :class_variable_read_node
|
175
|
+
[ConstantField.new(:name)]
|
176
|
+
when :class_variable_target_node
|
177
|
+
[ConstantField.new(:name)]
|
178
|
+
when :class_variable_write_node
|
179
|
+
[ConstantField.new(:name), LocationField.new(:name_loc), NodeField.new(:value), LocationField.new(:operator_loc)]
|
180
|
+
when :constant_and_write_node
|
181
|
+
[ConstantField.new(:name), LocationField.new(:name_loc), LocationField.new(:operator_loc), NodeField.new(:value)]
|
182
|
+
when :constant_operator_write_node
|
183
|
+
[ConstantField.new(:name), LocationField.new(:name_loc), LocationField.new(:operator_loc), NodeField.new(:value), ConstantField.new(:operator)]
|
184
|
+
when :constant_or_write_node
|
185
|
+
[ConstantField.new(:name), LocationField.new(:name_loc), LocationField.new(:operator_loc), NodeField.new(:value)]
|
186
|
+
when :constant_path_and_write_node
|
187
|
+
[NodeField.new(:target), LocationField.new(:operator_loc), NodeField.new(:value)]
|
188
|
+
when :constant_path_node
|
189
|
+
[OptionalNodeField.new(:parent), NodeField.new(:child), LocationField.new(:delimiter_loc)]
|
190
|
+
when :constant_path_operator_write_node
|
191
|
+
[NodeField.new(:target), LocationField.new(:operator_loc), NodeField.new(:value), ConstantField.new(:operator)]
|
192
|
+
when :constant_path_or_write_node
|
193
|
+
[NodeField.new(:target), LocationField.new(:operator_loc), NodeField.new(:value)]
|
194
|
+
when :constant_path_target_node
|
195
|
+
[OptionalNodeField.new(:parent), NodeField.new(:child), LocationField.new(:delimiter_loc)]
|
196
|
+
when :constant_path_write_node
|
197
|
+
[NodeField.new(:target), LocationField.new(:operator_loc), NodeField.new(:value)]
|
198
|
+
when :constant_read_node
|
199
|
+
[ConstantField.new(:name)]
|
200
|
+
when :constant_target_node
|
201
|
+
[ConstantField.new(:name)]
|
202
|
+
when :constant_write_node
|
203
|
+
[ConstantField.new(:name), LocationField.new(:name_loc), NodeField.new(:value), LocationField.new(:operator_loc)]
|
204
|
+
when :def_node
|
205
|
+
[ConstantField.new(:name), LocationField.new(:name_loc), OptionalNodeField.new(:receiver), OptionalNodeField.new(:parameters), OptionalNodeField.new(:body), ConstantListField.new(:locals), LocationField.new(:def_keyword_loc), OptionalLocationField.new(:operator_loc), OptionalLocationField.new(:lparen_loc), OptionalLocationField.new(:rparen_loc), OptionalLocationField.new(:equal_loc), OptionalLocationField.new(:end_keyword_loc)]
|
206
|
+
when :defined_node
|
207
|
+
[OptionalLocationField.new(:lparen_loc), NodeField.new(:value), OptionalLocationField.new(:rparen_loc), LocationField.new(:keyword_loc)]
|
208
|
+
when :else_node
|
209
|
+
[LocationField.new(:else_keyword_loc), OptionalNodeField.new(:statements), OptionalLocationField.new(:end_keyword_loc)]
|
210
|
+
when :embedded_statements_node
|
211
|
+
[LocationField.new(:opening_loc), OptionalNodeField.new(:statements), LocationField.new(:closing_loc)]
|
212
|
+
when :embedded_variable_node
|
213
|
+
[LocationField.new(:operator_loc), NodeField.new(:variable)]
|
214
|
+
when :ensure_node
|
215
|
+
[LocationField.new(:ensure_keyword_loc), OptionalNodeField.new(:statements), LocationField.new(:end_keyword_loc)]
|
216
|
+
when :false_node
|
217
|
+
[]
|
218
|
+
when :find_pattern_node
|
219
|
+
[OptionalNodeField.new(:constant), NodeField.new(:left), NodeListField.new(:requireds), NodeField.new(:right), OptionalLocationField.new(:opening_loc), OptionalLocationField.new(:closing_loc)]
|
220
|
+
when :flip_flop_node
|
221
|
+
[FlagsField.new(:flags, [:exclude_end?]), OptionalNodeField.new(:left), OptionalNodeField.new(:right), LocationField.new(:operator_loc)]
|
222
|
+
when :float_node
|
223
|
+
[DoubleField.new(:value)]
|
224
|
+
when :for_node
|
225
|
+
[NodeField.new(:index), NodeField.new(:collection), OptionalNodeField.new(:statements), LocationField.new(:for_keyword_loc), LocationField.new(:in_keyword_loc), OptionalLocationField.new(:do_keyword_loc), LocationField.new(:end_keyword_loc)]
|
226
|
+
when :forwarding_arguments_node
|
227
|
+
[]
|
228
|
+
when :forwarding_parameter_node
|
229
|
+
[]
|
230
|
+
when :forwarding_super_node
|
231
|
+
[OptionalNodeField.new(:block)]
|
232
|
+
when :global_variable_and_write_node
|
233
|
+
[ConstantField.new(:name), LocationField.new(:name_loc), LocationField.new(:operator_loc), NodeField.new(:value)]
|
234
|
+
when :global_variable_operator_write_node
|
235
|
+
[ConstantField.new(:name), LocationField.new(:name_loc), LocationField.new(:operator_loc), NodeField.new(:value), ConstantField.new(:operator)]
|
236
|
+
when :global_variable_or_write_node
|
237
|
+
[ConstantField.new(:name), LocationField.new(:name_loc), LocationField.new(:operator_loc), NodeField.new(:value)]
|
238
|
+
when :global_variable_read_node
|
239
|
+
[ConstantField.new(:name)]
|
240
|
+
when :global_variable_target_node
|
241
|
+
[ConstantField.new(:name)]
|
242
|
+
when :global_variable_write_node
|
243
|
+
[ConstantField.new(:name), LocationField.new(:name_loc), NodeField.new(:value), LocationField.new(:operator_loc)]
|
244
|
+
when :hash_node
|
245
|
+
[LocationField.new(:opening_loc), NodeListField.new(:elements), LocationField.new(:closing_loc)]
|
246
|
+
when :hash_pattern_node
|
247
|
+
[OptionalNodeField.new(:constant), NodeListField.new(:elements), OptionalNodeField.new(:rest), OptionalLocationField.new(:opening_loc), OptionalLocationField.new(:closing_loc)]
|
248
|
+
when :if_node
|
249
|
+
[OptionalLocationField.new(:if_keyword_loc), NodeField.new(:predicate), OptionalLocationField.new(:then_keyword_loc), OptionalNodeField.new(:statements), OptionalNodeField.new(:consequent), OptionalLocationField.new(:end_keyword_loc)]
|
250
|
+
when :imaginary_node
|
251
|
+
[NodeField.new(:numeric)]
|
252
|
+
when :implicit_node
|
253
|
+
[NodeField.new(:value)]
|
254
|
+
when :implicit_rest_node
|
255
|
+
[]
|
256
|
+
when :in_node
|
257
|
+
[NodeField.new(:pattern), OptionalNodeField.new(:statements), LocationField.new(:in_loc), OptionalLocationField.new(:then_loc)]
|
258
|
+
when :index_and_write_node
|
259
|
+
[FlagsField.new(:flags, [:safe_navigation?, :variable_call?, :attribute_write?, :ignore_visibility?]), OptionalNodeField.new(:receiver), OptionalLocationField.new(:call_operator_loc), LocationField.new(:opening_loc), OptionalNodeField.new(:arguments), LocationField.new(:closing_loc), OptionalNodeField.new(:block), LocationField.new(:operator_loc), NodeField.new(:value)]
|
260
|
+
when :index_operator_write_node
|
261
|
+
[FlagsField.new(:flags, [:safe_navigation?, :variable_call?, :attribute_write?, :ignore_visibility?]), OptionalNodeField.new(:receiver), OptionalLocationField.new(:call_operator_loc), LocationField.new(:opening_loc), OptionalNodeField.new(:arguments), LocationField.new(:closing_loc), OptionalNodeField.new(:block), ConstantField.new(:operator), LocationField.new(:operator_loc), NodeField.new(:value)]
|
262
|
+
when :index_or_write_node
|
263
|
+
[FlagsField.new(:flags, [:safe_navigation?, :variable_call?, :attribute_write?, :ignore_visibility?]), OptionalNodeField.new(:receiver), OptionalLocationField.new(:call_operator_loc), LocationField.new(:opening_loc), OptionalNodeField.new(:arguments), LocationField.new(:closing_loc), OptionalNodeField.new(:block), LocationField.new(:operator_loc), NodeField.new(:value)]
|
264
|
+
when :index_target_node
|
265
|
+
[FlagsField.new(:flags, [:safe_navigation?, :variable_call?, :attribute_write?, :ignore_visibility?]), NodeField.new(:receiver), LocationField.new(:opening_loc), OptionalNodeField.new(:arguments), LocationField.new(:closing_loc), OptionalNodeField.new(:block)]
|
266
|
+
when :instance_variable_and_write_node
|
267
|
+
[ConstantField.new(:name), LocationField.new(:name_loc), LocationField.new(:operator_loc), NodeField.new(:value)]
|
268
|
+
when :instance_variable_operator_write_node
|
269
|
+
[ConstantField.new(:name), LocationField.new(:name_loc), LocationField.new(:operator_loc), NodeField.new(:value), ConstantField.new(:operator)]
|
270
|
+
when :instance_variable_or_write_node
|
271
|
+
[ConstantField.new(:name), LocationField.new(:name_loc), LocationField.new(:operator_loc), NodeField.new(:value)]
|
272
|
+
when :instance_variable_read_node
|
273
|
+
[ConstantField.new(:name)]
|
274
|
+
when :instance_variable_target_node
|
275
|
+
[ConstantField.new(:name)]
|
276
|
+
when :instance_variable_write_node
|
277
|
+
[ConstantField.new(:name), LocationField.new(:name_loc), NodeField.new(:value), LocationField.new(:operator_loc)]
|
278
|
+
when :integer_node
|
279
|
+
[FlagsField.new(:flags, [:binary?, :decimal?, :octal?, :hexadecimal?]), IntegerField.new(:value)]
|
280
|
+
when :interpolated_match_last_line_node
|
281
|
+
[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)]
|
282
|
+
when :interpolated_regular_expression_node
|
283
|
+
[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)]
|
284
|
+
when :interpolated_string_node
|
285
|
+
[FlagsField.new(:flags, [:frozen?, :mutable?]), OptionalLocationField.new(:opening_loc), NodeListField.new(:parts), OptionalLocationField.new(:closing_loc)]
|
286
|
+
when :interpolated_symbol_node
|
287
|
+
[OptionalLocationField.new(:opening_loc), NodeListField.new(:parts), OptionalLocationField.new(:closing_loc)]
|
288
|
+
when :interpolated_x_string_node
|
289
|
+
[LocationField.new(:opening_loc), NodeListField.new(:parts), LocationField.new(:closing_loc)]
|
290
|
+
when :it_parameters_node
|
291
|
+
[]
|
292
|
+
when :keyword_hash_node
|
293
|
+
[FlagsField.new(:flags, [:symbol_keys?]), NodeListField.new(:elements)]
|
294
|
+
when :keyword_rest_parameter_node
|
295
|
+
[FlagsField.new(:flags, [:repeated_parameter?]), OptionalConstantField.new(:name), OptionalLocationField.new(:name_loc), LocationField.new(:operator_loc)]
|
296
|
+
when :lambda_node
|
297
|
+
[ConstantListField.new(:locals), LocationField.new(:operator_loc), LocationField.new(:opening_loc), LocationField.new(:closing_loc), OptionalNodeField.new(:parameters), OptionalNodeField.new(:body)]
|
298
|
+
when :local_variable_and_write_node
|
299
|
+
[LocationField.new(:name_loc), LocationField.new(:operator_loc), NodeField.new(:value), ConstantField.new(:name), UInt32Field.new(:depth)]
|
300
|
+
when :local_variable_operator_write_node
|
301
|
+
[LocationField.new(:name_loc), LocationField.new(:operator_loc), NodeField.new(:value), ConstantField.new(:name), ConstantField.new(:operator), UInt32Field.new(:depth)]
|
302
|
+
when :local_variable_or_write_node
|
303
|
+
[LocationField.new(:name_loc), LocationField.new(:operator_loc), NodeField.new(:value), ConstantField.new(:name), UInt32Field.new(:depth)]
|
304
|
+
when :local_variable_read_node
|
305
|
+
[ConstantField.new(:name), UInt32Field.new(:depth)]
|
306
|
+
when :local_variable_target_node
|
307
|
+
[ConstantField.new(:name), UInt32Field.new(:depth)]
|
308
|
+
when :local_variable_write_node
|
309
|
+
[ConstantField.new(:name), UInt32Field.new(:depth), LocationField.new(:name_loc), NodeField.new(:value), LocationField.new(:operator_loc)]
|
310
|
+
when :match_last_line_node
|
311
|
+
[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)]
|
312
|
+
when :match_predicate_node
|
313
|
+
[NodeField.new(:value), NodeField.new(:pattern), LocationField.new(:operator_loc)]
|
314
|
+
when :match_required_node
|
315
|
+
[NodeField.new(:value), NodeField.new(:pattern), LocationField.new(:operator_loc)]
|
316
|
+
when :match_write_node
|
317
|
+
[NodeField.new(:call), NodeListField.new(:targets)]
|
318
|
+
when :missing_node
|
319
|
+
[]
|
320
|
+
when :module_node
|
321
|
+
[ConstantListField.new(:locals), LocationField.new(:module_keyword_loc), NodeField.new(:constant_path), OptionalNodeField.new(:body), LocationField.new(:end_keyword_loc), ConstantField.new(:name)]
|
322
|
+
when :multi_target_node
|
323
|
+
[NodeListField.new(:lefts), OptionalNodeField.new(:rest), NodeListField.new(:rights), OptionalLocationField.new(:lparen_loc), OptionalLocationField.new(:rparen_loc)]
|
324
|
+
when :multi_write_node
|
325
|
+
[NodeListField.new(:lefts), OptionalNodeField.new(:rest), NodeListField.new(:rights), OptionalLocationField.new(:lparen_loc), OptionalLocationField.new(:rparen_loc), LocationField.new(:operator_loc), NodeField.new(:value)]
|
326
|
+
when :next_node
|
327
|
+
[OptionalNodeField.new(:arguments), LocationField.new(:keyword_loc)]
|
328
|
+
when :nil_node
|
329
|
+
[]
|
330
|
+
when :no_keywords_parameter_node
|
331
|
+
[LocationField.new(:operator_loc), LocationField.new(:keyword_loc)]
|
332
|
+
when :numbered_parameters_node
|
333
|
+
[UInt8Field.new(:maximum)]
|
334
|
+
when :numbered_reference_read_node
|
335
|
+
[UInt32Field.new(:number)]
|
336
|
+
when :optional_keyword_parameter_node
|
337
|
+
[FlagsField.new(:flags, [:repeated_parameter?]), ConstantField.new(:name), LocationField.new(:name_loc), NodeField.new(:value)]
|
338
|
+
when :optional_parameter_node
|
339
|
+
[FlagsField.new(:flags, [:repeated_parameter?]), ConstantField.new(:name), LocationField.new(:name_loc), LocationField.new(:operator_loc), NodeField.new(:value)]
|
340
|
+
when :or_node
|
341
|
+
[NodeField.new(:left), NodeField.new(:right), LocationField.new(:operator_loc)]
|
342
|
+
when :parameters_node
|
343
|
+
[NodeListField.new(:requireds), NodeListField.new(:optionals), OptionalNodeField.new(:rest), NodeListField.new(:posts), NodeListField.new(:keywords), OptionalNodeField.new(:keyword_rest), OptionalNodeField.new(:block)]
|
344
|
+
when :parentheses_node
|
345
|
+
[OptionalNodeField.new(:body), LocationField.new(:opening_loc), LocationField.new(:closing_loc)]
|
346
|
+
when :pinned_expression_node
|
347
|
+
[NodeField.new(:expression), LocationField.new(:operator_loc), LocationField.new(:lparen_loc), LocationField.new(:rparen_loc)]
|
348
|
+
when :pinned_variable_node
|
349
|
+
[NodeField.new(:variable), LocationField.new(:operator_loc)]
|
350
|
+
when :post_execution_node
|
351
|
+
[OptionalNodeField.new(:statements), LocationField.new(:keyword_loc), LocationField.new(:opening_loc), LocationField.new(:closing_loc)]
|
352
|
+
when :pre_execution_node
|
353
|
+
[OptionalNodeField.new(:statements), LocationField.new(:keyword_loc), LocationField.new(:opening_loc), LocationField.new(:closing_loc)]
|
354
|
+
when :program_node
|
355
|
+
[ConstantListField.new(:locals), NodeField.new(:statements)]
|
356
|
+
when :range_node
|
357
|
+
[FlagsField.new(:flags, [:exclude_end?]), OptionalNodeField.new(:left), OptionalNodeField.new(:right), LocationField.new(:operator_loc)]
|
358
|
+
when :rational_node
|
359
|
+
[NodeField.new(:numeric)]
|
360
|
+
when :redo_node
|
361
|
+
[]
|
362
|
+
when :regular_expression_node
|
363
|
+
[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)]
|
364
|
+
when :required_keyword_parameter_node
|
365
|
+
[FlagsField.new(:flags, [:repeated_parameter?]), ConstantField.new(:name), LocationField.new(:name_loc)]
|
366
|
+
when :required_parameter_node
|
367
|
+
[FlagsField.new(:flags, [:repeated_parameter?]), ConstantField.new(:name)]
|
368
|
+
when :rescue_modifier_node
|
369
|
+
[NodeField.new(:expression), LocationField.new(:keyword_loc), NodeField.new(:rescue_expression)]
|
370
|
+
when :rescue_node
|
371
|
+
[LocationField.new(:keyword_loc), NodeListField.new(:exceptions), OptionalLocationField.new(:operator_loc), OptionalNodeField.new(:reference), OptionalNodeField.new(:statements), OptionalNodeField.new(:consequent)]
|
372
|
+
when :rest_parameter_node
|
373
|
+
[FlagsField.new(:flags, [:repeated_parameter?]), OptionalConstantField.new(:name), OptionalLocationField.new(:name_loc), LocationField.new(:operator_loc)]
|
374
|
+
when :retry_node
|
375
|
+
[]
|
376
|
+
when :return_node
|
377
|
+
[LocationField.new(:keyword_loc), OptionalNodeField.new(:arguments)]
|
378
|
+
when :self_node
|
379
|
+
[]
|
380
|
+
when :shareable_constant_node
|
381
|
+
[FlagsField.new(:flags, [:literal?, :experimental_everything?, :experimental_copy?]), NodeField.new(:write)]
|
382
|
+
when :singleton_class_node
|
383
|
+
[ConstantListField.new(:locals), LocationField.new(:class_keyword_loc), LocationField.new(:operator_loc), NodeField.new(:expression), OptionalNodeField.new(:body), LocationField.new(:end_keyword_loc)]
|
384
|
+
when :source_encoding_node
|
385
|
+
[]
|
386
|
+
when :source_file_node
|
387
|
+
[FlagsField.new(:flags, [:forced_utf8_encoding?, :forced_binary_encoding?, :frozen?, :mutable?]), StringField.new(:filepath)]
|
388
|
+
when :source_line_node
|
389
|
+
[]
|
390
|
+
when :splat_node
|
391
|
+
[LocationField.new(:operator_loc), OptionalNodeField.new(:expression)]
|
392
|
+
when :statements_node
|
393
|
+
[NodeListField.new(:body)]
|
394
|
+
when :string_node
|
395
|
+
[FlagsField.new(:flags, [:forced_utf8_encoding?, :forced_binary_encoding?, :frozen?, :mutable?]), OptionalLocationField.new(:opening_loc), LocationField.new(:content_loc), OptionalLocationField.new(:closing_loc), StringField.new(:unescaped)]
|
396
|
+
when :super_node
|
397
|
+
[LocationField.new(:keyword_loc), OptionalLocationField.new(:lparen_loc), OptionalNodeField.new(:arguments), OptionalLocationField.new(:rparen_loc), OptionalNodeField.new(:block)]
|
398
|
+
when :symbol_node
|
399
|
+
[FlagsField.new(:flags, [:forced_utf8_encoding?, :forced_binary_encoding?, :forced_us_ascii_encoding?]), OptionalLocationField.new(:opening_loc), OptionalLocationField.new(:value_loc), OptionalLocationField.new(:closing_loc), StringField.new(:unescaped)]
|
400
|
+
when :true_node
|
401
|
+
[]
|
402
|
+
when :undef_node
|
403
|
+
[NodeListField.new(:names), LocationField.new(:keyword_loc)]
|
404
|
+
when :unless_node
|
405
|
+
[LocationField.new(:keyword_loc), NodeField.new(:predicate), OptionalLocationField.new(:then_keyword_loc), OptionalNodeField.new(:statements), OptionalNodeField.new(:consequent), OptionalLocationField.new(:end_keyword_loc)]
|
406
|
+
when :until_node
|
407
|
+
[FlagsField.new(:flags, [:begin_modifier?]), LocationField.new(:keyword_loc), OptionalLocationField.new(:closing_loc), NodeField.new(:predicate), OptionalNodeField.new(:statements)]
|
408
|
+
when :when_node
|
409
|
+
[LocationField.new(:keyword_loc), NodeListField.new(:conditions), OptionalLocationField.new(:then_keyword_loc), OptionalNodeField.new(:statements)]
|
410
|
+
when :while_node
|
411
|
+
[FlagsField.new(:flags, [:begin_modifier?]), LocationField.new(:keyword_loc), OptionalLocationField.new(:closing_loc), NodeField.new(:predicate), OptionalNodeField.new(:statements)]
|
412
|
+
when :x_string_node
|
413
|
+
[FlagsField.new(:flags, [:forced_utf8_encoding?, :forced_binary_encoding?]), LocationField.new(:opening_loc), LocationField.new(:content_loc), LocationField.new(:closing_loc), StringField.new(:unescaped)]
|
414
|
+
when :yield_node
|
415
|
+
[LocationField.new(:keyword_loc), OptionalLocationField.new(:lparen_loc), OptionalNodeField.new(:arguments), OptionalLocationField.new(:rparen_loc)]
|
416
|
+
else
|
417
|
+
raise "Unknown node type: #{node.type.inspect}"
|
418
|
+
end
|
419
|
+
end
|
420
|
+
end
|
421
|
+
end
|
data/lib/prism/serialize.rb
CHANGED
@@ -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 =
|
21
|
+
MINOR_VERSION = 26
|
22
22
|
|
23
23
|
# The patch version of prism that we are expecting to find in the serialized
|
24
24
|
# strings.
|
@@ -186,7 +186,6 @@ module Prism
|
|
186
186
|
:def_endless,
|
187
187
|
:def_endless_setter,
|
188
188
|
:def_name,
|
189
|
-
:def_name_after_receiver,
|
190
189
|
:def_params_term,
|
191
190
|
:def_params_term_paren,
|
192
191
|
:def_receiver,
|
@@ -223,6 +222,7 @@ module Prism
|
|
223
222
|
:expect_expression_after_star,
|
224
223
|
:expect_ident_req_parameter,
|
225
224
|
:expect_lparen_req_parameter,
|
225
|
+
:expect_message,
|
226
226
|
:expect_rbracket,
|
227
227
|
:expect_rparen,
|
228
228
|
:expect_rparen_after_multi,
|
@@ -230,6 +230,14 @@ module Prism
|
|
230
230
|
:expect_string_content,
|
231
231
|
:expect_when_delimiter,
|
232
232
|
:expression_bare_hash,
|
233
|
+
:expression_not_writable,
|
234
|
+
:expression_not_writable_encoding,
|
235
|
+
:expression_not_writable_false,
|
236
|
+
:expression_not_writable_file,
|
237
|
+
:expression_not_writable_line,
|
238
|
+
:expression_not_writable_nil,
|
239
|
+
:expression_not_writable_self,
|
240
|
+
:expression_not_writable_true,
|
233
241
|
:float_parse,
|
234
242
|
:for_collection,
|
235
243
|
:for_in,
|
@@ -361,6 +369,7 @@ module Prism
|
|
361
369
|
:ternary_expression_true,
|
362
370
|
:unary_receiver,
|
363
371
|
:undef_argument,
|
372
|
+
:unexpected_block_argument,
|
364
373
|
:unexpected_token_close_context,
|
365
374
|
:unexpected_token_ignore,
|
366
375
|
:until_term,
|
@@ -394,7 +403,9 @@ module Prism
|
|
394
403
|
:literal_in_condition_verbose,
|
395
404
|
:shebang_carriage_return,
|
396
405
|
:unexpected_carriage_return,
|
406
|
+
:unreachable_statement,
|
397
407
|
:unused_local_variable,
|
408
|
+
:void_statement,
|
398
409
|
].freeze
|
399
410
|
|
400
411
|
private_constant :DIAGNOSTIC_TYPES
|
@@ -947,8 +947,35 @@ module Prism
|
|
947
947
|
def visit_interpolated_string_node(node)
|
948
948
|
if node.heredoc?
|
949
949
|
children, closing = visit_heredoc(node)
|
950
|
+
opening = token(node.opening_loc)
|
951
|
+
|
952
|
+
start_offset = node.opening_loc.end_offset + 1
|
953
|
+
end_offset = node.parts.first.location.start_offset
|
954
|
+
|
955
|
+
# In the below case, the offsets should be the same:
|
956
|
+
#
|
957
|
+
# <<~HEREDOC
|
958
|
+
# a #{b}
|
959
|
+
# HEREDOC
|
960
|
+
#
|
961
|
+
# But in this case, the end_offset would be greater than the start_offset:
|
962
|
+
#
|
963
|
+
# <<~HEREDOC
|
964
|
+
# #{b}
|
965
|
+
# HEREDOC
|
966
|
+
#
|
967
|
+
# So we need to make sure the result node's heredoc range is correct, without updating the children
|
968
|
+
result = if start_offset < end_offset
|
969
|
+
# We need to add a padding string to ensure that the heredoc has correct range for its body
|
970
|
+
padding_string_node = builder.string_internal(["", srange_offsets(start_offset, end_offset)])
|
971
|
+
node_with_correct_location = builder.string_compose(opening, [padding_string_node, *children], closing)
|
972
|
+
# But the padding string should not be included in the final AST, so we need to update the result's children
|
973
|
+
node_with_correct_location.updated(:dstr, children)
|
974
|
+
else
|
975
|
+
builder.string_compose(opening, children, closing)
|
976
|
+
end
|
950
977
|
|
951
|
-
return
|
978
|
+
return result
|
952
979
|
end
|
953
980
|
|
954
981
|
parts = if node.parts.one? { |part| part.type == :string_node }
|
@@ -1508,19 +1535,29 @@ module Prism
|
|
1508
1535
|
elsif node.opening == "?"
|
1509
1536
|
builder.character([node.unescaped, srange(node.location)])
|
1510
1537
|
else
|
1511
|
-
|
1512
|
-
|
1513
|
-
else
|
1514
|
-
start_offset = node.content_loc.start_offset
|
1538
|
+
content_lines = node.content.lines
|
1539
|
+
unescaped_lines = node.unescaped.lines
|
1515
1540
|
|
1516
|
-
|
1517
|
-
|
1518
|
-
|
1519
|
-
|
1541
|
+
parts =
|
1542
|
+
if content_lines.length <= 1 || unescaped_lines.length <= 1
|
1543
|
+
[builder.string_internal([node.unescaped, srange(node.content_loc)])]
|
1544
|
+
elsif content_lines.length != unescaped_lines.length
|
1545
|
+
# This occurs when we have line continuations in the string. We
|
1546
|
+
# need to come back and fix this, but for now this stops the
|
1547
|
+
# code from breaking when we encounter it because of trying to
|
1548
|
+
# transpose arrays of different lengths.
|
1549
|
+
[builder.string_internal([node.unescaped, srange(node.content_loc)])]
|
1550
|
+
else
|
1551
|
+
start_offset = node.content_loc.start_offset
|
1520
1552
|
|
1521
|
-
|
1553
|
+
[content_lines, unescaped_lines].transpose.map do |content_line, unescaped_line|
|
1554
|
+
end_offset = start_offset + content_line.length
|
1555
|
+
offsets = srange_offsets(start_offset, end_offset)
|
1556
|
+
start_offset = end_offset
|
1557
|
+
|
1558
|
+
builder.string_internal([unescaped_line, offsets])
|
1559
|
+
end
|
1522
1560
|
end
|
1523
|
-
end
|
1524
1561
|
|
1525
1562
|
builder.string_compose(
|
1526
1563
|
token(node.opening_loc),
|
data/lib/prism.rb
CHANGED
@@ -24,6 +24,7 @@ module Prism
|
|
24
24
|
autoload :NodeInspector, "prism/node_inspector"
|
25
25
|
autoload :Pack, "prism/pack"
|
26
26
|
autoload :Pattern, "prism/pattern"
|
27
|
+
autoload :Reflection, "prism/reflection"
|
27
28
|
autoload :Serialize, "prism/serialize"
|
28
29
|
autoload :Translation, "prism/translation"
|
29
30
|
autoload :Visitor, "prism/visitor"
|
@@ -64,22 +65,6 @@ module Prism
|
|
64
65
|
def self.load(source, serialized)
|
65
66
|
Serialize.load(source, serialized)
|
66
67
|
end
|
67
|
-
|
68
|
-
# :call-seq:
|
69
|
-
# Prism::parse_failure?(source, **options) -> bool
|
70
|
-
#
|
71
|
-
# Returns true if the source parses with errors.
|
72
|
-
def self.parse_failure?(source, **options)
|
73
|
-
!parse_success?(source, **options)
|
74
|
-
end
|
75
|
-
|
76
|
-
# :call-seq:
|
77
|
-
# Prism::parse_file_failure?(filepath, **options) -> bool
|
78
|
-
#
|
79
|
-
# Returns true if the file at filepath parses with errors.
|
80
|
-
def self.parse_file_failure?(filepath, **options)
|
81
|
-
!parse_file_success?(filepath, **options)
|
82
|
-
end
|
83
68
|
end
|
84
69
|
|
85
70
|
require_relative "prism/node"
|
data/prism.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |spec|
|
4
4
|
spec.name = "prism"
|
5
|
-
spec.version = "0.
|
5
|
+
spec.version = "0.26.0"
|
6
6
|
spec.authors = ["Shopify"]
|
7
7
|
spec.email = ["ruby@shopify.com"]
|
8
8
|
|
@@ -63,7 +63,6 @@ Gem::Specification.new do |spec|
|
|
63
63
|
"include/prism/util/pm_list.h",
|
64
64
|
"include/prism/util/pm_memchr.h",
|
65
65
|
"include/prism/util/pm_newline_list.h",
|
66
|
-
"include/prism/util/pm_state_stack.h",
|
67
66
|
"include/prism/util/pm_strncasecmp.h",
|
68
67
|
"include/prism/util/pm_string.h",
|
69
68
|
"include/prism/util/pm_string_list.h",
|
@@ -88,6 +87,7 @@ Gem::Specification.new do |spec|
|
|
88
87
|
"lib/prism/parse_result/newlines.rb",
|
89
88
|
"lib/prism/pattern.rb",
|
90
89
|
"lib/prism/polyfill/string.rb",
|
90
|
+
"lib/prism/reflection.rb",
|
91
91
|
"lib/prism/serialize.rb",
|
92
92
|
"lib/prism/translation.rb",
|
93
93
|
"lib/prism/translation/parser.rb",
|
@@ -117,7 +117,6 @@ Gem::Specification.new do |spec|
|
|
117
117
|
"src/util/pm_list.c",
|
118
118
|
"src/util/pm_memchr.c",
|
119
119
|
"src/util/pm_newline_list.c",
|
120
|
-
"src/util/pm_state_stack.c",
|
121
120
|
"src/util/pm_string.c",
|
122
121
|
"src/util/pm_string_list.c",
|
123
122
|
"src/util/pm_strncasecmp.c",
|
@@ -136,6 +135,7 @@ Gem::Specification.new do |spec|
|
|
136
135
|
"sig/prism/pack.rbs",
|
137
136
|
"sig/prism/parse_result.rbs",
|
138
137
|
"sig/prism/pattern.rbs",
|
138
|
+
"sig/prism/reflection.rbs",
|
139
139
|
"sig/prism/serialize.rbs",
|
140
140
|
"sig/prism/visitor.rbs",
|
141
141
|
"rbi/prism.rbi",
|
@@ -145,7 +145,11 @@ Gem::Specification.new do |spec|
|
|
145
145
|
"rbi/prism/node_ext.rbi",
|
146
146
|
"rbi/prism/node.rbi",
|
147
147
|
"rbi/prism/parse_result.rbi",
|
148
|
+
"rbi/prism/reflection.rbi",
|
149
|
+
"rbi/prism/translation/parser.rbi",
|
148
150
|
"rbi/prism/translation/parser/compiler.rbi",
|
151
|
+
"rbi/prism/translation/parser33.rbi",
|
152
|
+
"rbi/prism/translation/parser34.rbi",
|
149
153
|
"rbi/prism/translation/ripper.rbi",
|
150
154
|
"rbi/prism/translation/ripper/ripper_compiler.rbi",
|
151
155
|
"rbi/prism/translation/ruby_parser.rbi",
|