prism 1.9.0 → 2.0.0.rc2

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 (244) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +88 -0
  3. data/CODE_OF_CONDUCT.md +1 -1
  4. data/LICENSE.md +1 -1
  5. data/Makefile +41 -12
  6. data/README.md +35 -97
  7. data/config.yml +174 -161
  8. data/docs/build_system.md +2 -2
  9. data/docs/configuration.md +5 -4
  10. data/docs/encoding.md +2 -2
  11. data/docs/fuzzing.md +4 -11
  12. data/docs/javascript.md +19 -4
  13. data/docs/mapping.md +1 -1
  14. data/docs/releasing.md +77 -5
  15. data/docs/relocation.md +2 -4
  16. data/docs/serialization.md +22 -24
  17. data/docs/testing.md +46 -29
  18. data/ext/prism/api_node.c +1461 -1401
  19. data/ext/prism/extconf.rb +3 -4
  20. data/ext/prism/extension.c +796 -422
  21. data/ext/prism/extension.h +3 -3
  22. data/include/prism/arena.h +37 -0
  23. data/include/prism/ast.h +2727 -610
  24. data/include/prism/buffer.h +52 -0
  25. data/include/prism/comments.h +55 -0
  26. data/include/prism/compiler/accel.h +26 -0
  27. data/include/prism/compiler/align.h +36 -0
  28. data/include/prism/compiler/assume.h +25 -0
  29. data/include/prism/compiler/bswap.h +46 -0
  30. data/include/prism/compiler/endianness.h +34 -0
  31. data/include/prism/compiler/exported.h +24 -0
  32. data/include/prism/compiler/fallthrough.h +22 -0
  33. data/include/prism/compiler/filesystem.h +32 -0
  34. data/include/prism/compiler/flex_array.h +19 -0
  35. data/include/prism/compiler/force_inline.h +21 -0
  36. data/include/prism/compiler/format.h +25 -0
  37. data/include/prism/compiler/inline.h +17 -0
  38. data/include/prism/compiler/nodiscard.h +22 -0
  39. data/include/prism/compiler/nonnull.h +18 -0
  40. data/include/prism/compiler/unused.h +18 -0
  41. data/include/prism/constant_pool.h +81 -0
  42. data/include/prism/diagnostic.h +38 -403
  43. data/include/prism/errors_format.h +53 -0
  44. data/include/prism/excludes.h +29 -0
  45. data/include/prism/integer.h +41 -0
  46. data/include/prism/internal/allocator.h +68 -0
  47. data/include/prism/internal/allocator_debug.h +88 -0
  48. data/include/prism/internal/arena.h +108 -0
  49. data/include/prism/internal/bit.h +42 -0
  50. data/include/prism/internal/buffer.h +94 -0
  51. data/include/prism/internal/char.h +145 -0
  52. data/include/prism/internal/comments.h +53 -0
  53. data/include/prism/internal/constant_pool.h +152 -0
  54. data/include/prism/internal/diagnostic.h +389 -0
  55. data/include/prism/{encoding.h → internal/encoding.h} +27 -68
  56. data/include/prism/internal/integer.h +68 -0
  57. data/include/prism/internal/isinf.h +16 -0
  58. data/include/prism/internal/line_offset_list.h +34 -0
  59. data/include/prism/{util/pm_list.h → internal/list.h} +11 -52
  60. data/include/prism/internal/magic_comments.h +23 -0
  61. data/include/prism/internal/memchr.h +15 -0
  62. data/include/prism/internal/node.h +38 -0
  63. data/include/prism/internal/options.h +232 -0
  64. data/include/prism/internal/parser.h +1004 -0
  65. data/include/prism/internal/regexp.h +26 -0
  66. data/include/prism/internal/serialize.h +39 -0
  67. data/include/prism/internal/source.h +72 -0
  68. data/include/prism/{static_literals.h → internal/static_literals.h} +26 -47
  69. data/include/prism/internal/stringy.h +35 -0
  70. data/include/prism/{util/pm_strncasecmp.h → internal/strncasecmp.h} +3 -17
  71. data/include/prism/{util/pm_strpbrk.h → internal/strpbrk.h} +7 -20
  72. data/include/prism/internal/tokens.h +11 -0
  73. data/include/prism/internal/xxh3.h +16 -0
  74. data/include/prism/json.h +32 -0
  75. data/include/prism/line_offset_list.h +61 -0
  76. data/include/prism/magic_comments.h +35 -0
  77. data/include/prism/node.h +18 -53
  78. data/include/prism/options.h +146 -280
  79. data/include/prism/parser.h +356 -867
  80. data/include/prism/prettyprint.h +6 -9
  81. data/include/prism/serialize.h +115 -0
  82. data/include/prism/source.h +155 -0
  83. data/include/prism/stream.h +28 -0
  84. data/include/prism/string_query.h +74 -0
  85. data/include/prism/stringy.h +72 -0
  86. data/include/prism/version.h +12 -3
  87. data/include/prism.h +43 -320
  88. data/lib/prism/compiler.rb +319 -305
  89. data/lib/prism/desugar_compiler.rb +105 -34
  90. data/lib/prism/dispatcher.rb +646 -473
  91. data/lib/prism/dot_visitor.rb +592 -511
  92. data/lib/prism/dsl.rb +391 -25
  93. data/lib/prism/ffi.rb +258 -90
  94. data/lib/prism/inspect_visitor.rb +357 -325
  95. data/lib/prism/lex_compat.rb +254 -212
  96. data/lib/prism/mutation_compiler.rb +313 -305
  97. data/lib/prism/node.rb +20966 -6992
  98. data/lib/prism/node_ext.rb +180 -187
  99. data/lib/prism/node_find.rb +215 -0
  100. data/lib/prism/parse_result/errors.rb +7 -1
  101. data/lib/prism/parse_result/newlines.rb +276 -8
  102. data/lib/prism/parse_result.rb +468 -139
  103. data/lib/prism/pattern.rb +65 -20
  104. data/lib/prism/reflection.rb +23 -12
  105. data/lib/prism/relocation.rb +149 -87
  106. data/lib/prism/serialize.rb +3460 -539
  107. data/lib/prism/string_query.rb +24 -1
  108. data/lib/prism/translation/parser/builder.rb +10 -2
  109. data/lib/prism/translation/parser/compiler.rb +44 -52
  110. data/lib/prism/translation/parser/lexer.rb +41 -92
  111. data/lib/prism/translation/parser.rb +1 -1
  112. data/lib/prism/translation/parser_current.rb +1 -1
  113. data/lib/prism/translation/ripper/lexer.rb +8 -10
  114. data/lib/prism/translation/ripper/sexp.rb +2 -10
  115. data/lib/prism/translation/ripper/shim.rb +2 -0
  116. data/lib/prism/translation/ripper.rb +967 -209
  117. data/lib/prism/translation/ruby_parser.rb +73 -316
  118. data/lib/prism/translation.rb +2 -0
  119. data/lib/prism/visitor.rb +632 -5
  120. data/lib/prism.rb +79 -9
  121. data/prism.gemspec +128 -62
  122. data/rbi/generated/prism/compiler.rbi +489 -0
  123. data/rbi/generated/prism/desugar_compiler.rbi +306 -0
  124. data/rbi/generated/prism/dispatcher.rbi +1138 -0
  125. data/rbi/generated/prism/dot_visitor.rbi +618 -0
  126. data/rbi/generated/prism/dsl.rbi +751 -0
  127. data/rbi/generated/prism/inspect_visitor.rbi +503 -0
  128. data/rbi/generated/prism/lex_compat.rbi +162 -0
  129. data/rbi/generated/prism/mutation_compiler.rbi +464 -0
  130. data/rbi/generated/prism/node.rbi +14407 -0
  131. data/rbi/generated/prism/node_ext.rbi +259 -0
  132. data/rbi/generated/prism/node_find.rbi +79 -0
  133. data/rbi/generated/prism/parse_result/errors.rbi +21 -0
  134. data/rbi/generated/prism/parse_result/newlines.rbi +208 -0
  135. data/rbi/generated/prism/parse_result.rbi +776 -0
  136. data/rbi/generated/prism/pattern.rbi +134 -0
  137. data/rbi/generated/prism/reflection.rbi +89 -0
  138. data/rbi/generated/prism/relocation.rbi +329 -0
  139. data/rbi/generated/prism/serialize.rbi +184 -0
  140. data/rbi/generated/prism/string_query.rbi +43 -0
  141. data/rbi/generated/prism/translation.rbi +7 -0
  142. data/rbi/generated/prism/visitor.rbi +650 -0
  143. data/rbi/generated/prism.rbi +86 -0
  144. data/rbi/prism/translation/parser_versions.rbi +5 -0
  145. data/rbi/rubyvm/node_find.rbi +14 -0
  146. data/sig/generated/prism/compiler.rbs +492 -0
  147. data/sig/generated/prism/desugar_compiler.rbs +305 -0
  148. data/sig/generated/prism/dispatcher.rbs +1292 -0
  149. data/sig/generated/prism/dot_visitor.rbs +635 -0
  150. data/sig/generated/prism/dsl.rbs +928 -0
  151. data/sig/generated/prism/inspect_visitor.rbs +509 -0
  152. data/sig/generated/prism/lex_compat.rbs +166 -0
  153. data/sig/{prism → generated/prism}/mutation_compiler.rbs +309 -4
  154. data/sig/generated/prism/node.rbs +20896 -0
  155. data/sig/generated/prism/node_ext.rbs +290 -0
  156. data/sig/generated/prism/node_find.rbs +90 -0
  157. data/sig/generated/prism/parse_result/errors.rbs +22 -0
  158. data/sig/generated/prism/parse_result/newlines.rbs +223 -0
  159. data/sig/generated/prism/parse_result.rbs +871 -0
  160. data/sig/generated/prism/pattern.rbs +156 -0
  161. data/sig/generated/prism/reflection.rbs +101 -0
  162. data/sig/generated/prism/relocation.rbs +428 -0
  163. data/sig/generated/prism/serialize.rbs +198 -0
  164. data/sig/generated/prism/string_query.rbs +43 -0
  165. data/sig/generated/prism/translation.rbs +8 -0
  166. data/sig/generated/prism/visitor.rbs +1111 -0
  167. data/sig/generated/prism.rbs +84 -0
  168. data/sig/manifest.yaml +2 -0
  169. data/src/arena.c +117 -0
  170. data/src/{util/pm_buffer.c → buffer.c} +53 -21
  171. data/src/{util/pm_char.c → char.c} +28 -57
  172. data/src/comments.c +454 -0
  173. data/src/constant_pool.c +406 -0
  174. data/src/diagnostic.c +97 -65
  175. data/src/encoding.c +8 -3
  176. data/src/errors_format.c +519 -0
  177. data/src/{util/pm_integer.c → integer.c} +33 -22
  178. data/src/json.c +5733 -0
  179. data/src/line_offset_list.c +100 -0
  180. data/src/list.c +24 -0
  181. data/src/{util/pm_memchr.c → memchr.c} +8 -6
  182. data/src/node.c +3504 -7674
  183. data/src/options.c +162 -49
  184. data/src/parser.c +367 -0
  185. data/src/prettyprint.c +421 -354
  186. data/src/prism.c +8402 -7161
  187. data/src/regexp.c +961 -45
  188. data/src/serialize.c +460 -424
  189. data/src/source.c +518 -0
  190. data/src/static_literals.c +111 -43
  191. data/src/string_query.c +180 -0
  192. data/src/stringy.c +91 -0
  193. data/src/{util/pm_strncasecmp.c → strncasecmp.c} +5 -4
  194. data/src/strpbrk.c +447 -0
  195. data/src/{token_type.c → tokens.c} +39 -18
  196. data/src/xxh3.c +292 -0
  197. metadata +128 -63
  198. data/ext/prism/api_pack.c +0 -276
  199. data/include/prism/defines.h +0 -260
  200. data/include/prism/pack.h +0 -163
  201. data/include/prism/regexp.h +0 -43
  202. data/include/prism/util/pm_buffer.h +0 -236
  203. data/include/prism/util/pm_char.h +0 -204
  204. data/include/prism/util/pm_constant_pool.h +0 -218
  205. data/include/prism/util/pm_integer.h +0 -130
  206. data/include/prism/util/pm_memchr.h +0 -29
  207. data/include/prism/util/pm_newline_list.h +0 -113
  208. data/include/prism/util/pm_string.h +0 -200
  209. data/lib/prism/pack.rb +0 -230
  210. data/lib/prism/parse_result/comments.rb +0 -188
  211. data/rbi/prism/compiler.rbi +0 -12
  212. data/rbi/prism/dsl.rbi +0 -524
  213. data/rbi/prism/inspect_visitor.rbi +0 -12
  214. data/rbi/prism/node.rbi +0 -8750
  215. data/rbi/prism/node_ext.rbi +0 -107
  216. data/rbi/prism/parse_result.rbi +0 -404
  217. data/rbi/prism/reflection.rbi +0 -58
  218. data/rbi/prism/string_query.rbi +0 -12
  219. data/rbi/prism/visitor.rbi +0 -473
  220. data/rbi/prism.rbi +0 -63
  221. data/sig/prism/compiler.rbs +0 -9
  222. data/sig/prism/dispatcher.rbs +0 -19
  223. data/sig/prism/dot_visitor.rbs +0 -6
  224. data/sig/prism/dsl.rbs +0 -351
  225. data/sig/prism/inspect_visitor.rbs +0 -22
  226. data/sig/prism/lex_compat.rbs +0 -10
  227. data/sig/prism/node.rbs +0 -4042
  228. data/sig/prism/node_ext.rbs +0 -149
  229. data/sig/prism/pack.rbs +0 -43
  230. data/sig/prism/parse_result/comments.rbs +0 -38
  231. data/sig/prism/parse_result.rbs +0 -197
  232. data/sig/prism/pattern.rbs +0 -13
  233. data/sig/prism/reflection.rbs +0 -50
  234. data/sig/prism/relocation.rbs +0 -185
  235. data/sig/prism/serialize.rbs +0 -8
  236. data/sig/prism/string_query.rbs +0 -11
  237. data/sig/prism/visitor.rbs +0 -169
  238. data/sig/prism.rbs +0 -272
  239. data/src/pack.c +0 -509
  240. data/src/util/pm_constant_pool.c +0 -342
  241. data/src/util/pm_list.c +0 -49
  242. data/src/util/pm_newline_list.c +0 -125
  243. data/src/util/pm_string.c +0 -381
  244. data/src/util/pm_strpbrk.c +0 -206
data/src/serialize.c CHANGED
@@ -1,5 +1,3 @@
1
- /* :markup: markdown */
2
-
3
1
  /*----------------------------------------------------------------------------*/
4
2
  /* This file is generated by the templates/template.rb script and should not */
5
3
  /* be modified manually. See */
@@ -8,60 +6,61 @@
8
6
  /* template */
9
7
  /*----------------------------------------------------------------------------*/
10
8
 
11
- #include "prism.h"
9
+ #include "prism/excludes.h"
10
+
11
+ /* We optionally support serializing to a binary string. For systems that do not
12
+ * want or need this functionality, it can be turned off with the
13
+ * PRISM_EXCLUDE_SERIALIZATION define. */
14
+ #ifdef PRISM_EXCLUDE_SERIALIZATION
15
+
16
+ /* Ensure this translation unit is never empty, even when serialization is
17
+ * excluded. */
18
+ typedef int pm_serialize_unused_t;
19
+
20
+ #else
12
21
 
13
- // We optionally support serializing to a binary string. For systems that don't
14
- // want or need this functionality, it can be turned off with the
15
- // PRISM_EXCLUDE_SERIALIZATION define.
16
- #ifndef PRISM_EXCLUDE_SERIALIZATION
22
+ #include "prism/compiler/inline.h"
17
23
 
24
+ #include "prism/internal/buffer.h"
25
+ #include "prism/internal/comments.h"
26
+ #include "prism/internal/diagnostic.h"
27
+ #include "prism/internal/encoding.h"
28
+ #include "prism/internal/list.h"
29
+ #include "prism/internal/magic_comments.h"
30
+ #include "prism/internal/options.h"
31
+ #include "prism/internal/parser.h"
32
+
33
+ #include "prism.h"
34
+ #include "prism/ast.h"
35
+ #include "prism/line_offset_list.h"
36
+
37
+ #include <assert.h>
18
38
  #include <stdio.h>
39
+ #include <string.h>
19
40
 
20
- static inline uint32_t
41
+ static PRISM_INLINE uint32_t
21
42
  pm_ptrdifft_to_u32(ptrdiff_t value) {
22
43
  assert(value >= 0 && ((unsigned long) value) < UINT32_MAX);
23
44
  return (uint32_t) value;
24
45
  }
25
46
 
26
- static inline uint32_t
47
+ static PRISM_INLINE uint32_t
27
48
  pm_sizet_to_u32(size_t value) {
28
49
  assert(value < UINT32_MAX);
29
50
  return (uint32_t) value;
30
51
  }
31
52
 
32
53
  static void
33
- pm_serialize_location(const pm_parser_t *parser, const pm_location_t *location, pm_buffer_t *buffer) {
34
- assert(location->start);
35
- assert(location->end);
36
- assert(location->start <= location->end);
37
-
38
- pm_buffer_append_varuint(buffer, pm_ptrdifft_to_u32(location->start - parser->start));
39
- pm_buffer_append_varuint(buffer, pm_ptrdifft_to_u32(location->end - location->start));
54
+ pm_serialize_location(const pm_location_t *location, pm_buffer_t *buffer) {
55
+ pm_buffer_append_varuint(buffer, location->start);
56
+ pm_buffer_append_varuint(buffer, location->length);
40
57
  }
41
58
 
42
59
  static void
43
- pm_serialize_string(const pm_parser_t *parser, const pm_string_t *string, pm_buffer_t *buffer) {
44
- switch (string->type) {
45
- case PM_STRING_SHARED: {
46
- pm_buffer_append_byte(buffer, 1);
47
- pm_buffer_append_varuint(buffer, pm_ptrdifft_to_u32(pm_string_source(string) - parser->start));
48
- pm_buffer_append_varuint(buffer, pm_sizet_to_u32(pm_string_length(string)));
49
- break;
50
- }
51
- case PM_STRING_OWNED:
52
- case PM_STRING_CONSTANT: {
53
- uint32_t length = pm_sizet_to_u32(pm_string_length(string));
54
- pm_buffer_append_byte(buffer, 2);
55
- pm_buffer_append_varuint(buffer, length);
56
- pm_buffer_append_bytes(buffer, pm_string_source(string), length);
57
- break;
58
- }
59
- #ifdef PRISM_HAS_MMAP
60
- case PM_STRING_MAPPED:
61
- assert(false && "Cannot serialize mapped strings.");
62
- break;
63
- #endif
64
- }
60
+ pm_serialize_string(const pm_string_t *string, pm_buffer_t *buffer) {
61
+ uint32_t length = pm_sizet_to_u32(pm_string_length(string));
62
+ pm_buffer_append_varuint(buffer, length);
63
+ pm_buffer_append_bytes(buffer, pm_string_source(string), length);
65
64
  }
66
65
 
67
66
  static void
@@ -82,10 +81,8 @@ static void
82
81
  pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
83
82
  pm_buffer_append_byte(buffer, (uint8_t) PM_NODE_TYPE(node));
84
83
 
85
- size_t offset = buffer->length;
86
-
87
84
  pm_buffer_append_varuint(buffer, node->node_id);
88
- pm_serialize_location(parser, &node->location, buffer);
85
+ pm_serialize_location(&node->location, buffer);
89
86
 
90
87
  switch (PM_NODE_TYPE(node)) {
91
88
  // We do not need to serialize a ScopeNode ever as
@@ -96,28 +93,28 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
96
93
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
97
94
  pm_serialize_node(parser, (pm_node_t *)((pm_alias_global_variable_node_t *)node)->new_name, buffer);
98
95
  pm_serialize_node(parser, (pm_node_t *)((pm_alias_global_variable_node_t *)node)->old_name, buffer);
99
- pm_serialize_location(parser, &((pm_alias_global_variable_node_t *)node)->keyword_loc, buffer);
96
+ pm_serialize_location(&((pm_alias_global_variable_node_t *)node)->keyword_loc, buffer);
100
97
  break;
101
98
  }
102
99
  case PM_ALIAS_METHOD_NODE: {
103
100
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
104
101
  pm_serialize_node(parser, (pm_node_t *)((pm_alias_method_node_t *)node)->new_name, buffer);
105
102
  pm_serialize_node(parser, (pm_node_t *)((pm_alias_method_node_t *)node)->old_name, buffer);
106
- pm_serialize_location(parser, &((pm_alias_method_node_t *)node)->keyword_loc, buffer);
103
+ pm_serialize_location(&((pm_alias_method_node_t *)node)->keyword_loc, buffer);
107
104
  break;
108
105
  }
109
106
  case PM_ALTERNATION_PATTERN_NODE: {
110
107
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
111
108
  pm_serialize_node(parser, (pm_node_t *)((pm_alternation_pattern_node_t *)node)->left, buffer);
112
109
  pm_serialize_node(parser, (pm_node_t *)((pm_alternation_pattern_node_t *)node)->right, buffer);
113
- pm_serialize_location(parser, &((pm_alternation_pattern_node_t *)node)->operator_loc, buffer);
110
+ pm_serialize_location(&((pm_alternation_pattern_node_t *)node)->operator_loc, buffer);
114
111
  break;
115
112
  }
116
113
  case PM_AND_NODE: {
117
114
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
118
115
  pm_serialize_node(parser, (pm_node_t *)((pm_and_node_t *)node)->left, buffer);
119
116
  pm_serialize_node(parser, (pm_node_t *)((pm_and_node_t *)node)->right, buffer);
120
- pm_serialize_location(parser, &((pm_and_node_t *)node)->operator_loc, buffer);
117
+ pm_serialize_location(&((pm_and_node_t *)node)->operator_loc, buffer);
121
118
  break;
122
119
  }
123
120
  case PM_ARGUMENTS_NODE: {
@@ -136,17 +133,17 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
136
133
  for (uint32_t index = 0; index < elements_size; index++) {
137
134
  pm_serialize_node(parser, (pm_node_t *) ((pm_array_node_t *)node)->elements.nodes[index], buffer);
138
135
  }
139
- if (((pm_array_node_t *)node)->opening_loc.start == NULL) {
136
+ if (((pm_array_node_t *)node)->opening_loc.length == 0) {
140
137
  pm_buffer_append_byte(buffer, 0);
141
138
  } else {
142
139
  pm_buffer_append_byte(buffer, 1);
143
- pm_serialize_location(parser, &((pm_array_node_t *)node)->opening_loc, buffer);
140
+ pm_serialize_location(&((pm_array_node_t *)node)->opening_loc, buffer);
144
141
  }
145
- if (((pm_array_node_t *)node)->closing_loc.start == NULL) {
142
+ if (((pm_array_node_t *)node)->closing_loc.length == 0) {
146
143
  pm_buffer_append_byte(buffer, 0);
147
144
  } else {
148
145
  pm_buffer_append_byte(buffer, 1);
149
- pm_serialize_location(parser, &((pm_array_node_t *)node)->closing_loc, buffer);
146
+ pm_serialize_location(&((pm_array_node_t *)node)->closing_loc, buffer);
150
147
  }
151
148
  break;
152
149
  }
@@ -172,17 +169,17 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
172
169
  for (uint32_t index = 0; index < posts_size; index++) {
173
170
  pm_serialize_node(parser, (pm_node_t *) ((pm_array_pattern_node_t *)node)->posts.nodes[index], buffer);
174
171
  }
175
- if (((pm_array_pattern_node_t *)node)->opening_loc.start == NULL) {
172
+ if (((pm_array_pattern_node_t *)node)->opening_loc.length == 0) {
176
173
  pm_buffer_append_byte(buffer, 0);
177
174
  } else {
178
175
  pm_buffer_append_byte(buffer, 1);
179
- pm_serialize_location(parser, &((pm_array_pattern_node_t *)node)->opening_loc, buffer);
176
+ pm_serialize_location(&((pm_array_pattern_node_t *)node)->opening_loc, buffer);
180
177
  }
181
- if (((pm_array_pattern_node_t *)node)->closing_loc.start == NULL) {
178
+ if (((pm_array_pattern_node_t *)node)->closing_loc.length == 0) {
182
179
  pm_buffer_append_byte(buffer, 0);
183
180
  } else {
184
181
  pm_buffer_append_byte(buffer, 1);
185
- pm_serialize_location(parser, &((pm_array_pattern_node_t *)node)->closing_loc, buffer);
182
+ pm_serialize_location(&((pm_array_pattern_node_t *)node)->closing_loc, buffer);
186
183
  }
187
184
  break;
188
185
  }
@@ -190,11 +187,11 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
190
187
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
191
188
  pm_serialize_node(parser, (pm_node_t *)((pm_assoc_node_t *)node)->key, buffer);
192
189
  pm_serialize_node(parser, (pm_node_t *)((pm_assoc_node_t *)node)->value, buffer);
193
- if (((pm_assoc_node_t *)node)->operator_loc.start == NULL) {
190
+ if (((pm_assoc_node_t *)node)->operator_loc.length == 0) {
194
191
  pm_buffer_append_byte(buffer, 0);
195
192
  } else {
196
193
  pm_buffer_append_byte(buffer, 1);
197
- pm_serialize_location(parser, &((pm_assoc_node_t *)node)->operator_loc, buffer);
194
+ pm_serialize_location(&((pm_assoc_node_t *)node)->operator_loc, buffer);
198
195
  }
199
196
  break;
200
197
  }
@@ -205,7 +202,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
205
202
  } else {
206
203
  pm_serialize_node(parser, (pm_node_t *)((pm_assoc_splat_node_t *)node)->value, buffer);
207
204
  }
208
- pm_serialize_location(parser, &((pm_assoc_splat_node_t *)node)->operator_loc, buffer);
205
+ pm_serialize_location(&((pm_assoc_splat_node_t *)node)->operator_loc, buffer);
209
206
  break;
210
207
  }
211
208
  case PM_BACK_REFERENCE_READ_NODE: {
@@ -215,11 +212,11 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
215
212
  }
216
213
  case PM_BEGIN_NODE: {
217
214
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
218
- if (((pm_begin_node_t *)node)->begin_keyword_loc.start == NULL) {
215
+ if (((pm_begin_node_t *)node)->begin_keyword_loc.length == 0) {
219
216
  pm_buffer_append_byte(buffer, 0);
220
217
  } else {
221
218
  pm_buffer_append_byte(buffer, 1);
222
- pm_serialize_location(parser, &((pm_begin_node_t *)node)->begin_keyword_loc, buffer);
219
+ pm_serialize_location(&((pm_begin_node_t *)node)->begin_keyword_loc, buffer);
223
220
  }
224
221
  if (((pm_begin_node_t *)node)->statements == NULL) {
225
222
  pm_buffer_append_byte(buffer, 0);
@@ -241,11 +238,11 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
241
238
  } else {
242
239
  pm_serialize_node(parser, (pm_node_t *)((pm_begin_node_t *)node)->ensure_clause, buffer);
243
240
  }
244
- if (((pm_begin_node_t *)node)->end_keyword_loc.start == NULL) {
241
+ if (((pm_begin_node_t *)node)->end_keyword_loc.length == 0) {
245
242
  pm_buffer_append_byte(buffer, 0);
246
243
  } else {
247
244
  pm_buffer_append_byte(buffer, 1);
248
- pm_serialize_location(parser, &((pm_begin_node_t *)node)->end_keyword_loc, buffer);
245
+ pm_serialize_location(&((pm_begin_node_t *)node)->end_keyword_loc, buffer);
249
246
  }
250
247
  break;
251
248
  }
@@ -256,7 +253,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
256
253
  } else {
257
254
  pm_serialize_node(parser, (pm_node_t *)((pm_block_argument_node_t *)node)->expression, buffer);
258
255
  }
259
- pm_serialize_location(parser, &((pm_block_argument_node_t *)node)->operator_loc, buffer);
256
+ pm_serialize_location(&((pm_block_argument_node_t *)node)->operator_loc, buffer);
260
257
  break;
261
258
  }
262
259
  case PM_BLOCK_LOCAL_VARIABLE_NODE: {
@@ -281,20 +278,20 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
281
278
  } else {
282
279
  pm_serialize_node(parser, (pm_node_t *)((pm_block_node_t *)node)->body, buffer);
283
280
  }
284
- pm_serialize_location(parser, &((pm_block_node_t *)node)->opening_loc, buffer);
285
- pm_serialize_location(parser, &((pm_block_node_t *)node)->closing_loc, buffer);
281
+ pm_serialize_location(&((pm_block_node_t *)node)->opening_loc, buffer);
282
+ pm_serialize_location(&((pm_block_node_t *)node)->closing_loc, buffer);
286
283
  break;
287
284
  }
288
285
  case PM_BLOCK_PARAMETER_NODE: {
289
286
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
290
287
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_block_parameter_node_t *)node)->name));
291
- if (((pm_block_parameter_node_t *)node)->name_loc.start == NULL) {
288
+ if (((pm_block_parameter_node_t *)node)->name_loc.length == 0) {
292
289
  pm_buffer_append_byte(buffer, 0);
293
290
  } else {
294
291
  pm_buffer_append_byte(buffer, 1);
295
- pm_serialize_location(parser, &((pm_block_parameter_node_t *)node)->name_loc, buffer);
292
+ pm_serialize_location(&((pm_block_parameter_node_t *)node)->name_loc, buffer);
296
293
  }
297
- pm_serialize_location(parser, &((pm_block_parameter_node_t *)node)->operator_loc, buffer);
294
+ pm_serialize_location(&((pm_block_parameter_node_t *)node)->operator_loc, buffer);
298
295
  break;
299
296
  }
300
297
  case PM_BLOCK_PARAMETERS_NODE: {
@@ -309,17 +306,17 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
309
306
  for (uint32_t index = 0; index < locals_size; index++) {
310
307
  pm_serialize_node(parser, (pm_node_t *) ((pm_block_parameters_node_t *)node)->locals.nodes[index], buffer);
311
308
  }
312
- if (((pm_block_parameters_node_t *)node)->opening_loc.start == NULL) {
309
+ if (((pm_block_parameters_node_t *)node)->opening_loc.length == 0) {
313
310
  pm_buffer_append_byte(buffer, 0);
314
311
  } else {
315
312
  pm_buffer_append_byte(buffer, 1);
316
- pm_serialize_location(parser, &((pm_block_parameters_node_t *)node)->opening_loc, buffer);
313
+ pm_serialize_location(&((pm_block_parameters_node_t *)node)->opening_loc, buffer);
317
314
  }
318
- if (((pm_block_parameters_node_t *)node)->closing_loc.start == NULL) {
315
+ if (((pm_block_parameters_node_t *)node)->closing_loc.length == 0) {
319
316
  pm_buffer_append_byte(buffer, 0);
320
317
  } else {
321
318
  pm_buffer_append_byte(buffer, 1);
322
- pm_serialize_location(parser, &((pm_block_parameters_node_t *)node)->closing_loc, buffer);
319
+ pm_serialize_location(&((pm_block_parameters_node_t *)node)->closing_loc, buffer);
323
320
  }
324
321
  break;
325
322
  }
@@ -330,7 +327,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
330
327
  } else {
331
328
  pm_serialize_node(parser, (pm_node_t *)((pm_break_node_t *)node)->arguments, buffer);
332
329
  }
333
- pm_serialize_location(parser, &((pm_break_node_t *)node)->keyword_loc, buffer);
330
+ pm_serialize_location(&((pm_break_node_t *)node)->keyword_loc, buffer);
334
331
  break;
335
332
  }
336
333
  case PM_CALL_AND_WRITE_NODE: {
@@ -340,21 +337,21 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
340
337
  } else {
341
338
  pm_serialize_node(parser, (pm_node_t *)((pm_call_and_write_node_t *)node)->receiver, buffer);
342
339
  }
343
- if (((pm_call_and_write_node_t *)node)->call_operator_loc.start == NULL) {
340
+ if (((pm_call_and_write_node_t *)node)->call_operator_loc.length == 0) {
344
341
  pm_buffer_append_byte(buffer, 0);
345
342
  } else {
346
343
  pm_buffer_append_byte(buffer, 1);
347
- pm_serialize_location(parser, &((pm_call_and_write_node_t *)node)->call_operator_loc, buffer);
344
+ pm_serialize_location(&((pm_call_and_write_node_t *)node)->call_operator_loc, buffer);
348
345
  }
349
- if (((pm_call_and_write_node_t *)node)->message_loc.start == NULL) {
346
+ if (((pm_call_and_write_node_t *)node)->message_loc.length == 0) {
350
347
  pm_buffer_append_byte(buffer, 0);
351
348
  } else {
352
349
  pm_buffer_append_byte(buffer, 1);
353
- pm_serialize_location(parser, &((pm_call_and_write_node_t *)node)->message_loc, buffer);
350
+ pm_serialize_location(&((pm_call_and_write_node_t *)node)->message_loc, buffer);
354
351
  }
355
352
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_call_and_write_node_t *)node)->read_name));
356
353
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_call_and_write_node_t *)node)->write_name));
357
- pm_serialize_location(parser, &((pm_call_and_write_node_t *)node)->operator_loc, buffer);
354
+ pm_serialize_location(&((pm_call_and_write_node_t *)node)->operator_loc, buffer);
358
355
  pm_serialize_node(parser, (pm_node_t *)((pm_call_and_write_node_t *)node)->value, buffer);
359
356
  break;
360
357
  }
@@ -365,41 +362,41 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
365
362
  } else {
366
363
  pm_serialize_node(parser, (pm_node_t *)((pm_call_node_t *)node)->receiver, buffer);
367
364
  }
368
- if (((pm_call_node_t *)node)->call_operator_loc.start == NULL) {
365
+ if (((pm_call_node_t *)node)->call_operator_loc.length == 0) {
369
366
  pm_buffer_append_byte(buffer, 0);
370
367
  } else {
371
368
  pm_buffer_append_byte(buffer, 1);
372
- pm_serialize_location(parser, &((pm_call_node_t *)node)->call_operator_loc, buffer);
369
+ pm_serialize_location(&((pm_call_node_t *)node)->call_operator_loc, buffer);
373
370
  }
374
371
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_call_node_t *)node)->name));
375
- if (((pm_call_node_t *)node)->message_loc.start == NULL) {
372
+ if (((pm_call_node_t *)node)->message_loc.length == 0) {
376
373
  pm_buffer_append_byte(buffer, 0);
377
374
  } else {
378
375
  pm_buffer_append_byte(buffer, 1);
379
- pm_serialize_location(parser, &((pm_call_node_t *)node)->message_loc, buffer);
376
+ pm_serialize_location(&((pm_call_node_t *)node)->message_loc, buffer);
380
377
  }
381
- if (((pm_call_node_t *)node)->opening_loc.start == NULL) {
378
+ if (((pm_call_node_t *)node)->opening_loc.length == 0) {
382
379
  pm_buffer_append_byte(buffer, 0);
383
380
  } else {
384
381
  pm_buffer_append_byte(buffer, 1);
385
- pm_serialize_location(parser, &((pm_call_node_t *)node)->opening_loc, buffer);
382
+ pm_serialize_location(&((pm_call_node_t *)node)->opening_loc, buffer);
386
383
  }
387
384
  if (((pm_call_node_t *)node)->arguments == NULL) {
388
385
  pm_buffer_append_byte(buffer, 0);
389
386
  } else {
390
387
  pm_serialize_node(parser, (pm_node_t *)((pm_call_node_t *)node)->arguments, buffer);
391
388
  }
392
- if (((pm_call_node_t *)node)->closing_loc.start == NULL) {
389
+ if (((pm_call_node_t *)node)->closing_loc.length == 0) {
393
390
  pm_buffer_append_byte(buffer, 0);
394
391
  } else {
395
392
  pm_buffer_append_byte(buffer, 1);
396
- pm_serialize_location(parser, &((pm_call_node_t *)node)->closing_loc, buffer);
393
+ pm_serialize_location(&((pm_call_node_t *)node)->closing_loc, buffer);
397
394
  }
398
- if (((pm_call_node_t *)node)->equal_loc.start == NULL) {
395
+ if (((pm_call_node_t *)node)->equal_loc.length == 0) {
399
396
  pm_buffer_append_byte(buffer, 0);
400
397
  } else {
401
398
  pm_buffer_append_byte(buffer, 1);
402
- pm_serialize_location(parser, &((pm_call_node_t *)node)->equal_loc, buffer);
399
+ pm_serialize_location(&((pm_call_node_t *)node)->equal_loc, buffer);
403
400
  }
404
401
  if (((pm_call_node_t *)node)->block == NULL) {
405
402
  pm_buffer_append_byte(buffer, 0);
@@ -415,22 +412,22 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
415
412
  } else {
416
413
  pm_serialize_node(parser, (pm_node_t *)((pm_call_operator_write_node_t *)node)->receiver, buffer);
417
414
  }
418
- if (((pm_call_operator_write_node_t *)node)->call_operator_loc.start == NULL) {
415
+ if (((pm_call_operator_write_node_t *)node)->call_operator_loc.length == 0) {
419
416
  pm_buffer_append_byte(buffer, 0);
420
417
  } else {
421
418
  pm_buffer_append_byte(buffer, 1);
422
- pm_serialize_location(parser, &((pm_call_operator_write_node_t *)node)->call_operator_loc, buffer);
419
+ pm_serialize_location(&((pm_call_operator_write_node_t *)node)->call_operator_loc, buffer);
423
420
  }
424
- if (((pm_call_operator_write_node_t *)node)->message_loc.start == NULL) {
421
+ if (((pm_call_operator_write_node_t *)node)->message_loc.length == 0) {
425
422
  pm_buffer_append_byte(buffer, 0);
426
423
  } else {
427
424
  pm_buffer_append_byte(buffer, 1);
428
- pm_serialize_location(parser, &((pm_call_operator_write_node_t *)node)->message_loc, buffer);
425
+ pm_serialize_location(&((pm_call_operator_write_node_t *)node)->message_loc, buffer);
429
426
  }
430
427
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_call_operator_write_node_t *)node)->read_name));
431
428
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_call_operator_write_node_t *)node)->write_name));
432
429
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_call_operator_write_node_t *)node)->binary_operator));
433
- pm_serialize_location(parser, &((pm_call_operator_write_node_t *)node)->binary_operator_loc, buffer);
430
+ pm_serialize_location(&((pm_call_operator_write_node_t *)node)->binary_operator_loc, buffer);
434
431
  pm_serialize_node(parser, (pm_node_t *)((pm_call_operator_write_node_t *)node)->value, buffer);
435
432
  break;
436
433
  }
@@ -441,37 +438,37 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
441
438
  } else {
442
439
  pm_serialize_node(parser, (pm_node_t *)((pm_call_or_write_node_t *)node)->receiver, buffer);
443
440
  }
444
- if (((pm_call_or_write_node_t *)node)->call_operator_loc.start == NULL) {
441
+ if (((pm_call_or_write_node_t *)node)->call_operator_loc.length == 0) {
445
442
  pm_buffer_append_byte(buffer, 0);
446
443
  } else {
447
444
  pm_buffer_append_byte(buffer, 1);
448
- pm_serialize_location(parser, &((pm_call_or_write_node_t *)node)->call_operator_loc, buffer);
445
+ pm_serialize_location(&((pm_call_or_write_node_t *)node)->call_operator_loc, buffer);
449
446
  }
450
- if (((pm_call_or_write_node_t *)node)->message_loc.start == NULL) {
447
+ if (((pm_call_or_write_node_t *)node)->message_loc.length == 0) {
451
448
  pm_buffer_append_byte(buffer, 0);
452
449
  } else {
453
450
  pm_buffer_append_byte(buffer, 1);
454
- pm_serialize_location(parser, &((pm_call_or_write_node_t *)node)->message_loc, buffer);
451
+ pm_serialize_location(&((pm_call_or_write_node_t *)node)->message_loc, buffer);
455
452
  }
456
453
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_call_or_write_node_t *)node)->read_name));
457
454
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_call_or_write_node_t *)node)->write_name));
458
- pm_serialize_location(parser, &((pm_call_or_write_node_t *)node)->operator_loc, buffer);
455
+ pm_serialize_location(&((pm_call_or_write_node_t *)node)->operator_loc, buffer);
459
456
  pm_serialize_node(parser, (pm_node_t *)((pm_call_or_write_node_t *)node)->value, buffer);
460
457
  break;
461
458
  }
462
459
  case PM_CALL_TARGET_NODE: {
463
460
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
464
461
  pm_serialize_node(parser, (pm_node_t *)((pm_call_target_node_t *)node)->receiver, buffer);
465
- pm_serialize_location(parser, &((pm_call_target_node_t *)node)->call_operator_loc, buffer);
462
+ pm_serialize_location(&((pm_call_target_node_t *)node)->call_operator_loc, buffer);
466
463
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_call_target_node_t *)node)->name));
467
- pm_serialize_location(parser, &((pm_call_target_node_t *)node)->message_loc, buffer);
464
+ pm_serialize_location(&((pm_call_target_node_t *)node)->message_loc, buffer);
468
465
  break;
469
466
  }
470
467
  case PM_CAPTURE_PATTERN_NODE: {
471
468
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
472
469
  pm_serialize_node(parser, (pm_node_t *)((pm_capture_pattern_node_t *)node)->value, buffer);
473
470
  pm_serialize_node(parser, (pm_node_t *)((pm_capture_pattern_node_t *)node)->target, buffer);
474
- pm_serialize_location(parser, &((pm_capture_pattern_node_t *)node)->operator_loc, buffer);
471
+ pm_serialize_location(&((pm_capture_pattern_node_t *)node)->operator_loc, buffer);
475
472
  break;
476
473
  }
477
474
  case PM_CASE_MATCH_NODE: {
@@ -491,8 +488,8 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
491
488
  } else {
492
489
  pm_serialize_node(parser, (pm_node_t *)((pm_case_match_node_t *)node)->else_clause, buffer);
493
490
  }
494
- pm_serialize_location(parser, &((pm_case_match_node_t *)node)->case_keyword_loc, buffer);
495
- pm_serialize_location(parser, &((pm_case_match_node_t *)node)->end_keyword_loc, buffer);
491
+ pm_serialize_location(&((pm_case_match_node_t *)node)->case_keyword_loc, buffer);
492
+ pm_serialize_location(&((pm_case_match_node_t *)node)->end_keyword_loc, buffer);
496
493
  break;
497
494
  }
498
495
  case PM_CASE_NODE: {
@@ -512,8 +509,8 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
512
509
  } else {
513
510
  pm_serialize_node(parser, (pm_node_t *)((pm_case_node_t *)node)->else_clause, buffer);
514
511
  }
515
- pm_serialize_location(parser, &((pm_case_node_t *)node)->case_keyword_loc, buffer);
516
- pm_serialize_location(parser, &((pm_case_node_t *)node)->end_keyword_loc, buffer);
512
+ pm_serialize_location(&((pm_case_node_t *)node)->case_keyword_loc, buffer);
513
+ pm_serialize_location(&((pm_case_node_t *)node)->end_keyword_loc, buffer);
517
514
  break;
518
515
  }
519
516
  case PM_CLASS_NODE: {
@@ -523,13 +520,13 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
523
520
  for (uint32_t index = 0; index < locals_size; index++) {
524
521
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_class_node_t *)node)->locals.ids[index]));
525
522
  }
526
- pm_serialize_location(parser, &((pm_class_node_t *)node)->class_keyword_loc, buffer);
523
+ pm_serialize_location(&((pm_class_node_t *)node)->class_keyword_loc, buffer);
527
524
  pm_serialize_node(parser, (pm_node_t *)((pm_class_node_t *)node)->constant_path, buffer);
528
- if (((pm_class_node_t *)node)->inheritance_operator_loc.start == NULL) {
525
+ if (((pm_class_node_t *)node)->inheritance_operator_loc.length == 0) {
529
526
  pm_buffer_append_byte(buffer, 0);
530
527
  } else {
531
528
  pm_buffer_append_byte(buffer, 1);
532
- pm_serialize_location(parser, &((pm_class_node_t *)node)->inheritance_operator_loc, buffer);
529
+ pm_serialize_location(&((pm_class_node_t *)node)->inheritance_operator_loc, buffer);
533
530
  }
534
531
  if (((pm_class_node_t *)node)->superclass == NULL) {
535
532
  pm_buffer_append_byte(buffer, 0);
@@ -541,23 +538,23 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
541
538
  } else {
542
539
  pm_serialize_node(parser, (pm_node_t *)((pm_class_node_t *)node)->body, buffer);
543
540
  }
544
- pm_serialize_location(parser, &((pm_class_node_t *)node)->end_keyword_loc, buffer);
541
+ pm_serialize_location(&((pm_class_node_t *)node)->end_keyword_loc, buffer);
545
542
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_class_node_t *)node)->name));
546
543
  break;
547
544
  }
548
545
  case PM_CLASS_VARIABLE_AND_WRITE_NODE: {
549
546
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
550
547
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_class_variable_and_write_node_t *)node)->name));
551
- pm_serialize_location(parser, &((pm_class_variable_and_write_node_t *)node)->name_loc, buffer);
552
- pm_serialize_location(parser, &((pm_class_variable_and_write_node_t *)node)->operator_loc, buffer);
548
+ pm_serialize_location(&((pm_class_variable_and_write_node_t *)node)->name_loc, buffer);
549
+ pm_serialize_location(&((pm_class_variable_and_write_node_t *)node)->operator_loc, buffer);
553
550
  pm_serialize_node(parser, (pm_node_t *)((pm_class_variable_and_write_node_t *)node)->value, buffer);
554
551
  break;
555
552
  }
556
553
  case PM_CLASS_VARIABLE_OPERATOR_WRITE_NODE: {
557
554
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
558
555
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_class_variable_operator_write_node_t *)node)->name));
559
- pm_serialize_location(parser, &((pm_class_variable_operator_write_node_t *)node)->name_loc, buffer);
560
- pm_serialize_location(parser, &((pm_class_variable_operator_write_node_t *)node)->binary_operator_loc, buffer);
556
+ pm_serialize_location(&((pm_class_variable_operator_write_node_t *)node)->name_loc, buffer);
557
+ pm_serialize_location(&((pm_class_variable_operator_write_node_t *)node)->binary_operator_loc, buffer);
561
558
  pm_serialize_node(parser, (pm_node_t *)((pm_class_variable_operator_write_node_t *)node)->value, buffer);
562
559
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_class_variable_operator_write_node_t *)node)->binary_operator));
563
560
  break;
@@ -565,8 +562,8 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
565
562
  case PM_CLASS_VARIABLE_OR_WRITE_NODE: {
566
563
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
567
564
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_class_variable_or_write_node_t *)node)->name));
568
- pm_serialize_location(parser, &((pm_class_variable_or_write_node_t *)node)->name_loc, buffer);
569
- pm_serialize_location(parser, &((pm_class_variable_or_write_node_t *)node)->operator_loc, buffer);
565
+ pm_serialize_location(&((pm_class_variable_or_write_node_t *)node)->name_loc, buffer);
566
+ pm_serialize_location(&((pm_class_variable_or_write_node_t *)node)->operator_loc, buffer);
570
567
  pm_serialize_node(parser, (pm_node_t *)((pm_class_variable_or_write_node_t *)node)->value, buffer);
571
568
  break;
572
569
  }
@@ -583,24 +580,24 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
583
580
  case PM_CLASS_VARIABLE_WRITE_NODE: {
584
581
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
585
582
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_class_variable_write_node_t *)node)->name));
586
- pm_serialize_location(parser, &((pm_class_variable_write_node_t *)node)->name_loc, buffer);
583
+ pm_serialize_location(&((pm_class_variable_write_node_t *)node)->name_loc, buffer);
587
584
  pm_serialize_node(parser, (pm_node_t *)((pm_class_variable_write_node_t *)node)->value, buffer);
588
- pm_serialize_location(parser, &((pm_class_variable_write_node_t *)node)->operator_loc, buffer);
585
+ pm_serialize_location(&((pm_class_variable_write_node_t *)node)->operator_loc, buffer);
589
586
  break;
590
587
  }
591
588
  case PM_CONSTANT_AND_WRITE_NODE: {
592
589
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
593
590
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_constant_and_write_node_t *)node)->name));
594
- pm_serialize_location(parser, &((pm_constant_and_write_node_t *)node)->name_loc, buffer);
595
- pm_serialize_location(parser, &((pm_constant_and_write_node_t *)node)->operator_loc, buffer);
591
+ pm_serialize_location(&((pm_constant_and_write_node_t *)node)->name_loc, buffer);
592
+ pm_serialize_location(&((pm_constant_and_write_node_t *)node)->operator_loc, buffer);
596
593
  pm_serialize_node(parser, (pm_node_t *)((pm_constant_and_write_node_t *)node)->value, buffer);
597
594
  break;
598
595
  }
599
596
  case PM_CONSTANT_OPERATOR_WRITE_NODE: {
600
597
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
601
598
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_constant_operator_write_node_t *)node)->name));
602
- pm_serialize_location(parser, &((pm_constant_operator_write_node_t *)node)->name_loc, buffer);
603
- pm_serialize_location(parser, &((pm_constant_operator_write_node_t *)node)->binary_operator_loc, buffer);
599
+ pm_serialize_location(&((pm_constant_operator_write_node_t *)node)->name_loc, buffer);
600
+ pm_serialize_location(&((pm_constant_operator_write_node_t *)node)->binary_operator_loc, buffer);
604
601
  pm_serialize_node(parser, (pm_node_t *)((pm_constant_operator_write_node_t *)node)->value, buffer);
605
602
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_constant_operator_write_node_t *)node)->binary_operator));
606
603
  break;
@@ -608,15 +605,15 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
608
605
  case PM_CONSTANT_OR_WRITE_NODE: {
609
606
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
610
607
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_constant_or_write_node_t *)node)->name));
611
- pm_serialize_location(parser, &((pm_constant_or_write_node_t *)node)->name_loc, buffer);
612
- pm_serialize_location(parser, &((pm_constant_or_write_node_t *)node)->operator_loc, buffer);
608
+ pm_serialize_location(&((pm_constant_or_write_node_t *)node)->name_loc, buffer);
609
+ pm_serialize_location(&((pm_constant_or_write_node_t *)node)->operator_loc, buffer);
613
610
  pm_serialize_node(parser, (pm_node_t *)((pm_constant_or_write_node_t *)node)->value, buffer);
614
611
  break;
615
612
  }
616
613
  case PM_CONSTANT_PATH_AND_WRITE_NODE: {
617
614
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
618
615
  pm_serialize_node(parser, (pm_node_t *)((pm_constant_path_and_write_node_t *)node)->target, buffer);
619
- pm_serialize_location(parser, &((pm_constant_path_and_write_node_t *)node)->operator_loc, buffer);
616
+ pm_serialize_location(&((pm_constant_path_and_write_node_t *)node)->operator_loc, buffer);
620
617
  pm_serialize_node(parser, (pm_node_t *)((pm_constant_path_and_write_node_t *)node)->value, buffer);
621
618
  break;
622
619
  }
@@ -628,14 +625,14 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
628
625
  pm_serialize_node(parser, (pm_node_t *)((pm_constant_path_node_t *)node)->parent, buffer);
629
626
  }
630
627
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_constant_path_node_t *)node)->name));
631
- pm_serialize_location(parser, &((pm_constant_path_node_t *)node)->delimiter_loc, buffer);
632
- pm_serialize_location(parser, &((pm_constant_path_node_t *)node)->name_loc, buffer);
628
+ pm_serialize_location(&((pm_constant_path_node_t *)node)->delimiter_loc, buffer);
629
+ pm_serialize_location(&((pm_constant_path_node_t *)node)->name_loc, buffer);
633
630
  break;
634
631
  }
635
632
  case PM_CONSTANT_PATH_OPERATOR_WRITE_NODE: {
636
633
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
637
634
  pm_serialize_node(parser, (pm_node_t *)((pm_constant_path_operator_write_node_t *)node)->target, buffer);
638
- pm_serialize_location(parser, &((pm_constant_path_operator_write_node_t *)node)->binary_operator_loc, buffer);
635
+ pm_serialize_location(&((pm_constant_path_operator_write_node_t *)node)->binary_operator_loc, buffer);
639
636
  pm_serialize_node(parser, (pm_node_t *)((pm_constant_path_operator_write_node_t *)node)->value, buffer);
640
637
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_constant_path_operator_write_node_t *)node)->binary_operator));
641
638
  break;
@@ -643,7 +640,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
643
640
  case PM_CONSTANT_PATH_OR_WRITE_NODE: {
644
641
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
645
642
  pm_serialize_node(parser, (pm_node_t *)((pm_constant_path_or_write_node_t *)node)->target, buffer);
646
- pm_serialize_location(parser, &((pm_constant_path_or_write_node_t *)node)->operator_loc, buffer);
643
+ pm_serialize_location(&((pm_constant_path_or_write_node_t *)node)->operator_loc, buffer);
647
644
  pm_serialize_node(parser, (pm_node_t *)((pm_constant_path_or_write_node_t *)node)->value, buffer);
648
645
  break;
649
646
  }
@@ -655,14 +652,14 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
655
652
  pm_serialize_node(parser, (pm_node_t *)((pm_constant_path_target_node_t *)node)->parent, buffer);
656
653
  }
657
654
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_constant_path_target_node_t *)node)->name));
658
- pm_serialize_location(parser, &((pm_constant_path_target_node_t *)node)->delimiter_loc, buffer);
659
- pm_serialize_location(parser, &((pm_constant_path_target_node_t *)node)->name_loc, buffer);
655
+ pm_serialize_location(&((pm_constant_path_target_node_t *)node)->delimiter_loc, buffer);
656
+ pm_serialize_location(&((pm_constant_path_target_node_t *)node)->name_loc, buffer);
660
657
  break;
661
658
  }
662
659
  case PM_CONSTANT_PATH_WRITE_NODE: {
663
660
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
664
661
  pm_serialize_node(parser, (pm_node_t *)((pm_constant_path_write_node_t *)node)->target, buffer);
665
- pm_serialize_location(parser, &((pm_constant_path_write_node_t *)node)->operator_loc, buffer);
662
+ pm_serialize_location(&((pm_constant_path_write_node_t *)node)->operator_loc, buffer);
666
663
  pm_serialize_node(parser, (pm_node_t *)((pm_constant_path_write_node_t *)node)->value, buffer);
667
664
  break;
668
665
  }
@@ -679,9 +676,9 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
679
676
  case PM_CONSTANT_WRITE_NODE: {
680
677
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
681
678
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_constant_write_node_t *)node)->name));
682
- pm_serialize_location(parser, &((pm_constant_write_node_t *)node)->name_loc, buffer);
679
+ pm_serialize_location(&((pm_constant_write_node_t *)node)->name_loc, buffer);
683
680
  pm_serialize_node(parser, (pm_node_t *)((pm_constant_write_node_t *)node)->value, buffer);
684
- pm_serialize_location(parser, &((pm_constant_write_node_t *)node)->operator_loc, buffer);
681
+ pm_serialize_location(&((pm_constant_write_node_t *)node)->operator_loc, buffer);
685
682
  break;
686
683
  }
687
684
  case PM_DEF_NODE: {
@@ -691,7 +688,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
691
688
  pm_buffer_append_string(buffer, "\0\0\0\0", 4); /* consume 4 bytes, updated below */
692
689
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
693
690
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_def_node_t *)node)->name));
694
- pm_serialize_location(parser, &((pm_def_node_t *)node)->name_loc, buffer);
691
+ pm_serialize_location(&((pm_def_node_t *)node)->name_loc, buffer);
695
692
  if (((pm_def_node_t *)node)->receiver == NULL) {
696
693
  pm_buffer_append_byte(buffer, 0);
697
694
  } else {
@@ -712,102 +709,111 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
712
709
  for (uint32_t index = 0; index < locals_size; index++) {
713
710
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_def_node_t *)node)->locals.ids[index]));
714
711
  }
715
- pm_serialize_location(parser, &((pm_def_node_t *)node)->def_keyword_loc, buffer);
716
- if (((pm_def_node_t *)node)->operator_loc.start == NULL) {
712
+ pm_serialize_location(&((pm_def_node_t *)node)->def_keyword_loc, buffer);
713
+ if (((pm_def_node_t *)node)->operator_loc.length == 0) {
717
714
  pm_buffer_append_byte(buffer, 0);
718
715
  } else {
719
716
  pm_buffer_append_byte(buffer, 1);
720
- pm_serialize_location(parser, &((pm_def_node_t *)node)->operator_loc, buffer);
717
+ pm_serialize_location(&((pm_def_node_t *)node)->operator_loc, buffer);
721
718
  }
722
- if (((pm_def_node_t *)node)->lparen_loc.start == NULL) {
719
+ if (((pm_def_node_t *)node)->lparen_loc.length == 0) {
723
720
  pm_buffer_append_byte(buffer, 0);
724
721
  } else {
725
722
  pm_buffer_append_byte(buffer, 1);
726
- pm_serialize_location(parser, &((pm_def_node_t *)node)->lparen_loc, buffer);
723
+ pm_serialize_location(&((pm_def_node_t *)node)->lparen_loc, buffer);
727
724
  }
728
- if (((pm_def_node_t *)node)->rparen_loc.start == NULL) {
725
+ if (((pm_def_node_t *)node)->rparen_loc.length == 0) {
729
726
  pm_buffer_append_byte(buffer, 0);
730
727
  } else {
731
728
  pm_buffer_append_byte(buffer, 1);
732
- pm_serialize_location(parser, &((pm_def_node_t *)node)->rparen_loc, buffer);
729
+ pm_serialize_location(&((pm_def_node_t *)node)->rparen_loc, buffer);
733
730
  }
734
- if (((pm_def_node_t *)node)->equal_loc.start == NULL) {
731
+ if (((pm_def_node_t *)node)->equal_loc.length == 0) {
735
732
  pm_buffer_append_byte(buffer, 0);
736
733
  } else {
737
734
  pm_buffer_append_byte(buffer, 1);
738
- pm_serialize_location(parser, &((pm_def_node_t *)node)->equal_loc, buffer);
735
+ pm_serialize_location(&((pm_def_node_t *)node)->equal_loc, buffer);
739
736
  }
740
- if (((pm_def_node_t *)node)->end_keyword_loc.start == NULL) {
737
+ if (((pm_def_node_t *)node)->end_keyword_loc.length == 0) {
741
738
  pm_buffer_append_byte(buffer, 0);
742
739
  } else {
743
740
  pm_buffer_append_byte(buffer, 1);
744
- pm_serialize_location(parser, &((pm_def_node_t *)node)->end_keyword_loc, buffer);
741
+ pm_serialize_location(&((pm_def_node_t *)node)->end_keyword_loc, buffer);
745
742
  }
746
743
  // serialize length
747
- uint32_t length = pm_sizet_to_u32(buffer->length - offset - sizeof(uint32_t));
744
+ uint32_t length = pm_sizet_to_u32(buffer->length - length_offset);
748
745
  memcpy(buffer->value + length_offset, &length, sizeof(uint32_t));
749
746
  break;
750
747
  }
751
748
  case PM_DEFINED_NODE: {
752
749
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
753
- if (((pm_defined_node_t *)node)->lparen_loc.start == NULL) {
750
+ if (((pm_defined_node_t *)node)->lparen_loc.length == 0) {
754
751
  pm_buffer_append_byte(buffer, 0);
755
752
  } else {
756
753
  pm_buffer_append_byte(buffer, 1);
757
- pm_serialize_location(parser, &((pm_defined_node_t *)node)->lparen_loc, buffer);
754
+ pm_serialize_location(&((pm_defined_node_t *)node)->lparen_loc, buffer);
758
755
  }
759
756
  pm_serialize_node(parser, (pm_node_t *)((pm_defined_node_t *)node)->value, buffer);
760
- if (((pm_defined_node_t *)node)->rparen_loc.start == NULL) {
757
+ if (((pm_defined_node_t *)node)->rparen_loc.length == 0) {
761
758
  pm_buffer_append_byte(buffer, 0);
762
759
  } else {
763
760
  pm_buffer_append_byte(buffer, 1);
764
- pm_serialize_location(parser, &((pm_defined_node_t *)node)->rparen_loc, buffer);
761
+ pm_serialize_location(&((pm_defined_node_t *)node)->rparen_loc, buffer);
765
762
  }
766
- pm_serialize_location(parser, &((pm_defined_node_t *)node)->keyword_loc, buffer);
763
+ pm_serialize_location(&((pm_defined_node_t *)node)->keyword_loc, buffer);
767
764
  break;
768
765
  }
769
766
  case PM_ELSE_NODE: {
770
767
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
771
- pm_serialize_location(parser, &((pm_else_node_t *)node)->else_keyword_loc, buffer);
768
+ pm_serialize_location(&((pm_else_node_t *)node)->else_keyword_loc, buffer);
772
769
  if (((pm_else_node_t *)node)->statements == NULL) {
773
770
  pm_buffer_append_byte(buffer, 0);
774
771
  } else {
775
772
  pm_serialize_node(parser, (pm_node_t *)((pm_else_node_t *)node)->statements, buffer);
776
773
  }
777
- if (((pm_else_node_t *)node)->end_keyword_loc.start == NULL) {
774
+ if (((pm_else_node_t *)node)->end_keyword_loc.length == 0) {
778
775
  pm_buffer_append_byte(buffer, 0);
779
776
  } else {
780
777
  pm_buffer_append_byte(buffer, 1);
781
- pm_serialize_location(parser, &((pm_else_node_t *)node)->end_keyword_loc, buffer);
778
+ pm_serialize_location(&((pm_else_node_t *)node)->end_keyword_loc, buffer);
782
779
  }
783
780
  break;
784
781
  }
785
782
  case PM_EMBEDDED_STATEMENTS_NODE: {
786
783
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
787
- pm_serialize_location(parser, &((pm_embedded_statements_node_t *)node)->opening_loc, buffer);
784
+ pm_serialize_location(&((pm_embedded_statements_node_t *)node)->opening_loc, buffer);
788
785
  if (((pm_embedded_statements_node_t *)node)->statements == NULL) {
789
786
  pm_buffer_append_byte(buffer, 0);
790
787
  } else {
791
788
  pm_serialize_node(parser, (pm_node_t *)((pm_embedded_statements_node_t *)node)->statements, buffer);
792
789
  }
793
- pm_serialize_location(parser, &((pm_embedded_statements_node_t *)node)->closing_loc, buffer);
790
+ pm_serialize_location(&((pm_embedded_statements_node_t *)node)->closing_loc, buffer);
794
791
  break;
795
792
  }
796
793
  case PM_EMBEDDED_VARIABLE_NODE: {
797
794
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
798
- pm_serialize_location(parser, &((pm_embedded_variable_node_t *)node)->operator_loc, buffer);
795
+ pm_serialize_location(&((pm_embedded_variable_node_t *)node)->operator_loc, buffer);
799
796
  pm_serialize_node(parser, (pm_node_t *)((pm_embedded_variable_node_t *)node)->variable, buffer);
800
797
  break;
801
798
  }
802
799
  case PM_ENSURE_NODE: {
803
800
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
804
- pm_serialize_location(parser, &((pm_ensure_node_t *)node)->ensure_keyword_loc, buffer);
801
+ pm_serialize_location(&((pm_ensure_node_t *)node)->ensure_keyword_loc, buffer);
805
802
  if (((pm_ensure_node_t *)node)->statements == NULL) {
806
803
  pm_buffer_append_byte(buffer, 0);
807
804
  } else {
808
805
  pm_serialize_node(parser, (pm_node_t *)((pm_ensure_node_t *)node)->statements, buffer);
809
806
  }
810
- pm_serialize_location(parser, &((pm_ensure_node_t *)node)->end_keyword_loc, buffer);
807
+ pm_serialize_location(&((pm_ensure_node_t *)node)->end_keyword_loc, buffer);
808
+ break;
809
+ }
810
+ case PM_ERROR_RECOVERY_NODE: {
811
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
812
+ if (((pm_error_recovery_node_t *)node)->unexpected == NULL) {
813
+ pm_buffer_append_byte(buffer, 0);
814
+ } else {
815
+ pm_serialize_node(parser, (pm_node_t *)((pm_error_recovery_node_t *)node)->unexpected, buffer);
816
+ }
811
817
  break;
812
818
  }
813
819
  case PM_FALSE_NODE: {
@@ -828,17 +834,17 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
828
834
  pm_serialize_node(parser, (pm_node_t *) ((pm_find_pattern_node_t *)node)->requireds.nodes[index], buffer);
829
835
  }
830
836
  pm_serialize_node(parser, (pm_node_t *)((pm_find_pattern_node_t *)node)->right, buffer);
831
- if (((pm_find_pattern_node_t *)node)->opening_loc.start == NULL) {
837
+ if (((pm_find_pattern_node_t *)node)->opening_loc.length == 0) {
832
838
  pm_buffer_append_byte(buffer, 0);
833
839
  } else {
834
840
  pm_buffer_append_byte(buffer, 1);
835
- pm_serialize_location(parser, &((pm_find_pattern_node_t *)node)->opening_loc, buffer);
841
+ pm_serialize_location(&((pm_find_pattern_node_t *)node)->opening_loc, buffer);
836
842
  }
837
- if (((pm_find_pattern_node_t *)node)->closing_loc.start == NULL) {
843
+ if (((pm_find_pattern_node_t *)node)->closing_loc.length == 0) {
838
844
  pm_buffer_append_byte(buffer, 0);
839
845
  } else {
840
846
  pm_buffer_append_byte(buffer, 1);
841
- pm_serialize_location(parser, &((pm_find_pattern_node_t *)node)->closing_loc, buffer);
847
+ pm_serialize_location(&((pm_find_pattern_node_t *)node)->closing_loc, buffer);
842
848
  }
843
849
  break;
844
850
  }
@@ -854,7 +860,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
854
860
  } else {
855
861
  pm_serialize_node(parser, (pm_node_t *)((pm_flip_flop_node_t *)node)->right, buffer);
856
862
  }
857
- pm_serialize_location(parser, &((pm_flip_flop_node_t *)node)->operator_loc, buffer);
863
+ pm_serialize_location(&((pm_flip_flop_node_t *)node)->operator_loc, buffer);
858
864
  break;
859
865
  }
860
866
  case PM_FLOAT_NODE: {
@@ -871,15 +877,15 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
871
877
  } else {
872
878
  pm_serialize_node(parser, (pm_node_t *)((pm_for_node_t *)node)->statements, buffer);
873
879
  }
874
- pm_serialize_location(parser, &((pm_for_node_t *)node)->for_keyword_loc, buffer);
875
- pm_serialize_location(parser, &((pm_for_node_t *)node)->in_keyword_loc, buffer);
876
- if (((pm_for_node_t *)node)->do_keyword_loc.start == NULL) {
880
+ pm_serialize_location(&((pm_for_node_t *)node)->for_keyword_loc, buffer);
881
+ pm_serialize_location(&((pm_for_node_t *)node)->in_keyword_loc, buffer);
882
+ if (((pm_for_node_t *)node)->do_keyword_loc.length == 0) {
877
883
  pm_buffer_append_byte(buffer, 0);
878
884
  } else {
879
885
  pm_buffer_append_byte(buffer, 1);
880
- pm_serialize_location(parser, &((pm_for_node_t *)node)->do_keyword_loc, buffer);
886
+ pm_serialize_location(&((pm_for_node_t *)node)->do_keyword_loc, buffer);
881
887
  }
882
- pm_serialize_location(parser, &((pm_for_node_t *)node)->end_keyword_loc, buffer);
888
+ pm_serialize_location(&((pm_for_node_t *)node)->end_keyword_loc, buffer);
883
889
  break;
884
890
  }
885
891
  case PM_FORWARDING_ARGUMENTS_NODE: {
@@ -892,6 +898,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
892
898
  }
893
899
  case PM_FORWARDING_SUPER_NODE: {
894
900
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
901
+ pm_serialize_location(&((pm_forwarding_super_node_t *)node)->keyword_loc, buffer);
895
902
  if (((pm_forwarding_super_node_t *)node)->block == NULL) {
896
903
  pm_buffer_append_byte(buffer, 0);
897
904
  } else {
@@ -902,16 +909,16 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
902
909
  case PM_GLOBAL_VARIABLE_AND_WRITE_NODE: {
903
910
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
904
911
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_global_variable_and_write_node_t *)node)->name));
905
- pm_serialize_location(parser, &((pm_global_variable_and_write_node_t *)node)->name_loc, buffer);
906
- pm_serialize_location(parser, &((pm_global_variable_and_write_node_t *)node)->operator_loc, buffer);
912
+ pm_serialize_location(&((pm_global_variable_and_write_node_t *)node)->name_loc, buffer);
913
+ pm_serialize_location(&((pm_global_variable_and_write_node_t *)node)->operator_loc, buffer);
907
914
  pm_serialize_node(parser, (pm_node_t *)((pm_global_variable_and_write_node_t *)node)->value, buffer);
908
915
  break;
909
916
  }
910
917
  case PM_GLOBAL_VARIABLE_OPERATOR_WRITE_NODE: {
911
918
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
912
919
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_global_variable_operator_write_node_t *)node)->name));
913
- pm_serialize_location(parser, &((pm_global_variable_operator_write_node_t *)node)->name_loc, buffer);
914
- pm_serialize_location(parser, &((pm_global_variable_operator_write_node_t *)node)->binary_operator_loc, buffer);
920
+ pm_serialize_location(&((pm_global_variable_operator_write_node_t *)node)->name_loc, buffer);
921
+ pm_serialize_location(&((pm_global_variable_operator_write_node_t *)node)->binary_operator_loc, buffer);
915
922
  pm_serialize_node(parser, (pm_node_t *)((pm_global_variable_operator_write_node_t *)node)->value, buffer);
916
923
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_global_variable_operator_write_node_t *)node)->binary_operator));
917
924
  break;
@@ -919,8 +926,8 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
919
926
  case PM_GLOBAL_VARIABLE_OR_WRITE_NODE: {
920
927
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
921
928
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_global_variable_or_write_node_t *)node)->name));
922
- pm_serialize_location(parser, &((pm_global_variable_or_write_node_t *)node)->name_loc, buffer);
923
- pm_serialize_location(parser, &((pm_global_variable_or_write_node_t *)node)->operator_loc, buffer);
929
+ pm_serialize_location(&((pm_global_variable_or_write_node_t *)node)->name_loc, buffer);
930
+ pm_serialize_location(&((pm_global_variable_or_write_node_t *)node)->operator_loc, buffer);
924
931
  pm_serialize_node(parser, (pm_node_t *)((pm_global_variable_or_write_node_t *)node)->value, buffer);
925
932
  break;
926
933
  }
@@ -937,20 +944,20 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
937
944
  case PM_GLOBAL_VARIABLE_WRITE_NODE: {
938
945
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
939
946
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_global_variable_write_node_t *)node)->name));
940
- pm_serialize_location(parser, &((pm_global_variable_write_node_t *)node)->name_loc, buffer);
947
+ pm_serialize_location(&((pm_global_variable_write_node_t *)node)->name_loc, buffer);
941
948
  pm_serialize_node(parser, (pm_node_t *)((pm_global_variable_write_node_t *)node)->value, buffer);
942
- pm_serialize_location(parser, &((pm_global_variable_write_node_t *)node)->operator_loc, buffer);
949
+ pm_serialize_location(&((pm_global_variable_write_node_t *)node)->operator_loc, buffer);
943
950
  break;
944
951
  }
945
952
  case PM_HASH_NODE: {
946
953
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
947
- pm_serialize_location(parser, &((pm_hash_node_t *)node)->opening_loc, buffer);
954
+ pm_serialize_location(&((pm_hash_node_t *)node)->opening_loc, buffer);
948
955
  uint32_t elements_size = pm_sizet_to_u32(((pm_hash_node_t *)node)->elements.size);
949
956
  pm_buffer_append_varuint(buffer, elements_size);
950
957
  for (uint32_t index = 0; index < elements_size; index++) {
951
958
  pm_serialize_node(parser, (pm_node_t *) ((pm_hash_node_t *)node)->elements.nodes[index], buffer);
952
959
  }
953
- pm_serialize_location(parser, &((pm_hash_node_t *)node)->closing_loc, buffer);
960
+ pm_serialize_location(&((pm_hash_node_t *)node)->closing_loc, buffer);
954
961
  break;
955
962
  }
956
963
  case PM_HASH_PATTERN_NODE: {
@@ -970,34 +977,34 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
970
977
  } else {
971
978
  pm_serialize_node(parser, (pm_node_t *)((pm_hash_pattern_node_t *)node)->rest, buffer);
972
979
  }
973
- if (((pm_hash_pattern_node_t *)node)->opening_loc.start == NULL) {
980
+ if (((pm_hash_pattern_node_t *)node)->opening_loc.length == 0) {
974
981
  pm_buffer_append_byte(buffer, 0);
975
982
  } else {
976
983
  pm_buffer_append_byte(buffer, 1);
977
- pm_serialize_location(parser, &((pm_hash_pattern_node_t *)node)->opening_loc, buffer);
984
+ pm_serialize_location(&((pm_hash_pattern_node_t *)node)->opening_loc, buffer);
978
985
  }
979
- if (((pm_hash_pattern_node_t *)node)->closing_loc.start == NULL) {
986
+ if (((pm_hash_pattern_node_t *)node)->closing_loc.length == 0) {
980
987
  pm_buffer_append_byte(buffer, 0);
981
988
  } else {
982
989
  pm_buffer_append_byte(buffer, 1);
983
- pm_serialize_location(parser, &((pm_hash_pattern_node_t *)node)->closing_loc, buffer);
990
+ pm_serialize_location(&((pm_hash_pattern_node_t *)node)->closing_loc, buffer);
984
991
  }
985
992
  break;
986
993
  }
987
994
  case PM_IF_NODE: {
988
995
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
989
- if (((pm_if_node_t *)node)->if_keyword_loc.start == NULL) {
996
+ if (((pm_if_node_t *)node)->if_keyword_loc.length == 0) {
990
997
  pm_buffer_append_byte(buffer, 0);
991
998
  } else {
992
999
  pm_buffer_append_byte(buffer, 1);
993
- pm_serialize_location(parser, &((pm_if_node_t *)node)->if_keyword_loc, buffer);
1000
+ pm_serialize_location(&((pm_if_node_t *)node)->if_keyword_loc, buffer);
994
1001
  }
995
1002
  pm_serialize_node(parser, (pm_node_t *)((pm_if_node_t *)node)->predicate, buffer);
996
- if (((pm_if_node_t *)node)->then_keyword_loc.start == NULL) {
1003
+ if (((pm_if_node_t *)node)->then_keyword_loc.length == 0) {
997
1004
  pm_buffer_append_byte(buffer, 0);
998
1005
  } else {
999
1006
  pm_buffer_append_byte(buffer, 1);
1000
- pm_serialize_location(parser, &((pm_if_node_t *)node)->then_keyword_loc, buffer);
1007
+ pm_serialize_location(&((pm_if_node_t *)node)->then_keyword_loc, buffer);
1001
1008
  }
1002
1009
  if (((pm_if_node_t *)node)->statements == NULL) {
1003
1010
  pm_buffer_append_byte(buffer, 0);
@@ -1009,11 +1016,11 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1009
1016
  } else {
1010
1017
  pm_serialize_node(parser, (pm_node_t *)((pm_if_node_t *)node)->subsequent, buffer);
1011
1018
  }
1012
- if (((pm_if_node_t *)node)->end_keyword_loc.start == NULL) {
1019
+ if (((pm_if_node_t *)node)->end_keyword_loc.length == 0) {
1013
1020
  pm_buffer_append_byte(buffer, 0);
1014
1021
  } else {
1015
1022
  pm_buffer_append_byte(buffer, 1);
1016
- pm_serialize_location(parser, &((pm_if_node_t *)node)->end_keyword_loc, buffer);
1023
+ pm_serialize_location(&((pm_if_node_t *)node)->end_keyword_loc, buffer);
1017
1024
  }
1018
1025
  break;
1019
1026
  }
@@ -1039,12 +1046,12 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1039
1046
  } else {
1040
1047
  pm_serialize_node(parser, (pm_node_t *)((pm_in_node_t *)node)->statements, buffer);
1041
1048
  }
1042
- pm_serialize_location(parser, &((pm_in_node_t *)node)->in_loc, buffer);
1043
- if (((pm_in_node_t *)node)->then_loc.start == NULL) {
1049
+ pm_serialize_location(&((pm_in_node_t *)node)->in_keyword_loc, buffer);
1050
+ if (((pm_in_node_t *)node)->then_keyword_loc.length == 0) {
1044
1051
  pm_buffer_append_byte(buffer, 0);
1045
1052
  } else {
1046
1053
  pm_buffer_append_byte(buffer, 1);
1047
- pm_serialize_location(parser, &((pm_in_node_t *)node)->then_loc, buffer);
1054
+ pm_serialize_location(&((pm_in_node_t *)node)->then_keyword_loc, buffer);
1048
1055
  }
1049
1056
  break;
1050
1057
  }
@@ -1055,25 +1062,25 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1055
1062
  } else {
1056
1063
  pm_serialize_node(parser, (pm_node_t *)((pm_index_and_write_node_t *)node)->receiver, buffer);
1057
1064
  }
1058
- if (((pm_index_and_write_node_t *)node)->call_operator_loc.start == NULL) {
1065
+ if (((pm_index_and_write_node_t *)node)->call_operator_loc.length == 0) {
1059
1066
  pm_buffer_append_byte(buffer, 0);
1060
1067
  } else {
1061
1068
  pm_buffer_append_byte(buffer, 1);
1062
- pm_serialize_location(parser, &((pm_index_and_write_node_t *)node)->call_operator_loc, buffer);
1069
+ pm_serialize_location(&((pm_index_and_write_node_t *)node)->call_operator_loc, buffer);
1063
1070
  }
1064
- pm_serialize_location(parser, &((pm_index_and_write_node_t *)node)->opening_loc, buffer);
1071
+ pm_serialize_location(&((pm_index_and_write_node_t *)node)->opening_loc, buffer);
1065
1072
  if (((pm_index_and_write_node_t *)node)->arguments == NULL) {
1066
1073
  pm_buffer_append_byte(buffer, 0);
1067
1074
  } else {
1068
1075
  pm_serialize_node(parser, (pm_node_t *)((pm_index_and_write_node_t *)node)->arguments, buffer);
1069
1076
  }
1070
- pm_serialize_location(parser, &((pm_index_and_write_node_t *)node)->closing_loc, buffer);
1077
+ pm_serialize_location(&((pm_index_and_write_node_t *)node)->closing_loc, buffer);
1071
1078
  if (((pm_index_and_write_node_t *)node)->block == NULL) {
1072
1079
  pm_buffer_append_byte(buffer, 0);
1073
1080
  } else {
1074
1081
  pm_serialize_node(parser, (pm_node_t *)((pm_index_and_write_node_t *)node)->block, buffer);
1075
1082
  }
1076
- pm_serialize_location(parser, &((pm_index_and_write_node_t *)node)->operator_loc, buffer);
1083
+ pm_serialize_location(&((pm_index_and_write_node_t *)node)->operator_loc, buffer);
1077
1084
  pm_serialize_node(parser, (pm_node_t *)((pm_index_and_write_node_t *)node)->value, buffer);
1078
1085
  break;
1079
1086
  }
@@ -1084,26 +1091,26 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1084
1091
  } else {
1085
1092
  pm_serialize_node(parser, (pm_node_t *)((pm_index_operator_write_node_t *)node)->receiver, buffer);
1086
1093
  }
1087
- if (((pm_index_operator_write_node_t *)node)->call_operator_loc.start == NULL) {
1094
+ if (((pm_index_operator_write_node_t *)node)->call_operator_loc.length == 0) {
1088
1095
  pm_buffer_append_byte(buffer, 0);
1089
1096
  } else {
1090
1097
  pm_buffer_append_byte(buffer, 1);
1091
- pm_serialize_location(parser, &((pm_index_operator_write_node_t *)node)->call_operator_loc, buffer);
1098
+ pm_serialize_location(&((pm_index_operator_write_node_t *)node)->call_operator_loc, buffer);
1092
1099
  }
1093
- pm_serialize_location(parser, &((pm_index_operator_write_node_t *)node)->opening_loc, buffer);
1100
+ pm_serialize_location(&((pm_index_operator_write_node_t *)node)->opening_loc, buffer);
1094
1101
  if (((pm_index_operator_write_node_t *)node)->arguments == NULL) {
1095
1102
  pm_buffer_append_byte(buffer, 0);
1096
1103
  } else {
1097
1104
  pm_serialize_node(parser, (pm_node_t *)((pm_index_operator_write_node_t *)node)->arguments, buffer);
1098
1105
  }
1099
- pm_serialize_location(parser, &((pm_index_operator_write_node_t *)node)->closing_loc, buffer);
1106
+ pm_serialize_location(&((pm_index_operator_write_node_t *)node)->closing_loc, buffer);
1100
1107
  if (((pm_index_operator_write_node_t *)node)->block == NULL) {
1101
1108
  pm_buffer_append_byte(buffer, 0);
1102
1109
  } else {
1103
1110
  pm_serialize_node(parser, (pm_node_t *)((pm_index_operator_write_node_t *)node)->block, buffer);
1104
1111
  }
1105
1112
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_index_operator_write_node_t *)node)->binary_operator));
1106
- pm_serialize_location(parser, &((pm_index_operator_write_node_t *)node)->binary_operator_loc, buffer);
1113
+ pm_serialize_location(&((pm_index_operator_write_node_t *)node)->binary_operator_loc, buffer);
1107
1114
  pm_serialize_node(parser, (pm_node_t *)((pm_index_operator_write_node_t *)node)->value, buffer);
1108
1115
  break;
1109
1116
  }
@@ -1114,38 +1121,38 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1114
1121
  } else {
1115
1122
  pm_serialize_node(parser, (pm_node_t *)((pm_index_or_write_node_t *)node)->receiver, buffer);
1116
1123
  }
1117
- if (((pm_index_or_write_node_t *)node)->call_operator_loc.start == NULL) {
1124
+ if (((pm_index_or_write_node_t *)node)->call_operator_loc.length == 0) {
1118
1125
  pm_buffer_append_byte(buffer, 0);
1119
1126
  } else {
1120
1127
  pm_buffer_append_byte(buffer, 1);
1121
- pm_serialize_location(parser, &((pm_index_or_write_node_t *)node)->call_operator_loc, buffer);
1128
+ pm_serialize_location(&((pm_index_or_write_node_t *)node)->call_operator_loc, buffer);
1122
1129
  }
1123
- pm_serialize_location(parser, &((pm_index_or_write_node_t *)node)->opening_loc, buffer);
1130
+ pm_serialize_location(&((pm_index_or_write_node_t *)node)->opening_loc, buffer);
1124
1131
  if (((pm_index_or_write_node_t *)node)->arguments == NULL) {
1125
1132
  pm_buffer_append_byte(buffer, 0);
1126
1133
  } else {
1127
1134
  pm_serialize_node(parser, (pm_node_t *)((pm_index_or_write_node_t *)node)->arguments, buffer);
1128
1135
  }
1129
- pm_serialize_location(parser, &((pm_index_or_write_node_t *)node)->closing_loc, buffer);
1136
+ pm_serialize_location(&((pm_index_or_write_node_t *)node)->closing_loc, buffer);
1130
1137
  if (((pm_index_or_write_node_t *)node)->block == NULL) {
1131
1138
  pm_buffer_append_byte(buffer, 0);
1132
1139
  } else {
1133
1140
  pm_serialize_node(parser, (pm_node_t *)((pm_index_or_write_node_t *)node)->block, buffer);
1134
1141
  }
1135
- pm_serialize_location(parser, &((pm_index_or_write_node_t *)node)->operator_loc, buffer);
1142
+ pm_serialize_location(&((pm_index_or_write_node_t *)node)->operator_loc, buffer);
1136
1143
  pm_serialize_node(parser, (pm_node_t *)((pm_index_or_write_node_t *)node)->value, buffer);
1137
1144
  break;
1138
1145
  }
1139
1146
  case PM_INDEX_TARGET_NODE: {
1140
1147
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1141
1148
  pm_serialize_node(parser, (pm_node_t *)((pm_index_target_node_t *)node)->receiver, buffer);
1142
- pm_serialize_location(parser, &((pm_index_target_node_t *)node)->opening_loc, buffer);
1149
+ pm_serialize_location(&((pm_index_target_node_t *)node)->opening_loc, buffer);
1143
1150
  if (((pm_index_target_node_t *)node)->arguments == NULL) {
1144
1151
  pm_buffer_append_byte(buffer, 0);
1145
1152
  } else {
1146
1153
  pm_serialize_node(parser, (pm_node_t *)((pm_index_target_node_t *)node)->arguments, buffer);
1147
1154
  }
1148
- pm_serialize_location(parser, &((pm_index_target_node_t *)node)->closing_loc, buffer);
1155
+ pm_serialize_location(&((pm_index_target_node_t *)node)->closing_loc, buffer);
1149
1156
  if (((pm_index_target_node_t *)node)->block == NULL) {
1150
1157
  pm_buffer_append_byte(buffer, 0);
1151
1158
  } else {
@@ -1156,16 +1163,16 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1156
1163
  case PM_INSTANCE_VARIABLE_AND_WRITE_NODE: {
1157
1164
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1158
1165
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_instance_variable_and_write_node_t *)node)->name));
1159
- pm_serialize_location(parser, &((pm_instance_variable_and_write_node_t *)node)->name_loc, buffer);
1160
- pm_serialize_location(parser, &((pm_instance_variable_and_write_node_t *)node)->operator_loc, buffer);
1166
+ pm_serialize_location(&((pm_instance_variable_and_write_node_t *)node)->name_loc, buffer);
1167
+ pm_serialize_location(&((pm_instance_variable_and_write_node_t *)node)->operator_loc, buffer);
1161
1168
  pm_serialize_node(parser, (pm_node_t *)((pm_instance_variable_and_write_node_t *)node)->value, buffer);
1162
1169
  break;
1163
1170
  }
1164
1171
  case PM_INSTANCE_VARIABLE_OPERATOR_WRITE_NODE: {
1165
1172
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1166
1173
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_instance_variable_operator_write_node_t *)node)->name));
1167
- pm_serialize_location(parser, &((pm_instance_variable_operator_write_node_t *)node)->name_loc, buffer);
1168
- pm_serialize_location(parser, &((pm_instance_variable_operator_write_node_t *)node)->binary_operator_loc, buffer);
1174
+ pm_serialize_location(&((pm_instance_variable_operator_write_node_t *)node)->name_loc, buffer);
1175
+ pm_serialize_location(&((pm_instance_variable_operator_write_node_t *)node)->binary_operator_loc, buffer);
1169
1176
  pm_serialize_node(parser, (pm_node_t *)((pm_instance_variable_operator_write_node_t *)node)->value, buffer);
1170
1177
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_instance_variable_operator_write_node_t *)node)->binary_operator));
1171
1178
  break;
@@ -1173,8 +1180,8 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1173
1180
  case PM_INSTANCE_VARIABLE_OR_WRITE_NODE: {
1174
1181
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1175
1182
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_instance_variable_or_write_node_t *)node)->name));
1176
- pm_serialize_location(parser, &((pm_instance_variable_or_write_node_t *)node)->name_loc, buffer);
1177
- pm_serialize_location(parser, &((pm_instance_variable_or_write_node_t *)node)->operator_loc, buffer);
1183
+ pm_serialize_location(&((pm_instance_variable_or_write_node_t *)node)->name_loc, buffer);
1184
+ pm_serialize_location(&((pm_instance_variable_or_write_node_t *)node)->operator_loc, buffer);
1178
1185
  pm_serialize_node(parser, (pm_node_t *)((pm_instance_variable_or_write_node_t *)node)->value, buffer);
1179
1186
  break;
1180
1187
  }
@@ -1191,9 +1198,9 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1191
1198
  case PM_INSTANCE_VARIABLE_WRITE_NODE: {
1192
1199
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1193
1200
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_instance_variable_write_node_t *)node)->name));
1194
- pm_serialize_location(parser, &((pm_instance_variable_write_node_t *)node)->name_loc, buffer);
1201
+ pm_serialize_location(&((pm_instance_variable_write_node_t *)node)->name_loc, buffer);
1195
1202
  pm_serialize_node(parser, (pm_node_t *)((pm_instance_variable_write_node_t *)node)->value, buffer);
1196
- pm_serialize_location(parser, &((pm_instance_variable_write_node_t *)node)->operator_loc, buffer);
1203
+ pm_serialize_location(&((pm_instance_variable_write_node_t *)node)->operator_loc, buffer);
1197
1204
  break;
1198
1205
  }
1199
1206
  case PM_INTEGER_NODE: {
@@ -1203,77 +1210,77 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1203
1210
  }
1204
1211
  case PM_INTERPOLATED_MATCH_LAST_LINE_NODE: {
1205
1212
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1206
- pm_serialize_location(parser, &((pm_interpolated_match_last_line_node_t *)node)->opening_loc, buffer);
1213
+ pm_serialize_location(&((pm_interpolated_match_last_line_node_t *)node)->opening_loc, buffer);
1207
1214
  uint32_t parts_size = pm_sizet_to_u32(((pm_interpolated_match_last_line_node_t *)node)->parts.size);
1208
1215
  pm_buffer_append_varuint(buffer, parts_size);
1209
1216
  for (uint32_t index = 0; index < parts_size; index++) {
1210
1217
  pm_serialize_node(parser, (pm_node_t *) ((pm_interpolated_match_last_line_node_t *)node)->parts.nodes[index], buffer);
1211
1218
  }
1212
- pm_serialize_location(parser, &((pm_interpolated_match_last_line_node_t *)node)->closing_loc, buffer);
1219
+ pm_serialize_location(&((pm_interpolated_match_last_line_node_t *)node)->closing_loc, buffer);
1213
1220
  break;
1214
1221
  }
1215
1222
  case PM_INTERPOLATED_REGULAR_EXPRESSION_NODE: {
1216
1223
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1217
- pm_serialize_location(parser, &((pm_interpolated_regular_expression_node_t *)node)->opening_loc, buffer);
1224
+ pm_serialize_location(&((pm_interpolated_regular_expression_node_t *)node)->opening_loc, buffer);
1218
1225
  uint32_t parts_size = pm_sizet_to_u32(((pm_interpolated_regular_expression_node_t *)node)->parts.size);
1219
1226
  pm_buffer_append_varuint(buffer, parts_size);
1220
1227
  for (uint32_t index = 0; index < parts_size; index++) {
1221
1228
  pm_serialize_node(parser, (pm_node_t *) ((pm_interpolated_regular_expression_node_t *)node)->parts.nodes[index], buffer);
1222
1229
  }
1223
- pm_serialize_location(parser, &((pm_interpolated_regular_expression_node_t *)node)->closing_loc, buffer);
1230
+ pm_serialize_location(&((pm_interpolated_regular_expression_node_t *)node)->closing_loc, buffer);
1224
1231
  break;
1225
1232
  }
1226
1233
  case PM_INTERPOLATED_STRING_NODE: {
1227
1234
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1228
- if (((pm_interpolated_string_node_t *)node)->opening_loc.start == NULL) {
1235
+ if (((pm_interpolated_string_node_t *)node)->opening_loc.length == 0) {
1229
1236
  pm_buffer_append_byte(buffer, 0);
1230
1237
  } else {
1231
1238
  pm_buffer_append_byte(buffer, 1);
1232
- pm_serialize_location(parser, &((pm_interpolated_string_node_t *)node)->opening_loc, buffer);
1239
+ pm_serialize_location(&((pm_interpolated_string_node_t *)node)->opening_loc, buffer);
1233
1240
  }
1234
1241
  uint32_t parts_size = pm_sizet_to_u32(((pm_interpolated_string_node_t *)node)->parts.size);
1235
1242
  pm_buffer_append_varuint(buffer, parts_size);
1236
1243
  for (uint32_t index = 0; index < parts_size; index++) {
1237
1244
  pm_serialize_node(parser, (pm_node_t *) ((pm_interpolated_string_node_t *)node)->parts.nodes[index], buffer);
1238
1245
  }
1239
- if (((pm_interpolated_string_node_t *)node)->closing_loc.start == NULL) {
1246
+ if (((pm_interpolated_string_node_t *)node)->closing_loc.length == 0) {
1240
1247
  pm_buffer_append_byte(buffer, 0);
1241
1248
  } else {
1242
1249
  pm_buffer_append_byte(buffer, 1);
1243
- pm_serialize_location(parser, &((pm_interpolated_string_node_t *)node)->closing_loc, buffer);
1250
+ pm_serialize_location(&((pm_interpolated_string_node_t *)node)->closing_loc, buffer);
1244
1251
  }
1245
1252
  break;
1246
1253
  }
1247
1254
  case PM_INTERPOLATED_SYMBOL_NODE: {
1248
1255
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1249
- if (((pm_interpolated_symbol_node_t *)node)->opening_loc.start == NULL) {
1256
+ if (((pm_interpolated_symbol_node_t *)node)->opening_loc.length == 0) {
1250
1257
  pm_buffer_append_byte(buffer, 0);
1251
1258
  } else {
1252
1259
  pm_buffer_append_byte(buffer, 1);
1253
- pm_serialize_location(parser, &((pm_interpolated_symbol_node_t *)node)->opening_loc, buffer);
1260
+ pm_serialize_location(&((pm_interpolated_symbol_node_t *)node)->opening_loc, buffer);
1254
1261
  }
1255
1262
  uint32_t parts_size = pm_sizet_to_u32(((pm_interpolated_symbol_node_t *)node)->parts.size);
1256
1263
  pm_buffer_append_varuint(buffer, parts_size);
1257
1264
  for (uint32_t index = 0; index < parts_size; index++) {
1258
1265
  pm_serialize_node(parser, (pm_node_t *) ((pm_interpolated_symbol_node_t *)node)->parts.nodes[index], buffer);
1259
1266
  }
1260
- if (((pm_interpolated_symbol_node_t *)node)->closing_loc.start == NULL) {
1267
+ if (((pm_interpolated_symbol_node_t *)node)->closing_loc.length == 0) {
1261
1268
  pm_buffer_append_byte(buffer, 0);
1262
1269
  } else {
1263
1270
  pm_buffer_append_byte(buffer, 1);
1264
- pm_serialize_location(parser, &((pm_interpolated_symbol_node_t *)node)->closing_loc, buffer);
1271
+ pm_serialize_location(&((pm_interpolated_symbol_node_t *)node)->closing_loc, buffer);
1265
1272
  }
1266
1273
  break;
1267
1274
  }
1268
1275
  case PM_INTERPOLATED_X_STRING_NODE: {
1269
1276
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1270
- pm_serialize_location(parser, &((pm_interpolated_x_string_node_t *)node)->opening_loc, buffer);
1277
+ pm_serialize_location(&((pm_interpolated_x_string_node_t *)node)->opening_loc, buffer);
1271
1278
  uint32_t parts_size = pm_sizet_to_u32(((pm_interpolated_x_string_node_t *)node)->parts.size);
1272
1279
  pm_buffer_append_varuint(buffer, parts_size);
1273
1280
  for (uint32_t index = 0; index < parts_size; index++) {
1274
1281
  pm_serialize_node(parser, (pm_node_t *) ((pm_interpolated_x_string_node_t *)node)->parts.nodes[index], buffer);
1275
1282
  }
1276
- pm_serialize_location(parser, &((pm_interpolated_x_string_node_t *)node)->closing_loc, buffer);
1283
+ pm_serialize_location(&((pm_interpolated_x_string_node_t *)node)->closing_loc, buffer);
1277
1284
  break;
1278
1285
  }
1279
1286
  case PM_IT_LOCAL_VARIABLE_READ_NODE: {
@@ -1296,13 +1303,13 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1296
1303
  case PM_KEYWORD_REST_PARAMETER_NODE: {
1297
1304
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1298
1305
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_keyword_rest_parameter_node_t *)node)->name));
1299
- if (((pm_keyword_rest_parameter_node_t *)node)->name_loc.start == NULL) {
1306
+ if (((pm_keyword_rest_parameter_node_t *)node)->name_loc.length == 0) {
1300
1307
  pm_buffer_append_byte(buffer, 0);
1301
1308
  } else {
1302
1309
  pm_buffer_append_byte(buffer, 1);
1303
- pm_serialize_location(parser, &((pm_keyword_rest_parameter_node_t *)node)->name_loc, buffer);
1310
+ pm_serialize_location(&((pm_keyword_rest_parameter_node_t *)node)->name_loc, buffer);
1304
1311
  }
1305
- pm_serialize_location(parser, &((pm_keyword_rest_parameter_node_t *)node)->operator_loc, buffer);
1312
+ pm_serialize_location(&((pm_keyword_rest_parameter_node_t *)node)->operator_loc, buffer);
1306
1313
  break;
1307
1314
  }
1308
1315
  case PM_LAMBDA_NODE: {
@@ -1312,9 +1319,9 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1312
1319
  for (uint32_t index = 0; index < locals_size; index++) {
1313
1320
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_lambda_node_t *)node)->locals.ids[index]));
1314
1321
  }
1315
- pm_serialize_location(parser, &((pm_lambda_node_t *)node)->operator_loc, buffer);
1316
- pm_serialize_location(parser, &((pm_lambda_node_t *)node)->opening_loc, buffer);
1317
- pm_serialize_location(parser, &((pm_lambda_node_t *)node)->closing_loc, buffer);
1322
+ pm_serialize_location(&((pm_lambda_node_t *)node)->operator_loc, buffer);
1323
+ pm_serialize_location(&((pm_lambda_node_t *)node)->opening_loc, buffer);
1324
+ pm_serialize_location(&((pm_lambda_node_t *)node)->closing_loc, buffer);
1318
1325
  if (((pm_lambda_node_t *)node)->parameters == NULL) {
1319
1326
  pm_buffer_append_byte(buffer, 0);
1320
1327
  } else {
@@ -1329,8 +1336,8 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1329
1336
  }
1330
1337
  case PM_LOCAL_VARIABLE_AND_WRITE_NODE: {
1331
1338
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1332
- pm_serialize_location(parser, &((pm_local_variable_and_write_node_t *)node)->name_loc, buffer);
1333
- pm_serialize_location(parser, &((pm_local_variable_and_write_node_t *)node)->operator_loc, buffer);
1339
+ pm_serialize_location(&((pm_local_variable_and_write_node_t *)node)->name_loc, buffer);
1340
+ pm_serialize_location(&((pm_local_variable_and_write_node_t *)node)->operator_loc, buffer);
1334
1341
  pm_serialize_node(parser, (pm_node_t *)((pm_local_variable_and_write_node_t *)node)->value, buffer);
1335
1342
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_local_variable_and_write_node_t *)node)->name));
1336
1343
  pm_buffer_append_varuint(buffer, ((pm_local_variable_and_write_node_t *)node)->depth);
@@ -1338,8 +1345,8 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1338
1345
  }
1339
1346
  case PM_LOCAL_VARIABLE_OPERATOR_WRITE_NODE: {
1340
1347
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1341
- pm_serialize_location(parser, &((pm_local_variable_operator_write_node_t *)node)->name_loc, buffer);
1342
- pm_serialize_location(parser, &((pm_local_variable_operator_write_node_t *)node)->binary_operator_loc, buffer);
1348
+ pm_serialize_location(&((pm_local_variable_operator_write_node_t *)node)->name_loc, buffer);
1349
+ pm_serialize_location(&((pm_local_variable_operator_write_node_t *)node)->binary_operator_loc, buffer);
1343
1350
  pm_serialize_node(parser, (pm_node_t *)((pm_local_variable_operator_write_node_t *)node)->value, buffer);
1344
1351
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_local_variable_operator_write_node_t *)node)->name));
1345
1352
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_local_variable_operator_write_node_t *)node)->binary_operator));
@@ -1348,8 +1355,8 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1348
1355
  }
1349
1356
  case PM_LOCAL_VARIABLE_OR_WRITE_NODE: {
1350
1357
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1351
- pm_serialize_location(parser, &((pm_local_variable_or_write_node_t *)node)->name_loc, buffer);
1352
- pm_serialize_location(parser, &((pm_local_variable_or_write_node_t *)node)->operator_loc, buffer);
1358
+ pm_serialize_location(&((pm_local_variable_or_write_node_t *)node)->name_loc, buffer);
1359
+ pm_serialize_location(&((pm_local_variable_or_write_node_t *)node)->operator_loc, buffer);
1353
1360
  pm_serialize_node(parser, (pm_node_t *)((pm_local_variable_or_write_node_t *)node)->value, buffer);
1354
1361
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_local_variable_or_write_node_t *)node)->name));
1355
1362
  pm_buffer_append_varuint(buffer, ((pm_local_variable_or_write_node_t *)node)->depth);
@@ -1371,31 +1378,31 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1371
1378
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1372
1379
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_local_variable_write_node_t *)node)->name));
1373
1380
  pm_buffer_append_varuint(buffer, ((pm_local_variable_write_node_t *)node)->depth);
1374
- pm_serialize_location(parser, &((pm_local_variable_write_node_t *)node)->name_loc, buffer);
1381
+ pm_serialize_location(&((pm_local_variable_write_node_t *)node)->name_loc, buffer);
1375
1382
  pm_serialize_node(parser, (pm_node_t *)((pm_local_variable_write_node_t *)node)->value, buffer);
1376
- pm_serialize_location(parser, &((pm_local_variable_write_node_t *)node)->operator_loc, buffer);
1383
+ pm_serialize_location(&((pm_local_variable_write_node_t *)node)->operator_loc, buffer);
1377
1384
  break;
1378
1385
  }
1379
1386
  case PM_MATCH_LAST_LINE_NODE: {
1380
1387
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1381
- pm_serialize_location(parser, &((pm_match_last_line_node_t *)node)->opening_loc, buffer);
1382
- pm_serialize_location(parser, &((pm_match_last_line_node_t *)node)->content_loc, buffer);
1383
- pm_serialize_location(parser, &((pm_match_last_line_node_t *)node)->closing_loc, buffer);
1384
- pm_serialize_string(parser, &((pm_match_last_line_node_t *)node)->unescaped, buffer);
1388
+ pm_serialize_location(&((pm_match_last_line_node_t *)node)->opening_loc, buffer);
1389
+ pm_serialize_location(&((pm_match_last_line_node_t *)node)->content_loc, buffer);
1390
+ pm_serialize_location(&((pm_match_last_line_node_t *)node)->closing_loc, buffer);
1391
+ pm_serialize_string(&((pm_match_last_line_node_t *)node)->unescaped, buffer);
1385
1392
  break;
1386
1393
  }
1387
1394
  case PM_MATCH_PREDICATE_NODE: {
1388
1395
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1389
1396
  pm_serialize_node(parser, (pm_node_t *)((pm_match_predicate_node_t *)node)->value, buffer);
1390
1397
  pm_serialize_node(parser, (pm_node_t *)((pm_match_predicate_node_t *)node)->pattern, buffer);
1391
- pm_serialize_location(parser, &((pm_match_predicate_node_t *)node)->operator_loc, buffer);
1398
+ pm_serialize_location(&((pm_match_predicate_node_t *)node)->keyword_loc, buffer);
1392
1399
  break;
1393
1400
  }
1394
1401
  case PM_MATCH_REQUIRED_NODE: {
1395
1402
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1396
1403
  pm_serialize_node(parser, (pm_node_t *)((pm_match_required_node_t *)node)->value, buffer);
1397
1404
  pm_serialize_node(parser, (pm_node_t *)((pm_match_required_node_t *)node)->pattern, buffer);
1398
- pm_serialize_location(parser, &((pm_match_required_node_t *)node)->operator_loc, buffer);
1405
+ pm_serialize_location(&((pm_match_required_node_t *)node)->operator_loc, buffer);
1399
1406
  break;
1400
1407
  }
1401
1408
  case PM_MATCH_WRITE_NODE: {
@@ -1408,10 +1415,6 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1408
1415
  }
1409
1416
  break;
1410
1417
  }
1411
- case PM_MISSING_NODE: {
1412
- pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1413
- break;
1414
- }
1415
1418
  case PM_MODULE_NODE: {
1416
1419
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1417
1420
  uint32_t locals_size = pm_sizet_to_u32(((pm_module_node_t *)node)->locals.size);
@@ -1419,14 +1422,14 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1419
1422
  for (uint32_t index = 0; index < locals_size; index++) {
1420
1423
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_module_node_t *)node)->locals.ids[index]));
1421
1424
  }
1422
- pm_serialize_location(parser, &((pm_module_node_t *)node)->module_keyword_loc, buffer);
1425
+ pm_serialize_location(&((pm_module_node_t *)node)->module_keyword_loc, buffer);
1423
1426
  pm_serialize_node(parser, (pm_node_t *)((pm_module_node_t *)node)->constant_path, buffer);
1424
1427
  if (((pm_module_node_t *)node)->body == NULL) {
1425
1428
  pm_buffer_append_byte(buffer, 0);
1426
1429
  } else {
1427
1430
  pm_serialize_node(parser, (pm_node_t *)((pm_module_node_t *)node)->body, buffer);
1428
1431
  }
1429
- pm_serialize_location(parser, &((pm_module_node_t *)node)->end_keyword_loc, buffer);
1432
+ pm_serialize_location(&((pm_module_node_t *)node)->end_keyword_loc, buffer);
1430
1433
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_module_node_t *)node)->name));
1431
1434
  break;
1432
1435
  }
@@ -1447,17 +1450,17 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1447
1450
  for (uint32_t index = 0; index < rights_size; index++) {
1448
1451
  pm_serialize_node(parser, (pm_node_t *) ((pm_multi_target_node_t *)node)->rights.nodes[index], buffer);
1449
1452
  }
1450
- if (((pm_multi_target_node_t *)node)->lparen_loc.start == NULL) {
1453
+ if (((pm_multi_target_node_t *)node)->lparen_loc.length == 0) {
1451
1454
  pm_buffer_append_byte(buffer, 0);
1452
1455
  } else {
1453
1456
  pm_buffer_append_byte(buffer, 1);
1454
- pm_serialize_location(parser, &((pm_multi_target_node_t *)node)->lparen_loc, buffer);
1457
+ pm_serialize_location(&((pm_multi_target_node_t *)node)->lparen_loc, buffer);
1455
1458
  }
1456
- if (((pm_multi_target_node_t *)node)->rparen_loc.start == NULL) {
1459
+ if (((pm_multi_target_node_t *)node)->rparen_loc.length == 0) {
1457
1460
  pm_buffer_append_byte(buffer, 0);
1458
1461
  } else {
1459
1462
  pm_buffer_append_byte(buffer, 1);
1460
- pm_serialize_location(parser, &((pm_multi_target_node_t *)node)->rparen_loc, buffer);
1463
+ pm_serialize_location(&((pm_multi_target_node_t *)node)->rparen_loc, buffer);
1461
1464
  }
1462
1465
  break;
1463
1466
  }
@@ -1478,19 +1481,19 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1478
1481
  for (uint32_t index = 0; index < rights_size; index++) {
1479
1482
  pm_serialize_node(parser, (pm_node_t *) ((pm_multi_write_node_t *)node)->rights.nodes[index], buffer);
1480
1483
  }
1481
- if (((pm_multi_write_node_t *)node)->lparen_loc.start == NULL) {
1484
+ if (((pm_multi_write_node_t *)node)->lparen_loc.length == 0) {
1482
1485
  pm_buffer_append_byte(buffer, 0);
1483
1486
  } else {
1484
1487
  pm_buffer_append_byte(buffer, 1);
1485
- pm_serialize_location(parser, &((pm_multi_write_node_t *)node)->lparen_loc, buffer);
1488
+ pm_serialize_location(&((pm_multi_write_node_t *)node)->lparen_loc, buffer);
1486
1489
  }
1487
- if (((pm_multi_write_node_t *)node)->rparen_loc.start == NULL) {
1490
+ if (((pm_multi_write_node_t *)node)->rparen_loc.length == 0) {
1488
1491
  pm_buffer_append_byte(buffer, 0);
1489
1492
  } else {
1490
1493
  pm_buffer_append_byte(buffer, 1);
1491
- pm_serialize_location(parser, &((pm_multi_write_node_t *)node)->rparen_loc, buffer);
1494
+ pm_serialize_location(&((pm_multi_write_node_t *)node)->rparen_loc, buffer);
1492
1495
  }
1493
- pm_serialize_location(parser, &((pm_multi_write_node_t *)node)->operator_loc, buffer);
1496
+ pm_serialize_location(&((pm_multi_write_node_t *)node)->operator_loc, buffer);
1494
1497
  pm_serialize_node(parser, (pm_node_t *)((pm_multi_write_node_t *)node)->value, buffer);
1495
1498
  break;
1496
1499
  }
@@ -1501,17 +1504,23 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1501
1504
  } else {
1502
1505
  pm_serialize_node(parser, (pm_node_t *)((pm_next_node_t *)node)->arguments, buffer);
1503
1506
  }
1504
- pm_serialize_location(parser, &((pm_next_node_t *)node)->keyword_loc, buffer);
1507
+ pm_serialize_location(&((pm_next_node_t *)node)->keyword_loc, buffer);
1505
1508
  break;
1506
1509
  }
1507
1510
  case PM_NIL_NODE: {
1508
1511
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1509
1512
  break;
1510
1513
  }
1514
+ case PM_NO_BLOCK_PARAMETER_NODE: {
1515
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1516
+ pm_serialize_location(&((pm_no_block_parameter_node_t *)node)->operator_loc, buffer);
1517
+ pm_serialize_location(&((pm_no_block_parameter_node_t *)node)->keyword_loc, buffer);
1518
+ break;
1519
+ }
1511
1520
  case PM_NO_KEYWORDS_PARAMETER_NODE: {
1512
1521
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1513
- pm_serialize_location(parser, &((pm_no_keywords_parameter_node_t *)node)->operator_loc, buffer);
1514
- pm_serialize_location(parser, &((pm_no_keywords_parameter_node_t *)node)->keyword_loc, buffer);
1522
+ pm_serialize_location(&((pm_no_keywords_parameter_node_t *)node)->operator_loc, buffer);
1523
+ pm_serialize_location(&((pm_no_keywords_parameter_node_t *)node)->keyword_loc, buffer);
1515
1524
  break;
1516
1525
  }
1517
1526
  case PM_NUMBERED_PARAMETERS_NODE: {
@@ -1527,15 +1536,15 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1527
1536
  case PM_OPTIONAL_KEYWORD_PARAMETER_NODE: {
1528
1537
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1529
1538
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_optional_keyword_parameter_node_t *)node)->name));
1530
- pm_serialize_location(parser, &((pm_optional_keyword_parameter_node_t *)node)->name_loc, buffer);
1539
+ pm_serialize_location(&((pm_optional_keyword_parameter_node_t *)node)->name_loc, buffer);
1531
1540
  pm_serialize_node(parser, (pm_node_t *)((pm_optional_keyword_parameter_node_t *)node)->value, buffer);
1532
1541
  break;
1533
1542
  }
1534
1543
  case PM_OPTIONAL_PARAMETER_NODE: {
1535
1544
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1536
1545
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_optional_parameter_node_t *)node)->name));
1537
- pm_serialize_location(parser, &((pm_optional_parameter_node_t *)node)->name_loc, buffer);
1538
- pm_serialize_location(parser, &((pm_optional_parameter_node_t *)node)->operator_loc, buffer);
1546
+ pm_serialize_location(&((pm_optional_parameter_node_t *)node)->name_loc, buffer);
1547
+ pm_serialize_location(&((pm_optional_parameter_node_t *)node)->operator_loc, buffer);
1539
1548
  pm_serialize_node(parser, (pm_node_t *)((pm_optional_parameter_node_t *)node)->value, buffer);
1540
1549
  break;
1541
1550
  }
@@ -1543,7 +1552,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1543
1552
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1544
1553
  pm_serialize_node(parser, (pm_node_t *)((pm_or_node_t *)node)->left, buffer);
1545
1554
  pm_serialize_node(parser, (pm_node_t *)((pm_or_node_t *)node)->right, buffer);
1546
- pm_serialize_location(parser, &((pm_or_node_t *)node)->operator_loc, buffer);
1555
+ pm_serialize_location(&((pm_or_node_t *)node)->operator_loc, buffer);
1547
1556
  break;
1548
1557
  }
1549
1558
  case PM_PARAMETERS_NODE: {
@@ -1592,22 +1601,22 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1592
1601
  } else {
1593
1602
  pm_serialize_node(parser, (pm_node_t *)((pm_parentheses_node_t *)node)->body, buffer);
1594
1603
  }
1595
- pm_serialize_location(parser, &((pm_parentheses_node_t *)node)->opening_loc, buffer);
1596
- pm_serialize_location(parser, &((pm_parentheses_node_t *)node)->closing_loc, buffer);
1604
+ pm_serialize_location(&((pm_parentheses_node_t *)node)->opening_loc, buffer);
1605
+ pm_serialize_location(&((pm_parentheses_node_t *)node)->closing_loc, buffer);
1597
1606
  break;
1598
1607
  }
1599
1608
  case PM_PINNED_EXPRESSION_NODE: {
1600
1609
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1601
1610
  pm_serialize_node(parser, (pm_node_t *)((pm_pinned_expression_node_t *)node)->expression, buffer);
1602
- pm_serialize_location(parser, &((pm_pinned_expression_node_t *)node)->operator_loc, buffer);
1603
- pm_serialize_location(parser, &((pm_pinned_expression_node_t *)node)->lparen_loc, buffer);
1604
- pm_serialize_location(parser, &((pm_pinned_expression_node_t *)node)->rparen_loc, buffer);
1611
+ pm_serialize_location(&((pm_pinned_expression_node_t *)node)->operator_loc, buffer);
1612
+ pm_serialize_location(&((pm_pinned_expression_node_t *)node)->lparen_loc, buffer);
1613
+ pm_serialize_location(&((pm_pinned_expression_node_t *)node)->rparen_loc, buffer);
1605
1614
  break;
1606
1615
  }
1607
1616
  case PM_PINNED_VARIABLE_NODE: {
1608
1617
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1609
1618
  pm_serialize_node(parser, (pm_node_t *)((pm_pinned_variable_node_t *)node)->variable, buffer);
1610
- pm_serialize_location(parser, &((pm_pinned_variable_node_t *)node)->operator_loc, buffer);
1619
+ pm_serialize_location(&((pm_pinned_variable_node_t *)node)->operator_loc, buffer);
1611
1620
  break;
1612
1621
  }
1613
1622
  case PM_POST_EXECUTION_NODE: {
@@ -1617,9 +1626,9 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1617
1626
  } else {
1618
1627
  pm_serialize_node(parser, (pm_node_t *)((pm_post_execution_node_t *)node)->statements, buffer);
1619
1628
  }
1620
- pm_serialize_location(parser, &((pm_post_execution_node_t *)node)->keyword_loc, buffer);
1621
- pm_serialize_location(parser, &((pm_post_execution_node_t *)node)->opening_loc, buffer);
1622
- pm_serialize_location(parser, &((pm_post_execution_node_t *)node)->closing_loc, buffer);
1629
+ pm_serialize_location(&((pm_post_execution_node_t *)node)->keyword_loc, buffer);
1630
+ pm_serialize_location(&((pm_post_execution_node_t *)node)->opening_loc, buffer);
1631
+ pm_serialize_location(&((pm_post_execution_node_t *)node)->closing_loc, buffer);
1623
1632
  break;
1624
1633
  }
1625
1634
  case PM_PRE_EXECUTION_NODE: {
@@ -1629,9 +1638,9 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1629
1638
  } else {
1630
1639
  pm_serialize_node(parser, (pm_node_t *)((pm_pre_execution_node_t *)node)->statements, buffer);
1631
1640
  }
1632
- pm_serialize_location(parser, &((pm_pre_execution_node_t *)node)->keyword_loc, buffer);
1633
- pm_serialize_location(parser, &((pm_pre_execution_node_t *)node)->opening_loc, buffer);
1634
- pm_serialize_location(parser, &((pm_pre_execution_node_t *)node)->closing_loc, buffer);
1641
+ pm_serialize_location(&((pm_pre_execution_node_t *)node)->keyword_loc, buffer);
1642
+ pm_serialize_location(&((pm_pre_execution_node_t *)node)->opening_loc, buffer);
1643
+ pm_serialize_location(&((pm_pre_execution_node_t *)node)->closing_loc, buffer);
1635
1644
  break;
1636
1645
  }
1637
1646
  case PM_PROGRAM_NODE: {
@@ -1656,7 +1665,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1656
1665
  } else {
1657
1666
  pm_serialize_node(parser, (pm_node_t *)((pm_range_node_t *)node)->right, buffer);
1658
1667
  }
1659
- pm_serialize_location(parser, &((pm_range_node_t *)node)->operator_loc, buffer);
1668
+ pm_serialize_location(&((pm_range_node_t *)node)->operator_loc, buffer);
1660
1669
  break;
1661
1670
  }
1662
1671
  case PM_RATIONAL_NODE: {
@@ -1671,16 +1680,16 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1671
1680
  }
1672
1681
  case PM_REGULAR_EXPRESSION_NODE: {
1673
1682
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1674
- pm_serialize_location(parser, &((pm_regular_expression_node_t *)node)->opening_loc, buffer);
1675
- pm_serialize_location(parser, &((pm_regular_expression_node_t *)node)->content_loc, buffer);
1676
- pm_serialize_location(parser, &((pm_regular_expression_node_t *)node)->closing_loc, buffer);
1677
- pm_serialize_string(parser, &((pm_regular_expression_node_t *)node)->unescaped, buffer);
1683
+ pm_serialize_location(&((pm_regular_expression_node_t *)node)->opening_loc, buffer);
1684
+ pm_serialize_location(&((pm_regular_expression_node_t *)node)->content_loc, buffer);
1685
+ pm_serialize_location(&((pm_regular_expression_node_t *)node)->closing_loc, buffer);
1686
+ pm_serialize_string(&((pm_regular_expression_node_t *)node)->unescaped, buffer);
1678
1687
  break;
1679
1688
  }
1680
1689
  case PM_REQUIRED_KEYWORD_PARAMETER_NODE: {
1681
1690
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1682
1691
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_required_keyword_parameter_node_t *)node)->name));
1683
- pm_serialize_location(parser, &((pm_required_keyword_parameter_node_t *)node)->name_loc, buffer);
1692
+ pm_serialize_location(&((pm_required_keyword_parameter_node_t *)node)->name_loc, buffer);
1684
1693
  break;
1685
1694
  }
1686
1695
  case PM_REQUIRED_PARAMETER_NODE: {
@@ -1691,34 +1700,34 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1691
1700
  case PM_RESCUE_MODIFIER_NODE: {
1692
1701
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1693
1702
  pm_serialize_node(parser, (pm_node_t *)((pm_rescue_modifier_node_t *)node)->expression, buffer);
1694
- pm_serialize_location(parser, &((pm_rescue_modifier_node_t *)node)->keyword_loc, buffer);
1703
+ pm_serialize_location(&((pm_rescue_modifier_node_t *)node)->keyword_loc, buffer);
1695
1704
  pm_serialize_node(parser, (pm_node_t *)((pm_rescue_modifier_node_t *)node)->rescue_expression, buffer);
1696
1705
  break;
1697
1706
  }
1698
1707
  case PM_RESCUE_NODE: {
1699
1708
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1700
- pm_serialize_location(parser, &((pm_rescue_node_t *)node)->keyword_loc, buffer);
1709
+ pm_serialize_location(&((pm_rescue_node_t *)node)->keyword_loc, buffer);
1701
1710
  uint32_t exceptions_size = pm_sizet_to_u32(((pm_rescue_node_t *)node)->exceptions.size);
1702
1711
  pm_buffer_append_varuint(buffer, exceptions_size);
1703
1712
  for (uint32_t index = 0; index < exceptions_size; index++) {
1704
1713
  pm_serialize_node(parser, (pm_node_t *) ((pm_rescue_node_t *)node)->exceptions.nodes[index], buffer);
1705
1714
  }
1706
- if (((pm_rescue_node_t *)node)->operator_loc.start == NULL) {
1715
+ if (((pm_rescue_node_t *)node)->operator_loc.length == 0) {
1707
1716
  pm_buffer_append_byte(buffer, 0);
1708
1717
  } else {
1709
1718
  pm_buffer_append_byte(buffer, 1);
1710
- pm_serialize_location(parser, &((pm_rescue_node_t *)node)->operator_loc, buffer);
1719
+ pm_serialize_location(&((pm_rescue_node_t *)node)->operator_loc, buffer);
1711
1720
  }
1712
1721
  if (((pm_rescue_node_t *)node)->reference == NULL) {
1713
1722
  pm_buffer_append_byte(buffer, 0);
1714
1723
  } else {
1715
1724
  pm_serialize_node(parser, (pm_node_t *)((pm_rescue_node_t *)node)->reference, buffer);
1716
1725
  }
1717
- if (((pm_rescue_node_t *)node)->then_keyword_loc.start == NULL) {
1726
+ if (((pm_rescue_node_t *)node)->then_keyword_loc.length == 0) {
1718
1727
  pm_buffer_append_byte(buffer, 0);
1719
1728
  } else {
1720
1729
  pm_buffer_append_byte(buffer, 1);
1721
- pm_serialize_location(parser, &((pm_rescue_node_t *)node)->then_keyword_loc, buffer);
1730
+ pm_serialize_location(&((pm_rescue_node_t *)node)->then_keyword_loc, buffer);
1722
1731
  }
1723
1732
  if (((pm_rescue_node_t *)node)->statements == NULL) {
1724
1733
  pm_buffer_append_byte(buffer, 0);
@@ -1735,13 +1744,13 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1735
1744
  case PM_REST_PARAMETER_NODE: {
1736
1745
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1737
1746
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_rest_parameter_node_t *)node)->name));
1738
- if (((pm_rest_parameter_node_t *)node)->name_loc.start == NULL) {
1747
+ if (((pm_rest_parameter_node_t *)node)->name_loc.length == 0) {
1739
1748
  pm_buffer_append_byte(buffer, 0);
1740
1749
  } else {
1741
1750
  pm_buffer_append_byte(buffer, 1);
1742
- pm_serialize_location(parser, &((pm_rest_parameter_node_t *)node)->name_loc, buffer);
1751
+ pm_serialize_location(&((pm_rest_parameter_node_t *)node)->name_loc, buffer);
1743
1752
  }
1744
- pm_serialize_location(parser, &((pm_rest_parameter_node_t *)node)->operator_loc, buffer);
1753
+ pm_serialize_location(&((pm_rest_parameter_node_t *)node)->operator_loc, buffer);
1745
1754
  break;
1746
1755
  }
1747
1756
  case PM_RETRY_NODE: {
@@ -1750,7 +1759,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1750
1759
  }
1751
1760
  case PM_RETURN_NODE: {
1752
1761
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1753
- pm_serialize_location(parser, &((pm_return_node_t *)node)->keyword_loc, buffer);
1762
+ pm_serialize_location(&((pm_return_node_t *)node)->keyword_loc, buffer);
1754
1763
  if (((pm_return_node_t *)node)->arguments == NULL) {
1755
1764
  pm_buffer_append_byte(buffer, 0);
1756
1765
  } else {
@@ -1774,15 +1783,15 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1774
1783
  for (uint32_t index = 0; index < locals_size; index++) {
1775
1784
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_singleton_class_node_t *)node)->locals.ids[index]));
1776
1785
  }
1777
- pm_serialize_location(parser, &((pm_singleton_class_node_t *)node)->class_keyword_loc, buffer);
1778
- pm_serialize_location(parser, &((pm_singleton_class_node_t *)node)->operator_loc, buffer);
1786
+ pm_serialize_location(&((pm_singleton_class_node_t *)node)->class_keyword_loc, buffer);
1787
+ pm_serialize_location(&((pm_singleton_class_node_t *)node)->operator_loc, buffer);
1779
1788
  pm_serialize_node(parser, (pm_node_t *)((pm_singleton_class_node_t *)node)->expression, buffer);
1780
1789
  if (((pm_singleton_class_node_t *)node)->body == NULL) {
1781
1790
  pm_buffer_append_byte(buffer, 0);
1782
1791
  } else {
1783
1792
  pm_serialize_node(parser, (pm_node_t *)((pm_singleton_class_node_t *)node)->body, buffer);
1784
1793
  }
1785
- pm_serialize_location(parser, &((pm_singleton_class_node_t *)node)->end_keyword_loc, buffer);
1794
+ pm_serialize_location(&((pm_singleton_class_node_t *)node)->end_keyword_loc, buffer);
1786
1795
  break;
1787
1796
  }
1788
1797
  case PM_SOURCE_ENCODING_NODE: {
@@ -1791,7 +1800,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1791
1800
  }
1792
1801
  case PM_SOURCE_FILE_NODE: {
1793
1802
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1794
- pm_serialize_string(parser, &((pm_source_file_node_t *)node)->filepath, buffer);
1803
+ pm_serialize_string(&((pm_source_file_node_t *)node)->filepath, buffer);
1795
1804
  break;
1796
1805
  }
1797
1806
  case PM_SOURCE_LINE_NODE: {
@@ -1800,7 +1809,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1800
1809
  }
1801
1810
  case PM_SPLAT_NODE: {
1802
1811
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1803
- pm_serialize_location(parser, &((pm_splat_node_t *)node)->operator_loc, buffer);
1812
+ pm_serialize_location(&((pm_splat_node_t *)node)->operator_loc, buffer);
1804
1813
  if (((pm_splat_node_t *)node)->expression == NULL) {
1805
1814
  pm_buffer_append_byte(buffer, 0);
1806
1815
  } else {
@@ -1819,41 +1828,41 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1819
1828
  }
1820
1829
  case PM_STRING_NODE: {
1821
1830
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1822
- if (((pm_string_node_t *)node)->opening_loc.start == NULL) {
1831
+ if (((pm_string_node_t *)node)->opening_loc.length == 0) {
1823
1832
  pm_buffer_append_byte(buffer, 0);
1824
1833
  } else {
1825
1834
  pm_buffer_append_byte(buffer, 1);
1826
- pm_serialize_location(parser, &((pm_string_node_t *)node)->opening_loc, buffer);
1835
+ pm_serialize_location(&((pm_string_node_t *)node)->opening_loc, buffer);
1827
1836
  }
1828
- pm_serialize_location(parser, &((pm_string_node_t *)node)->content_loc, buffer);
1829
- if (((pm_string_node_t *)node)->closing_loc.start == NULL) {
1837
+ pm_serialize_location(&((pm_string_node_t *)node)->content_loc, buffer);
1838
+ if (((pm_string_node_t *)node)->closing_loc.length == 0) {
1830
1839
  pm_buffer_append_byte(buffer, 0);
1831
1840
  } else {
1832
1841
  pm_buffer_append_byte(buffer, 1);
1833
- pm_serialize_location(parser, &((pm_string_node_t *)node)->closing_loc, buffer);
1842
+ pm_serialize_location(&((pm_string_node_t *)node)->closing_loc, buffer);
1834
1843
  }
1835
- pm_serialize_string(parser, &((pm_string_node_t *)node)->unescaped, buffer);
1844
+ pm_serialize_string(&((pm_string_node_t *)node)->unescaped, buffer);
1836
1845
  break;
1837
1846
  }
1838
1847
  case PM_SUPER_NODE: {
1839
1848
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1840
- pm_serialize_location(parser, &((pm_super_node_t *)node)->keyword_loc, buffer);
1841
- if (((pm_super_node_t *)node)->lparen_loc.start == NULL) {
1849
+ pm_serialize_location(&((pm_super_node_t *)node)->keyword_loc, buffer);
1850
+ if (((pm_super_node_t *)node)->lparen_loc.length == 0) {
1842
1851
  pm_buffer_append_byte(buffer, 0);
1843
1852
  } else {
1844
1853
  pm_buffer_append_byte(buffer, 1);
1845
- pm_serialize_location(parser, &((pm_super_node_t *)node)->lparen_loc, buffer);
1854
+ pm_serialize_location(&((pm_super_node_t *)node)->lparen_loc, buffer);
1846
1855
  }
1847
1856
  if (((pm_super_node_t *)node)->arguments == NULL) {
1848
1857
  pm_buffer_append_byte(buffer, 0);
1849
1858
  } else {
1850
1859
  pm_serialize_node(parser, (pm_node_t *)((pm_super_node_t *)node)->arguments, buffer);
1851
1860
  }
1852
- if (((pm_super_node_t *)node)->rparen_loc.start == NULL) {
1861
+ if (((pm_super_node_t *)node)->rparen_loc.length == 0) {
1853
1862
  pm_buffer_append_byte(buffer, 0);
1854
1863
  } else {
1855
1864
  pm_buffer_append_byte(buffer, 1);
1856
- pm_serialize_location(parser, &((pm_super_node_t *)node)->rparen_loc, buffer);
1865
+ pm_serialize_location(&((pm_super_node_t *)node)->rparen_loc, buffer);
1857
1866
  }
1858
1867
  if (((pm_super_node_t *)node)->block == NULL) {
1859
1868
  pm_buffer_append_byte(buffer, 0);
@@ -1864,25 +1873,20 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1864
1873
  }
1865
1874
  case PM_SYMBOL_NODE: {
1866
1875
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1867
- if (((pm_symbol_node_t *)node)->opening_loc.start == NULL) {
1868
- pm_buffer_append_byte(buffer, 0);
1869
- } else {
1870
- pm_buffer_append_byte(buffer, 1);
1871
- pm_serialize_location(parser, &((pm_symbol_node_t *)node)->opening_loc, buffer);
1872
- }
1873
- if (((pm_symbol_node_t *)node)->value_loc.start == NULL) {
1876
+ if (((pm_symbol_node_t *)node)->opening_loc.length == 0) {
1874
1877
  pm_buffer_append_byte(buffer, 0);
1875
1878
  } else {
1876
1879
  pm_buffer_append_byte(buffer, 1);
1877
- pm_serialize_location(parser, &((pm_symbol_node_t *)node)->value_loc, buffer);
1880
+ pm_serialize_location(&((pm_symbol_node_t *)node)->opening_loc, buffer);
1878
1881
  }
1879
- if (((pm_symbol_node_t *)node)->closing_loc.start == NULL) {
1882
+ pm_serialize_location(&((pm_symbol_node_t *)node)->content_loc, buffer);
1883
+ if (((pm_symbol_node_t *)node)->closing_loc.length == 0) {
1880
1884
  pm_buffer_append_byte(buffer, 0);
1881
1885
  } else {
1882
1886
  pm_buffer_append_byte(buffer, 1);
1883
- pm_serialize_location(parser, &((pm_symbol_node_t *)node)->closing_loc, buffer);
1887
+ pm_serialize_location(&((pm_symbol_node_t *)node)->closing_loc, buffer);
1884
1888
  }
1885
- pm_serialize_string(parser, &((pm_symbol_node_t *)node)->unescaped, buffer);
1889
+ pm_serialize_string(&((pm_symbol_node_t *)node)->unescaped, buffer);
1886
1890
  break;
1887
1891
  }
1888
1892
  case PM_TRUE_NODE: {
@@ -1896,18 +1900,18 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1896
1900
  for (uint32_t index = 0; index < names_size; index++) {
1897
1901
  pm_serialize_node(parser, (pm_node_t *) ((pm_undef_node_t *)node)->names.nodes[index], buffer);
1898
1902
  }
1899
- pm_serialize_location(parser, &((pm_undef_node_t *)node)->keyword_loc, buffer);
1903
+ pm_serialize_location(&((pm_undef_node_t *)node)->keyword_loc, buffer);
1900
1904
  break;
1901
1905
  }
1902
1906
  case PM_UNLESS_NODE: {
1903
1907
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1904
- pm_serialize_location(parser, &((pm_unless_node_t *)node)->keyword_loc, buffer);
1908
+ pm_serialize_location(&((pm_unless_node_t *)node)->unless_keyword_loc, buffer);
1905
1909
  pm_serialize_node(parser, (pm_node_t *)((pm_unless_node_t *)node)->predicate, buffer);
1906
- if (((pm_unless_node_t *)node)->then_keyword_loc.start == NULL) {
1910
+ if (((pm_unless_node_t *)node)->then_keyword_loc.length == 0) {
1907
1911
  pm_buffer_append_byte(buffer, 0);
1908
1912
  } else {
1909
1913
  pm_buffer_append_byte(buffer, 1);
1910
- pm_serialize_location(parser, &((pm_unless_node_t *)node)->then_keyword_loc, buffer);
1914
+ pm_serialize_location(&((pm_unless_node_t *)node)->then_keyword_loc, buffer);
1911
1915
  }
1912
1916
  if (((pm_unless_node_t *)node)->statements == NULL) {
1913
1917
  pm_buffer_append_byte(buffer, 0);
@@ -1919,28 +1923,28 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1919
1923
  } else {
1920
1924
  pm_serialize_node(parser, (pm_node_t *)((pm_unless_node_t *)node)->else_clause, buffer);
1921
1925
  }
1922
- if (((pm_unless_node_t *)node)->end_keyword_loc.start == NULL) {
1926
+ if (((pm_unless_node_t *)node)->end_keyword_loc.length == 0) {
1923
1927
  pm_buffer_append_byte(buffer, 0);
1924
1928
  } else {
1925
1929
  pm_buffer_append_byte(buffer, 1);
1926
- pm_serialize_location(parser, &((pm_unless_node_t *)node)->end_keyword_loc, buffer);
1930
+ pm_serialize_location(&((pm_unless_node_t *)node)->end_keyword_loc, buffer);
1927
1931
  }
1928
1932
  break;
1929
1933
  }
1930
1934
  case PM_UNTIL_NODE: {
1931
1935
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1932
- pm_serialize_location(parser, &((pm_until_node_t *)node)->keyword_loc, buffer);
1933
- if (((pm_until_node_t *)node)->do_keyword_loc.start == NULL) {
1936
+ pm_serialize_location(&((pm_until_node_t *)node)->until_keyword_loc, buffer);
1937
+ if (((pm_until_node_t *)node)->do_keyword_loc.length == 0) {
1934
1938
  pm_buffer_append_byte(buffer, 0);
1935
1939
  } else {
1936
1940
  pm_buffer_append_byte(buffer, 1);
1937
- pm_serialize_location(parser, &((pm_until_node_t *)node)->do_keyword_loc, buffer);
1941
+ pm_serialize_location(&((pm_until_node_t *)node)->do_keyword_loc, buffer);
1938
1942
  }
1939
- if (((pm_until_node_t *)node)->closing_loc.start == NULL) {
1943
+ if (((pm_until_node_t *)node)->end_keyword_loc.length == 0) {
1940
1944
  pm_buffer_append_byte(buffer, 0);
1941
1945
  } else {
1942
1946
  pm_buffer_append_byte(buffer, 1);
1943
- pm_serialize_location(parser, &((pm_until_node_t *)node)->closing_loc, buffer);
1947
+ pm_serialize_location(&((pm_until_node_t *)node)->end_keyword_loc, buffer);
1944
1948
  }
1945
1949
  pm_serialize_node(parser, (pm_node_t *)((pm_until_node_t *)node)->predicate, buffer);
1946
1950
  if (((pm_until_node_t *)node)->statements == NULL) {
@@ -1952,17 +1956,17 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1952
1956
  }
1953
1957
  case PM_WHEN_NODE: {
1954
1958
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1955
- pm_serialize_location(parser, &((pm_when_node_t *)node)->keyword_loc, buffer);
1959
+ pm_serialize_location(&((pm_when_node_t *)node)->when_keyword_loc, buffer);
1956
1960
  uint32_t conditions_size = pm_sizet_to_u32(((pm_when_node_t *)node)->conditions.size);
1957
1961
  pm_buffer_append_varuint(buffer, conditions_size);
1958
1962
  for (uint32_t index = 0; index < conditions_size; index++) {
1959
1963
  pm_serialize_node(parser, (pm_node_t *) ((pm_when_node_t *)node)->conditions.nodes[index], buffer);
1960
1964
  }
1961
- if (((pm_when_node_t *)node)->then_keyword_loc.start == NULL) {
1965
+ if (((pm_when_node_t *)node)->then_keyword_loc.length == 0) {
1962
1966
  pm_buffer_append_byte(buffer, 0);
1963
1967
  } else {
1964
1968
  pm_buffer_append_byte(buffer, 1);
1965
- pm_serialize_location(parser, &((pm_when_node_t *)node)->then_keyword_loc, buffer);
1969
+ pm_serialize_location(&((pm_when_node_t *)node)->then_keyword_loc, buffer);
1966
1970
  }
1967
1971
  if (((pm_when_node_t *)node)->statements == NULL) {
1968
1972
  pm_buffer_append_byte(buffer, 0);
@@ -1973,18 +1977,18 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1973
1977
  }
1974
1978
  case PM_WHILE_NODE: {
1975
1979
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1976
- pm_serialize_location(parser, &((pm_while_node_t *)node)->keyword_loc, buffer);
1977
- if (((pm_while_node_t *)node)->do_keyword_loc.start == NULL) {
1980
+ pm_serialize_location(&((pm_while_node_t *)node)->while_keyword_loc, buffer);
1981
+ if (((pm_while_node_t *)node)->do_keyword_loc.length == 0) {
1978
1982
  pm_buffer_append_byte(buffer, 0);
1979
1983
  } else {
1980
1984
  pm_buffer_append_byte(buffer, 1);
1981
- pm_serialize_location(parser, &((pm_while_node_t *)node)->do_keyword_loc, buffer);
1985
+ pm_serialize_location(&((pm_while_node_t *)node)->do_keyword_loc, buffer);
1982
1986
  }
1983
- if (((pm_while_node_t *)node)->closing_loc.start == NULL) {
1987
+ if (((pm_while_node_t *)node)->end_keyword_loc.length == 0) {
1984
1988
  pm_buffer_append_byte(buffer, 0);
1985
1989
  } else {
1986
1990
  pm_buffer_append_byte(buffer, 1);
1987
- pm_serialize_location(parser, &((pm_while_node_t *)node)->closing_loc, buffer);
1991
+ pm_serialize_location(&((pm_while_node_t *)node)->end_keyword_loc, buffer);
1988
1992
  }
1989
1993
  pm_serialize_node(parser, (pm_node_t *)((pm_while_node_t *)node)->predicate, buffer);
1990
1994
  if (((pm_while_node_t *)node)->statements == NULL) {
@@ -1996,39 +2000,42 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1996
2000
  }
1997
2001
  case PM_X_STRING_NODE: {
1998
2002
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1999
- pm_serialize_location(parser, &((pm_x_string_node_t *)node)->opening_loc, buffer);
2000
- pm_serialize_location(parser, &((pm_x_string_node_t *)node)->content_loc, buffer);
2001
- pm_serialize_location(parser, &((pm_x_string_node_t *)node)->closing_loc, buffer);
2002
- pm_serialize_string(parser, &((pm_x_string_node_t *)node)->unescaped, buffer);
2003
+ pm_serialize_location(&((pm_x_string_node_t *)node)->opening_loc, buffer);
2004
+ pm_serialize_location(&((pm_x_string_node_t *)node)->content_loc, buffer);
2005
+ pm_serialize_location(&((pm_x_string_node_t *)node)->closing_loc, buffer);
2006
+ pm_serialize_string(&((pm_x_string_node_t *)node)->unescaped, buffer);
2003
2007
  break;
2004
2008
  }
2005
2009
  case PM_YIELD_NODE: {
2006
2010
  pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2007
- pm_serialize_location(parser, &((pm_yield_node_t *)node)->keyword_loc, buffer);
2008
- if (((pm_yield_node_t *)node)->lparen_loc.start == NULL) {
2011
+ pm_serialize_location(&((pm_yield_node_t *)node)->keyword_loc, buffer);
2012
+ if (((pm_yield_node_t *)node)->lparen_loc.length == 0) {
2009
2013
  pm_buffer_append_byte(buffer, 0);
2010
2014
  } else {
2011
2015
  pm_buffer_append_byte(buffer, 1);
2012
- pm_serialize_location(parser, &((pm_yield_node_t *)node)->lparen_loc, buffer);
2016
+ pm_serialize_location(&((pm_yield_node_t *)node)->lparen_loc, buffer);
2013
2017
  }
2014
2018
  if (((pm_yield_node_t *)node)->arguments == NULL) {
2015
2019
  pm_buffer_append_byte(buffer, 0);
2016
2020
  } else {
2017
2021
  pm_serialize_node(parser, (pm_node_t *)((pm_yield_node_t *)node)->arguments, buffer);
2018
2022
  }
2019
- if (((pm_yield_node_t *)node)->rparen_loc.start == NULL) {
2023
+ if (((pm_yield_node_t *)node)->rparen_loc.length == 0) {
2020
2024
  pm_buffer_append_byte(buffer, 0);
2021
2025
  } else {
2022
2026
  pm_buffer_append_byte(buffer, 1);
2023
- pm_serialize_location(parser, &((pm_yield_node_t *)node)->rparen_loc, buffer);
2027
+ pm_serialize_location(&((pm_yield_node_t *)node)->rparen_loc, buffer);
2024
2028
  }
2025
2029
  break;
2026
2030
  }
2027
2031
  }
2028
2032
  }
2029
2033
 
2030
- static void
2031
- pm_serialize_newline_list(pm_newline_list_t *list, pm_buffer_t *buffer) {
2034
+ /*
2035
+ * Serialize the given list of offsets to the given buffer.
2036
+ */
2037
+ void
2038
+ pm_serialize_line_offset_list(pm_line_offset_list_t *list, pm_buffer_t *buffer) {
2032
2039
  uint32_t size = pm_sizet_to_u32(list->size);
2033
2040
  pm_buffer_append_varuint(buffer, size);
2034
2041
 
@@ -2039,60 +2046,88 @@ pm_serialize_newline_list(pm_newline_list_t *list, pm_buffer_t *buffer) {
2039
2046
  }
2040
2047
 
2041
2048
  static void
2042
- pm_serialize_comment(pm_parser_t *parser, pm_comment_t *comment, pm_buffer_t *buffer) {
2049
+ pm_serialize_comment(pm_comment_t *comment, pm_buffer_t *buffer) {
2043
2050
  // serialize type
2044
2051
  pm_buffer_append_byte(buffer, (uint8_t) comment->type);
2045
2052
 
2046
2053
  // serialize location
2047
- pm_serialize_location(parser, &comment->location, buffer);
2054
+ pm_serialize_location(&comment->location, buffer);
2048
2055
  }
2049
2056
 
2050
2057
  /**
2051
2058
  * Serialize the given list of comments to the given buffer.
2052
2059
  */
2053
2060
  void
2054
- pm_serialize_comment_list(pm_parser_t *parser, pm_list_t *list, pm_buffer_t *buffer) {
2061
+ pm_serialize_comment_list(pm_list_t *list, pm_buffer_t *buffer) {
2055
2062
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(pm_list_size(list)));
2056
2063
 
2057
2064
  pm_comment_t *comment;
2058
2065
  for (comment = (pm_comment_t *) list->head; comment != NULL; comment = (pm_comment_t *) comment->node.next) {
2059
- pm_serialize_comment(parser, comment, buffer);
2066
+ pm_serialize_comment(comment, buffer);
2060
2067
  }
2061
2068
  }
2062
2069
 
2070
+ /**
2071
+ * Serialize the comments attached to each node. This is the number of nodes
2072
+ * that own comments, followed by each of those nodes' id, the number of
2073
+ * comments it owns, and the index of each of those comments in the comment
2074
+ * list.
2075
+ */
2063
2076
  static void
2064
- pm_serialize_magic_comment(pm_parser_t *parser, pm_magic_comment_t *magic_comment, pm_buffer_t *buffer) {
2077
+ pm_serialize_comment_attachments(const pm_comment_attachments_t *attachments, pm_buffer_t *buffer) {
2078
+ uint32_t count = 0;
2079
+ for (uint32_t node_id = 0; node_id < attachments->ranges_size; node_id++) {
2080
+ if (attachments->ranges[node_id].length > 0) count++;
2081
+ }
2082
+
2083
+ pm_buffer_append_varuint(buffer, count);
2084
+
2085
+ for (uint32_t node_id = 0; node_id < attachments->ranges_size; node_id++) {
2086
+ pm_comment_range_t range = attachments->ranges[node_id];
2087
+ if (range.length == 0) continue;
2088
+
2089
+ pm_buffer_append_varuint(buffer, node_id);
2090
+ pm_buffer_append_varuint(buffer, range.length);
2091
+
2092
+ for (uint32_t index = 0; index < range.length; index++) {
2093
+ pm_buffer_append_varuint(buffer, attachments->attachments[range.index + index]);
2094
+ }
2095
+ }
2096
+ }
2097
+
2098
+ static void
2099
+ pm_serialize_magic_comment(pm_magic_comment_t *magic_comment, pm_buffer_t *buffer) {
2065
2100
  // serialize key location
2066
- pm_buffer_append_varuint(buffer, pm_ptrdifft_to_u32(magic_comment->key_start - parser->start));
2067
- pm_buffer_append_varuint(buffer, pm_sizet_to_u32(magic_comment->key_length));
2101
+ pm_buffer_append_varuint(buffer, magic_comment->key.start);
2102
+ pm_buffer_append_varuint(buffer, magic_comment->key.length);
2068
2103
 
2069
2104
  // serialize value location
2070
- pm_buffer_append_varuint(buffer, pm_ptrdifft_to_u32(magic_comment->value_start - parser->start));
2071
- pm_buffer_append_varuint(buffer, pm_sizet_to_u32(magic_comment->value_length));
2105
+ pm_buffer_append_varuint(buffer, magic_comment->value.start);
2106
+ pm_buffer_append_varuint(buffer, magic_comment->value.length);
2072
2107
  }
2073
2108
 
2074
2109
  static void
2075
- pm_serialize_magic_comment_list(pm_parser_t *parser, pm_list_t *list, pm_buffer_t *buffer) {
2110
+ pm_serialize_magic_comment_list(pm_list_t *list, pm_buffer_t *buffer) {
2076
2111
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(pm_list_size(list)));
2077
2112
 
2078
2113
  pm_magic_comment_t *magic_comment;
2079
2114
  for (magic_comment = (pm_magic_comment_t *) list->head; magic_comment != NULL; magic_comment = (pm_magic_comment_t *) magic_comment->node.next) {
2080
- pm_serialize_magic_comment(parser, magic_comment, buffer);
2115
+ pm_serialize_magic_comment(magic_comment, buffer);
2081
2116
  }
2082
2117
  }
2083
2118
 
2084
2119
  static void
2085
2120
  pm_serialize_data_loc(const pm_parser_t *parser, pm_buffer_t *buffer) {
2086
- if (parser->data_loc.end == NULL) {
2121
+ if (parser->data_loc.length == 0) {
2087
2122
  pm_buffer_append_byte(buffer, 0);
2088
2123
  } else {
2089
2124
  pm_buffer_append_byte(buffer, 1);
2090
- pm_serialize_location(parser, &parser->data_loc, buffer);
2125
+ pm_serialize_location(&parser->data_loc, buffer);
2091
2126
  }
2092
2127
  }
2093
2128
 
2094
2129
  static void
2095
- pm_serialize_diagnostic(pm_parser_t *parser, pm_diagnostic_t *diagnostic, pm_buffer_t *buffer) {
2130
+ pm_serialize_diagnostic(pm_diagnostic_t *diagnostic, pm_buffer_t *buffer) {
2096
2131
  // serialize the type
2097
2132
  pm_buffer_append_varuint(buffer, (uint32_t) diagnostic->diag_id);
2098
2133
 
@@ -2102,18 +2137,18 @@ pm_serialize_diagnostic(pm_parser_t *parser, pm_diagnostic_t *diagnostic, pm_buf
2102
2137
  pm_buffer_append_string(buffer, diagnostic->message, message_length);
2103
2138
 
2104
2139
  // serialize location
2105
- pm_serialize_location(parser, &diagnostic->location, buffer);
2140
+ pm_serialize_location(&diagnostic->location, buffer);
2106
2141
 
2107
2142
  pm_buffer_append_byte(buffer, diagnostic->level);
2108
2143
  }
2109
2144
 
2110
2145
  static void
2111
- pm_serialize_diagnostic_list(pm_parser_t *parser, pm_list_t *list, pm_buffer_t *buffer) {
2146
+ pm_serialize_diagnostic_list(pm_list_t *list, pm_buffer_t *buffer) {
2112
2147
  pm_buffer_append_varuint(buffer, pm_sizet_to_u32(pm_list_size(list)));
2113
2148
 
2114
2149
  pm_diagnostic_t *diagnostic;
2115
2150
  for (diagnostic = (pm_diagnostic_t *) list->head; diagnostic != NULL; diagnostic = (pm_diagnostic_t *) diagnostic->node.next) {
2116
- pm_serialize_diagnostic(parser, diagnostic, buffer);
2151
+ pm_serialize_diagnostic(diagnostic, buffer);
2117
2152
  }
2118
2153
  }
2119
2154
 
@@ -2131,15 +2166,18 @@ static void
2131
2166
  pm_serialize_metadata(pm_parser_t *parser, pm_buffer_t *buffer) {
2132
2167
  pm_serialize_encoding(parser->encoding, buffer);
2133
2168
  pm_buffer_append_varsint(buffer, parser->start_line);
2134
- pm_serialize_newline_list(&parser->newline_list, buffer);
2135
- pm_serialize_comment_list(parser, &parser->comment_list, buffer);
2136
- pm_serialize_magic_comment_list(parser, &parser->magic_comment_list, buffer);
2169
+ pm_buffer_append_uint64(buffer, pm_parser_checksum(parser));
2170
+ pm_serialize_line_offset_list(&parser->line_offsets, buffer);
2171
+ pm_serialize_comment_list(&parser->comment_list, buffer);
2172
+ pm_serialize_comment_attachments(&parser->comment_attachments, buffer);
2173
+ pm_serialize_magic_comment_list(&parser->magic_comment_list, buffer);
2137
2174
  pm_serialize_data_loc(parser, buffer);
2138
- pm_serialize_diagnostic_list(parser, &parser->error_list, buffer);
2139
- pm_serialize_diagnostic_list(parser, &parser->warning_list, buffer);
2175
+ pm_serialize_diagnostic_list(&parser->error_list, buffer);
2176
+ pm_serialize_diagnostic_list(&parser->warning_list, buffer);
2177
+ pm_buffer_append_byte(buffer, (uint8_t) parser->continuable);
2140
2178
  }
2141
2179
 
2142
- #line 275 "prism/templates/src/serialize.c.erb"
2180
+ #line 310 "prism/templates/src/serialize.c.erb"
2143
2181
  /**
2144
2182
  * Serialize the metadata, nodes, and constant pool.
2145
2183
  */
@@ -2176,28 +2214,12 @@ pm_serialize_content(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer)
2176
2214
  pm_constant_t *constant = &parser->constant_pool.constants[bucket->id - 1];
2177
2215
  size_t buffer_offset = offset + ((((size_t)bucket->id) - 1) * 8);
2178
2216
 
2179
- if (bucket->type == PM_CONSTANT_POOL_BUCKET_OWNED || bucket->type == PM_CONSTANT_POOL_BUCKET_CONSTANT) {
2180
- // Since this is an owned or constant constant, we are going to
2181
- // write its contents into the buffer after the constant pool.
2182
- // So effectively in place of the source offset, we have a
2183
- // buffer offset. We will add a leading 1 to indicate that this
2184
- // is a buffer offset.
2185
- uint32_t content_offset = pm_sizet_to_u32(buffer->length);
2186
- uint32_t owned_mask = 1U << 31;
2187
-
2188
- assert(content_offset < owned_mask);
2189
- content_offset |= owned_mask;
2190
-
2191
- memcpy(buffer->value + buffer_offset, &content_offset, 4);
2192
- pm_buffer_append_bytes(buffer, constant->start, constant->length);
2193
- } else {
2194
- // Since this is a shared constant, we are going to write its
2195
- // source offset directly into the buffer.
2196
- uint32_t source_offset = pm_ptrdifft_to_u32(constant->start - parser->start);
2197
- memcpy(buffer->value + buffer_offset, &source_offset, 4);
2198
- }
2217
+ // Write the constant contents into the buffer after the constant
2218
+ // pool. In place of the source offset, we store a buffer offset.
2219
+ uint32_t content_offset = pm_sizet_to_u32(buffer->length);
2220
+ memcpy(buffer->value + buffer_offset, &content_offset, 4);
2221
+ pm_buffer_append_bytes(buffer, constant->start, constant->length);
2199
2222
 
2200
- // Now we can write the length of the constant into the buffer.
2201
2223
  uint32_t constant_length = pm_sizet_to_u32(constant->length);
2202
2224
  memcpy(buffer->value + buffer_offset + 4, &constant_length, 4);
2203
2225
  }
@@ -2205,7 +2227,7 @@ pm_serialize_content(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer)
2205
2227
  }
2206
2228
 
2207
2229
  static void
2208
- serialize_token(void *data, pm_parser_t *parser, pm_token_t *token) {
2230
+ serialize_token(pm_parser_t *parser, pm_token_t *token, void *data) {
2209
2231
  pm_buffer_t *buffer = (pm_buffer_t *) data;
2210
2232
 
2211
2233
  pm_buffer_append_varuint(buffer, token->type);
@@ -2217,58 +2239,72 @@ serialize_token(void *data, pm_parser_t *parser, pm_token_t *token) {
2217
2239
  /**
2218
2240
  * Lex the given source and serialize to the given buffer.
2219
2241
  */
2220
- PRISM_EXPORTED_FUNCTION void
2242
+ void
2221
2243
  pm_serialize_lex(pm_buffer_t *buffer, const uint8_t *source, size_t size, const char *data) {
2222
2244
  pm_options_t options = { 0 };
2223
2245
  pm_options_read(&options, data);
2224
2246
 
2247
+ pm_arena_t arena = { 0 };
2225
2248
  pm_parser_t parser;
2226
- pm_parser_init(&parser, source, size, &options);
2249
+ pm_parser_init(&arena, &parser, source, size, &options);
2227
2250
 
2228
- pm_lex_callback_t lex_callback = (pm_lex_callback_t) {
2229
- .data = (void *) buffer,
2230
- .callback = serialize_token,
2231
- };
2232
-
2233
- parser.lex_callback = &lex_callback;
2234
- pm_node_t *node = pm_parse(&parser);
2251
+ pm_parser_lex_callback_set(&parser, serialize_token, buffer);
2252
+ pm_parse(&parser);
2235
2253
 
2236
2254
  // Append 0 to mark end of tokens.
2237
2255
  pm_buffer_append_byte(buffer, 0);
2238
2256
 
2239
2257
  pm_serialize_metadata(&parser, buffer);
2240
2258
 
2241
- pm_node_destroy(&parser, node);
2242
- pm_parser_free(&parser);
2243
- pm_options_free(&options);
2259
+ pm_parser_cleanup(&parser);
2260
+ pm_arena_cleanup(&arena);
2261
+ pm_options_cleanup(&options);
2244
2262
  }
2245
2263
 
2246
2264
  /**
2247
2265
  * Parse and serialize both the AST and the tokens represented by the given
2248
2266
  * source to the given buffer.
2249
2267
  */
2250
- PRISM_EXPORTED_FUNCTION void
2268
+ void
2251
2269
  pm_serialize_parse_lex(pm_buffer_t *buffer, const uint8_t *source, size_t size, const char *data) {
2252
2270
  pm_options_t options = { 0 };
2253
2271
  pm_options_read(&options, data);
2254
2272
 
2273
+ pm_arena_t arena = { 0 };
2255
2274
  pm_parser_t parser;
2256
- pm_parser_init(&parser, source, size, &options);
2275
+ pm_parser_init(&arena, &parser, source, size, &options);
2257
2276
 
2258
- pm_lex_callback_t lex_callback = (pm_lex_callback_t) {
2259
- .data = (void *) buffer,
2260
- .callback = serialize_token,
2261
- };
2262
-
2263
- parser.lex_callback = &lex_callback;
2277
+ pm_parser_lex_callback_set(&parser, serialize_token, buffer);
2264
2278
  pm_node_t *node = pm_parse(&parser);
2265
2279
 
2266
2280
  pm_buffer_append_byte(buffer, 0);
2267
2281
  pm_serialize(&parser, node, buffer);
2268
2282
 
2269
- pm_node_destroy(&parser, node);
2270
- pm_parser_free(&parser);
2271
- pm_options_free(&options);
2283
+ pm_parser_cleanup(&parser);
2284
+ pm_arena_cleanup(&arena);
2285
+ pm_options_cleanup(&options);
2286
+ }
2287
+
2288
+ /**
2289
+ * Parse the source and return true if it parses without errors or warnings.
2290
+ */
2291
+ bool
2292
+ pm_serialize_parse_success_p(const uint8_t *source, size_t size, const char *data) {
2293
+ pm_options_t options = { 0 };
2294
+ pm_options_read(&options, data);
2295
+
2296
+ pm_arena_t arena = { 0 };
2297
+ pm_parser_t parser;
2298
+ pm_parser_init(&arena, &parser, source, size, &options);
2299
+
2300
+ pm_parse(&parser);
2301
+
2302
+ bool result = parser.error_list.size == 0;
2303
+ pm_parser_cleanup(&parser);
2304
+ pm_arena_cleanup(&arena);
2305
+ pm_options_cleanup(&options);
2306
+
2307
+ return result;
2272
2308
  }
2273
2309
 
2274
2310
  #endif