prism 0.17.1 → 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 +60 -1
- data/Makefile +5 -5
- data/README.md +4 -3
- data/config.yml +214 -68
- data/docs/build_system.md +6 -6
- data/docs/building.md +10 -3
- data/docs/configuration.md +11 -9
- data/docs/encoding.md +92 -88
- data/docs/heredocs.md +1 -1
- data/docs/javascript.md +29 -1
- data/docs/local_variable_depth.md +229 -0
- data/docs/ruby_api.md +16 -0
- data/docs/serialization.md +18 -13
- data/ext/prism/api_node.c +411 -240
- data/ext/prism/extconf.rb +97 -127
- data/ext/prism/extension.c +97 -33
- data/ext/prism/extension.h +1 -1
- data/include/prism/ast.h +377 -159
- data/include/prism/defines.h +17 -0
- data/include/prism/diagnostic.h +38 -6
- data/include/prism/{enc/pm_encoding.h → encoding.h} +126 -64
- data/include/prism/options.h +2 -2
- data/include/prism/parser.h +62 -36
- 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 +3 -3
- data/include/prism.h +13 -15
- data/lib/prism/compiler.rb +15 -3
- data/lib/prism/debug.rb +13 -4
- data/lib/prism/desugar_compiler.rb +4 -3
- data/lib/prism/dispatcher.rb +70 -14
- data/lib/prism/dot_visitor.rb +4612 -0
- data/lib/prism/dsl.rb +77 -57
- data/lib/prism/ffi.rb +19 -6
- data/lib/prism/lex_compat.rb +19 -9
- data/lib/prism/mutation_compiler.rb +26 -6
- data/lib/prism/node.rb +1314 -522
- data/lib/prism/node_ext.rb +102 -19
- data/lib/prism/parse_result.rb +58 -27
- data/lib/prism/ripper_compat.rb +49 -34
- data/lib/prism/serialize.rb +251 -227
- data/lib/prism/visitor.rb +15 -3
- data/lib/prism.rb +21 -4
- data/prism.gemspec +7 -9
- data/rbi/prism.rbi +688 -284
- data/rbi/prism_static.rbi +3 -0
- data/sig/prism.rbs +426 -156
- data/sig/prism_static.rbs +1 -0
- data/src/diagnostic.c +280 -216
- data/src/encoding.c +5137 -0
- data/src/node.c +99 -21
- data/src/options.c +21 -2
- data/src/prettyprint.c +1743 -1241
- data/src/prism.c +1774 -831
- data/src/regexp.c +15 -15
- data/src/serialize.c +261 -164
- 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 +8 -10
- data/src/enc/pm_big5.c +0 -53
- data/src/enc/pm_euc_jp.c +0 -59
- data/src/enc/pm_gbk.c +0 -62
- data/src/enc/pm_shift_jis.c +0 -57
- data/src/enc/pm_tables.c +0 -743
- data/src/enc/pm_unicode.c +0 -2369
- data/src/enc/pm_windows_31j.c +0 -57
data/src/node.c
CHANGED
@@ -237,6 +237,12 @@ pm_node_destroy(pm_parser_t *parser, pm_node_t *node) {
|
|
237
237
|
pm_node_destroy(parser, (pm_node_t *)cast->value);
|
238
238
|
break;
|
239
239
|
}
|
240
|
+
#line 58 "node.c.erb"
|
241
|
+
case PM_CALL_TARGET_NODE: {
|
242
|
+
pm_call_target_node_t *cast = (pm_call_target_node_t *) node;
|
243
|
+
pm_node_destroy(parser, (pm_node_t *)cast->receiver);
|
244
|
+
break;
|
245
|
+
}
|
240
246
|
#line 58 "node.c.erb"
|
241
247
|
case PM_CAPTURE_PATTERN_NODE: {
|
242
248
|
pm_capture_pattern_node_t *cast = (pm_capture_pattern_node_t *) node;
|
@@ -244,6 +250,18 @@ pm_node_destroy(pm_parser_t *parser, pm_node_t *node) {
|
|
244
250
|
pm_node_destroy(parser, (pm_node_t *)cast->target);
|
245
251
|
break;
|
246
252
|
}
|
253
|
+
#line 58 "node.c.erb"
|
254
|
+
case PM_CASE_MATCH_NODE: {
|
255
|
+
pm_case_match_node_t *cast = (pm_case_match_node_t *) node;
|
256
|
+
if (cast->predicate != NULL) {
|
257
|
+
pm_node_destroy(parser, (pm_node_t *)cast->predicate);
|
258
|
+
}
|
259
|
+
pm_node_list_free(parser, &cast->conditions);
|
260
|
+
if (cast->consequent != NULL) {
|
261
|
+
pm_node_destroy(parser, (pm_node_t *)cast->consequent);
|
262
|
+
}
|
263
|
+
break;
|
264
|
+
}
|
247
265
|
#line 58 "node.c.erb"
|
248
266
|
case PM_CASE_NODE: {
|
249
267
|
pm_case_node_t *cast = (pm_case_node_t *) node;
|
@@ -560,6 +578,10 @@ pm_node_destroy(pm_parser_t *parser, pm_node_t *node) {
|
|
560
578
|
pm_node_destroy(parser, (pm_node_t *)cast->value);
|
561
579
|
break;
|
562
580
|
}
|
581
|
+
#line 58 "node.c.erb"
|
582
|
+
case PM_IMPLICIT_REST_NODE: {
|
583
|
+
break;
|
584
|
+
}
|
563
585
|
#line 58 "node.c.erb"
|
564
586
|
case PM_IN_NODE: {
|
565
587
|
pm_in_node_t *cast = (pm_in_node_t *) node;
|
@@ -614,6 +636,18 @@ pm_node_destroy(pm_parser_t *parser, pm_node_t *node) {
|
|
614
636
|
pm_node_destroy(parser, (pm_node_t *)cast->value);
|
615
637
|
break;
|
616
638
|
}
|
639
|
+
#line 58 "node.c.erb"
|
640
|
+
case PM_INDEX_TARGET_NODE: {
|
641
|
+
pm_index_target_node_t *cast = (pm_index_target_node_t *) node;
|
642
|
+
pm_node_destroy(parser, (pm_node_t *)cast->receiver);
|
643
|
+
if (cast->arguments != NULL) {
|
644
|
+
pm_node_destroy(parser, (pm_node_t *)cast->arguments);
|
645
|
+
}
|
646
|
+
if (cast->block != NULL) {
|
647
|
+
pm_node_destroy(parser, (pm_node_t *)cast->block);
|
648
|
+
}
|
649
|
+
break;
|
650
|
+
}
|
617
651
|
#line 58 "node.c.erb"
|
618
652
|
case PM_INSTANCE_VARIABLE_AND_WRITE_NODE: {
|
619
653
|
pm_instance_variable_and_write_node_t *cast = (pm_instance_variable_and_write_node_t *) node;
|
@@ -758,7 +792,7 @@ pm_node_destroy(pm_parser_t *parser, pm_node_t *node) {
|
|
758
792
|
case PM_MATCH_WRITE_NODE: {
|
759
793
|
pm_match_write_node_t *cast = (pm_match_write_node_t *) node;
|
760
794
|
pm_node_destroy(parser, (pm_node_t *)cast->call);
|
761
|
-
|
795
|
+
pm_node_list_free(parser, &cast->targets);
|
762
796
|
break;
|
763
797
|
}
|
764
798
|
#line 58 "node.c.erb"
|
@@ -812,6 +846,10 @@ pm_node_destroy(pm_parser_t *parser, pm_node_t *node) {
|
|
812
846
|
case PM_NO_KEYWORDS_PARAMETER_NODE: {
|
813
847
|
break;
|
814
848
|
}
|
849
|
+
#line 58 "node.c.erb"
|
850
|
+
case PM_NUMBERED_PARAMETERS_NODE: {
|
851
|
+
break;
|
852
|
+
}
|
815
853
|
#line 58 "node.c.erb"
|
816
854
|
case PM_NUMBERED_REFERENCE_READ_NODE: {
|
817
855
|
break;
|
@@ -1011,13 +1049,6 @@ pm_node_destroy(pm_parser_t *parser, pm_node_t *node) {
|
|
1011
1049
|
pm_node_list_free(parser, &cast->body);
|
1012
1050
|
break;
|
1013
1051
|
}
|
1014
|
-
#line 58 "node.c.erb"
|
1015
|
-
case PM_STRING_CONCAT_NODE: {
|
1016
|
-
pm_string_concat_node_t *cast = (pm_string_concat_node_t *) node;
|
1017
|
-
pm_node_destroy(parser, (pm_node_t *)cast->left);
|
1018
|
-
pm_node_destroy(parser, (pm_node_t *)cast->right);
|
1019
|
-
break;
|
1020
|
-
}
|
1021
1052
|
#line 58 "node.c.erb"
|
1022
1053
|
case PM_STRING_NODE: {
|
1023
1054
|
pm_string_node_t *cast = (pm_string_node_t *) node;
|
@@ -1332,6 +1363,13 @@ pm_node_memsize_node(pm_node_t *node, pm_memsize_t *memsize) {
|
|
1332
1363
|
pm_node_memsize_node((pm_node_t *)cast->value, memsize);
|
1333
1364
|
break;
|
1334
1365
|
}
|
1366
|
+
#line 103 "node.c.erb"
|
1367
|
+
case PM_CALL_TARGET_NODE: {
|
1368
|
+
pm_call_target_node_t *cast = (pm_call_target_node_t *) node;
|
1369
|
+
memsize->memsize += sizeof(*cast);
|
1370
|
+
pm_node_memsize_node((pm_node_t *)cast->receiver, memsize);
|
1371
|
+
break;
|
1372
|
+
}
|
1335
1373
|
#line 103 "node.c.erb"
|
1336
1374
|
case PM_CAPTURE_PATTERN_NODE: {
|
1337
1375
|
pm_capture_pattern_node_t *cast = (pm_capture_pattern_node_t *) node;
|
@@ -1340,6 +1378,21 @@ pm_node_memsize_node(pm_node_t *node, pm_memsize_t *memsize) {
|
|
1340
1378
|
pm_node_memsize_node((pm_node_t *)cast->target, memsize);
|
1341
1379
|
break;
|
1342
1380
|
}
|
1381
|
+
#line 103 "node.c.erb"
|
1382
|
+
case PM_CASE_MATCH_NODE: {
|
1383
|
+
pm_case_match_node_t *cast = (pm_case_match_node_t *) node;
|
1384
|
+
memsize->memsize += sizeof(*cast);
|
1385
|
+
// Node lists will add in their own sizes below.
|
1386
|
+
memsize->memsize -= sizeof(pm_node_list_t) * 1;
|
1387
|
+
if (cast->predicate != NULL) {
|
1388
|
+
pm_node_memsize_node((pm_node_t *)cast->predicate, memsize);
|
1389
|
+
}
|
1390
|
+
memsize->memsize += pm_node_list_memsize(&cast->conditions, memsize);
|
1391
|
+
if (cast->consequent != NULL) {
|
1392
|
+
pm_node_memsize_node((pm_node_t *)cast->consequent, memsize);
|
1393
|
+
}
|
1394
|
+
break;
|
1395
|
+
}
|
1343
1396
|
#line 103 "node.c.erb"
|
1344
1397
|
case PM_CASE_NODE: {
|
1345
1398
|
pm_case_node_t *cast = (pm_case_node_t *) node;
|
@@ -1723,6 +1776,12 @@ pm_node_memsize_node(pm_node_t *node, pm_memsize_t *memsize) {
|
|
1723
1776
|
pm_node_memsize_node((pm_node_t *)cast->value, memsize);
|
1724
1777
|
break;
|
1725
1778
|
}
|
1779
|
+
#line 103 "node.c.erb"
|
1780
|
+
case PM_IMPLICIT_REST_NODE: {
|
1781
|
+
pm_implicit_rest_node_t *cast = (pm_implicit_rest_node_t *) node;
|
1782
|
+
memsize->memsize += sizeof(*cast);
|
1783
|
+
break;
|
1784
|
+
}
|
1726
1785
|
#line 103 "node.c.erb"
|
1727
1786
|
case PM_IN_NODE: {
|
1728
1787
|
pm_in_node_t *cast = (pm_in_node_t *) node;
|
@@ -1781,6 +1840,19 @@ pm_node_memsize_node(pm_node_t *node, pm_memsize_t *memsize) {
|
|
1781
1840
|
pm_node_memsize_node((pm_node_t *)cast->value, memsize);
|
1782
1841
|
break;
|
1783
1842
|
}
|
1843
|
+
#line 103 "node.c.erb"
|
1844
|
+
case PM_INDEX_TARGET_NODE: {
|
1845
|
+
pm_index_target_node_t *cast = (pm_index_target_node_t *) node;
|
1846
|
+
memsize->memsize += sizeof(*cast);
|
1847
|
+
pm_node_memsize_node((pm_node_t *)cast->receiver, memsize);
|
1848
|
+
if (cast->arguments != NULL) {
|
1849
|
+
pm_node_memsize_node((pm_node_t *)cast->arguments, memsize);
|
1850
|
+
}
|
1851
|
+
if (cast->block != NULL) {
|
1852
|
+
pm_node_memsize_node((pm_node_t *)cast->block, memsize);
|
1853
|
+
}
|
1854
|
+
break;
|
1855
|
+
}
|
1784
1856
|
#line 103 "node.c.erb"
|
1785
1857
|
case PM_INSTANCE_VARIABLE_AND_WRITE_NODE: {
|
1786
1858
|
pm_instance_variable_and_write_node_t *cast = (pm_instance_variable_and_write_node_t *) node;
|
@@ -1969,10 +2041,10 @@ pm_node_memsize_node(pm_node_t *node, pm_memsize_t *memsize) {
|
|
1969
2041
|
case PM_MATCH_WRITE_NODE: {
|
1970
2042
|
pm_match_write_node_t *cast = (pm_match_write_node_t *) node;
|
1971
2043
|
memsize->memsize += sizeof(*cast);
|
1972
|
-
//
|
1973
|
-
memsize->memsize -= sizeof(
|
2044
|
+
// Node lists will add in their own sizes below.
|
2045
|
+
memsize->memsize -= sizeof(pm_node_list_t) * 1;
|
1974
2046
|
pm_node_memsize_node((pm_node_t *)cast->call, memsize);
|
1975
|
-
memsize->memsize +=
|
2047
|
+
memsize->memsize += pm_node_list_memsize(&cast->targets, memsize);
|
1976
2048
|
break;
|
1977
2049
|
}
|
1978
2050
|
#line 103 "node.c.erb"
|
@@ -2042,6 +2114,12 @@ pm_node_memsize_node(pm_node_t *node, pm_memsize_t *memsize) {
|
|
2042
2114
|
memsize->memsize += sizeof(*cast);
|
2043
2115
|
break;
|
2044
2116
|
}
|
2117
|
+
#line 103 "node.c.erb"
|
2118
|
+
case PM_NUMBERED_PARAMETERS_NODE: {
|
2119
|
+
pm_numbered_parameters_node_t *cast = (pm_numbered_parameters_node_t *) node;
|
2120
|
+
memsize->memsize += sizeof(*cast);
|
2121
|
+
break;
|
2122
|
+
}
|
2045
2123
|
#line 103 "node.c.erb"
|
2046
2124
|
case PM_NUMBERED_REFERENCE_READ_NODE: {
|
2047
2125
|
pm_numbered_reference_read_node_t *cast = (pm_numbered_reference_read_node_t *) node;
|
@@ -2289,14 +2367,6 @@ pm_node_memsize_node(pm_node_t *node, pm_memsize_t *memsize) {
|
|
2289
2367
|
memsize->memsize += pm_node_list_memsize(&cast->body, memsize);
|
2290
2368
|
break;
|
2291
2369
|
}
|
2292
|
-
#line 103 "node.c.erb"
|
2293
|
-
case PM_STRING_CONCAT_NODE: {
|
2294
|
-
pm_string_concat_node_t *cast = (pm_string_concat_node_t *) node;
|
2295
|
-
memsize->memsize += sizeof(*cast);
|
2296
|
-
pm_node_memsize_node((pm_node_t *)cast->left, memsize);
|
2297
|
-
pm_node_memsize_node((pm_node_t *)cast->right, memsize);
|
2298
|
-
break;
|
2299
|
-
}
|
2300
2370
|
#line 103 "node.c.erb"
|
2301
2371
|
case PM_STRING_NODE: {
|
2302
2372
|
pm_string_node_t *cast = (pm_string_node_t *) node;
|
@@ -2461,8 +2531,12 @@ pm_node_type_to_str(pm_node_type_t node_type)
|
|
2461
2531
|
return "PM_CALL_OPERATOR_WRITE_NODE";
|
2462
2532
|
case PM_CALL_OR_WRITE_NODE:
|
2463
2533
|
return "PM_CALL_OR_WRITE_NODE";
|
2534
|
+
case PM_CALL_TARGET_NODE:
|
2535
|
+
return "PM_CALL_TARGET_NODE";
|
2464
2536
|
case PM_CAPTURE_PATTERN_NODE:
|
2465
2537
|
return "PM_CAPTURE_PATTERN_NODE";
|
2538
|
+
case PM_CASE_MATCH_NODE:
|
2539
|
+
return "PM_CASE_MATCH_NODE";
|
2466
2540
|
case PM_CASE_NODE:
|
2467
2541
|
return "PM_CASE_NODE";
|
2468
2542
|
case PM_CLASS_NODE:
|
@@ -2553,6 +2627,8 @@ pm_node_type_to_str(pm_node_type_t node_type)
|
|
2553
2627
|
return "PM_IMAGINARY_NODE";
|
2554
2628
|
case PM_IMPLICIT_NODE:
|
2555
2629
|
return "PM_IMPLICIT_NODE";
|
2630
|
+
case PM_IMPLICIT_REST_NODE:
|
2631
|
+
return "PM_IMPLICIT_REST_NODE";
|
2556
2632
|
case PM_IN_NODE:
|
2557
2633
|
return "PM_IN_NODE";
|
2558
2634
|
case PM_INDEX_AND_WRITE_NODE:
|
@@ -2561,6 +2637,8 @@ pm_node_type_to_str(pm_node_type_t node_type)
|
|
2561
2637
|
return "PM_INDEX_OPERATOR_WRITE_NODE";
|
2562
2638
|
case PM_INDEX_OR_WRITE_NODE:
|
2563
2639
|
return "PM_INDEX_OR_WRITE_NODE";
|
2640
|
+
case PM_INDEX_TARGET_NODE:
|
2641
|
+
return "PM_INDEX_TARGET_NODE";
|
2564
2642
|
case PM_INSTANCE_VARIABLE_AND_WRITE_NODE:
|
2565
2643
|
return "PM_INSTANCE_VARIABLE_AND_WRITE_NODE";
|
2566
2644
|
case PM_INSTANCE_VARIABLE_OPERATOR_WRITE_NODE:
|
@@ -2625,6 +2703,8 @@ pm_node_type_to_str(pm_node_type_t node_type)
|
|
2625
2703
|
return "PM_NIL_NODE";
|
2626
2704
|
case PM_NO_KEYWORDS_PARAMETER_NODE:
|
2627
2705
|
return "PM_NO_KEYWORDS_PARAMETER_NODE";
|
2706
|
+
case PM_NUMBERED_PARAMETERS_NODE:
|
2707
|
+
return "PM_NUMBERED_PARAMETERS_NODE";
|
2628
2708
|
case PM_NUMBERED_REFERENCE_READ_NODE:
|
2629
2709
|
return "PM_NUMBERED_REFERENCE_READ_NODE";
|
2630
2710
|
case PM_OPTIONAL_KEYWORD_PARAMETER_NODE:
|
@@ -2683,8 +2763,6 @@ pm_node_type_to_str(pm_node_type_t node_type)
|
|
2683
2763
|
return "PM_SPLAT_NODE";
|
2684
2764
|
case PM_STATEMENTS_NODE:
|
2685
2765
|
return "PM_STATEMENTS_NODE";
|
2686
|
-
case PM_STRING_CONCAT_NODE:
|
2687
|
-
return "PM_STRING_CONCAT_NODE";
|
2688
2766
|
case PM_STRING_NODE:
|
2689
2767
|
return "PM_STRING_NODE";
|
2690
2768
|
case PM_SUPER_NODE:
|
data/src/options.c
CHANGED
@@ -20,7 +20,7 @@ pm_options_encoding_set(pm_options_t *options, const char *encoding) {
|
|
20
20
|
* Set the line option on the given options struct.
|
21
21
|
*/
|
22
22
|
PRISM_EXPORTED_FUNCTION void
|
23
|
-
pm_options_line_set(pm_options_t *options,
|
23
|
+
pm_options_line_set(pm_options_t *options, int32_t line) {
|
24
24
|
options->line = line;
|
25
25
|
}
|
26
26
|
|
@@ -114,6 +114,22 @@ pm_options_read_u32(const char *data) {
|
|
114
114
|
}
|
115
115
|
}
|
116
116
|
|
117
|
+
/**
|
118
|
+
* Read a 32-bit signed integer from a pointer. This function is used to read
|
119
|
+
* the options that are passed into the parser from the Ruby implementation. It
|
120
|
+
* handles aligned and unaligned reads.
|
121
|
+
*/
|
122
|
+
static int32_t
|
123
|
+
pm_options_read_s32(const char *data) {
|
124
|
+
if (((uintptr_t) data) % sizeof(int32_t) == 0) {
|
125
|
+
return *((int32_t *) data);
|
126
|
+
} else {
|
127
|
+
int32_t value;
|
128
|
+
memcpy(&value, data, sizeof(int32_t));
|
129
|
+
return value;
|
130
|
+
}
|
131
|
+
}
|
132
|
+
|
117
133
|
/**
|
118
134
|
* Deserialize an options struct from the given binary string. This is used to
|
119
135
|
* pass options to the parser from an FFI call so that consumers of the library
|
@@ -123,6 +139,9 @@ pm_options_read_u32(const char *data) {
|
|
123
139
|
*/
|
124
140
|
void
|
125
141
|
pm_options_read(pm_options_t *options, const char *data) {
|
142
|
+
options->line = 1; // default
|
143
|
+
if (data == NULL) return;
|
144
|
+
|
126
145
|
uint32_t filepath_length = pm_options_read_u32(data);
|
127
146
|
data += 4;
|
128
147
|
|
@@ -131,7 +150,7 @@ pm_options_read(pm_options_t *options, const char *data) {
|
|
131
150
|
data += filepath_length;
|
132
151
|
}
|
133
152
|
|
134
|
-
options->line =
|
153
|
+
options->line = pm_options_read_s32(data);
|
135
154
|
data += 4;
|
136
155
|
|
137
156
|
uint32_t encoding_length = pm_options_read_u32(data);
|