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/serialize.c CHANGED
@@ -22,13 +22,13 @@ pm_sizet_to_u32(size_t value) {
22
22
  }
23
23
 
24
24
  static void
25
- pm_serialize_location(pm_parser_t *parser, pm_location_t *location, pm_buffer_t *buffer) {
25
+ pm_serialize_location(const pm_parser_t *parser, const pm_location_t *location, pm_buffer_t *buffer) {
26
26
  assert(location->start);
27
27
  assert(location->end);
28
28
  assert(location->start <= location->end);
29
29
 
30
- pm_buffer_append_varint(buffer, pm_ptrdifft_to_u32(location->start - parser->start));
31
- pm_buffer_append_varint(buffer, pm_ptrdifft_to_u32(location->end - location->start));
30
+ pm_buffer_append_varuint(buffer, pm_ptrdifft_to_u32(location->start - parser->start));
31
+ pm_buffer_append_varuint(buffer, pm_ptrdifft_to_u32(location->end - location->start));
32
32
  }
33
33
 
34
34
  static void
@@ -36,15 +36,15 @@ pm_serialize_string(pm_parser_t *parser, pm_string_t *string, pm_buffer_t *buffe
36
36
  switch (string->type) {
37
37
  case PM_STRING_SHARED: {
38
38
  pm_buffer_append_byte(buffer, 1);
39
- pm_buffer_append_varint(buffer, pm_ptrdifft_to_u32(pm_string_source(string) - parser->start));
40
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(pm_string_length(string)));
39
+ pm_buffer_append_varuint(buffer, pm_ptrdifft_to_u32(pm_string_source(string) - parser->start));
40
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(pm_string_length(string)));
41
41
  break;
42
42
  }
43
43
  case PM_STRING_OWNED:
44
44
  case PM_STRING_CONSTANT: {
45
45
  uint32_t length = pm_sizet_to_u32(pm_string_length(string));
46
46
  pm_buffer_append_byte(buffer, 2);
47
- pm_buffer_append_varint(buffer, length);
47
+ pm_buffer_append_varuint(buffer, length);
48
48
  pm_buffer_append_bytes(buffer, pm_string_source(string), length);
49
49
  break;
50
50
  }
@@ -92,17 +92,18 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
92
92
  break;
93
93
  }
94
94
  case PM_ARGUMENTS_NODE: {
95
+ pm_buffer_append_varuint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
95
96
  uint32_t arguments_size = pm_sizet_to_u32(((pm_arguments_node_t *)node)->arguments.size);
96
- pm_buffer_append_varint(buffer, arguments_size);
97
+ pm_buffer_append_varuint(buffer, arguments_size);
97
98
  for (uint32_t index = 0; index < arguments_size; index++) {
98
99
  pm_serialize_node(parser, (pm_node_t *) ((pm_arguments_node_t *)node)->arguments.nodes[index], buffer);
99
100
  }
100
- pm_buffer_append_varint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
101
101
  break;
102
102
  }
103
103
  case PM_ARRAY_NODE: {
104
+ pm_buffer_append_varuint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
104
105
  uint32_t elements_size = pm_sizet_to_u32(((pm_array_node_t *)node)->elements.size);
105
- pm_buffer_append_varint(buffer, elements_size);
106
+ pm_buffer_append_varuint(buffer, elements_size);
106
107
  for (uint32_t index = 0; index < elements_size; index++) {
107
108
  pm_serialize_node(parser, (pm_node_t *) ((pm_array_node_t *)node)->elements.nodes[index], buffer);
108
109
  }
@@ -127,7 +128,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
127
128
  pm_serialize_node(parser, (pm_node_t *)((pm_array_pattern_node_t *)node)->constant, buffer);
128
129
  }
129
130
  uint32_t requireds_size = pm_sizet_to_u32(((pm_array_pattern_node_t *)node)->requireds.size);
130
- pm_buffer_append_varint(buffer, requireds_size);
131
+ pm_buffer_append_varuint(buffer, requireds_size);
131
132
  for (uint32_t index = 0; index < requireds_size; index++) {
132
133
  pm_serialize_node(parser, (pm_node_t *) ((pm_array_pattern_node_t *)node)->requireds.nodes[index], buffer);
133
134
  }
@@ -137,7 +138,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
137
138
  pm_serialize_node(parser, (pm_node_t *)((pm_array_pattern_node_t *)node)->rest, buffer);
138
139
  }
139
140
  uint32_t posts_size = pm_sizet_to_u32(((pm_array_pattern_node_t *)node)->posts.size);
140
- pm_buffer_append_varint(buffer, posts_size);
141
+ pm_buffer_append_varuint(buffer, posts_size);
141
142
  for (uint32_t index = 0; index < posts_size; index++) {
142
143
  pm_serialize_node(parser, (pm_node_t *) ((pm_array_pattern_node_t *)node)->posts.nodes[index], buffer);
143
144
  }
@@ -180,7 +181,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
180
181
  break;
181
182
  }
182
183
  case PM_BACK_REFERENCE_READ_NODE: {
183
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_back_reference_read_node_t *)node)->name));
184
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_back_reference_read_node_t *)node)->name));
184
185
  break;
185
186
  }
186
187
  case PM_BEGIN_NODE: {
@@ -228,15 +229,16 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
228
229
  break;
229
230
  }
230
231
  case PM_BLOCK_LOCAL_VARIABLE_NODE: {
231
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_block_local_variable_node_t *)node)->name));
232
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_block_local_variable_node_t *)node)->name));
232
233
  break;
233
234
  }
234
235
  case PM_BLOCK_NODE: {
235
236
  uint32_t locals_size = pm_sizet_to_u32(((pm_block_node_t *)node)->locals.size);
236
- pm_buffer_append_varint(buffer, locals_size);
237
+ pm_buffer_append_varuint(buffer, locals_size);
237
238
  for (uint32_t index = 0; index < locals_size; index++) {
238
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_block_node_t *)node)->locals.ids[index]));
239
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_block_node_t *)node)->locals.ids[index]));
239
240
  }
241
+ pm_buffer_append_varuint(buffer, ((pm_block_node_t *)node)->locals_body_index);
240
242
  if (((pm_block_node_t *)node)->parameters == NULL) {
241
243
  pm_buffer_append_byte(buffer, 0);
242
244
  } else {
@@ -252,7 +254,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
252
254
  break;
253
255
  }
254
256
  case PM_BLOCK_PARAMETER_NODE: {
255
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_block_parameter_node_t *)node)->name));
257
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_block_parameter_node_t *)node)->name));
256
258
  if (((pm_block_parameter_node_t *)node)->name_loc.start == NULL) {
257
259
  pm_buffer_append_byte(buffer, 0);
258
260
  } else {
@@ -269,7 +271,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
269
271
  pm_serialize_node(parser, (pm_node_t *)((pm_block_parameters_node_t *)node)->parameters, buffer);
270
272
  }
271
273
  uint32_t locals_size = pm_sizet_to_u32(((pm_block_parameters_node_t *)node)->locals.size);
272
- pm_buffer_append_varint(buffer, locals_size);
274
+ pm_buffer_append_varuint(buffer, locals_size);
273
275
  for (uint32_t index = 0; index < locals_size; index++) {
274
276
  pm_serialize_node(parser, (pm_node_t *) ((pm_block_parameters_node_t *)node)->locals.nodes[index], buffer);
275
277
  }
@@ -297,6 +299,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
297
299
  break;
298
300
  }
299
301
  case PM_CALL_AND_WRITE_NODE: {
302
+ pm_buffer_append_varuint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
300
303
  if (((pm_call_and_write_node_t *)node)->receiver == NULL) {
301
304
  pm_buffer_append_byte(buffer, 0);
302
305
  } else {
@@ -314,14 +317,14 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
314
317
  pm_buffer_append_byte(buffer, 1);
315
318
  pm_serialize_location(parser, &((pm_call_and_write_node_t *)node)->message_loc, buffer);
316
319
  }
317
- pm_buffer_append_varint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
318
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_call_and_write_node_t *)node)->read_name));
319
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_call_and_write_node_t *)node)->write_name));
320
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_call_and_write_node_t *)node)->read_name));
321
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_call_and_write_node_t *)node)->write_name));
320
322
  pm_serialize_location(parser, &((pm_call_and_write_node_t *)node)->operator_loc, buffer);
321
323
  pm_serialize_node(parser, (pm_node_t *)((pm_call_and_write_node_t *)node)->value, buffer);
322
324
  break;
323
325
  }
324
326
  case PM_CALL_NODE: {
327
+ pm_buffer_append_varuint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
325
328
  if (((pm_call_node_t *)node)->receiver == NULL) {
326
329
  pm_buffer_append_byte(buffer, 0);
327
330
  } else {
@@ -333,6 +336,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
333
336
  pm_buffer_append_byte(buffer, 1);
334
337
  pm_serialize_location(parser, &((pm_call_node_t *)node)->call_operator_loc, buffer);
335
338
  }
339
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_call_node_t *)node)->name));
336
340
  if (((pm_call_node_t *)node)->message_loc.start == NULL) {
337
341
  pm_buffer_append_byte(buffer, 0);
338
342
  } else {
@@ -361,11 +365,10 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
361
365
  } else {
362
366
  pm_serialize_node(parser, (pm_node_t *)((pm_call_node_t *)node)->block, buffer);
363
367
  }
364
- pm_buffer_append_varint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
365
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_call_node_t *)node)->name));
366
368
  break;
367
369
  }
368
370
  case PM_CALL_OPERATOR_WRITE_NODE: {
371
+ pm_buffer_append_varuint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
369
372
  if (((pm_call_operator_write_node_t *)node)->receiver == NULL) {
370
373
  pm_buffer_append_byte(buffer, 0);
371
374
  } else {
@@ -383,15 +386,15 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
383
386
  pm_buffer_append_byte(buffer, 1);
384
387
  pm_serialize_location(parser, &((pm_call_operator_write_node_t *)node)->message_loc, buffer);
385
388
  }
386
- pm_buffer_append_varint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
387
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_call_operator_write_node_t *)node)->read_name));
388
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_call_operator_write_node_t *)node)->write_name));
389
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_call_operator_write_node_t *)node)->operator));
389
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_call_operator_write_node_t *)node)->read_name));
390
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_call_operator_write_node_t *)node)->write_name));
391
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_call_operator_write_node_t *)node)->operator));
390
392
  pm_serialize_location(parser, &((pm_call_operator_write_node_t *)node)->operator_loc, buffer);
391
393
  pm_serialize_node(parser, (pm_node_t *)((pm_call_operator_write_node_t *)node)->value, buffer);
392
394
  break;
393
395
  }
394
396
  case PM_CALL_OR_WRITE_NODE: {
397
+ pm_buffer_append_varuint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
395
398
  if (((pm_call_or_write_node_t *)node)->receiver == NULL) {
396
399
  pm_buffer_append_byte(buffer, 0);
397
400
  } else {
@@ -409,19 +412,46 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
409
412
  pm_buffer_append_byte(buffer, 1);
410
413
  pm_serialize_location(parser, &((pm_call_or_write_node_t *)node)->message_loc, buffer);
411
414
  }
412
- pm_buffer_append_varint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
413
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_call_or_write_node_t *)node)->read_name));
414
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_call_or_write_node_t *)node)->write_name));
415
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_call_or_write_node_t *)node)->read_name));
416
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_call_or_write_node_t *)node)->write_name));
415
417
  pm_serialize_location(parser, &((pm_call_or_write_node_t *)node)->operator_loc, buffer);
416
418
  pm_serialize_node(parser, (pm_node_t *)((pm_call_or_write_node_t *)node)->value, buffer);
417
419
  break;
418
420
  }
421
+ case PM_CALL_TARGET_NODE: {
422
+ pm_buffer_append_varuint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
423
+ pm_serialize_node(parser, (pm_node_t *)((pm_call_target_node_t *)node)->receiver, buffer);
424
+ pm_serialize_location(parser, &((pm_call_target_node_t *)node)->call_operator_loc, buffer);
425
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_call_target_node_t *)node)->name));
426
+ pm_serialize_location(parser, &((pm_call_target_node_t *)node)->message_loc, buffer);
427
+ break;
428
+ }
419
429
  case PM_CAPTURE_PATTERN_NODE: {
420
430
  pm_serialize_node(parser, (pm_node_t *)((pm_capture_pattern_node_t *)node)->value, buffer);
421
431
  pm_serialize_node(parser, (pm_node_t *)((pm_capture_pattern_node_t *)node)->target, buffer);
422
432
  pm_serialize_location(parser, &((pm_capture_pattern_node_t *)node)->operator_loc, buffer);
423
433
  break;
424
434
  }
435
+ case PM_CASE_MATCH_NODE: {
436
+ if (((pm_case_match_node_t *)node)->predicate == NULL) {
437
+ pm_buffer_append_byte(buffer, 0);
438
+ } else {
439
+ pm_serialize_node(parser, (pm_node_t *)((pm_case_match_node_t *)node)->predicate, buffer);
440
+ }
441
+ uint32_t conditions_size = pm_sizet_to_u32(((pm_case_match_node_t *)node)->conditions.size);
442
+ pm_buffer_append_varuint(buffer, conditions_size);
443
+ for (uint32_t index = 0; index < conditions_size; index++) {
444
+ pm_serialize_node(parser, (pm_node_t *) ((pm_case_match_node_t *)node)->conditions.nodes[index], buffer);
445
+ }
446
+ if (((pm_case_match_node_t *)node)->consequent == NULL) {
447
+ pm_buffer_append_byte(buffer, 0);
448
+ } else {
449
+ pm_serialize_node(parser, (pm_node_t *)((pm_case_match_node_t *)node)->consequent, buffer);
450
+ }
451
+ pm_serialize_location(parser, &((pm_case_match_node_t *)node)->case_keyword_loc, buffer);
452
+ pm_serialize_location(parser, &((pm_case_match_node_t *)node)->end_keyword_loc, buffer);
453
+ break;
454
+ }
425
455
  case PM_CASE_NODE: {
426
456
  if (((pm_case_node_t *)node)->predicate == NULL) {
427
457
  pm_buffer_append_byte(buffer, 0);
@@ -429,7 +459,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
429
459
  pm_serialize_node(parser, (pm_node_t *)((pm_case_node_t *)node)->predicate, buffer);
430
460
  }
431
461
  uint32_t conditions_size = pm_sizet_to_u32(((pm_case_node_t *)node)->conditions.size);
432
- pm_buffer_append_varint(buffer, conditions_size);
462
+ pm_buffer_append_varuint(buffer, conditions_size);
433
463
  for (uint32_t index = 0; index < conditions_size; index++) {
434
464
  pm_serialize_node(parser, (pm_node_t *) ((pm_case_node_t *)node)->conditions.nodes[index], buffer);
435
465
  }
@@ -444,9 +474,9 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
444
474
  }
445
475
  case PM_CLASS_NODE: {
446
476
  uint32_t locals_size = pm_sizet_to_u32(((pm_class_node_t *)node)->locals.size);
447
- pm_buffer_append_varint(buffer, locals_size);
477
+ pm_buffer_append_varuint(buffer, locals_size);
448
478
  for (uint32_t index = 0; index < locals_size; index++) {
449
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_class_node_t *)node)->locals.ids[index]));
479
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_class_node_t *)node)->locals.ids[index]));
450
480
  }
451
481
  pm_serialize_location(parser, &((pm_class_node_t *)node)->class_keyword_loc, buffer);
452
482
  pm_serialize_node(parser, (pm_node_t *)((pm_class_node_t *)node)->constant_path, buffer);
@@ -467,41 +497,41 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
467
497
  pm_serialize_node(parser, (pm_node_t *)((pm_class_node_t *)node)->body, buffer);
468
498
  }
469
499
  pm_serialize_location(parser, &((pm_class_node_t *)node)->end_keyword_loc, buffer);
470
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_class_node_t *)node)->name));
500
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_class_node_t *)node)->name));
471
501
  break;
472
502
  }
473
503
  case PM_CLASS_VARIABLE_AND_WRITE_NODE: {
474
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_class_variable_and_write_node_t *)node)->name));
504
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_class_variable_and_write_node_t *)node)->name));
475
505
  pm_serialize_location(parser, &((pm_class_variable_and_write_node_t *)node)->name_loc, buffer);
476
506
  pm_serialize_location(parser, &((pm_class_variable_and_write_node_t *)node)->operator_loc, buffer);
477
507
  pm_serialize_node(parser, (pm_node_t *)((pm_class_variable_and_write_node_t *)node)->value, buffer);
478
508
  break;
479
509
  }
480
510
  case PM_CLASS_VARIABLE_OPERATOR_WRITE_NODE: {
481
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_class_variable_operator_write_node_t *)node)->name));
511
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_class_variable_operator_write_node_t *)node)->name));
482
512
  pm_serialize_location(parser, &((pm_class_variable_operator_write_node_t *)node)->name_loc, buffer);
483
513
  pm_serialize_location(parser, &((pm_class_variable_operator_write_node_t *)node)->operator_loc, buffer);
484
514
  pm_serialize_node(parser, (pm_node_t *)((pm_class_variable_operator_write_node_t *)node)->value, buffer);
485
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_class_variable_operator_write_node_t *)node)->operator));
515
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_class_variable_operator_write_node_t *)node)->operator));
486
516
  break;
487
517
  }
488
518
  case PM_CLASS_VARIABLE_OR_WRITE_NODE: {
489
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_class_variable_or_write_node_t *)node)->name));
519
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_class_variable_or_write_node_t *)node)->name));
490
520
  pm_serialize_location(parser, &((pm_class_variable_or_write_node_t *)node)->name_loc, buffer);
491
521
  pm_serialize_location(parser, &((pm_class_variable_or_write_node_t *)node)->operator_loc, buffer);
492
522
  pm_serialize_node(parser, (pm_node_t *)((pm_class_variable_or_write_node_t *)node)->value, buffer);
493
523
  break;
494
524
  }
495
525
  case PM_CLASS_VARIABLE_READ_NODE: {
496
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_class_variable_read_node_t *)node)->name));
526
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_class_variable_read_node_t *)node)->name));
497
527
  break;
498
528
  }
499
529
  case PM_CLASS_VARIABLE_TARGET_NODE: {
500
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_class_variable_target_node_t *)node)->name));
530
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_class_variable_target_node_t *)node)->name));
501
531
  break;
502
532
  }
503
533
  case PM_CLASS_VARIABLE_WRITE_NODE: {
504
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_class_variable_write_node_t *)node)->name));
534
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_class_variable_write_node_t *)node)->name));
505
535
  pm_serialize_location(parser, &((pm_class_variable_write_node_t *)node)->name_loc, buffer);
506
536
  pm_serialize_node(parser, (pm_node_t *)((pm_class_variable_write_node_t *)node)->value, buffer);
507
537
  if (((pm_class_variable_write_node_t *)node)->operator_loc.start == NULL) {
@@ -513,22 +543,22 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
513
543
  break;
514
544
  }
515
545
  case PM_CONSTANT_AND_WRITE_NODE: {
516
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_constant_and_write_node_t *)node)->name));
546
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_constant_and_write_node_t *)node)->name));
517
547
  pm_serialize_location(parser, &((pm_constant_and_write_node_t *)node)->name_loc, buffer);
518
548
  pm_serialize_location(parser, &((pm_constant_and_write_node_t *)node)->operator_loc, buffer);
519
549
  pm_serialize_node(parser, (pm_node_t *)((pm_constant_and_write_node_t *)node)->value, buffer);
520
550
  break;
521
551
  }
522
552
  case PM_CONSTANT_OPERATOR_WRITE_NODE: {
523
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_constant_operator_write_node_t *)node)->name));
553
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_constant_operator_write_node_t *)node)->name));
524
554
  pm_serialize_location(parser, &((pm_constant_operator_write_node_t *)node)->name_loc, buffer);
525
555
  pm_serialize_location(parser, &((pm_constant_operator_write_node_t *)node)->operator_loc, buffer);
526
556
  pm_serialize_node(parser, (pm_node_t *)((pm_constant_operator_write_node_t *)node)->value, buffer);
527
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_constant_operator_write_node_t *)node)->operator));
557
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_constant_operator_write_node_t *)node)->operator));
528
558
  break;
529
559
  }
530
560
  case PM_CONSTANT_OR_WRITE_NODE: {
531
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_constant_or_write_node_t *)node)->name));
561
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_constant_or_write_node_t *)node)->name));
532
562
  pm_serialize_location(parser, &((pm_constant_or_write_node_t *)node)->name_loc, buffer);
533
563
  pm_serialize_location(parser, &((pm_constant_or_write_node_t *)node)->operator_loc, buffer);
534
564
  pm_serialize_node(parser, (pm_node_t *)((pm_constant_or_write_node_t *)node)->value, buffer);
@@ -554,7 +584,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
554
584
  pm_serialize_node(parser, (pm_node_t *)((pm_constant_path_operator_write_node_t *)node)->target, buffer);
555
585
  pm_serialize_location(parser, &((pm_constant_path_operator_write_node_t *)node)->operator_loc, buffer);
556
586
  pm_serialize_node(parser, (pm_node_t *)((pm_constant_path_operator_write_node_t *)node)->value, buffer);
557
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_constant_path_operator_write_node_t *)node)->operator));
587
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_constant_path_operator_write_node_t *)node)->operator));
558
588
  break;
559
589
  }
560
590
  case PM_CONSTANT_PATH_OR_WRITE_NODE: {
@@ -580,15 +610,15 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
580
610
  break;
581
611
  }
582
612
  case PM_CONSTANT_READ_NODE: {
583
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_constant_read_node_t *)node)->name));
613
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_constant_read_node_t *)node)->name));
584
614
  break;
585
615
  }
586
616
  case PM_CONSTANT_TARGET_NODE: {
587
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_constant_target_node_t *)node)->name));
617
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_constant_target_node_t *)node)->name));
588
618
  break;
589
619
  }
590
620
  case PM_CONSTANT_WRITE_NODE: {
591
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_constant_write_node_t *)node)->name));
621
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_constant_write_node_t *)node)->name));
592
622
  pm_serialize_location(parser, &((pm_constant_write_node_t *)node)->name_loc, buffer);
593
623
  pm_serialize_node(parser, (pm_node_t *)((pm_constant_write_node_t *)node)->value, buffer);
594
624
  pm_serialize_location(parser, &((pm_constant_write_node_t *)node)->operator_loc, buffer);
@@ -599,7 +629,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
599
629
  // encoding of location u32s make us need to save this offset.
600
630
  size_t length_offset = buffer->length;
601
631
  pm_buffer_append_string(buffer, "\0\0\0\0", 4); /* consume 4 bytes, updated below */
602
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_def_node_t *)node)->name));
632
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_def_node_t *)node)->name));
603
633
  pm_serialize_location(parser, &((pm_def_node_t *)node)->name_loc, buffer);
604
634
  if (((pm_def_node_t *)node)->receiver == NULL) {
605
635
  pm_buffer_append_byte(buffer, 0);
@@ -617,10 +647,11 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
617
647
  pm_serialize_node(parser, (pm_node_t *)((pm_def_node_t *)node)->body, buffer);
618
648
  }
619
649
  uint32_t locals_size = pm_sizet_to_u32(((pm_def_node_t *)node)->locals.size);
620
- pm_buffer_append_varint(buffer, locals_size);
650
+ pm_buffer_append_varuint(buffer, locals_size);
621
651
  for (uint32_t index = 0; index < locals_size; index++) {
622
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_def_node_t *)node)->locals.ids[index]));
652
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_def_node_t *)node)->locals.ids[index]));
623
653
  }
654
+ pm_buffer_append_varuint(buffer, ((pm_def_node_t *)node)->locals_body_index);
624
655
  pm_serialize_location(parser, &((pm_def_node_t *)node)->def_keyword_loc, buffer);
625
656
  if (((pm_def_node_t *)node)->operator_loc.start == NULL) {
626
657
  pm_buffer_append_byte(buffer, 0);
@@ -725,7 +756,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
725
756
  }
726
757
  pm_serialize_node(parser, (pm_node_t *)((pm_find_pattern_node_t *)node)->left, buffer);
727
758
  uint32_t requireds_size = pm_sizet_to_u32(((pm_find_pattern_node_t *)node)->requireds.size);
728
- pm_buffer_append_varint(buffer, requireds_size);
759
+ pm_buffer_append_varuint(buffer, requireds_size);
729
760
  for (uint32_t index = 0; index < requireds_size; index++) {
730
761
  pm_serialize_node(parser, (pm_node_t *) ((pm_find_pattern_node_t *)node)->requireds.nodes[index], buffer);
731
762
  }
@@ -745,6 +776,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
745
776
  break;
746
777
  }
747
778
  case PM_FLIP_FLOP_NODE: {
779
+ pm_buffer_append_varuint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
748
780
  if (((pm_flip_flop_node_t *)node)->left == NULL) {
749
781
  pm_buffer_append_byte(buffer, 0);
750
782
  } else {
@@ -756,7 +788,6 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
756
788
  pm_serialize_node(parser, (pm_node_t *)((pm_flip_flop_node_t *)node)->right, buffer);
757
789
  }
758
790
  pm_serialize_location(parser, &((pm_flip_flop_node_t *)node)->operator_loc, buffer);
759
- pm_buffer_append_varint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
760
791
  break;
761
792
  }
762
793
  case PM_FLOAT_NODE: {
@@ -796,37 +827,37 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
796
827
  break;
797
828
  }
798
829
  case PM_GLOBAL_VARIABLE_AND_WRITE_NODE: {
799
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_global_variable_and_write_node_t *)node)->name));
830
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_global_variable_and_write_node_t *)node)->name));
800
831
  pm_serialize_location(parser, &((pm_global_variable_and_write_node_t *)node)->name_loc, buffer);
801
832
  pm_serialize_location(parser, &((pm_global_variable_and_write_node_t *)node)->operator_loc, buffer);
802
833
  pm_serialize_node(parser, (pm_node_t *)((pm_global_variable_and_write_node_t *)node)->value, buffer);
803
834
  break;
804
835
  }
805
836
  case PM_GLOBAL_VARIABLE_OPERATOR_WRITE_NODE: {
806
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_global_variable_operator_write_node_t *)node)->name));
837
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_global_variable_operator_write_node_t *)node)->name));
807
838
  pm_serialize_location(parser, &((pm_global_variable_operator_write_node_t *)node)->name_loc, buffer);
808
839
  pm_serialize_location(parser, &((pm_global_variable_operator_write_node_t *)node)->operator_loc, buffer);
809
840
  pm_serialize_node(parser, (pm_node_t *)((pm_global_variable_operator_write_node_t *)node)->value, buffer);
810
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_global_variable_operator_write_node_t *)node)->operator));
841
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_global_variable_operator_write_node_t *)node)->operator));
811
842
  break;
812
843
  }
813
844
  case PM_GLOBAL_VARIABLE_OR_WRITE_NODE: {
814
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_global_variable_or_write_node_t *)node)->name));
845
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_global_variable_or_write_node_t *)node)->name));
815
846
  pm_serialize_location(parser, &((pm_global_variable_or_write_node_t *)node)->name_loc, buffer);
816
847
  pm_serialize_location(parser, &((pm_global_variable_or_write_node_t *)node)->operator_loc, buffer);
817
848
  pm_serialize_node(parser, (pm_node_t *)((pm_global_variable_or_write_node_t *)node)->value, buffer);
818
849
  break;
819
850
  }
820
851
  case PM_GLOBAL_VARIABLE_READ_NODE: {
821
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_global_variable_read_node_t *)node)->name));
852
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_global_variable_read_node_t *)node)->name));
822
853
  break;
823
854
  }
824
855
  case PM_GLOBAL_VARIABLE_TARGET_NODE: {
825
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_global_variable_target_node_t *)node)->name));
856
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_global_variable_target_node_t *)node)->name));
826
857
  break;
827
858
  }
828
859
  case PM_GLOBAL_VARIABLE_WRITE_NODE: {
829
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_global_variable_write_node_t *)node)->name));
860
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_global_variable_write_node_t *)node)->name));
830
861
  pm_serialize_location(parser, &((pm_global_variable_write_node_t *)node)->name_loc, buffer);
831
862
  pm_serialize_node(parser, (pm_node_t *)((pm_global_variable_write_node_t *)node)->value, buffer);
832
863
  pm_serialize_location(parser, &((pm_global_variable_write_node_t *)node)->operator_loc, buffer);
@@ -835,7 +866,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
835
866
  case PM_HASH_NODE: {
836
867
  pm_serialize_location(parser, &((pm_hash_node_t *)node)->opening_loc, buffer);
837
868
  uint32_t elements_size = pm_sizet_to_u32(((pm_hash_node_t *)node)->elements.size);
838
- pm_buffer_append_varint(buffer, elements_size);
869
+ pm_buffer_append_varuint(buffer, elements_size);
839
870
  for (uint32_t index = 0; index < elements_size; index++) {
840
871
  pm_serialize_node(parser, (pm_node_t *) ((pm_hash_node_t *)node)->elements.nodes[index], buffer);
841
872
  }
@@ -849,7 +880,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
849
880
  pm_serialize_node(parser, (pm_node_t *)((pm_hash_pattern_node_t *)node)->constant, buffer);
850
881
  }
851
882
  uint32_t elements_size = pm_sizet_to_u32(((pm_hash_pattern_node_t *)node)->elements.size);
852
- pm_buffer_append_varint(buffer, elements_size);
883
+ pm_buffer_append_varuint(buffer, elements_size);
853
884
  for (uint32_t index = 0; index < elements_size; index++) {
854
885
  pm_serialize_node(parser, (pm_node_t *) ((pm_hash_pattern_node_t *)node)->elements.nodes[index], buffer);
855
886
  }
@@ -880,6 +911,12 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
880
911
  pm_serialize_location(parser, &((pm_if_node_t *)node)->if_keyword_loc, buffer);
881
912
  }
882
913
  pm_serialize_node(parser, (pm_node_t *)((pm_if_node_t *)node)->predicate, buffer);
914
+ if (((pm_if_node_t *)node)->then_keyword_loc.start == NULL) {
915
+ pm_buffer_append_byte(buffer, 0);
916
+ } else {
917
+ pm_buffer_append_byte(buffer, 1);
918
+ pm_serialize_location(parser, &((pm_if_node_t *)node)->then_keyword_loc, buffer);
919
+ }
883
920
  if (((pm_if_node_t *)node)->statements == NULL) {
884
921
  pm_buffer_append_byte(buffer, 0);
885
922
  } else {
@@ -906,6 +943,9 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
906
943
  pm_serialize_node(parser, (pm_node_t *)((pm_implicit_node_t *)node)->value, buffer);
907
944
  break;
908
945
  }
946
+ case PM_IMPLICIT_REST_NODE: {
947
+ break;
948
+ }
909
949
  case PM_IN_NODE: {
910
950
  pm_serialize_node(parser, (pm_node_t *)((pm_in_node_t *)node)->pattern, buffer);
911
951
  if (((pm_in_node_t *)node)->statements == NULL) {
@@ -923,6 +963,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
923
963
  break;
924
964
  }
925
965
  case PM_INDEX_AND_WRITE_NODE: {
966
+ pm_buffer_append_varuint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
926
967
  if (((pm_index_and_write_node_t *)node)->receiver == NULL) {
927
968
  pm_buffer_append_byte(buffer, 0);
928
969
  } else {
@@ -946,12 +987,12 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
946
987
  } else {
947
988
  pm_serialize_node(parser, (pm_node_t *)((pm_index_and_write_node_t *)node)->block, buffer);
948
989
  }
949
- pm_buffer_append_varint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
950
990
  pm_serialize_location(parser, &((pm_index_and_write_node_t *)node)->operator_loc, buffer);
951
991
  pm_serialize_node(parser, (pm_node_t *)((pm_index_and_write_node_t *)node)->value, buffer);
952
992
  break;
953
993
  }
954
994
  case PM_INDEX_OPERATOR_WRITE_NODE: {
995
+ pm_buffer_append_varuint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
955
996
  if (((pm_index_operator_write_node_t *)node)->receiver == NULL) {
956
997
  pm_buffer_append_byte(buffer, 0);
957
998
  } else {
@@ -975,13 +1016,13 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
975
1016
  } else {
976
1017
  pm_serialize_node(parser, (pm_node_t *)((pm_index_operator_write_node_t *)node)->block, buffer);
977
1018
  }
978
- pm_buffer_append_varint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
979
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_index_operator_write_node_t *)node)->operator));
1019
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_index_operator_write_node_t *)node)->operator));
980
1020
  pm_serialize_location(parser, &((pm_index_operator_write_node_t *)node)->operator_loc, buffer);
981
1021
  pm_serialize_node(parser, (pm_node_t *)((pm_index_operator_write_node_t *)node)->value, buffer);
982
1022
  break;
983
1023
  }
984
1024
  case PM_INDEX_OR_WRITE_NODE: {
1025
+ pm_buffer_append_varuint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
985
1026
  if (((pm_index_or_write_node_t *)node)->receiver == NULL) {
986
1027
  pm_buffer_append_byte(buffer, 0);
987
1028
  } else {
@@ -1005,72 +1046,88 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1005
1046
  } else {
1006
1047
  pm_serialize_node(parser, (pm_node_t *)((pm_index_or_write_node_t *)node)->block, buffer);
1007
1048
  }
1008
- pm_buffer_append_varint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1009
1049
  pm_serialize_location(parser, &((pm_index_or_write_node_t *)node)->operator_loc, buffer);
1010
1050
  pm_serialize_node(parser, (pm_node_t *)((pm_index_or_write_node_t *)node)->value, buffer);
1011
1051
  break;
1012
1052
  }
1053
+ case PM_INDEX_TARGET_NODE: {
1054
+ pm_buffer_append_varuint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1055
+ pm_serialize_node(parser, (pm_node_t *)((pm_index_target_node_t *)node)->receiver, buffer);
1056
+ pm_serialize_location(parser, &((pm_index_target_node_t *)node)->opening_loc, buffer);
1057
+ if (((pm_index_target_node_t *)node)->arguments == NULL) {
1058
+ pm_buffer_append_byte(buffer, 0);
1059
+ } else {
1060
+ pm_serialize_node(parser, (pm_node_t *)((pm_index_target_node_t *)node)->arguments, buffer);
1061
+ }
1062
+ pm_serialize_location(parser, &((pm_index_target_node_t *)node)->closing_loc, buffer);
1063
+ if (((pm_index_target_node_t *)node)->block == NULL) {
1064
+ pm_buffer_append_byte(buffer, 0);
1065
+ } else {
1066
+ pm_serialize_node(parser, (pm_node_t *)((pm_index_target_node_t *)node)->block, buffer);
1067
+ }
1068
+ break;
1069
+ }
1013
1070
  case PM_INSTANCE_VARIABLE_AND_WRITE_NODE: {
1014
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_instance_variable_and_write_node_t *)node)->name));
1071
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_instance_variable_and_write_node_t *)node)->name));
1015
1072
  pm_serialize_location(parser, &((pm_instance_variable_and_write_node_t *)node)->name_loc, buffer);
1016
1073
  pm_serialize_location(parser, &((pm_instance_variable_and_write_node_t *)node)->operator_loc, buffer);
1017
1074
  pm_serialize_node(parser, (pm_node_t *)((pm_instance_variable_and_write_node_t *)node)->value, buffer);
1018
1075
  break;
1019
1076
  }
1020
1077
  case PM_INSTANCE_VARIABLE_OPERATOR_WRITE_NODE: {
1021
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_instance_variable_operator_write_node_t *)node)->name));
1078
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_instance_variable_operator_write_node_t *)node)->name));
1022
1079
  pm_serialize_location(parser, &((pm_instance_variable_operator_write_node_t *)node)->name_loc, buffer);
1023
1080
  pm_serialize_location(parser, &((pm_instance_variable_operator_write_node_t *)node)->operator_loc, buffer);
1024
1081
  pm_serialize_node(parser, (pm_node_t *)((pm_instance_variable_operator_write_node_t *)node)->value, buffer);
1025
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_instance_variable_operator_write_node_t *)node)->operator));
1082
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_instance_variable_operator_write_node_t *)node)->operator));
1026
1083
  break;
1027
1084
  }
1028
1085
  case PM_INSTANCE_VARIABLE_OR_WRITE_NODE: {
1029
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_instance_variable_or_write_node_t *)node)->name));
1086
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_instance_variable_or_write_node_t *)node)->name));
1030
1087
  pm_serialize_location(parser, &((pm_instance_variable_or_write_node_t *)node)->name_loc, buffer);
1031
1088
  pm_serialize_location(parser, &((pm_instance_variable_or_write_node_t *)node)->operator_loc, buffer);
1032
1089
  pm_serialize_node(parser, (pm_node_t *)((pm_instance_variable_or_write_node_t *)node)->value, buffer);
1033
1090
  break;
1034
1091
  }
1035
1092
  case PM_INSTANCE_VARIABLE_READ_NODE: {
1036
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_instance_variable_read_node_t *)node)->name));
1093
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_instance_variable_read_node_t *)node)->name));
1037
1094
  break;
1038
1095
  }
1039
1096
  case PM_INSTANCE_VARIABLE_TARGET_NODE: {
1040
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_instance_variable_target_node_t *)node)->name));
1097
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_instance_variable_target_node_t *)node)->name));
1041
1098
  break;
1042
1099
  }
1043
1100
  case PM_INSTANCE_VARIABLE_WRITE_NODE: {
1044
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_instance_variable_write_node_t *)node)->name));
1101
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_instance_variable_write_node_t *)node)->name));
1045
1102
  pm_serialize_location(parser, &((pm_instance_variable_write_node_t *)node)->name_loc, buffer);
1046
1103
  pm_serialize_node(parser, (pm_node_t *)((pm_instance_variable_write_node_t *)node)->value, buffer);
1047
1104
  pm_serialize_location(parser, &((pm_instance_variable_write_node_t *)node)->operator_loc, buffer);
1048
1105
  break;
1049
1106
  }
1050
1107
  case PM_INTEGER_NODE: {
1051
- pm_buffer_append_varint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1108
+ pm_buffer_append_varuint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1052
1109
  break;
1053
1110
  }
1054
1111
  case PM_INTERPOLATED_MATCH_LAST_LINE_NODE: {
1112
+ pm_buffer_append_varuint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1055
1113
  pm_serialize_location(parser, &((pm_interpolated_match_last_line_node_t *)node)->opening_loc, buffer);
1056
1114
  uint32_t parts_size = pm_sizet_to_u32(((pm_interpolated_match_last_line_node_t *)node)->parts.size);
1057
- pm_buffer_append_varint(buffer, parts_size);
1115
+ pm_buffer_append_varuint(buffer, parts_size);
1058
1116
  for (uint32_t index = 0; index < parts_size; index++) {
1059
1117
  pm_serialize_node(parser, (pm_node_t *) ((pm_interpolated_match_last_line_node_t *)node)->parts.nodes[index], buffer);
1060
1118
  }
1061
1119
  pm_serialize_location(parser, &((pm_interpolated_match_last_line_node_t *)node)->closing_loc, buffer);
1062
- pm_buffer_append_varint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1063
1120
  break;
1064
1121
  }
1065
1122
  case PM_INTERPOLATED_REGULAR_EXPRESSION_NODE: {
1123
+ pm_buffer_append_varuint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1066
1124
  pm_serialize_location(parser, &((pm_interpolated_regular_expression_node_t *)node)->opening_loc, buffer);
1067
1125
  uint32_t parts_size = pm_sizet_to_u32(((pm_interpolated_regular_expression_node_t *)node)->parts.size);
1068
- pm_buffer_append_varint(buffer, parts_size);
1126
+ pm_buffer_append_varuint(buffer, parts_size);
1069
1127
  for (uint32_t index = 0; index < parts_size; index++) {
1070
1128
  pm_serialize_node(parser, (pm_node_t *) ((pm_interpolated_regular_expression_node_t *)node)->parts.nodes[index], buffer);
1071
1129
  }
1072
1130
  pm_serialize_location(parser, &((pm_interpolated_regular_expression_node_t *)node)->closing_loc, buffer);
1073
- pm_buffer_append_varint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1074
1131
  break;
1075
1132
  }
1076
1133
  case PM_INTERPOLATED_STRING_NODE: {
@@ -1081,7 +1138,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1081
1138
  pm_serialize_location(parser, &((pm_interpolated_string_node_t *)node)->opening_loc, buffer);
1082
1139
  }
1083
1140
  uint32_t parts_size = pm_sizet_to_u32(((pm_interpolated_string_node_t *)node)->parts.size);
1084
- pm_buffer_append_varint(buffer, parts_size);
1141
+ pm_buffer_append_varuint(buffer, parts_size);
1085
1142
  for (uint32_t index = 0; index < parts_size; index++) {
1086
1143
  pm_serialize_node(parser, (pm_node_t *) ((pm_interpolated_string_node_t *)node)->parts.nodes[index], buffer);
1087
1144
  }
@@ -1101,7 +1158,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1101
1158
  pm_serialize_location(parser, &((pm_interpolated_symbol_node_t *)node)->opening_loc, buffer);
1102
1159
  }
1103
1160
  uint32_t parts_size = pm_sizet_to_u32(((pm_interpolated_symbol_node_t *)node)->parts.size);
1104
- pm_buffer_append_varint(buffer, parts_size);
1161
+ pm_buffer_append_varuint(buffer, parts_size);
1105
1162
  for (uint32_t index = 0; index < parts_size; index++) {
1106
1163
  pm_serialize_node(parser, (pm_node_t *) ((pm_interpolated_symbol_node_t *)node)->parts.nodes[index], buffer);
1107
1164
  }
@@ -1116,7 +1173,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1116
1173
  case PM_INTERPOLATED_X_STRING_NODE: {
1117
1174
  pm_serialize_location(parser, &((pm_interpolated_x_string_node_t *)node)->opening_loc, buffer);
1118
1175
  uint32_t parts_size = pm_sizet_to_u32(((pm_interpolated_x_string_node_t *)node)->parts.size);
1119
- pm_buffer_append_varint(buffer, parts_size);
1176
+ pm_buffer_append_varuint(buffer, parts_size);
1120
1177
  for (uint32_t index = 0; index < parts_size; index++) {
1121
1178
  pm_serialize_node(parser, (pm_node_t *) ((pm_interpolated_x_string_node_t *)node)->parts.nodes[index], buffer);
1122
1179
  }
@@ -1124,15 +1181,16 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1124
1181
  break;
1125
1182
  }
1126
1183
  case PM_KEYWORD_HASH_NODE: {
1184
+ pm_buffer_append_varuint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1127
1185
  uint32_t elements_size = pm_sizet_to_u32(((pm_keyword_hash_node_t *)node)->elements.size);
1128
- pm_buffer_append_varint(buffer, elements_size);
1186
+ pm_buffer_append_varuint(buffer, elements_size);
1129
1187
  for (uint32_t index = 0; index < elements_size; index++) {
1130
1188
  pm_serialize_node(parser, (pm_node_t *) ((pm_keyword_hash_node_t *)node)->elements.nodes[index], buffer);
1131
1189
  }
1132
1190
  break;
1133
1191
  }
1134
1192
  case PM_KEYWORD_REST_PARAMETER_NODE: {
1135
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_keyword_rest_parameter_node_t *)node)->name));
1193
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_keyword_rest_parameter_node_t *)node)->name));
1136
1194
  if (((pm_keyword_rest_parameter_node_t *)node)->name_loc.start == NULL) {
1137
1195
  pm_buffer_append_byte(buffer, 0);
1138
1196
  } else {
@@ -1144,10 +1202,11 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1144
1202
  }
1145
1203
  case PM_LAMBDA_NODE: {
1146
1204
  uint32_t locals_size = pm_sizet_to_u32(((pm_lambda_node_t *)node)->locals.size);
1147
- pm_buffer_append_varint(buffer, locals_size);
1205
+ pm_buffer_append_varuint(buffer, locals_size);
1148
1206
  for (uint32_t index = 0; index < locals_size; index++) {
1149
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_lambda_node_t *)node)->locals.ids[index]));
1207
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_lambda_node_t *)node)->locals.ids[index]));
1150
1208
  }
1209
+ pm_buffer_append_varuint(buffer, ((pm_lambda_node_t *)node)->locals_body_index);
1151
1210
  pm_serialize_location(parser, &((pm_lambda_node_t *)node)->operator_loc, buffer);
1152
1211
  pm_serialize_location(parser, &((pm_lambda_node_t *)node)->opening_loc, buffer);
1153
1212
  pm_serialize_location(parser, &((pm_lambda_node_t *)node)->closing_loc, buffer);
@@ -1167,51 +1226,51 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1167
1226
  pm_serialize_location(parser, &((pm_local_variable_and_write_node_t *)node)->name_loc, buffer);
1168
1227
  pm_serialize_location(parser, &((pm_local_variable_and_write_node_t *)node)->operator_loc, buffer);
1169
1228
  pm_serialize_node(parser, (pm_node_t *)((pm_local_variable_and_write_node_t *)node)->value, buffer);
1170
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_local_variable_and_write_node_t *)node)->name));
1171
- pm_buffer_append_varint(buffer, ((pm_local_variable_and_write_node_t *)node)->depth);
1229
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_local_variable_and_write_node_t *)node)->name));
1230
+ pm_buffer_append_varuint(buffer, ((pm_local_variable_and_write_node_t *)node)->depth);
1172
1231
  break;
1173
1232
  }
1174
1233
  case PM_LOCAL_VARIABLE_OPERATOR_WRITE_NODE: {
1175
1234
  pm_serialize_location(parser, &((pm_local_variable_operator_write_node_t *)node)->name_loc, buffer);
1176
1235
  pm_serialize_location(parser, &((pm_local_variable_operator_write_node_t *)node)->operator_loc, buffer);
1177
1236
  pm_serialize_node(parser, (pm_node_t *)((pm_local_variable_operator_write_node_t *)node)->value, buffer);
1178
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_local_variable_operator_write_node_t *)node)->name));
1179
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_local_variable_operator_write_node_t *)node)->operator));
1180
- pm_buffer_append_varint(buffer, ((pm_local_variable_operator_write_node_t *)node)->depth);
1237
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_local_variable_operator_write_node_t *)node)->name));
1238
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_local_variable_operator_write_node_t *)node)->operator));
1239
+ pm_buffer_append_varuint(buffer, ((pm_local_variable_operator_write_node_t *)node)->depth);
1181
1240
  break;
1182
1241
  }
1183
1242
  case PM_LOCAL_VARIABLE_OR_WRITE_NODE: {
1184
1243
  pm_serialize_location(parser, &((pm_local_variable_or_write_node_t *)node)->name_loc, buffer);
1185
1244
  pm_serialize_location(parser, &((pm_local_variable_or_write_node_t *)node)->operator_loc, buffer);
1186
1245
  pm_serialize_node(parser, (pm_node_t *)((pm_local_variable_or_write_node_t *)node)->value, buffer);
1187
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_local_variable_or_write_node_t *)node)->name));
1188
- pm_buffer_append_varint(buffer, ((pm_local_variable_or_write_node_t *)node)->depth);
1246
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_local_variable_or_write_node_t *)node)->name));
1247
+ pm_buffer_append_varuint(buffer, ((pm_local_variable_or_write_node_t *)node)->depth);
1189
1248
  break;
1190
1249
  }
1191
1250
  case PM_LOCAL_VARIABLE_READ_NODE: {
1192
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_local_variable_read_node_t *)node)->name));
1193
- pm_buffer_append_varint(buffer, ((pm_local_variable_read_node_t *)node)->depth);
1251
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_local_variable_read_node_t *)node)->name));
1252
+ pm_buffer_append_varuint(buffer, ((pm_local_variable_read_node_t *)node)->depth);
1194
1253
  break;
1195
1254
  }
1196
1255
  case PM_LOCAL_VARIABLE_TARGET_NODE: {
1197
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_local_variable_target_node_t *)node)->name));
1198
- pm_buffer_append_varint(buffer, ((pm_local_variable_target_node_t *)node)->depth);
1256
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_local_variable_target_node_t *)node)->name));
1257
+ pm_buffer_append_varuint(buffer, ((pm_local_variable_target_node_t *)node)->depth);
1199
1258
  break;
1200
1259
  }
1201
1260
  case PM_LOCAL_VARIABLE_WRITE_NODE: {
1202
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_local_variable_write_node_t *)node)->name));
1203
- pm_buffer_append_varint(buffer, ((pm_local_variable_write_node_t *)node)->depth);
1261
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_local_variable_write_node_t *)node)->name));
1262
+ pm_buffer_append_varuint(buffer, ((pm_local_variable_write_node_t *)node)->depth);
1204
1263
  pm_serialize_location(parser, &((pm_local_variable_write_node_t *)node)->name_loc, buffer);
1205
1264
  pm_serialize_node(parser, (pm_node_t *)((pm_local_variable_write_node_t *)node)->value, buffer);
1206
1265
  pm_serialize_location(parser, &((pm_local_variable_write_node_t *)node)->operator_loc, buffer);
1207
1266
  break;
1208
1267
  }
1209
1268
  case PM_MATCH_LAST_LINE_NODE: {
1269
+ pm_buffer_append_varuint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1210
1270
  pm_serialize_location(parser, &((pm_match_last_line_node_t *)node)->opening_loc, buffer);
1211
1271
  pm_serialize_location(parser, &((pm_match_last_line_node_t *)node)->content_loc, buffer);
1212
1272
  pm_serialize_location(parser, &((pm_match_last_line_node_t *)node)->closing_loc, buffer);
1213
1273
  pm_serialize_string(parser, &((pm_match_last_line_node_t *)node)->unescaped, buffer);
1214
- pm_buffer_append_varint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1215
1274
  break;
1216
1275
  }
1217
1276
  case PM_MATCH_PREDICATE_NODE: {
@@ -1228,10 +1287,10 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1228
1287
  }
1229
1288
  case PM_MATCH_WRITE_NODE: {
1230
1289
  pm_serialize_node(parser, (pm_node_t *)((pm_match_write_node_t *)node)->call, buffer);
1231
- uint32_t locals_size = pm_sizet_to_u32(((pm_match_write_node_t *)node)->locals.size);
1232
- pm_buffer_append_varint(buffer, locals_size);
1233
- for (uint32_t index = 0; index < locals_size; index++) {
1234
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_match_write_node_t *)node)->locals.ids[index]));
1290
+ uint32_t targets_size = pm_sizet_to_u32(((pm_match_write_node_t *)node)->targets.size);
1291
+ pm_buffer_append_varuint(buffer, targets_size);
1292
+ for (uint32_t index = 0; index < targets_size; index++) {
1293
+ pm_serialize_node(parser, (pm_node_t *) ((pm_match_write_node_t *)node)->targets.nodes[index], buffer);
1235
1294
  }
1236
1295
  break;
1237
1296
  }
@@ -1240,9 +1299,9 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1240
1299
  }
1241
1300
  case PM_MODULE_NODE: {
1242
1301
  uint32_t locals_size = pm_sizet_to_u32(((pm_module_node_t *)node)->locals.size);
1243
- pm_buffer_append_varint(buffer, locals_size);
1302
+ pm_buffer_append_varuint(buffer, locals_size);
1244
1303
  for (uint32_t index = 0; index < locals_size; index++) {
1245
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_module_node_t *)node)->locals.ids[index]));
1304
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_module_node_t *)node)->locals.ids[index]));
1246
1305
  }
1247
1306
  pm_serialize_location(parser, &((pm_module_node_t *)node)->module_keyword_loc, buffer);
1248
1307
  pm_serialize_node(parser, (pm_node_t *)((pm_module_node_t *)node)->constant_path, buffer);
@@ -1252,12 +1311,12 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1252
1311
  pm_serialize_node(parser, (pm_node_t *)((pm_module_node_t *)node)->body, buffer);
1253
1312
  }
1254
1313
  pm_serialize_location(parser, &((pm_module_node_t *)node)->end_keyword_loc, buffer);
1255
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_module_node_t *)node)->name));
1314
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_module_node_t *)node)->name));
1256
1315
  break;
1257
1316
  }
1258
1317
  case PM_MULTI_TARGET_NODE: {
1259
1318
  uint32_t lefts_size = pm_sizet_to_u32(((pm_multi_target_node_t *)node)->lefts.size);
1260
- pm_buffer_append_varint(buffer, lefts_size);
1319
+ pm_buffer_append_varuint(buffer, lefts_size);
1261
1320
  for (uint32_t index = 0; index < lefts_size; index++) {
1262
1321
  pm_serialize_node(parser, (pm_node_t *) ((pm_multi_target_node_t *)node)->lefts.nodes[index], buffer);
1263
1322
  }
@@ -1267,7 +1326,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1267
1326
  pm_serialize_node(parser, (pm_node_t *)((pm_multi_target_node_t *)node)->rest, buffer);
1268
1327
  }
1269
1328
  uint32_t rights_size = pm_sizet_to_u32(((pm_multi_target_node_t *)node)->rights.size);
1270
- pm_buffer_append_varint(buffer, rights_size);
1329
+ pm_buffer_append_varuint(buffer, rights_size);
1271
1330
  for (uint32_t index = 0; index < rights_size; index++) {
1272
1331
  pm_serialize_node(parser, (pm_node_t *) ((pm_multi_target_node_t *)node)->rights.nodes[index], buffer);
1273
1332
  }
@@ -1287,7 +1346,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1287
1346
  }
1288
1347
  case PM_MULTI_WRITE_NODE: {
1289
1348
  uint32_t lefts_size = pm_sizet_to_u32(((pm_multi_write_node_t *)node)->lefts.size);
1290
- pm_buffer_append_varint(buffer, lefts_size);
1349
+ pm_buffer_append_varuint(buffer, lefts_size);
1291
1350
  for (uint32_t index = 0; index < lefts_size; index++) {
1292
1351
  pm_serialize_node(parser, (pm_node_t *) ((pm_multi_write_node_t *)node)->lefts.nodes[index], buffer);
1293
1352
  }
@@ -1297,7 +1356,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1297
1356
  pm_serialize_node(parser, (pm_node_t *)((pm_multi_write_node_t *)node)->rest, buffer);
1298
1357
  }
1299
1358
  uint32_t rights_size = pm_sizet_to_u32(((pm_multi_write_node_t *)node)->rights.size);
1300
- pm_buffer_append_varint(buffer, rights_size);
1359
+ pm_buffer_append_varuint(buffer, rights_size);
1301
1360
  for (uint32_t index = 0; index < rights_size; index++) {
1302
1361
  pm_serialize_node(parser, (pm_node_t *) ((pm_multi_write_node_t *)node)->rights.nodes[index], buffer);
1303
1362
  }
@@ -1334,18 +1393,22 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1334
1393
  pm_serialize_location(parser, &((pm_no_keywords_parameter_node_t *)node)->keyword_loc, buffer);
1335
1394
  break;
1336
1395
  }
1396
+ case PM_NUMBERED_PARAMETERS_NODE: {
1397
+ pm_buffer_append_byte(buffer, ((pm_numbered_parameters_node_t *)node)->maximum);
1398
+ break;
1399
+ }
1337
1400
  case PM_NUMBERED_REFERENCE_READ_NODE: {
1338
- pm_buffer_append_varint(buffer, ((pm_numbered_reference_read_node_t *)node)->number);
1401
+ pm_buffer_append_varuint(buffer, ((pm_numbered_reference_read_node_t *)node)->number);
1339
1402
  break;
1340
1403
  }
1341
1404
  case PM_OPTIONAL_KEYWORD_PARAMETER_NODE: {
1342
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_optional_keyword_parameter_node_t *)node)->name));
1405
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_optional_keyword_parameter_node_t *)node)->name));
1343
1406
  pm_serialize_location(parser, &((pm_optional_keyword_parameter_node_t *)node)->name_loc, buffer);
1344
1407
  pm_serialize_node(parser, (pm_node_t *)((pm_optional_keyword_parameter_node_t *)node)->value, buffer);
1345
1408
  break;
1346
1409
  }
1347
1410
  case PM_OPTIONAL_PARAMETER_NODE: {
1348
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_optional_parameter_node_t *)node)->name));
1411
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_optional_parameter_node_t *)node)->name));
1349
1412
  pm_serialize_location(parser, &((pm_optional_parameter_node_t *)node)->name_loc, buffer);
1350
1413
  pm_serialize_location(parser, &((pm_optional_parameter_node_t *)node)->operator_loc, buffer);
1351
1414
  pm_serialize_node(parser, (pm_node_t *)((pm_optional_parameter_node_t *)node)->value, buffer);
@@ -1359,12 +1422,12 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1359
1422
  }
1360
1423
  case PM_PARAMETERS_NODE: {
1361
1424
  uint32_t requireds_size = pm_sizet_to_u32(((pm_parameters_node_t *)node)->requireds.size);
1362
- pm_buffer_append_varint(buffer, requireds_size);
1425
+ pm_buffer_append_varuint(buffer, requireds_size);
1363
1426
  for (uint32_t index = 0; index < requireds_size; index++) {
1364
1427
  pm_serialize_node(parser, (pm_node_t *) ((pm_parameters_node_t *)node)->requireds.nodes[index], buffer);
1365
1428
  }
1366
1429
  uint32_t optionals_size = pm_sizet_to_u32(((pm_parameters_node_t *)node)->optionals.size);
1367
- pm_buffer_append_varint(buffer, optionals_size);
1430
+ pm_buffer_append_varuint(buffer, optionals_size);
1368
1431
  for (uint32_t index = 0; index < optionals_size; index++) {
1369
1432
  pm_serialize_node(parser, (pm_node_t *) ((pm_parameters_node_t *)node)->optionals.nodes[index], buffer);
1370
1433
  }
@@ -1374,12 +1437,12 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1374
1437
  pm_serialize_node(parser, (pm_node_t *)((pm_parameters_node_t *)node)->rest, buffer);
1375
1438
  }
1376
1439
  uint32_t posts_size = pm_sizet_to_u32(((pm_parameters_node_t *)node)->posts.size);
1377
- pm_buffer_append_varint(buffer, posts_size);
1440
+ pm_buffer_append_varuint(buffer, posts_size);
1378
1441
  for (uint32_t index = 0; index < posts_size; index++) {
1379
1442
  pm_serialize_node(parser, (pm_node_t *) ((pm_parameters_node_t *)node)->posts.nodes[index], buffer);
1380
1443
  }
1381
1444
  uint32_t keywords_size = pm_sizet_to_u32(((pm_parameters_node_t *)node)->keywords.size);
1382
- pm_buffer_append_varint(buffer, keywords_size);
1445
+ pm_buffer_append_varuint(buffer, keywords_size);
1383
1446
  for (uint32_t index = 0; index < keywords_size; index++) {
1384
1447
  pm_serialize_node(parser, (pm_node_t *) ((pm_parameters_node_t *)node)->keywords.nodes[index], buffer);
1385
1448
  }
@@ -1441,14 +1504,15 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1441
1504
  }
1442
1505
  case PM_PROGRAM_NODE: {
1443
1506
  uint32_t locals_size = pm_sizet_to_u32(((pm_program_node_t *)node)->locals.size);
1444
- pm_buffer_append_varint(buffer, locals_size);
1507
+ pm_buffer_append_varuint(buffer, locals_size);
1445
1508
  for (uint32_t index = 0; index < locals_size; index++) {
1446
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_program_node_t *)node)->locals.ids[index]));
1509
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_program_node_t *)node)->locals.ids[index]));
1447
1510
  }
1448
1511
  pm_serialize_node(parser, (pm_node_t *)((pm_program_node_t *)node)->statements, buffer);
1449
1512
  break;
1450
1513
  }
1451
1514
  case PM_RANGE_NODE: {
1515
+ pm_buffer_append_varuint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1452
1516
  if (((pm_range_node_t *)node)->left == NULL) {
1453
1517
  pm_buffer_append_byte(buffer, 0);
1454
1518
  } else {
@@ -1460,7 +1524,6 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1460
1524
  pm_serialize_node(parser, (pm_node_t *)((pm_range_node_t *)node)->right, buffer);
1461
1525
  }
1462
1526
  pm_serialize_location(parser, &((pm_range_node_t *)node)->operator_loc, buffer);
1463
- pm_buffer_append_varint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1464
1527
  break;
1465
1528
  }
1466
1529
  case PM_RATIONAL_NODE: {
@@ -1471,20 +1534,20 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1471
1534
  break;
1472
1535
  }
1473
1536
  case PM_REGULAR_EXPRESSION_NODE: {
1537
+ pm_buffer_append_varuint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1474
1538
  pm_serialize_location(parser, &((pm_regular_expression_node_t *)node)->opening_loc, buffer);
1475
1539
  pm_serialize_location(parser, &((pm_regular_expression_node_t *)node)->content_loc, buffer);
1476
1540
  pm_serialize_location(parser, &((pm_regular_expression_node_t *)node)->closing_loc, buffer);
1477
1541
  pm_serialize_string(parser, &((pm_regular_expression_node_t *)node)->unescaped, buffer);
1478
- pm_buffer_append_varint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1479
1542
  break;
1480
1543
  }
1481
1544
  case PM_REQUIRED_KEYWORD_PARAMETER_NODE: {
1482
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_required_keyword_parameter_node_t *)node)->name));
1545
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_required_keyword_parameter_node_t *)node)->name));
1483
1546
  pm_serialize_location(parser, &((pm_required_keyword_parameter_node_t *)node)->name_loc, buffer);
1484
1547
  break;
1485
1548
  }
1486
1549
  case PM_REQUIRED_PARAMETER_NODE: {
1487
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_required_parameter_node_t *)node)->name));
1550
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_required_parameter_node_t *)node)->name));
1488
1551
  break;
1489
1552
  }
1490
1553
  case PM_RESCUE_MODIFIER_NODE: {
@@ -1496,7 +1559,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1496
1559
  case PM_RESCUE_NODE: {
1497
1560
  pm_serialize_location(parser, &((pm_rescue_node_t *)node)->keyword_loc, buffer);
1498
1561
  uint32_t exceptions_size = pm_sizet_to_u32(((pm_rescue_node_t *)node)->exceptions.size);
1499
- pm_buffer_append_varint(buffer, exceptions_size);
1562
+ pm_buffer_append_varuint(buffer, exceptions_size);
1500
1563
  for (uint32_t index = 0; index < exceptions_size; index++) {
1501
1564
  pm_serialize_node(parser, (pm_node_t *) ((pm_rescue_node_t *)node)->exceptions.nodes[index], buffer);
1502
1565
  }
@@ -1524,7 +1587,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1524
1587
  break;
1525
1588
  }
1526
1589
  case PM_REST_PARAMETER_NODE: {
1527
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_rest_parameter_node_t *)node)->name));
1590
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_rest_parameter_node_t *)node)->name));
1528
1591
  if (((pm_rest_parameter_node_t *)node)->name_loc.start == NULL) {
1529
1592
  pm_buffer_append_byte(buffer, 0);
1530
1593
  } else {
@@ -1551,9 +1614,9 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1551
1614
  }
1552
1615
  case PM_SINGLETON_CLASS_NODE: {
1553
1616
  uint32_t locals_size = pm_sizet_to_u32(((pm_singleton_class_node_t *)node)->locals.size);
1554
- pm_buffer_append_varint(buffer, locals_size);
1617
+ pm_buffer_append_varuint(buffer, locals_size);
1555
1618
  for (uint32_t index = 0; index < locals_size; index++) {
1556
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_singleton_class_node_t *)node)->locals.ids[index]));
1619
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_singleton_class_node_t *)node)->locals.ids[index]));
1557
1620
  }
1558
1621
  pm_serialize_location(parser, &((pm_singleton_class_node_t *)node)->class_keyword_loc, buffer);
1559
1622
  pm_serialize_location(parser, &((pm_singleton_class_node_t *)node)->operator_loc, buffer);
@@ -1587,19 +1650,14 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1587
1650
  }
1588
1651
  case PM_STATEMENTS_NODE: {
1589
1652
  uint32_t body_size = pm_sizet_to_u32(((pm_statements_node_t *)node)->body.size);
1590
- pm_buffer_append_varint(buffer, body_size);
1653
+ pm_buffer_append_varuint(buffer, body_size);
1591
1654
  for (uint32_t index = 0; index < body_size; index++) {
1592
1655
  pm_serialize_node(parser, (pm_node_t *) ((pm_statements_node_t *)node)->body.nodes[index], buffer);
1593
1656
  }
1594
1657
  break;
1595
1658
  }
1596
- case PM_STRING_CONCAT_NODE: {
1597
- pm_serialize_node(parser, (pm_node_t *)((pm_string_concat_node_t *)node)->left, buffer);
1598
- pm_serialize_node(parser, (pm_node_t *)((pm_string_concat_node_t *)node)->right, buffer);
1599
- break;
1600
- }
1601
1659
  case PM_STRING_NODE: {
1602
- pm_buffer_append_varint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1660
+ pm_buffer_append_varuint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1603
1661
  if (((pm_string_node_t *)node)->opening_loc.start == NULL) {
1604
1662
  pm_buffer_append_byte(buffer, 0);
1605
1663
  } else {
@@ -1643,6 +1701,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1643
1701
  break;
1644
1702
  }
1645
1703
  case PM_SYMBOL_NODE: {
1704
+ pm_buffer_append_varuint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1646
1705
  if (((pm_symbol_node_t *)node)->opening_loc.start == NULL) {
1647
1706
  pm_buffer_append_byte(buffer, 0);
1648
1707
  } else {
@@ -1669,7 +1728,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1669
1728
  }
1670
1729
  case PM_UNDEF_NODE: {
1671
1730
  uint32_t names_size = pm_sizet_to_u32(((pm_undef_node_t *)node)->names.size);
1672
- pm_buffer_append_varint(buffer, names_size);
1731
+ pm_buffer_append_varuint(buffer, names_size);
1673
1732
  for (uint32_t index = 0; index < names_size; index++) {
1674
1733
  pm_serialize_node(parser, (pm_node_t *) ((pm_undef_node_t *)node)->names.nodes[index], buffer);
1675
1734
  }
@@ -1679,6 +1738,12 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1679
1738
  case PM_UNLESS_NODE: {
1680
1739
  pm_serialize_location(parser, &((pm_unless_node_t *)node)->keyword_loc, buffer);
1681
1740
  pm_serialize_node(parser, (pm_node_t *)((pm_unless_node_t *)node)->predicate, buffer);
1741
+ if (((pm_unless_node_t *)node)->then_keyword_loc.start == NULL) {
1742
+ pm_buffer_append_byte(buffer, 0);
1743
+ } else {
1744
+ pm_buffer_append_byte(buffer, 1);
1745
+ pm_serialize_location(parser, &((pm_unless_node_t *)node)->then_keyword_loc, buffer);
1746
+ }
1682
1747
  if (((pm_unless_node_t *)node)->statements == NULL) {
1683
1748
  pm_buffer_append_byte(buffer, 0);
1684
1749
  } else {
@@ -1698,6 +1763,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1698
1763
  break;
1699
1764
  }
1700
1765
  case PM_UNTIL_NODE: {
1766
+ pm_buffer_append_varuint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1701
1767
  pm_serialize_location(parser, &((pm_until_node_t *)node)->keyword_loc, buffer);
1702
1768
  if (((pm_until_node_t *)node)->closing_loc.start == NULL) {
1703
1769
  pm_buffer_append_byte(buffer, 0);
@@ -1711,13 +1777,12 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1711
1777
  } else {
1712
1778
  pm_serialize_node(parser, (pm_node_t *)((pm_until_node_t *)node)->statements, buffer);
1713
1779
  }
1714
- pm_buffer_append_varint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1715
1780
  break;
1716
1781
  }
1717
1782
  case PM_WHEN_NODE: {
1718
1783
  pm_serialize_location(parser, &((pm_when_node_t *)node)->keyword_loc, buffer);
1719
1784
  uint32_t conditions_size = pm_sizet_to_u32(((pm_when_node_t *)node)->conditions.size);
1720
- pm_buffer_append_varint(buffer, conditions_size);
1785
+ pm_buffer_append_varuint(buffer, conditions_size);
1721
1786
  for (uint32_t index = 0; index < conditions_size; index++) {
1722
1787
  pm_serialize_node(parser, (pm_node_t *) ((pm_when_node_t *)node)->conditions.nodes[index], buffer);
1723
1788
  }
@@ -1729,6 +1794,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1729
1794
  break;
1730
1795
  }
1731
1796
  case PM_WHILE_NODE: {
1797
+ pm_buffer_append_varuint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1732
1798
  pm_serialize_location(parser, &((pm_while_node_t *)node)->keyword_loc, buffer);
1733
1799
  if (((pm_while_node_t *)node)->closing_loc.start == NULL) {
1734
1800
  pm_buffer_append_byte(buffer, 0);
@@ -1742,10 +1808,10 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1742
1808
  } else {
1743
1809
  pm_serialize_node(parser, (pm_node_t *)((pm_while_node_t *)node)->statements, buffer);
1744
1810
  }
1745
- pm_buffer_append_varint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1746
1811
  break;
1747
1812
  }
1748
1813
  case PM_X_STRING_NODE: {
1814
+ pm_buffer_append_varuint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1749
1815
  pm_serialize_location(parser, &((pm_x_string_node_t *)node)->opening_loc, buffer);
1750
1816
  pm_serialize_location(parser, &((pm_x_string_node_t *)node)->content_loc, buffer);
1751
1817
  pm_serialize_location(parser, &((pm_x_string_node_t *)node)->closing_loc, buffer);
@@ -1782,8 +1848,7 @@ pm_serialize_comment(pm_parser_t *parser, pm_comment_t *comment, pm_buffer_t *bu
1782
1848
  pm_buffer_append_byte(buffer, (uint8_t) comment->type);
1783
1849
 
1784
1850
  // serialize location
1785
- pm_buffer_append_varint(buffer, pm_ptrdifft_to_u32(comment->start - parser->start));
1786
- pm_buffer_append_varint(buffer, pm_ptrdifft_to_u32(comment->end - comment->start));
1851
+ pm_serialize_location(parser, &comment->location, buffer);
1787
1852
  }
1788
1853
 
1789
1854
  /**
@@ -1791,7 +1856,7 @@ pm_serialize_comment(pm_parser_t *parser, pm_comment_t *comment, pm_buffer_t *bu
1791
1856
  */
1792
1857
  void
1793
1858
  pm_serialize_comment_list(pm_parser_t *parser, pm_list_t *list, pm_buffer_t *buffer) {
1794
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(pm_list_size(list)));
1859
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(pm_list_size(list)));
1795
1860
 
1796
1861
  pm_comment_t *comment;
1797
1862
  for (comment = (pm_comment_t *) list->head; comment != NULL; comment = (pm_comment_t *) comment->node.next) {
@@ -1802,17 +1867,17 @@ pm_serialize_comment_list(pm_parser_t *parser, pm_list_t *list, pm_buffer_t *buf
1802
1867
  static void
1803
1868
  pm_serialize_magic_comment(pm_parser_t *parser, pm_magic_comment_t *magic_comment, pm_buffer_t *buffer) {
1804
1869
  // serialize key location
1805
- pm_buffer_append_varint(buffer, pm_ptrdifft_to_u32(magic_comment->key_start - parser->start));
1806
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(magic_comment->key_length));
1870
+ pm_buffer_append_varuint(buffer, pm_ptrdifft_to_u32(magic_comment->key_start - parser->start));
1871
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(magic_comment->key_length));
1807
1872
 
1808
1873
  // serialize value location
1809
- pm_buffer_append_varint(buffer, pm_ptrdifft_to_u32(magic_comment->value_start - parser->start));
1810
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(magic_comment->value_length));
1874
+ pm_buffer_append_varuint(buffer, pm_ptrdifft_to_u32(magic_comment->value_start - parser->start));
1875
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(magic_comment->value_length));
1811
1876
  }
1812
1877
 
1813
1878
  static void
1814
1879
  pm_serialize_magic_comment_list(pm_parser_t *parser, pm_list_t *list, pm_buffer_t *buffer) {
1815
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(pm_list_size(list)));
1880
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(pm_list_size(list)));
1816
1881
 
1817
1882
  pm_magic_comment_t *magic_comment;
1818
1883
  for (magic_comment = (pm_magic_comment_t *) list->head; magic_comment != NULL; magic_comment = (pm_magic_comment_t *) magic_comment->node.next) {
@@ -1820,21 +1885,30 @@ pm_serialize_magic_comment_list(pm_parser_t *parser, pm_list_t *list, pm_buffer_
1820
1885
  }
1821
1886
  }
1822
1887
 
1888
+ static void
1889
+ pm_serialize_data_loc(const pm_parser_t *parser, pm_buffer_t *buffer) {
1890
+ if (parser->data_loc.end == NULL) {
1891
+ pm_buffer_append_byte(buffer, 0);
1892
+ } else {
1893
+ pm_buffer_append_byte(buffer, 1);
1894
+ pm_serialize_location(parser, &parser->data_loc, buffer);
1895
+ }
1896
+ }
1897
+
1823
1898
  static void
1824
1899
  pm_serialize_diagnostic(pm_parser_t *parser, pm_diagnostic_t *diagnostic, pm_buffer_t *buffer) {
1825
1900
  // serialize message
1826
1901
  size_t message_length = strlen(diagnostic->message);
1827
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(message_length));
1902
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(message_length));
1828
1903
  pm_buffer_append_string(buffer, diagnostic->message, message_length);
1829
1904
 
1830
1905
  // serialize location
1831
- pm_buffer_append_varint(buffer, pm_ptrdifft_to_u32(diagnostic->start - parser->start));
1832
- pm_buffer_append_varint(buffer, pm_ptrdifft_to_u32(diagnostic->end - diagnostic->start));
1906
+ pm_serialize_location(parser, &diagnostic->location, buffer);
1833
1907
  }
1834
1908
 
1835
1909
  static void
1836
1910
  pm_serialize_diagnostic_list(pm_parser_t *parser, pm_list_t *list, pm_buffer_t *buffer) {
1837
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(pm_list_size(list)));
1911
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(pm_list_size(list)));
1838
1912
 
1839
1913
  pm_diagnostic_t *diagnostic;
1840
1914
  for (diagnostic = (pm_diagnostic_t *) list->head; diagnostic != NULL; diagnostic = (pm_diagnostic_t *) diagnostic->node.next) {
@@ -1846,22 +1920,23 @@ pm_serialize_diagnostic_list(pm_parser_t *parser, pm_list_t *list, pm_buffer_t *
1846
1920
  * Serialize the name of the encoding to the buffer.
1847
1921
  */
1848
1922
  void
1849
- pm_serialize_encoding(pm_encoding_t *encoding, pm_buffer_t *buffer) {
1923
+ pm_serialize_encoding(const pm_encoding_t *encoding, pm_buffer_t *buffer) {
1850
1924
  size_t encoding_length = strlen(encoding->name);
1851
- pm_buffer_append_varint(buffer, pm_sizet_to_u32(encoding_length));
1925
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(encoding_length));
1852
1926
  pm_buffer_append_string(buffer, encoding->name, encoding_length);
1853
1927
  }
1854
1928
 
1855
- #line 206 "serialize.c.erb"
1929
+ #line 216 "serialize.c.erb"
1856
1930
  /**
1857
1931
  * Serialize the encoding, metadata, nodes, and constant pool.
1858
1932
  */
1859
1933
  void
1860
1934
  pm_serialize_content(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1861
- pm_serialize_encoding(&parser->encoding, buffer);
1862
- pm_buffer_append_varint(buffer, parser->start_line);
1935
+ pm_serialize_encoding(parser->encoding, buffer);
1936
+ pm_buffer_append_varsint(buffer, parser->start_line);
1863
1937
  pm_serialize_comment_list(parser, &parser->comment_list, buffer);
1864
1938
  pm_serialize_magic_comment_list(parser, &parser->magic_comment_list, buffer);
1939
+ pm_serialize_data_loc(parser, buffer);
1865
1940
  pm_serialize_diagnostic_list(parser, &parser->error_list, buffer);
1866
1941
  pm_serialize_diagnostic_list(parser, &parser->warning_list, buffer);
1867
1942
 
@@ -1871,7 +1946,7 @@ pm_serialize_content(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer)
1871
1946
  pm_buffer_append_zeroes(buffer, 4);
1872
1947
 
1873
1948
  // Next, encode the length of the constant pool.
1874
- pm_buffer_append_varint(buffer, parser->constant_pool.size);
1949
+ pm_buffer_append_varuint(buffer, parser->constant_pool.size);
1875
1950
 
1876
1951
  // Now we're going to serialize the content of the node.
1877
1952
  pm_serialize_node(parser, node, buffer);
@@ -1926,10 +2001,10 @@ static void
1926
2001
  serialize_token(void *data, pm_parser_t *parser, pm_token_t *token) {
1927
2002
  pm_buffer_t *buffer = (pm_buffer_t *) data;
1928
2003
 
1929
- pm_buffer_append_varint(buffer, token->type);
1930
- pm_buffer_append_varint(buffer, pm_ptrdifft_to_u32(token->start - parser->start));
1931
- pm_buffer_append_varint(buffer, pm_ptrdifft_to_u32(token->end - token->start));
1932
- pm_buffer_append_varint(buffer, parser->lex_state);
2004
+ pm_buffer_append_varuint(buffer, token->type);
2005
+ pm_buffer_append_varuint(buffer, pm_ptrdifft_to_u32(token->start - parser->start));
2006
+ pm_buffer_append_varuint(buffer, pm_ptrdifft_to_u32(token->end - token->start));
2007
+ pm_buffer_append_varuint(buffer, parser->lex_state);
1933
2008
  }
1934
2009
 
1935
2010
  /**
@@ -1938,7 +2013,7 @@ serialize_token(void *data, pm_parser_t *parser, pm_token_t *token) {
1938
2013
  PRISM_EXPORTED_FUNCTION void
1939
2014
  pm_serialize_lex(pm_buffer_t *buffer, const uint8_t *source, size_t size, const char *data) {
1940
2015
  pm_options_t options = { 0 };
1941
- if (data != NULL) pm_options_read(&options, data);
2016
+ pm_options_read(&options, data);
1942
2017
 
1943
2018
  pm_parser_t parser;
1944
2019
  pm_parser_init(&parser, source, size, &options);
@@ -1954,10 +2029,11 @@ pm_serialize_lex(pm_buffer_t *buffer, const uint8_t *source, size_t size, const
1954
2029
  // Append 0 to mark end of tokens.
1955
2030
  pm_buffer_append_byte(buffer, 0);
1956
2031
 
1957
- pm_serialize_encoding(&parser.encoding, buffer);
1958
- pm_buffer_append_varint(buffer, parser.start_line);
2032
+ pm_serialize_encoding(parser.encoding, buffer);
2033
+ pm_buffer_append_varsint(buffer, parser.start_line);
1959
2034
  pm_serialize_comment_list(&parser, &parser.comment_list, buffer);
1960
2035
  pm_serialize_magic_comment_list(&parser, &parser.magic_comment_list, buffer);
2036
+ pm_serialize_data_loc(&parser, buffer);
1961
2037
  pm_serialize_diagnostic_list(&parser, &parser.error_list, buffer);
1962
2038
  pm_serialize_diagnostic_list(&parser, &parser.warning_list, buffer);
1963
2039
 
@@ -1973,7 +2049,7 @@ pm_serialize_lex(pm_buffer_t *buffer, const uint8_t *source, size_t size, const
1973
2049
  PRISM_EXPORTED_FUNCTION void
1974
2050
  pm_serialize_parse_lex(pm_buffer_t *buffer, const uint8_t *source, size_t size, const char *data) {
1975
2051
  pm_options_t options = { 0 };
1976
- if (data != NULL) pm_options_read(&options, data);
2052
+ pm_options_read(&options, data);
1977
2053
 
1978
2054
  pm_parser_t parser;
1979
2055
  pm_parser_init(&parser, source, size, &options);
@@ -1993,3 +2069,24 @@ pm_serialize_parse_lex(pm_buffer_t *buffer, const uint8_t *source, size_t size,
1993
2069
  pm_parser_free(&parser);
1994
2070
  pm_options_free(&options);
1995
2071
  }
2072
+
2073
+ /**
2074
+ * Parse the source and return true if it parses without errors or warnings.
2075
+ */
2076
+ PRISM_EXPORTED_FUNCTION bool
2077
+ pm_parse_success_p(const uint8_t *source, size_t size, const char *data) {
2078
+ pm_options_t options = { 0 };
2079
+ pm_options_read(&options, data);
2080
+
2081
+ pm_parser_t parser;
2082
+ pm_parser_init(&parser, source, size, &options);
2083
+
2084
+ pm_node_t *node = pm_parse(&parser);
2085
+ pm_node_destroy(&parser, node);
2086
+
2087
+ bool result = parser.error_list.size == 0 && parser.warning_list.size == 0;
2088
+ pm_parser_free(&parser);
2089
+ pm_options_free(&options);
2090
+
2091
+ return result;
2092
+ }