prism 0.18.0 → 0.19.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 +31 -1
- data/README.md +2 -1
- data/config.yml +188 -55
- data/docs/building.md +9 -2
- data/docs/configuration.md +10 -9
- data/docs/encoding.md +24 -56
- data/docs/local_variable_depth.md +229 -0
- data/docs/ruby_api.md +2 -0
- data/docs/serialization.md +18 -13
- data/ext/prism/api_node.c +337 -195
- data/ext/prism/extconf.rb +13 -7
- data/ext/prism/extension.c +96 -32
- data/ext/prism/extension.h +1 -1
- data/include/prism/ast.h +340 -137
- data/include/prism/defines.h +17 -0
- data/include/prism/diagnostic.h +11 -5
- data/include/prism/encoding.h +248 -0
- data/include/prism/options.h +2 -2
- data/include/prism/parser.h +62 -42
- data/include/prism/regexp.h +2 -2
- data/include/prism/util/pm_buffer.h +9 -1
- data/include/prism/util/pm_memchr.h +2 -2
- data/include/prism/util/pm_strpbrk.h +3 -3
- data/include/prism/version.h +2 -2
- data/include/prism.h +13 -15
- data/lib/prism/compiler.rb +12 -0
- data/lib/prism/debug.rb +9 -4
- data/lib/prism/desugar_compiler.rb +3 -3
- data/lib/prism/dispatcher.rb +56 -0
- data/lib/prism/dot_visitor.rb +476 -198
- data/lib/prism/dsl.rb +66 -46
- data/lib/prism/ffi.rb +16 -3
- data/lib/prism/lex_compat.rb +19 -9
- data/lib/prism/mutation_compiler.rb +20 -0
- data/lib/prism/node.rb +1173 -450
- data/lib/prism/node_ext.rb +41 -16
- data/lib/prism/parse_result.rb +12 -15
- data/lib/prism/ripper_compat.rb +49 -34
- data/lib/prism/serialize.rb +242 -212
- data/lib/prism/visitor.rb +12 -0
- data/lib/prism.rb +20 -4
- data/prism.gemspec +4 -10
- data/rbi/prism.rbi +605 -230
- data/rbi/prism_static.rbi +3 -0
- data/sig/prism.rbs +379 -124
- data/sig/prism_static.rbs +1 -0
- data/src/diagnostic.c +228 -222
- data/src/encoding.c +5137 -0
- data/src/node.c +66 -0
- data/src/options.c +21 -2
- data/src/prettyprint.c +806 -406
- data/src/prism.c +1092 -700
- data/src/regexp.c +3 -3
- data/src/serialize.c +227 -157
- data/src/util/pm_buffer.c +10 -1
- data/src/util/pm_memchr.c +1 -1
- data/src/util/pm_strpbrk.c +4 -4
- metadata +5 -11
- data/include/prism/enc/pm_encoding.h +0 -227
- data/src/enc/pm_big5.c +0 -116
- data/src/enc/pm_cp51932.c +0 -57
- data/src/enc/pm_euc_jp.c +0 -69
- data/src/enc/pm_gbk.c +0 -65
- data/src/enc/pm_shift_jis.c +0 -57
- data/src/enc/pm_tables.c +0 -2073
- data/src/enc/pm_unicode.c +0 -2369
- data/src/enc/pm_windows_31j.c +0 -57
data/include/prism.h
CHANGED
@@ -61,18 +61,6 @@ PRISM_EXPORTED_FUNCTION void pm_parser_init(pm_parser_t *parser, const uint8_t *
|
|
61
61
|
*/
|
62
62
|
PRISM_EXPORTED_FUNCTION void pm_parser_register_encoding_changed_callback(pm_parser_t *parser, pm_encoding_changed_callback_t callback);
|
63
63
|
|
64
|
-
/**
|
65
|
-
* Register a callback that will be called when prism encounters a magic comment
|
66
|
-
* with an encoding referenced that it doesn't understand. The callback should
|
67
|
-
* return NULL if it also doesn't understand the encoding or it should return a
|
68
|
-
* pointer to a pm_encoding_t struct that contains the functions necessary to
|
69
|
-
* parse identifiers.
|
70
|
-
*
|
71
|
-
* @param parser The parser to register the callback with.
|
72
|
-
* @param callback The callback to register.
|
73
|
-
*/
|
74
|
-
PRISM_EXPORTED_FUNCTION void pm_parser_register_encoding_decode_callback(pm_parser_t *parser, pm_encoding_decode_callback_t callback);
|
75
|
-
|
76
64
|
/**
|
77
65
|
* Free any memory associated with the given parser.
|
78
66
|
*
|
@@ -103,7 +91,7 @@ void pm_serialize_comment_list(pm_parser_t *parser, pm_list_t *list, pm_buffer_t
|
|
103
91
|
* @param encoding The encoding to serialize.
|
104
92
|
* @param buffer The buffer to serialize to.
|
105
93
|
*/
|
106
|
-
void pm_serialize_encoding(pm_encoding_t *encoding, pm_buffer_t *buffer);
|
94
|
+
void pm_serialize_encoding(const pm_encoding_t *encoding, pm_buffer_t *buffer);
|
107
95
|
|
108
96
|
/**
|
109
97
|
* Serialize the encoding, metadata, nodes, and constant pool.
|
@@ -164,6 +152,16 @@ PRISM_EXPORTED_FUNCTION void pm_serialize_lex(pm_buffer_t *buffer, const uint8_t
|
|
164
152
|
*/
|
165
153
|
PRISM_EXPORTED_FUNCTION void pm_serialize_parse_lex(pm_buffer_t *buffer, const uint8_t *source, size_t size, const char *data);
|
166
154
|
|
155
|
+
/**
|
156
|
+
* Parse the source and return true if it parses without errors or warnings.
|
157
|
+
*
|
158
|
+
* @param source The source to parse.
|
159
|
+
* @param size The size of the source.
|
160
|
+
* @param data The optional data to pass to the parser.
|
161
|
+
* @return True if the source parses without errors or warnings.
|
162
|
+
*/
|
163
|
+
PRISM_EXPORTED_FUNCTION bool pm_parse_success_p(const uint8_t *source, size_t size, const char *data);
|
164
|
+
|
167
165
|
/**
|
168
166
|
* Returns a string representation of the given token type.
|
169
167
|
*
|
@@ -213,7 +211,7 @@ PRISM_EXPORTED_FUNCTION const char * pm_token_type_to_str(pm_token_type_t token_
|
|
213
211
|
* pm_node_t *root = pm_parse(&parser);
|
214
212
|
* printf("PARSED!\n");
|
215
213
|
*
|
216
|
-
* pm_node_destroy(root);
|
214
|
+
* pm_node_destroy(&parser, root);
|
217
215
|
* pm_parser_free(&parser);
|
218
216
|
* }
|
219
217
|
* ```
|
@@ -265,7 +263,7 @@ PRISM_EXPORTED_FUNCTION const char * pm_token_type_to_str(pm_token_type_t token_
|
|
265
263
|
* printf("*.s%\n", (int) buffer.length, buffer.value);
|
266
264
|
*
|
267
265
|
* pm_buffer_free(&buffer);
|
268
|
-
* pm_node_destroy(root);
|
266
|
+
* pm_node_destroy(&parser, root);
|
269
267
|
* pm_parser_free(&parser);
|
270
268
|
* }
|
271
269
|
* ```
|
data/lib/prism/compiler.rb
CHANGED
@@ -102,6 +102,9 @@ module Prism
|
|
102
102
|
# Compile a CallOrWriteNode node
|
103
103
|
alias visit_call_or_write_node visit_child_nodes
|
104
104
|
|
105
|
+
# Compile a CallTargetNode node
|
106
|
+
alias visit_call_target_node visit_child_nodes
|
107
|
+
|
105
108
|
# Compile a CapturePatternNode node
|
106
109
|
alias visit_capture_pattern_node visit_child_nodes
|
107
110
|
|
@@ -243,6 +246,9 @@ module Prism
|
|
243
246
|
# Compile a ImplicitNode node
|
244
247
|
alias visit_implicit_node visit_child_nodes
|
245
248
|
|
249
|
+
# Compile a ImplicitRestNode node
|
250
|
+
alias visit_implicit_rest_node visit_child_nodes
|
251
|
+
|
246
252
|
# Compile a InNode node
|
247
253
|
alias visit_in_node visit_child_nodes
|
248
254
|
|
@@ -255,6 +261,9 @@ module Prism
|
|
255
261
|
# Compile a IndexOrWriteNode node
|
256
262
|
alias visit_index_or_write_node visit_child_nodes
|
257
263
|
|
264
|
+
# Compile a IndexTargetNode node
|
265
|
+
alias visit_index_target_node visit_child_nodes
|
266
|
+
|
258
267
|
# Compile a InstanceVariableAndWriteNode node
|
259
268
|
alias visit_instance_variable_and_write_node visit_child_nodes
|
260
269
|
|
@@ -351,6 +360,9 @@ module Prism
|
|
351
360
|
# Compile a NoKeywordsParameterNode node
|
352
361
|
alias visit_no_keywords_parameter_node visit_child_nodes
|
353
362
|
|
363
|
+
# Compile a NumberedParametersNode node
|
364
|
+
alias visit_numbered_parameters_node visit_child_nodes
|
365
|
+
|
354
366
|
# Compile a NumberedReferenceReadNode node
|
355
367
|
alias visit_numbered_reference_read_node visit_child_nodes
|
356
368
|
|
data/lib/prism/debug.rb
CHANGED
@@ -103,9 +103,14 @@ module Prism
|
|
103
103
|
case node
|
104
104
|
when BlockNode, DefNode, LambdaNode
|
105
105
|
names = node.locals
|
106
|
-
|
107
|
-
|
108
|
-
|
106
|
+
params =
|
107
|
+
if node.is_a?(DefNode)
|
108
|
+
node.parameters
|
109
|
+
elsif node.parameters.is_a?(NumberedParametersNode)
|
110
|
+
nil
|
111
|
+
else
|
112
|
+
node.parameters&.parameters
|
113
|
+
end
|
109
114
|
|
110
115
|
# prism places parameters in the same order that they appear in the
|
111
116
|
# source. CRuby places them in the order that they need to appear
|
@@ -121,7 +126,7 @@ module Prism
|
|
121
126
|
end
|
122
127
|
end,
|
123
128
|
*params.optionals.map(&:name),
|
124
|
-
*((params.rest.name || :*) if params.rest && params.rest.
|
129
|
+
*((params.rest.name || :*) if params.rest && !params.rest.is_a?(ImplicitRestNode)),
|
125
130
|
*params.posts.map do |post|
|
126
131
|
if post.is_a?(RequiredParameterNode)
|
127
132
|
post.name
|
@@ -157,15 +157,15 @@ module Prism
|
|
157
157
|
*arguments,
|
158
158
|
node.name_loc,
|
159
159
|
CallNode.new(
|
160
|
+
0,
|
160
161
|
read_class.new(*arguments, node.name_loc),
|
161
162
|
nil,
|
163
|
+
node.operator_loc.slice.chomp("="),
|
162
164
|
node.operator_loc.copy(length: node.operator_loc.length - 1),
|
163
165
|
nil,
|
164
|
-
ArgumentsNode.new([node.value],
|
166
|
+
ArgumentsNode.new(0, [node.value], node.value.location),
|
165
167
|
nil,
|
166
168
|
nil,
|
167
|
-
0,
|
168
|
-
node.operator_loc.slice.chomp("="),
|
169
169
|
node.location
|
170
170
|
),
|
171
171
|
node.operator_loc.copy(start_offset: node.operator_loc.end_offset - 1, length: 1),
|
data/lib/prism/dispatcher.rb
CHANGED
@@ -233,6 +233,14 @@ module Prism
|
|
233
233
|
listeners[:on_call_or_write_node_leave]&.each { |listener| listener.on_call_or_write_node_leave(node) }
|
234
234
|
end
|
235
235
|
|
236
|
+
# Dispatch enter and leave events for CallTargetNode nodes and continue
|
237
|
+
# walking the tree.
|
238
|
+
def visit_call_target_node(node)
|
239
|
+
listeners[:on_call_target_node_enter]&.each { |listener| listener.on_call_target_node_enter(node) }
|
240
|
+
super
|
241
|
+
listeners[:on_call_target_node_leave]&.each { |listener| listener.on_call_target_node_leave(node) }
|
242
|
+
end
|
243
|
+
|
236
244
|
# Dispatch enter and leave events for CapturePatternNode nodes and continue
|
237
245
|
# walking the tree.
|
238
246
|
def visit_capture_pattern_node(node)
|
@@ -609,6 +617,14 @@ module Prism
|
|
609
617
|
listeners[:on_implicit_node_leave]&.each { |listener| listener.on_implicit_node_leave(node) }
|
610
618
|
end
|
611
619
|
|
620
|
+
# Dispatch enter and leave events for ImplicitRestNode nodes and continue
|
621
|
+
# walking the tree.
|
622
|
+
def visit_implicit_rest_node(node)
|
623
|
+
listeners[:on_implicit_rest_node_enter]&.each { |listener| listener.on_implicit_rest_node_enter(node) }
|
624
|
+
super
|
625
|
+
listeners[:on_implicit_rest_node_leave]&.each { |listener| listener.on_implicit_rest_node_leave(node) }
|
626
|
+
end
|
627
|
+
|
612
628
|
# Dispatch enter and leave events for InNode nodes and continue
|
613
629
|
# walking the tree.
|
614
630
|
def visit_in_node(node)
|
@@ -641,6 +657,14 @@ module Prism
|
|
641
657
|
listeners[:on_index_or_write_node_leave]&.each { |listener| listener.on_index_or_write_node_leave(node) }
|
642
658
|
end
|
643
659
|
|
660
|
+
# Dispatch enter and leave events for IndexTargetNode nodes and continue
|
661
|
+
# walking the tree.
|
662
|
+
def visit_index_target_node(node)
|
663
|
+
listeners[:on_index_target_node_enter]&.each { |listener| listener.on_index_target_node_enter(node) }
|
664
|
+
super
|
665
|
+
listeners[:on_index_target_node_leave]&.each { |listener| listener.on_index_target_node_leave(node) }
|
666
|
+
end
|
667
|
+
|
644
668
|
# Dispatch enter and leave events for InstanceVariableAndWriteNode nodes and continue
|
645
669
|
# walking the tree.
|
646
670
|
def visit_instance_variable_and_write_node(node)
|
@@ -897,6 +921,14 @@ module Prism
|
|
897
921
|
listeners[:on_no_keywords_parameter_node_leave]&.each { |listener| listener.on_no_keywords_parameter_node_leave(node) }
|
898
922
|
end
|
899
923
|
|
924
|
+
# Dispatch enter and leave events for NumberedParametersNode nodes and continue
|
925
|
+
# walking the tree.
|
926
|
+
def visit_numbered_parameters_node(node)
|
927
|
+
listeners[:on_numbered_parameters_node_enter]&.each { |listener| listener.on_numbered_parameters_node_enter(node) }
|
928
|
+
super
|
929
|
+
listeners[:on_numbered_parameters_node_leave]&.each { |listener| listener.on_numbered_parameters_node_leave(node) }
|
930
|
+
end
|
931
|
+
|
900
932
|
# Dispatch enter and leave events for NumberedReferenceReadNode nodes and continue
|
901
933
|
# walking the tree.
|
902
934
|
def visit_numbered_reference_read_node(node)
|
@@ -1350,6 +1382,12 @@ module Prism
|
|
1350
1382
|
listeners[:on_call_or_write_node_leave]&.each { |listener| listener.on_call_or_write_node_leave(node) }
|
1351
1383
|
end
|
1352
1384
|
|
1385
|
+
# Dispatch enter and leave events for CallTargetNode nodes.
|
1386
|
+
def visit_call_target_node(node)
|
1387
|
+
listeners[:on_call_target_node_enter]&.each { |listener| listener.on_call_target_node_enter(node) }
|
1388
|
+
listeners[:on_call_target_node_leave]&.each { |listener| listener.on_call_target_node_leave(node) }
|
1389
|
+
end
|
1390
|
+
|
1353
1391
|
# Dispatch enter and leave events for CapturePatternNode nodes.
|
1354
1392
|
def visit_capture_pattern_node(node)
|
1355
1393
|
listeners[:on_capture_pattern_node_enter]&.each { |listener| listener.on_capture_pattern_node_enter(node) }
|
@@ -1632,6 +1670,12 @@ module Prism
|
|
1632
1670
|
listeners[:on_implicit_node_leave]&.each { |listener| listener.on_implicit_node_leave(node) }
|
1633
1671
|
end
|
1634
1672
|
|
1673
|
+
# Dispatch enter and leave events for ImplicitRestNode nodes.
|
1674
|
+
def visit_implicit_rest_node(node)
|
1675
|
+
listeners[:on_implicit_rest_node_enter]&.each { |listener| listener.on_implicit_rest_node_enter(node) }
|
1676
|
+
listeners[:on_implicit_rest_node_leave]&.each { |listener| listener.on_implicit_rest_node_leave(node) }
|
1677
|
+
end
|
1678
|
+
|
1635
1679
|
# Dispatch enter and leave events for InNode nodes.
|
1636
1680
|
def visit_in_node(node)
|
1637
1681
|
listeners[:on_in_node_enter]&.each { |listener| listener.on_in_node_enter(node) }
|
@@ -1656,6 +1700,12 @@ module Prism
|
|
1656
1700
|
listeners[:on_index_or_write_node_leave]&.each { |listener| listener.on_index_or_write_node_leave(node) }
|
1657
1701
|
end
|
1658
1702
|
|
1703
|
+
# Dispatch enter and leave events for IndexTargetNode nodes.
|
1704
|
+
def visit_index_target_node(node)
|
1705
|
+
listeners[:on_index_target_node_enter]&.each { |listener| listener.on_index_target_node_enter(node) }
|
1706
|
+
listeners[:on_index_target_node_leave]&.each { |listener| listener.on_index_target_node_leave(node) }
|
1707
|
+
end
|
1708
|
+
|
1659
1709
|
# Dispatch enter and leave events for InstanceVariableAndWriteNode nodes.
|
1660
1710
|
def visit_instance_variable_and_write_node(node)
|
1661
1711
|
listeners[:on_instance_variable_and_write_node_enter]&.each { |listener| listener.on_instance_variable_and_write_node_enter(node) }
|
@@ -1848,6 +1898,12 @@ module Prism
|
|
1848
1898
|
listeners[:on_no_keywords_parameter_node_leave]&.each { |listener| listener.on_no_keywords_parameter_node_leave(node) }
|
1849
1899
|
end
|
1850
1900
|
|
1901
|
+
# Dispatch enter and leave events for NumberedParametersNode nodes.
|
1902
|
+
def visit_numbered_parameters_node(node)
|
1903
|
+
listeners[:on_numbered_parameters_node_enter]&.each { |listener| listener.on_numbered_parameters_node_enter(node) }
|
1904
|
+
listeners[:on_numbered_parameters_node_leave]&.each { |listener| listener.on_numbered_parameters_node_leave(node) }
|
1905
|
+
end
|
1906
|
+
|
1851
1907
|
# Dispatch enter and leave events for NumberedReferenceReadNode nodes.
|
1852
1908
|
def visit_numbered_reference_read_node(node)
|
1853
1909
|
listeners[:on_numbered_reference_read_node_enter]&.each { |listener| listener.on_numbered_reference_read_node_enter(node) }
|