prism 2.0.0.rc2 → 2.0.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 (60) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -2
  3. data/docs/serialization.md +19 -6
  4. data/ext/prism/api_node.c +80 -80
  5. data/ext/prism/extension.c +34 -67
  6. data/ext/prism/extension.h +1 -1
  7. data/include/prism/arena.h +8 -0
  8. data/include/prism/arena.hpp +42 -0
  9. data/include/prism/ast.h +11 -1
  10. data/include/prism/ast.hpp +641 -0
  11. data/include/prism/buffer.h +8 -0
  12. data/include/prism/buffer.hpp +55 -0
  13. data/include/prism/comments.h +17 -0
  14. data/include/prism/compiler/branch.h +26 -0
  15. data/include/prism/compiler/cplusplus.hpp +16 -0
  16. data/include/prism/compiler/exceptions.hpp +17 -0
  17. data/include/prism/compiler/format.h +2 -0
  18. data/include/prism/compiler/lifetimebound.hpp +25 -0
  19. data/include/prism/constant_pool.h +25 -0
  20. data/include/prism/diagnostic.h +18 -0
  21. data/include/prism/errors_format.h +8 -0
  22. data/include/prism/internal/node.h +8 -4
  23. data/include/prism/internal/stringy.h +1 -6
  24. data/include/prism/json.h +8 -0
  25. data/include/prism/line_offset_list.h +8 -0
  26. data/include/prism/magic_comments.h +18 -0
  27. data/include/prism/node.h +55 -10
  28. data/include/prism/node.hpp +272 -0
  29. data/include/prism/node_type.hpp +38 -0
  30. data/include/prism/options.h +10 -1
  31. data/include/prism/options.hpp +43 -0
  32. data/include/prism/parser.h +72 -64
  33. data/include/prism/parser.hpp +274 -0
  34. data/include/prism/prettyprint.h +8 -0
  35. data/include/prism/serialize.h +8 -0
  36. data/include/prism/source.h +8 -0
  37. data/include/prism/stream.h +8 -0
  38. data/include/prism/string_query.h +8 -0
  39. data/include/prism/stringy.h +16 -27
  40. data/include/prism/stringy.hpp +31 -0
  41. data/include/prism/version.h +9 -1
  42. data/include/prism.h +0 -8
  43. data/include/prism.hpp +24 -0
  44. data/lib/prism/serialize.rb +2549 -3281
  45. data/prism.gemspec +14 -1
  46. data/rbi/generated/prism/node.rbi +736 -0
  47. data/rbi/generated/prism/serialize.rbi +6 -5
  48. data/sig/generated/prism/node.rbs +736 -0
  49. data/sig/generated/prism/serialize.rbs +7 -5
  50. data/src/comments.c +2 -2
  51. data/src/diagnostic.c +8 -0
  52. data/src/node.c +216 -368
  53. data/src/options.c +7 -13
  54. data/src/parser.c +52 -48
  55. data/src/prism.c +175 -194
  56. data/src/regexp.c +0 -1
  57. data/src/serialize.c +2300 -1950
  58. data/src/source.c +8 -2
  59. data/src/stringy.c +3 -33
  60. metadata +14 -1
data/ext/prism/api_node.c CHANGED
@@ -284,17 +284,14 @@ pm_node_stack_pop(pm_node_stack_node_t **stack) {
284
284
  return visit;
285
285
  }
286
286
 
287
- typedef struct {
288
- VALUE constants;
289
- rb_encoding *encoding;
290
- } pm_ast_constants_each_data_t;
291
-
292
- static void
293
- pm_ast_constants_each(const pm_constant_t *constant, void *data) {
294
- pm_ast_constants_each_data_t *constants_data = (pm_ast_constants_each_data_t *) data;
287
+ /**
288
+ * Build the Symbol for the given constant.
289
+ */
290
+ static VALUE
291
+ pm_ast_constant(const pm_constant_t *constant, rb_encoding *encoding) {
295
292
  int state = 0;
296
293
 
297
- VALUE string = rb_enc_str_new((const char *) pm_constant_start(constant), pm_constant_length(constant), constants_data->encoding);
294
+ VALUE string = rb_enc_str_new((const char *) pm_constant_start(constant), pm_constant_length(constant), encoding);
298
295
  VALUE value = rb_protect(rb_str_intern, string, &state);
299
296
 
300
297
  if (state != 0) {
@@ -302,14 +299,17 @@ pm_ast_constants_each(const pm_constant_t *constant, void *data) {
302
299
  rb_set_errinfo(Qnil);
303
300
  }
304
301
 
305
- rb_ary_push(constants_data->constants, value);
302
+ return value;
306
303
  }
307
304
 
308
305
  VALUE
309
306
  pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encoding, VALUE source, bool freeze) {
310
- VALUE constants = rb_ary_new_capa(pm_parser_constants_size(parser));
311
- pm_ast_constants_each_data_t constants_data = { .constants = constants, .encoding = encoding };
312
- pm_parser_constants_each(parser, pm_ast_constants_each, &constants_data);
307
+ size_t constants_size = pm_parser_constants_size(parser);
308
+ VALUE constants = rb_ary_new_capa((long) constants_size);
309
+
310
+ for (size_t index = 0; index < constants_size; index++) {
311
+ rb_ary_push(constants, pm_ast_constant(pm_parser_constant_at(parser, index), encoding));
312
+ }
313
313
 
314
314
  pm_arena_t *node_arena = pm_arena_new();
315
315
  pm_node_stack_node_t *node_stack = NULL;
@@ -1481,7 +1481,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
1481
1481
  // name
1482
1482
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
1483
1483
  assert(cast->name != 0);
1484
- argv[4] = RARRAY_AREF(constants, cast->name - 1);
1484
+ argv[4] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
1485
1485
 
1486
1486
  VALUE value = rb_class_new_instance(5, argv, rb_cPrismBackReferenceReadNode);
1487
1487
  if (freeze) rb_obj_freeze(value);
@@ -1587,7 +1587,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
1587
1587
  // name
1588
1588
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
1589
1589
  assert(cast->name != 0);
1590
- argv[4] = RARRAY_AREF(constants, cast->name - 1);
1590
+ argv[4] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
1591
1591
 
1592
1592
  VALUE value = rb_class_new_instance(5, argv, rb_cPrismBlockLocalVariableNode);
1593
1593
  if (freeze) rb_obj_freeze(value);
@@ -1617,7 +1617,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
1617
1617
  argv[4] = rb_ary_new_capa(cast->locals.size);
1618
1618
  for (size_t index = 0; index < cast->locals.size; index++) {
1619
1619
  assert(cast->locals.ids[index] != 0);
1620
- rb_ary_push(argv[4], RARRAY_AREF(constants, cast->locals.ids[index] - 1));
1620
+ rb_ary_push(argv[4], RARRAY_AREF(constants, pm_constant_id_index(cast->locals.ids[index])));
1621
1621
  }
1622
1622
  if (freeze) rb_obj_freeze(argv[4]);
1623
1623
 
@@ -1661,7 +1661,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
1661
1661
  argv[3] = ULONG2NUM(node->flags);
1662
1662
 
1663
1663
  // name
1664
- argv[4] = cast->name == 0 ? Qnil : RARRAY_AREF(constants, cast->name - 1);
1664
+ argv[4] = cast->name == 0 ? Qnil : RARRAY_AREF(constants, pm_constant_id_index(cast->name));
1665
1665
 
1666
1666
  // name_loc
1667
1667
  #line 256 "prism/templates/ext/prism/api_node.c.erb"
@@ -1783,12 +1783,12 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
1783
1783
  // read_name
1784
1784
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
1785
1785
  assert(cast->read_name != 0);
1786
- argv[7] = RARRAY_AREF(constants, cast->read_name - 1);
1786
+ argv[7] = RARRAY_AREF(constants, pm_constant_id_index(cast->read_name));
1787
1787
 
1788
1788
  // write_name
1789
1789
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
1790
1790
  assert(cast->write_name != 0);
1791
- argv[8] = RARRAY_AREF(constants, cast->write_name - 1);
1791
+ argv[8] = RARRAY_AREF(constants, pm_constant_id_index(cast->write_name));
1792
1792
 
1793
1793
  // operator_loc
1794
1794
  #line 253 "prism/templates/ext/prism/api_node.c.erb"
@@ -1832,7 +1832,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
1832
1832
  // name
1833
1833
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
1834
1834
  assert(cast->name != 0);
1835
- argv[6] = RARRAY_AREF(constants, cast->name - 1);
1835
+ argv[6] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
1836
1836
 
1837
1837
  // message_loc
1838
1838
  #line 256 "prism/templates/ext/prism/api_node.c.erb"
@@ -1896,17 +1896,17 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
1896
1896
  // read_name
1897
1897
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
1898
1898
  assert(cast->read_name != 0);
1899
- argv[7] = RARRAY_AREF(constants, cast->read_name - 1);
1899
+ argv[7] = RARRAY_AREF(constants, pm_constant_id_index(cast->read_name));
1900
1900
 
1901
1901
  // write_name
1902
1902
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
1903
1903
  assert(cast->write_name != 0);
1904
- argv[8] = RARRAY_AREF(constants, cast->write_name - 1);
1904
+ argv[8] = RARRAY_AREF(constants, pm_constant_id_index(cast->write_name));
1905
1905
 
1906
1906
  // binary_operator
1907
1907
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
1908
1908
  assert(cast->binary_operator != 0);
1909
- argv[9] = RARRAY_AREF(constants, cast->binary_operator - 1);
1909
+ argv[9] = RARRAY_AREF(constants, pm_constant_id_index(cast->binary_operator));
1910
1910
 
1911
1911
  // binary_operator_loc
1912
1912
  #line 253 "prism/templates/ext/prism/api_node.c.erb"
@@ -1954,12 +1954,12 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
1954
1954
  // read_name
1955
1955
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
1956
1956
  assert(cast->read_name != 0);
1957
- argv[7] = RARRAY_AREF(constants, cast->read_name - 1);
1957
+ argv[7] = RARRAY_AREF(constants, pm_constant_id_index(cast->read_name));
1958
1958
 
1959
1959
  // write_name
1960
1960
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
1961
1961
  assert(cast->write_name != 0);
1962
- argv[8] = RARRAY_AREF(constants, cast->write_name - 1);
1962
+ argv[8] = RARRAY_AREF(constants, pm_constant_id_index(cast->write_name));
1963
1963
 
1964
1964
  // operator_loc
1965
1965
  #line 253 "prism/templates/ext/prism/api_node.c.erb"
@@ -2003,7 +2003,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
2003
2003
  // name
2004
2004
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
2005
2005
  assert(cast->name != 0);
2006
- argv[6] = RARRAY_AREF(constants, cast->name - 1);
2006
+ argv[6] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
2007
2007
 
2008
2008
  // message_loc
2009
2009
  #line 253 "prism/templates/ext/prism/api_node.c.erb"
@@ -2166,7 +2166,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
2166
2166
  argv[4] = rb_ary_new_capa(cast->locals.size);
2167
2167
  for (size_t index = 0; index < cast->locals.size; index++) {
2168
2168
  assert(cast->locals.ids[index] != 0);
2169
- rb_ary_push(argv[4], RARRAY_AREF(constants, cast->locals.ids[index] - 1));
2169
+ rb_ary_push(argv[4], RARRAY_AREF(constants, pm_constant_id_index(cast->locals.ids[index])));
2170
2170
  }
2171
2171
  if (freeze) rb_obj_freeze(argv[4]);
2172
2172
 
@@ -2197,7 +2197,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
2197
2197
  // name
2198
2198
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
2199
2199
  assert(cast->name != 0);
2200
- argv[11] = RARRAY_AREF(constants, cast->name - 1);
2200
+ argv[11] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
2201
2201
 
2202
2202
  VALUE value = rb_class_new_instance(12, argv, rb_cPrismClassNode);
2203
2203
  if (freeze) rb_obj_freeze(value);
@@ -2225,7 +2225,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
2225
2225
  // name
2226
2226
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
2227
2227
  assert(cast->name != 0);
2228
- argv[4] = RARRAY_AREF(constants, cast->name - 1);
2228
+ argv[4] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
2229
2229
 
2230
2230
  // name_loc
2231
2231
  #line 253 "prism/templates/ext/prism/api_node.c.erb"
@@ -2265,7 +2265,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
2265
2265
  // name
2266
2266
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
2267
2267
  assert(cast->name != 0);
2268
- argv[4] = RARRAY_AREF(constants, cast->name - 1);
2268
+ argv[4] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
2269
2269
 
2270
2270
  // name_loc
2271
2271
  #line 253 "prism/templates/ext/prism/api_node.c.erb"
@@ -2282,7 +2282,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
2282
2282
  // binary_operator
2283
2283
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
2284
2284
  assert(cast->binary_operator != 0);
2285
- argv[8] = RARRAY_AREF(constants, cast->binary_operator - 1);
2285
+ argv[8] = RARRAY_AREF(constants, pm_constant_id_index(cast->binary_operator));
2286
2286
 
2287
2287
  VALUE value = rb_class_new_instance(9, argv, rb_cPrismClassVariableOperatorWriteNode);
2288
2288
  if (freeze) rb_obj_freeze(value);
@@ -2310,7 +2310,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
2310
2310
  // name
2311
2311
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
2312
2312
  assert(cast->name != 0);
2313
- argv[4] = RARRAY_AREF(constants, cast->name - 1);
2313
+ argv[4] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
2314
2314
 
2315
2315
  // name_loc
2316
2316
  #line 253 "prism/templates/ext/prism/api_node.c.erb"
@@ -2350,7 +2350,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
2350
2350
  // name
2351
2351
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
2352
2352
  assert(cast->name != 0);
2353
- argv[4] = RARRAY_AREF(constants, cast->name - 1);
2353
+ argv[4] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
2354
2354
 
2355
2355
  VALUE value = rb_class_new_instance(5, argv, rb_cPrismClassVariableReadNode);
2356
2356
  if (freeze) rb_obj_freeze(value);
@@ -2378,7 +2378,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
2378
2378
  // name
2379
2379
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
2380
2380
  assert(cast->name != 0);
2381
- argv[4] = RARRAY_AREF(constants, cast->name - 1);
2381
+ argv[4] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
2382
2382
 
2383
2383
  VALUE value = rb_class_new_instance(5, argv, rb_cPrismClassVariableTargetNode);
2384
2384
  if (freeze) rb_obj_freeze(value);
@@ -2406,7 +2406,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
2406
2406
  // name
2407
2407
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
2408
2408
  assert(cast->name != 0);
2409
- argv[4] = RARRAY_AREF(constants, cast->name - 1);
2409
+ argv[4] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
2410
2410
 
2411
2411
  // name_loc
2412
2412
  #line 253 "prism/templates/ext/prism/api_node.c.erb"
@@ -2446,7 +2446,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
2446
2446
  // name
2447
2447
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
2448
2448
  assert(cast->name != 0);
2449
- argv[4] = RARRAY_AREF(constants, cast->name - 1);
2449
+ argv[4] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
2450
2450
 
2451
2451
  // name_loc
2452
2452
  #line 253 "prism/templates/ext/prism/api_node.c.erb"
@@ -2486,7 +2486,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
2486
2486
  // name
2487
2487
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
2488
2488
  assert(cast->name != 0);
2489
- argv[4] = RARRAY_AREF(constants, cast->name - 1);
2489
+ argv[4] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
2490
2490
 
2491
2491
  // name_loc
2492
2492
  #line 253 "prism/templates/ext/prism/api_node.c.erb"
@@ -2503,7 +2503,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
2503
2503
  // binary_operator
2504
2504
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
2505
2505
  assert(cast->binary_operator != 0);
2506
- argv[8] = RARRAY_AREF(constants, cast->binary_operator - 1);
2506
+ argv[8] = RARRAY_AREF(constants, pm_constant_id_index(cast->binary_operator));
2507
2507
 
2508
2508
  VALUE value = rb_class_new_instance(9, argv, rb_cPrismConstantOperatorWriteNode);
2509
2509
  if (freeze) rb_obj_freeze(value);
@@ -2531,7 +2531,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
2531
2531
  // name
2532
2532
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
2533
2533
  assert(cast->name != 0);
2534
- argv[4] = RARRAY_AREF(constants, cast->name - 1);
2534
+ argv[4] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
2535
2535
 
2536
2536
  // name_loc
2537
2537
  #line 253 "prism/templates/ext/prism/api_node.c.erb"
@@ -2608,7 +2608,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
2608
2608
  argv[4] = rb_ary_pop(value_stack);
2609
2609
 
2610
2610
  // name
2611
- argv[5] = cast->name == 0 ? Qnil : RARRAY_AREF(constants, cast->name - 1);
2611
+ argv[5] = cast->name == 0 ? Qnil : RARRAY_AREF(constants, pm_constant_id_index(cast->name));
2612
2612
 
2613
2613
  // delimiter_loc
2614
2614
  #line 253 "prism/templates/ext/prism/api_node.c.erb"
@@ -2656,7 +2656,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
2656
2656
  // binary_operator
2657
2657
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
2658
2658
  assert(cast->binary_operator != 0);
2659
- argv[7] = RARRAY_AREF(constants, cast->binary_operator - 1);
2659
+ argv[7] = RARRAY_AREF(constants, pm_constant_id_index(cast->binary_operator));
2660
2660
 
2661
2661
  VALUE value = rb_class_new_instance(8, argv, rb_cPrismConstantPathOperatorWriteNode);
2662
2662
  if (freeze) rb_obj_freeze(value);
@@ -2721,7 +2721,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
2721
2721
  argv[4] = rb_ary_pop(value_stack);
2722
2722
 
2723
2723
  // name
2724
- argv[5] = cast->name == 0 ? Qnil : RARRAY_AREF(constants, cast->name - 1);
2724
+ argv[5] = cast->name == 0 ? Qnil : RARRAY_AREF(constants, pm_constant_id_index(cast->name));
2725
2725
 
2726
2726
  // delimiter_loc
2727
2727
  #line 253 "prism/templates/ext/prism/api_node.c.erb"
@@ -2792,7 +2792,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
2792
2792
  // name
2793
2793
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
2794
2794
  assert(cast->name != 0);
2795
- argv[4] = RARRAY_AREF(constants, cast->name - 1);
2795
+ argv[4] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
2796
2796
 
2797
2797
  VALUE value = rb_class_new_instance(5, argv, rb_cPrismConstantReadNode);
2798
2798
  if (freeze) rb_obj_freeze(value);
@@ -2820,7 +2820,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
2820
2820
  // name
2821
2821
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
2822
2822
  assert(cast->name != 0);
2823
- argv[4] = RARRAY_AREF(constants, cast->name - 1);
2823
+ argv[4] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
2824
2824
 
2825
2825
  VALUE value = rb_class_new_instance(5, argv, rb_cPrismConstantTargetNode);
2826
2826
  if (freeze) rb_obj_freeze(value);
@@ -2848,7 +2848,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
2848
2848
  // name
2849
2849
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
2850
2850
  assert(cast->name != 0);
2851
- argv[4] = RARRAY_AREF(constants, cast->name - 1);
2851
+ argv[4] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
2852
2852
 
2853
2853
  // name_loc
2854
2854
  #line 253 "prism/templates/ext/prism/api_node.c.erb"
@@ -2888,7 +2888,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
2888
2888
  // name
2889
2889
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
2890
2890
  assert(cast->name != 0);
2891
- argv[4] = RARRAY_AREF(constants, cast->name - 1);
2891
+ argv[4] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
2892
2892
 
2893
2893
  // name_loc
2894
2894
  #line 253 "prism/templates/ext/prism/api_node.c.erb"
@@ -2911,7 +2911,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
2911
2911
  argv[9] = rb_ary_new_capa(cast->locals.size);
2912
2912
  for (size_t index = 0; index < cast->locals.size; index++) {
2913
2913
  assert(cast->locals.ids[index] != 0);
2914
- rb_ary_push(argv[9], RARRAY_AREF(constants, cast->locals.ids[index] - 1));
2914
+ rb_ary_push(argv[9], RARRAY_AREF(constants, pm_constant_id_index(cast->locals.ids[index])));
2915
2915
  }
2916
2916
  if (freeze) rb_obj_freeze(argv[9]);
2917
2917
 
@@ -3427,7 +3427,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
3427
3427
  // name
3428
3428
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
3429
3429
  assert(cast->name != 0);
3430
- argv[4] = RARRAY_AREF(constants, cast->name - 1);
3430
+ argv[4] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
3431
3431
 
3432
3432
  // name_loc
3433
3433
  #line 253 "prism/templates/ext/prism/api_node.c.erb"
@@ -3467,7 +3467,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
3467
3467
  // name
3468
3468
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
3469
3469
  assert(cast->name != 0);
3470
- argv[4] = RARRAY_AREF(constants, cast->name - 1);
3470
+ argv[4] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
3471
3471
 
3472
3472
  // name_loc
3473
3473
  #line 253 "prism/templates/ext/prism/api_node.c.erb"
@@ -3484,7 +3484,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
3484
3484
  // binary_operator
3485
3485
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
3486
3486
  assert(cast->binary_operator != 0);
3487
- argv[8] = RARRAY_AREF(constants, cast->binary_operator - 1);
3487
+ argv[8] = RARRAY_AREF(constants, pm_constant_id_index(cast->binary_operator));
3488
3488
 
3489
3489
  VALUE value = rb_class_new_instance(9, argv, rb_cPrismGlobalVariableOperatorWriteNode);
3490
3490
  if (freeze) rb_obj_freeze(value);
@@ -3512,7 +3512,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
3512
3512
  // name
3513
3513
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
3514
3514
  assert(cast->name != 0);
3515
- argv[4] = RARRAY_AREF(constants, cast->name - 1);
3515
+ argv[4] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
3516
3516
 
3517
3517
  // name_loc
3518
3518
  #line 253 "prism/templates/ext/prism/api_node.c.erb"
@@ -3552,7 +3552,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
3552
3552
  // name
3553
3553
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
3554
3554
  assert(cast->name != 0);
3555
- argv[4] = RARRAY_AREF(constants, cast->name - 1);
3555
+ argv[4] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
3556
3556
 
3557
3557
  VALUE value = rb_class_new_instance(5, argv, rb_cPrismGlobalVariableReadNode);
3558
3558
  if (freeze) rb_obj_freeze(value);
@@ -3580,7 +3580,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
3580
3580
  // name
3581
3581
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
3582
3582
  assert(cast->name != 0);
3583
- argv[4] = RARRAY_AREF(constants, cast->name - 1);
3583
+ argv[4] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
3584
3584
 
3585
3585
  VALUE value = rb_class_new_instance(5, argv, rb_cPrismGlobalVariableTargetNode);
3586
3586
  if (freeze) rb_obj_freeze(value);
@@ -3608,7 +3608,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
3608
3608
  // name
3609
3609
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
3610
3610
  assert(cast->name != 0);
3611
- argv[4] = RARRAY_AREF(constants, cast->name - 1);
3611
+ argv[4] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
3612
3612
 
3613
3613
  // name_loc
3614
3614
  #line 253 "prism/templates/ext/prism/api_node.c.erb"
@@ -3973,7 +3973,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
3973
3973
  // binary_operator
3974
3974
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
3975
3975
  assert(cast->binary_operator != 0);
3976
- argv[10] = RARRAY_AREF(constants, cast->binary_operator - 1);
3976
+ argv[10] = RARRAY_AREF(constants, pm_constant_id_index(cast->binary_operator));
3977
3977
 
3978
3978
  // binary_operator_loc
3979
3979
  #line 253 "prism/templates/ext/prism/api_node.c.erb"
@@ -4107,7 +4107,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
4107
4107
  // name
4108
4108
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
4109
4109
  assert(cast->name != 0);
4110
- argv[4] = RARRAY_AREF(constants, cast->name - 1);
4110
+ argv[4] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
4111
4111
 
4112
4112
  // name_loc
4113
4113
  #line 253 "prism/templates/ext/prism/api_node.c.erb"
@@ -4147,7 +4147,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
4147
4147
  // name
4148
4148
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
4149
4149
  assert(cast->name != 0);
4150
- argv[4] = RARRAY_AREF(constants, cast->name - 1);
4150
+ argv[4] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
4151
4151
 
4152
4152
  // name_loc
4153
4153
  #line 253 "prism/templates/ext/prism/api_node.c.erb"
@@ -4164,7 +4164,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
4164
4164
  // binary_operator
4165
4165
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
4166
4166
  assert(cast->binary_operator != 0);
4167
- argv[8] = RARRAY_AREF(constants, cast->binary_operator - 1);
4167
+ argv[8] = RARRAY_AREF(constants, pm_constant_id_index(cast->binary_operator));
4168
4168
 
4169
4169
  VALUE value = rb_class_new_instance(9, argv, rb_cPrismInstanceVariableOperatorWriteNode);
4170
4170
  if (freeze) rb_obj_freeze(value);
@@ -4192,7 +4192,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
4192
4192
  // name
4193
4193
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
4194
4194
  assert(cast->name != 0);
4195
- argv[4] = RARRAY_AREF(constants, cast->name - 1);
4195
+ argv[4] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
4196
4196
 
4197
4197
  // name_loc
4198
4198
  #line 253 "prism/templates/ext/prism/api_node.c.erb"
@@ -4232,7 +4232,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
4232
4232
  // name
4233
4233
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
4234
4234
  assert(cast->name != 0);
4235
- argv[4] = RARRAY_AREF(constants, cast->name - 1);
4235
+ argv[4] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
4236
4236
 
4237
4237
  VALUE value = rb_class_new_instance(5, argv, rb_cPrismInstanceVariableReadNode);
4238
4238
  if (freeze) rb_obj_freeze(value);
@@ -4260,7 +4260,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
4260
4260
  // name
4261
4261
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
4262
4262
  assert(cast->name != 0);
4263
- argv[4] = RARRAY_AREF(constants, cast->name - 1);
4263
+ argv[4] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
4264
4264
 
4265
4265
  VALUE value = rb_class_new_instance(5, argv, rb_cPrismInstanceVariableTargetNode);
4266
4266
  if (freeze) rb_obj_freeze(value);
@@ -4288,7 +4288,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
4288
4288
  // name
4289
4289
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
4290
4290
  assert(cast->name != 0);
4291
- argv[4] = RARRAY_AREF(constants, cast->name - 1);
4291
+ argv[4] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
4292
4292
 
4293
4293
  // name_loc
4294
4294
  #line 253 "prism/templates/ext/prism/api_node.c.erb"
@@ -4623,7 +4623,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
4623
4623
  argv[3] = ULONG2NUM(node->flags);
4624
4624
 
4625
4625
  // name
4626
- argv[4] = cast->name == 0 ? Qnil : RARRAY_AREF(constants, cast->name - 1);
4626
+ argv[4] = cast->name == 0 ? Qnil : RARRAY_AREF(constants, pm_constant_id_index(cast->name));
4627
4627
 
4628
4628
  // name_loc
4629
4629
  #line 256 "prism/templates/ext/prism/api_node.c.erb"
@@ -4661,7 +4661,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
4661
4661
  argv[4] = rb_ary_new_capa(cast->locals.size);
4662
4662
  for (size_t index = 0; index < cast->locals.size; index++) {
4663
4663
  assert(cast->locals.ids[index] != 0);
4664
- rb_ary_push(argv[4], RARRAY_AREF(constants, cast->locals.ids[index] - 1));
4664
+ rb_ary_push(argv[4], RARRAY_AREF(constants, pm_constant_id_index(cast->locals.ids[index])));
4665
4665
  }
4666
4666
  if (freeze) rb_obj_freeze(argv[4]);
4667
4667
 
@@ -4723,7 +4723,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
4723
4723
  // name
4724
4724
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
4725
4725
  assert(cast->name != 0);
4726
- argv[7] = RARRAY_AREF(constants, cast->name - 1);
4726
+ argv[7] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
4727
4727
 
4728
4728
  // depth
4729
4729
  #line 262 "prism/templates/ext/prism/api_node.c.erb"
@@ -4767,12 +4767,12 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
4767
4767
  // name
4768
4768
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
4769
4769
  assert(cast->name != 0);
4770
- argv[7] = RARRAY_AREF(constants, cast->name - 1);
4770
+ argv[7] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
4771
4771
 
4772
4772
  // binary_operator
4773
4773
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
4774
4774
  assert(cast->binary_operator != 0);
4775
- argv[8] = RARRAY_AREF(constants, cast->binary_operator - 1);
4775
+ argv[8] = RARRAY_AREF(constants, pm_constant_id_index(cast->binary_operator));
4776
4776
 
4777
4777
  // depth
4778
4778
  #line 262 "prism/templates/ext/prism/api_node.c.erb"
@@ -4816,7 +4816,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
4816
4816
  // name
4817
4817
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
4818
4818
  assert(cast->name != 0);
4819
- argv[7] = RARRAY_AREF(constants, cast->name - 1);
4819
+ argv[7] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
4820
4820
 
4821
4821
  // depth
4822
4822
  #line 262 "prism/templates/ext/prism/api_node.c.erb"
@@ -4848,7 +4848,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
4848
4848
  // name
4849
4849
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
4850
4850
  assert(cast->name != 0);
4851
- argv[4] = RARRAY_AREF(constants, cast->name - 1);
4851
+ argv[4] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
4852
4852
 
4853
4853
  // depth
4854
4854
  #line 262 "prism/templates/ext/prism/api_node.c.erb"
@@ -4880,7 +4880,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
4880
4880
  // name
4881
4881
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
4882
4882
  assert(cast->name != 0);
4883
- argv[4] = RARRAY_AREF(constants, cast->name - 1);
4883
+ argv[4] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
4884
4884
 
4885
4885
  // depth
4886
4886
  #line 262 "prism/templates/ext/prism/api_node.c.erb"
@@ -4912,7 +4912,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
4912
4912
  // name
4913
4913
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
4914
4914
  assert(cast->name != 0);
4915
- argv[4] = RARRAY_AREF(constants, cast->name - 1);
4915
+ argv[4] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
4916
4916
 
4917
4917
  // depth
4918
4918
  #line 262 "prism/templates/ext/prism/api_node.c.erb"
@@ -5102,7 +5102,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
5102
5102
  argv[4] = rb_ary_new_capa(cast->locals.size);
5103
5103
  for (size_t index = 0; index < cast->locals.size; index++) {
5104
5104
  assert(cast->locals.ids[index] != 0);
5105
- rb_ary_push(argv[4], RARRAY_AREF(constants, cast->locals.ids[index] - 1));
5105
+ rb_ary_push(argv[4], RARRAY_AREF(constants, pm_constant_id_index(cast->locals.ids[index])));
5106
5106
  }
5107
5107
  if (freeze) rb_obj_freeze(argv[4]);
5108
5108
 
@@ -5125,7 +5125,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
5125
5125
  // name
5126
5126
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
5127
5127
  assert(cast->name != 0);
5128
- argv[9] = RARRAY_AREF(constants, cast->name - 1);
5128
+ argv[9] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
5129
5129
 
5130
5130
  VALUE value = rb_class_new_instance(10, argv, rb_cPrismModuleNode);
5131
5131
  if (freeze) rb_obj_freeze(value);
@@ -5432,7 +5432,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
5432
5432
  // name
5433
5433
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
5434
5434
  assert(cast->name != 0);
5435
- argv[4] = RARRAY_AREF(constants, cast->name - 1);
5435
+ argv[4] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
5436
5436
 
5437
5437
  // name_loc
5438
5438
  #line 253 "prism/templates/ext/prism/api_node.c.erb"
@@ -5468,7 +5468,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
5468
5468
  // name
5469
5469
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
5470
5470
  assert(cast->name != 0);
5471
- argv[4] = RARRAY_AREF(constants, cast->name - 1);
5471
+ argv[4] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
5472
5472
 
5473
5473
  // name_loc
5474
5474
  #line 253 "prism/templates/ext/prism/api_node.c.erb"
@@ -5795,7 +5795,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
5795
5795
  argv[4] = rb_ary_new_capa(cast->locals.size);
5796
5796
  for (size_t index = 0; index < cast->locals.size; index++) {
5797
5797
  assert(cast->locals.ids[index] != 0);
5798
- rb_ary_push(argv[4], RARRAY_AREF(constants, cast->locals.ids[index] - 1));
5798
+ rb_ary_push(argv[4], RARRAY_AREF(constants, pm_constant_id_index(cast->locals.ids[index])));
5799
5799
  }
5800
5800
  if (freeze) rb_obj_freeze(argv[4]);
5801
5801
 
@@ -5956,7 +5956,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
5956
5956
  // name
5957
5957
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
5958
5958
  assert(cast->name != 0);
5959
- argv[4] = RARRAY_AREF(constants, cast->name - 1);
5959
+ argv[4] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
5960
5960
 
5961
5961
  // name_loc
5962
5962
  #line 253 "prism/templates/ext/prism/api_node.c.erb"
@@ -5988,7 +5988,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
5988
5988
  // name
5989
5989
  #line 239 "prism/templates/ext/prism/api_node.c.erb"
5990
5990
  assert(cast->name != 0);
5991
- argv[4] = RARRAY_AREF(constants, cast->name - 1);
5991
+ argv[4] = RARRAY_AREF(constants, pm_constant_id_index(cast->name));
5992
5992
 
5993
5993
  VALUE value = rb_class_new_instance(5, argv, rb_cPrismRequiredParameterNode);
5994
5994
  if (freeze) rb_obj_freeze(value);
@@ -6104,7 +6104,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
6104
6104
  argv[3] = ULONG2NUM(node->flags);
6105
6105
 
6106
6106
  // name
6107
- argv[4] = cast->name == 0 ? Qnil : RARRAY_AREF(constants, cast->name - 1);
6107
+ argv[4] = cast->name == 0 ? Qnil : RARRAY_AREF(constants, pm_constant_id_index(cast->name));
6108
6108
 
6109
6109
  // name_loc
6110
6110
  #line 256 "prism/templates/ext/prism/api_node.c.erb"
@@ -6243,7 +6243,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
6243
6243
  argv[4] = rb_ary_new_capa(cast->locals.size);
6244
6244
  for (size_t index = 0; index < cast->locals.size; index++) {
6245
6245
  assert(cast->locals.ids[index] != 0);
6246
- rb_ary_push(argv[4], RARRAY_AREF(constants, cast->locals.ids[index] - 1));
6246
+ rb_ary_push(argv[4], RARRAY_AREF(constants, pm_constant_id_index(cast->locals.ids[index])));
6247
6247
  }
6248
6248
  if (freeze) rb_obj_freeze(argv[4]);
6249
6249