@herb-tools/node 0.1.0

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