prism 0.17.1 → 0.19.0

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