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.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +60 -1
  3. data/Makefile +5 -5
  4. data/README.md +4 -3
  5. data/config.yml +214 -68
  6. data/docs/build_system.md +6 -6
  7. data/docs/building.md +10 -3
  8. data/docs/configuration.md +11 -9
  9. data/docs/encoding.md +92 -88
  10. data/docs/heredocs.md +1 -1
  11. data/docs/javascript.md +29 -1
  12. data/docs/local_variable_depth.md +229 -0
  13. data/docs/ruby_api.md +16 -0
  14. data/docs/serialization.md +18 -13
  15. data/ext/prism/api_node.c +411 -240
  16. data/ext/prism/extconf.rb +97 -127
  17. data/ext/prism/extension.c +97 -33
  18. data/ext/prism/extension.h +1 -1
  19. data/include/prism/ast.h +377 -159
  20. data/include/prism/defines.h +17 -0
  21. data/include/prism/diagnostic.h +38 -6
  22. data/include/prism/{enc/pm_encoding.h → encoding.h} +126 -64
  23. data/include/prism/options.h +2 -2
  24. data/include/prism/parser.h +62 -36
  25. data/include/prism/regexp.h +2 -2
  26. data/include/prism/util/pm_buffer.h +9 -1
  27. data/include/prism/util/pm_memchr.h +2 -2
  28. data/include/prism/util/pm_strpbrk.h +3 -3
  29. data/include/prism/version.h +3 -3
  30. data/include/prism.h +13 -15
  31. data/lib/prism/compiler.rb +15 -3
  32. data/lib/prism/debug.rb +13 -4
  33. data/lib/prism/desugar_compiler.rb +4 -3
  34. data/lib/prism/dispatcher.rb +70 -14
  35. data/lib/prism/dot_visitor.rb +4612 -0
  36. data/lib/prism/dsl.rb +77 -57
  37. data/lib/prism/ffi.rb +19 -6
  38. data/lib/prism/lex_compat.rb +19 -9
  39. data/lib/prism/mutation_compiler.rb +26 -6
  40. data/lib/prism/node.rb +1314 -522
  41. data/lib/prism/node_ext.rb +102 -19
  42. data/lib/prism/parse_result.rb +58 -27
  43. data/lib/prism/ripper_compat.rb +49 -34
  44. data/lib/prism/serialize.rb +251 -227
  45. data/lib/prism/visitor.rb +15 -3
  46. data/lib/prism.rb +21 -4
  47. data/prism.gemspec +7 -9
  48. data/rbi/prism.rbi +688 -284
  49. data/rbi/prism_static.rbi +3 -0
  50. data/sig/prism.rbs +426 -156
  51. data/sig/prism_static.rbs +1 -0
  52. data/src/diagnostic.c +280 -216
  53. data/src/encoding.c +5137 -0
  54. data/src/node.c +99 -21
  55. data/src/options.c +21 -2
  56. data/src/prettyprint.c +1743 -1241
  57. data/src/prism.c +1774 -831
  58. data/src/regexp.c +15 -15
  59. data/src/serialize.c +261 -164
  60. data/src/util/pm_buffer.c +10 -1
  61. data/src/util/pm_memchr.c +1 -1
  62. data/src/util/pm_strpbrk.c +4 -4
  63. metadata +8 -10
  64. data/src/enc/pm_big5.c +0 -53
  65. data/src/enc/pm_euc_jp.c +0 -59
  66. data/src/enc/pm_gbk.c +0 -62
  67. data/src/enc/pm_shift_jis.c +0 -57
  68. data/src/enc/pm_tables.c +0 -743
  69. data/src/enc/pm_unicode.c +0 -2369
  70. 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
- pm_constant_id_list_free(&cast->locals);
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
- // Constant id lists will add in their own sizes below.
1973
- memsize->memsize -= sizeof(pm_constant_id_list_t) * 1;
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 += pm_constant_id_list_memsize(&cast->locals);
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, uint32_t line) {
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 = pm_options_read_u32(data);
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);