prism 0.17.1 → 0.19.0

Sign up to get free protection for your applications and to get access to all the features.
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);