yarp 0.8.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
data/src/serialize.c CHANGED
@@ -1,6 +1,6 @@
1
1
  /******************************************************************************/
2
- /* This file is generated by the bin/template script and should not be */
3
- /* modified manually. See */
2
+ /* This file is generated by the templates/template.rb script and should not */
3
+ /* be modified manually. See */
4
4
  /* templates/src/serialize.c.erb */
5
5
  /* if you are looking to modify the */
6
6
  /* template */
@@ -22,7 +22,7 @@ yp_sizet_to_u32(size_t value) {
22
22
  }
23
23
 
24
24
  static void
25
- serialize_location(yp_parser_t *parser, yp_location_t *location, yp_buffer_t *buffer) {
25
+ yp_serialize_location(yp_parser_t *parser, yp_location_t *location, yp_buffer_t *buffer) {
26
26
  assert(location->start);
27
27
  assert(location->end);
28
28
  assert(location->start <= location->end);
@@ -31,37 +31,58 @@ serialize_location(yp_parser_t *parser, yp_location_t *location, yp_buffer_t *bu
31
31
  yp_buffer_append_u32(buffer, yp_ptrdifft_to_u32(location->end - location->start));
32
32
  }
33
33
 
34
+ static void
35
+ yp_serialize_string(yp_parser_t *parser, yp_string_t *string, yp_buffer_t *buffer) {
36
+ switch (string->type) {
37
+ case YP_STRING_SHARED: {
38
+ yp_buffer_append_u8(buffer, 1);
39
+ yp_buffer_append_u32(buffer, yp_ptrdifft_to_u32(yp_string_source(string) - parser->start));
40
+ yp_buffer_append_u32(buffer, yp_sizet_to_u32(yp_string_length(string)));
41
+ break;
42
+ }
43
+ case YP_STRING_OWNED:
44
+ case YP_STRING_CONSTANT: {
45
+ uint32_t length = yp_sizet_to_u32(yp_string_length(string));
46
+ yp_buffer_append_u8(buffer, 2);
47
+ yp_buffer_append_u32(buffer, length);
48
+ yp_buffer_append_str(buffer, yp_string_source(string), length);
49
+ break;
50
+ }
51
+ case YP_STRING_MAPPED:
52
+ assert(false && "Cannot serialize mapped strings.");
53
+ break;
54
+ }
55
+ }
56
+
34
57
  void
35
58
  yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
36
59
  yp_buffer_append_u8(buffer, (uint8_t) YP_NODE_TYPE(node));
37
60
 
38
61
  size_t offset = buffer->length;
39
62
 
40
- serialize_location(parser, &node->location, buffer);
63
+ yp_serialize_location(parser, &node->location, buffer);
41
64
 
42
65
  switch (YP_NODE_TYPE(node)) {
66
+ // We do not need to serialize a ScopeNode ever as
67
+ // it is not part of the AST
68
+ case YP_NODE_SCOPE_NODE:
69
+ return;
43
70
  case YP_NODE_ALIAS_NODE: {
44
71
  yp_serialize_node(parser, (yp_node_t *)((yp_alias_node_t *)node)->new_name, buffer);
45
72
  yp_serialize_node(parser, (yp_node_t *)((yp_alias_node_t *)node)->old_name, buffer);
46
- serialize_location(parser, &((yp_alias_node_t *)node)->keyword_loc, buffer);
73
+ yp_serialize_location(parser, &((yp_alias_node_t *)node)->keyword_loc, buffer);
47
74
  break;
48
75
  }
49
76
  case YP_NODE_ALTERNATION_PATTERN_NODE: {
50
77
  yp_serialize_node(parser, (yp_node_t *)((yp_alternation_pattern_node_t *)node)->left, buffer);
51
78
  yp_serialize_node(parser, (yp_node_t *)((yp_alternation_pattern_node_t *)node)->right, buffer);
52
- serialize_location(parser, &((yp_alternation_pattern_node_t *)node)->operator_loc, buffer);
79
+ yp_serialize_location(parser, &((yp_alternation_pattern_node_t *)node)->operator_loc, buffer);
53
80
  break;
54
81
  }
55
82
  case YP_NODE_AND_NODE: {
56
83
  yp_serialize_node(parser, (yp_node_t *)((yp_and_node_t *)node)->left, buffer);
57
84
  yp_serialize_node(parser, (yp_node_t *)((yp_and_node_t *)node)->right, buffer);
58
- serialize_location(parser, &((yp_and_node_t *)node)->operator_loc, buffer);
59
- break;
60
- }
61
- case YP_NODE_AND_WRITE_NODE: {
62
- yp_serialize_node(parser, (yp_node_t *)((yp_and_write_node_t *)node)->target, buffer);
63
- yp_serialize_node(parser, (yp_node_t *)((yp_and_write_node_t *)node)->value, buffer);
64
- serialize_location(parser, &((yp_and_write_node_t *)node)->operator_loc, buffer);
85
+ yp_serialize_location(parser, &((yp_and_node_t *)node)->operator_loc, buffer);
65
86
  break;
66
87
  }
67
88
  case YP_NODE_ARGUMENTS_NODE: {
@@ -82,13 +103,13 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
82
103
  yp_buffer_append_u8(buffer, 0);
83
104
  } else {
84
105
  yp_buffer_append_u8(buffer, 1);
85
- serialize_location(parser, &((yp_array_node_t *)node)->opening_loc, buffer);
106
+ yp_serialize_location(parser, &((yp_array_node_t *)node)->opening_loc, buffer);
86
107
  }
87
108
  if (((yp_array_node_t *)node)->closing_loc.start == NULL) {
88
109
  yp_buffer_append_u8(buffer, 0);
89
110
  } else {
90
111
  yp_buffer_append_u8(buffer, 1);
91
- serialize_location(parser, &((yp_array_node_t *)node)->closing_loc, buffer);
112
+ yp_serialize_location(parser, &((yp_array_node_t *)node)->closing_loc, buffer);
92
113
  }
93
114
  break;
94
115
  }
@@ -117,13 +138,13 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
117
138
  yp_buffer_append_u8(buffer, 0);
118
139
  } else {
119
140
  yp_buffer_append_u8(buffer, 1);
120
- serialize_location(parser, &((yp_array_pattern_node_t *)node)->opening_loc, buffer);
141
+ yp_serialize_location(parser, &((yp_array_pattern_node_t *)node)->opening_loc, buffer);
121
142
  }
122
143
  if (((yp_array_pattern_node_t *)node)->closing_loc.start == NULL) {
123
144
  yp_buffer_append_u8(buffer, 0);
124
145
  } else {
125
146
  yp_buffer_append_u8(buffer, 1);
126
- serialize_location(parser, &((yp_array_pattern_node_t *)node)->closing_loc, buffer);
147
+ yp_serialize_location(parser, &((yp_array_pattern_node_t *)node)->closing_loc, buffer);
127
148
  }
128
149
  break;
129
150
  }
@@ -138,7 +159,7 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
138
159
  yp_buffer_append_u8(buffer, 0);
139
160
  } else {
140
161
  yp_buffer_append_u8(buffer, 1);
141
- serialize_location(parser, &((yp_assoc_node_t *)node)->operator_loc, buffer);
162
+ yp_serialize_location(parser, &((yp_assoc_node_t *)node)->operator_loc, buffer);
142
163
  }
143
164
  break;
144
165
  }
@@ -148,7 +169,7 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
148
169
  } else {
149
170
  yp_serialize_node(parser, (yp_node_t *)((yp_assoc_splat_node_t *)node)->value, buffer);
150
171
  }
151
- serialize_location(parser, &((yp_assoc_splat_node_t *)node)->operator_loc, buffer);
172
+ yp_serialize_location(parser, &((yp_assoc_splat_node_t *)node)->operator_loc, buffer);
152
173
  break;
153
174
  }
154
175
  case YP_NODE_BACK_REFERENCE_READ_NODE: {
@@ -159,7 +180,7 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
159
180
  yp_buffer_append_u8(buffer, 0);
160
181
  } else {
161
182
  yp_buffer_append_u8(buffer, 1);
162
- serialize_location(parser, &((yp_begin_node_t *)node)->begin_keyword_loc, buffer);
183
+ yp_serialize_location(parser, &((yp_begin_node_t *)node)->begin_keyword_loc, buffer);
163
184
  }
164
185
  if (((yp_begin_node_t *)node)->statements == NULL) {
165
186
  yp_buffer_append_u8(buffer, 0);
@@ -185,7 +206,7 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
185
206
  yp_buffer_append_u8(buffer, 0);
186
207
  } else {
187
208
  yp_buffer_append_u8(buffer, 1);
188
- serialize_location(parser, &((yp_begin_node_t *)node)->end_keyword_loc, buffer);
209
+ yp_serialize_location(parser, &((yp_begin_node_t *)node)->end_keyword_loc, buffer);
189
210
  }
190
211
  break;
191
212
  }
@@ -195,7 +216,7 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
195
216
  } else {
196
217
  yp_serialize_node(parser, (yp_node_t *)((yp_block_argument_node_t *)node)->expression, buffer);
197
218
  }
198
- serialize_location(parser, &((yp_block_argument_node_t *)node)->operator_loc, buffer);
219
+ yp_serialize_location(parser, &((yp_block_argument_node_t *)node)->operator_loc, buffer);
199
220
  break;
200
221
  }
201
222
  case YP_NODE_BLOCK_NODE: {
@@ -214,8 +235,8 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
214
235
  } else {
215
236
  yp_serialize_node(parser, (yp_node_t *)((yp_block_node_t *)node)->body, buffer);
216
237
  }
217
- serialize_location(parser, &((yp_block_node_t *)node)->opening_loc, buffer);
218
- serialize_location(parser, &((yp_block_node_t *)node)->closing_loc, buffer);
238
+ yp_serialize_location(parser, &((yp_block_node_t *)node)->opening_loc, buffer);
239
+ yp_serialize_location(parser, &((yp_block_node_t *)node)->closing_loc, buffer);
219
240
  break;
220
241
  }
221
242
  case YP_NODE_BLOCK_PARAMETER_NODE: {
@@ -223,9 +244,9 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
223
244
  yp_buffer_append_u8(buffer, 0);
224
245
  } else {
225
246
  yp_buffer_append_u8(buffer, 1);
226
- serialize_location(parser, &((yp_block_parameter_node_t *)node)->name_loc, buffer);
247
+ yp_serialize_location(parser, &((yp_block_parameter_node_t *)node)->name_loc, buffer);
227
248
  }
228
- serialize_location(parser, &((yp_block_parameter_node_t *)node)->operator_loc, buffer);
249
+ yp_serialize_location(parser, &((yp_block_parameter_node_t *)node)->operator_loc, buffer);
229
250
  break;
230
251
  }
231
252
  case YP_NODE_BLOCK_PARAMETERS_NODE: {
@@ -237,19 +258,19 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
237
258
  uint32_t locals_size = yp_sizet_to_u32(((yp_block_parameters_node_t *)node)->locals.size);
238
259
  yp_buffer_append_u32(buffer, locals_size);
239
260
  for (uint32_t index = 0; index < locals_size; index++) {
240
- serialize_location(parser, &((yp_block_parameters_node_t *)node)->locals.locations[index], buffer);
261
+ yp_serialize_location(parser, &((yp_block_parameters_node_t *)node)->locals.locations[index], buffer);
241
262
  }
242
263
  if (((yp_block_parameters_node_t *)node)->opening_loc.start == NULL) {
243
264
  yp_buffer_append_u8(buffer, 0);
244
265
  } else {
245
266
  yp_buffer_append_u8(buffer, 1);
246
- serialize_location(parser, &((yp_block_parameters_node_t *)node)->opening_loc, buffer);
267
+ yp_serialize_location(parser, &((yp_block_parameters_node_t *)node)->opening_loc, buffer);
247
268
  }
248
269
  if (((yp_block_parameters_node_t *)node)->closing_loc.start == NULL) {
249
270
  yp_buffer_append_u8(buffer, 0);
250
271
  } else {
251
272
  yp_buffer_append_u8(buffer, 1);
252
- serialize_location(parser, &((yp_block_parameters_node_t *)node)->closing_loc, buffer);
273
+ yp_serialize_location(parser, &((yp_block_parameters_node_t *)node)->closing_loc, buffer);
253
274
  }
254
275
  break;
255
276
  }
@@ -259,7 +280,7 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
259
280
  } else {
260
281
  yp_serialize_node(parser, (yp_node_t *)((yp_break_node_t *)node)->arguments, buffer);
261
282
  }
262
- serialize_location(parser, &((yp_break_node_t *)node)->keyword_loc, buffer);
283
+ yp_serialize_location(parser, &((yp_break_node_t *)node)->keyword_loc, buffer);
263
284
  break;
264
285
  }
265
286
  case YP_NODE_CALL_NODE: {
@@ -272,19 +293,19 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
272
293
  yp_buffer_append_u8(buffer, 0);
273
294
  } else {
274
295
  yp_buffer_append_u8(buffer, 1);
275
- serialize_location(parser, &((yp_call_node_t *)node)->operator_loc, buffer);
296
+ yp_serialize_location(parser, &((yp_call_node_t *)node)->operator_loc, buffer);
276
297
  }
277
298
  if (((yp_call_node_t *)node)->message_loc.start == NULL) {
278
299
  yp_buffer_append_u8(buffer, 0);
279
300
  } else {
280
301
  yp_buffer_append_u8(buffer, 1);
281
- serialize_location(parser, &((yp_call_node_t *)node)->message_loc, buffer);
302
+ yp_serialize_location(parser, &((yp_call_node_t *)node)->message_loc, buffer);
282
303
  }
283
304
  if (((yp_call_node_t *)node)->opening_loc.start == NULL) {
284
305
  yp_buffer_append_u8(buffer, 0);
285
306
  } else {
286
307
  yp_buffer_append_u8(buffer, 1);
287
- serialize_location(parser, &((yp_call_node_t *)node)->opening_loc, buffer);
308
+ yp_serialize_location(parser, &((yp_call_node_t *)node)->opening_loc, buffer);
288
309
  }
289
310
  if (((yp_call_node_t *)node)->arguments == NULL) {
290
311
  yp_buffer_append_u8(buffer, 0);
@@ -295,7 +316,7 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
295
316
  yp_buffer_append_u8(buffer, 0);
296
317
  } else {
297
318
  yp_buffer_append_u8(buffer, 1);
298
- serialize_location(parser, &((yp_call_node_t *)node)->closing_loc, buffer);
319
+ yp_serialize_location(parser, &((yp_call_node_t *)node)->closing_loc, buffer);
299
320
  }
300
321
  if (((yp_call_node_t *)node)->block == NULL) {
301
322
  yp_buffer_append_u8(buffer, 0);
@@ -303,26 +324,24 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
303
324
  yp_serialize_node(parser, (yp_node_t *)((yp_call_node_t *)node)->block, buffer);
304
325
  }
305
326
  yp_buffer_append_u32(buffer, node->flags >> 1);
306
- uint32_t name_length = yp_sizet_to_u32(yp_string_length(&((yp_call_node_t *)node)->name));
307
- yp_buffer_append_u32(buffer, name_length);
308
- yp_buffer_append_str(buffer, yp_string_source(&((yp_call_node_t *)node)->name), name_length);
327
+ yp_serialize_string(parser, &((yp_call_node_t *)node)->name, buffer);
309
328
  break;
310
329
  }
311
330
  case YP_NODE_CALL_OPERATOR_AND_WRITE_NODE: {
312
331
  yp_serialize_node(parser, (yp_node_t *)((yp_call_operator_and_write_node_t *)node)->target, buffer);
313
- serialize_location(parser, &((yp_call_operator_and_write_node_t *)node)->operator_loc, buffer);
332
+ yp_serialize_location(parser, &((yp_call_operator_and_write_node_t *)node)->operator_loc, buffer);
314
333
  yp_serialize_node(parser, (yp_node_t *)((yp_call_operator_and_write_node_t *)node)->value, buffer);
315
334
  break;
316
335
  }
317
336
  case YP_NODE_CALL_OPERATOR_OR_WRITE_NODE: {
318
337
  yp_serialize_node(parser, (yp_node_t *)((yp_call_operator_or_write_node_t *)node)->target, buffer);
319
338
  yp_serialize_node(parser, (yp_node_t *)((yp_call_operator_or_write_node_t *)node)->value, buffer);
320
- serialize_location(parser, &((yp_call_operator_or_write_node_t *)node)->operator_loc, buffer);
339
+ yp_serialize_location(parser, &((yp_call_operator_or_write_node_t *)node)->operator_loc, buffer);
321
340
  break;
322
341
  }
323
342
  case YP_NODE_CALL_OPERATOR_WRITE_NODE: {
324
343
  yp_serialize_node(parser, (yp_node_t *)((yp_call_operator_write_node_t *)node)->target, buffer);
325
- serialize_location(parser, &((yp_call_operator_write_node_t *)node)->operator_loc, buffer);
344
+ yp_serialize_location(parser, &((yp_call_operator_write_node_t *)node)->operator_loc, buffer);
326
345
  yp_serialize_node(parser, (yp_node_t *)((yp_call_operator_write_node_t *)node)->value, buffer);
327
346
  yp_buffer_append_u32(buffer, yp_sizet_to_u32(((yp_call_operator_write_node_t *)node)->operator_id));
328
347
  break;
@@ -330,7 +349,7 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
330
349
  case YP_NODE_CAPTURE_PATTERN_NODE: {
331
350
  yp_serialize_node(parser, (yp_node_t *)((yp_capture_pattern_node_t *)node)->value, buffer);
332
351
  yp_serialize_node(parser, (yp_node_t *)((yp_capture_pattern_node_t *)node)->target, buffer);
333
- serialize_location(parser, &((yp_capture_pattern_node_t *)node)->operator_loc, buffer);
352
+ yp_serialize_location(parser, &((yp_capture_pattern_node_t *)node)->operator_loc, buffer);
334
353
  break;
335
354
  }
336
355
  case YP_NODE_CASE_NODE: {
@@ -349,8 +368,8 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
349
368
  } else {
350
369
  yp_serialize_node(parser, (yp_node_t *)((yp_case_node_t *)node)->consequent, buffer);
351
370
  }
352
- serialize_location(parser, &((yp_case_node_t *)node)->case_keyword_loc, buffer);
353
- serialize_location(parser, &((yp_case_node_t *)node)->end_keyword_loc, buffer);
371
+ yp_serialize_location(parser, &((yp_case_node_t *)node)->case_keyword_loc, buffer);
372
+ yp_serialize_location(parser, &((yp_case_node_t *)node)->end_keyword_loc, buffer);
354
373
  break;
355
374
  }
356
375
  case YP_NODE_CLASS_NODE: {
@@ -359,13 +378,13 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
359
378
  for (uint32_t index = 0; index < locals_size; index++) {
360
379
  yp_buffer_append_u32(buffer, yp_sizet_to_u32(((yp_class_node_t *)node)->locals.ids[index]));
361
380
  }
362
- serialize_location(parser, &((yp_class_node_t *)node)->class_keyword_loc, buffer);
381
+ yp_serialize_location(parser, &((yp_class_node_t *)node)->class_keyword_loc, buffer);
363
382
  yp_serialize_node(parser, (yp_node_t *)((yp_class_node_t *)node)->constant_path, buffer);
364
383
  if (((yp_class_node_t *)node)->inheritance_operator_loc.start == NULL) {
365
384
  yp_buffer_append_u8(buffer, 0);
366
385
  } else {
367
386
  yp_buffer_append_u8(buffer, 1);
368
- serialize_location(parser, &((yp_class_node_t *)node)->inheritance_operator_loc, buffer);
387
+ yp_serialize_location(parser, &((yp_class_node_t *)node)->inheritance_operator_loc, buffer);
369
388
  }
370
389
  if (((yp_class_node_t *)node)->superclass == NULL) {
371
390
  yp_buffer_append_u8(buffer, 0);
@@ -377,14 +396,37 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
377
396
  } else {
378
397
  yp_serialize_node(parser, (yp_node_t *)((yp_class_node_t *)node)->body, buffer);
379
398
  }
380
- serialize_location(parser, &((yp_class_node_t *)node)->end_keyword_loc, buffer);
399
+ yp_serialize_location(parser, &((yp_class_node_t *)node)->end_keyword_loc, buffer);
400
+ yp_serialize_string(parser, &((yp_class_node_t *)node)->name, buffer);
401
+ break;
402
+ }
403
+ case YP_NODE_CLASS_VARIABLE_AND_WRITE_NODE: {
404
+ yp_serialize_location(parser, &((yp_class_variable_and_write_node_t *)node)->name_loc, buffer);
405
+ yp_serialize_location(parser, &((yp_class_variable_and_write_node_t *)node)->operator_loc, buffer);
406
+ yp_serialize_node(parser, (yp_node_t *)((yp_class_variable_and_write_node_t *)node)->value, buffer);
407
+ break;
408
+ }
409
+ case YP_NODE_CLASS_VARIABLE_OPERATOR_WRITE_NODE: {
410
+ yp_serialize_location(parser, &((yp_class_variable_operator_write_node_t *)node)->name_loc, buffer);
411
+ yp_serialize_location(parser, &((yp_class_variable_operator_write_node_t *)node)->operator_loc, buffer);
412
+ yp_serialize_node(parser, (yp_node_t *)((yp_class_variable_operator_write_node_t *)node)->value, buffer);
413
+ yp_buffer_append_u32(buffer, yp_sizet_to_u32(((yp_class_variable_operator_write_node_t *)node)->operator));
414
+ break;
415
+ }
416
+ case YP_NODE_CLASS_VARIABLE_OR_WRITE_NODE: {
417
+ yp_serialize_location(parser, &((yp_class_variable_or_write_node_t *)node)->name_loc, buffer);
418
+ yp_serialize_location(parser, &((yp_class_variable_or_write_node_t *)node)->operator_loc, buffer);
419
+ yp_serialize_node(parser, (yp_node_t *)((yp_class_variable_or_write_node_t *)node)->value, buffer);
381
420
  break;
382
421
  }
383
422
  case YP_NODE_CLASS_VARIABLE_READ_NODE: {
384
423
  break;
385
424
  }
425
+ case YP_NODE_CLASS_VARIABLE_TARGET_NODE: {
426
+ break;
427
+ }
386
428
  case YP_NODE_CLASS_VARIABLE_WRITE_NODE: {
387
- serialize_location(parser, &((yp_class_variable_write_node_t *)node)->name_loc, buffer);
429
+ yp_serialize_location(parser, &((yp_class_variable_write_node_t *)node)->name_loc, buffer);
388
430
  if (((yp_class_variable_write_node_t *)node)->value == NULL) {
389
431
  yp_buffer_append_u8(buffer, 0);
390
432
  } else {
@@ -394,10 +436,35 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
394
436
  yp_buffer_append_u8(buffer, 0);
395
437
  } else {
396
438
  yp_buffer_append_u8(buffer, 1);
397
- serialize_location(parser, &((yp_class_variable_write_node_t *)node)->operator_loc, buffer);
439
+ yp_serialize_location(parser, &((yp_class_variable_write_node_t *)node)->operator_loc, buffer);
398
440
  }
399
441
  break;
400
442
  }
443
+ case YP_NODE_CONSTANT_AND_WRITE_NODE: {
444
+ yp_serialize_location(parser, &((yp_constant_and_write_node_t *)node)->name_loc, buffer);
445
+ yp_serialize_location(parser, &((yp_constant_and_write_node_t *)node)->operator_loc, buffer);
446
+ yp_serialize_node(parser, (yp_node_t *)((yp_constant_and_write_node_t *)node)->value, buffer);
447
+ break;
448
+ }
449
+ case YP_NODE_CONSTANT_OPERATOR_WRITE_NODE: {
450
+ yp_serialize_location(parser, &((yp_constant_operator_write_node_t *)node)->name_loc, buffer);
451
+ yp_serialize_location(parser, &((yp_constant_operator_write_node_t *)node)->operator_loc, buffer);
452
+ yp_serialize_node(parser, (yp_node_t *)((yp_constant_operator_write_node_t *)node)->value, buffer);
453
+ yp_buffer_append_u32(buffer, yp_sizet_to_u32(((yp_constant_operator_write_node_t *)node)->operator));
454
+ break;
455
+ }
456
+ case YP_NODE_CONSTANT_OR_WRITE_NODE: {
457
+ yp_serialize_location(parser, &((yp_constant_or_write_node_t *)node)->name_loc, buffer);
458
+ yp_serialize_location(parser, &((yp_constant_or_write_node_t *)node)->operator_loc, buffer);
459
+ yp_serialize_node(parser, (yp_node_t *)((yp_constant_or_write_node_t *)node)->value, buffer);
460
+ break;
461
+ }
462
+ case YP_NODE_CONSTANT_PATH_AND_WRITE_NODE: {
463
+ yp_serialize_node(parser, (yp_node_t *)((yp_constant_path_and_write_node_t *)node)->target, buffer);
464
+ yp_serialize_location(parser, &((yp_constant_path_and_write_node_t *)node)->operator_loc, buffer);
465
+ yp_serialize_node(parser, (yp_node_t *)((yp_constant_path_and_write_node_t *)node)->value, buffer);
466
+ break;
467
+ }
401
468
  case YP_NODE_CONSTANT_PATH_NODE: {
402
469
  if (((yp_constant_path_node_t *)node)->parent == NULL) {
403
470
  yp_buffer_append_u8(buffer, 0);
@@ -405,40 +472,48 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
405
472
  yp_serialize_node(parser, (yp_node_t *)((yp_constant_path_node_t *)node)->parent, buffer);
406
473
  }
407
474
  yp_serialize_node(parser, (yp_node_t *)((yp_constant_path_node_t *)node)->child, buffer);
408
- serialize_location(parser, &((yp_constant_path_node_t *)node)->delimiter_loc, buffer);
475
+ yp_serialize_location(parser, &((yp_constant_path_node_t *)node)->delimiter_loc, buffer);
409
476
  break;
410
477
  }
411
- case YP_NODE_CONSTANT_PATH_WRITE_NODE: {
412
- yp_serialize_node(parser, (yp_node_t *)((yp_constant_path_write_node_t *)node)->target, buffer);
413
- if (((yp_constant_path_write_node_t *)node)->operator_loc.start == NULL) {
414
- yp_buffer_append_u8(buffer, 0);
415
- } else {
416
- yp_buffer_append_u8(buffer, 1);
417
- serialize_location(parser, &((yp_constant_path_write_node_t *)node)->operator_loc, buffer);
418
- }
419
- if (((yp_constant_path_write_node_t *)node)->value == NULL) {
478
+ case YP_NODE_CONSTANT_PATH_OPERATOR_WRITE_NODE: {
479
+ yp_serialize_node(parser, (yp_node_t *)((yp_constant_path_operator_write_node_t *)node)->target, buffer);
480
+ yp_serialize_location(parser, &((yp_constant_path_operator_write_node_t *)node)->operator_loc, buffer);
481
+ yp_serialize_node(parser, (yp_node_t *)((yp_constant_path_operator_write_node_t *)node)->value, buffer);
482
+ yp_buffer_append_u32(buffer, yp_sizet_to_u32(((yp_constant_path_operator_write_node_t *)node)->operator));
483
+ break;
484
+ }
485
+ case YP_NODE_CONSTANT_PATH_OR_WRITE_NODE: {
486
+ yp_serialize_node(parser, (yp_node_t *)((yp_constant_path_or_write_node_t *)node)->target, buffer);
487
+ yp_serialize_location(parser, &((yp_constant_path_or_write_node_t *)node)->operator_loc, buffer);
488
+ yp_serialize_node(parser, (yp_node_t *)((yp_constant_path_or_write_node_t *)node)->value, buffer);
489
+ break;
490
+ }
491
+ case YP_NODE_CONSTANT_PATH_TARGET_NODE: {
492
+ if (((yp_constant_path_target_node_t *)node)->parent == NULL) {
420
493
  yp_buffer_append_u8(buffer, 0);
421
494
  } else {
422
- yp_serialize_node(parser, (yp_node_t *)((yp_constant_path_write_node_t *)node)->value, buffer);
495
+ yp_serialize_node(parser, (yp_node_t *)((yp_constant_path_target_node_t *)node)->parent, buffer);
423
496
  }
497
+ yp_serialize_node(parser, (yp_node_t *)((yp_constant_path_target_node_t *)node)->child, buffer);
498
+ yp_serialize_location(parser, &((yp_constant_path_target_node_t *)node)->delimiter_loc, buffer);
499
+ break;
500
+ }
501
+ case YP_NODE_CONSTANT_PATH_WRITE_NODE: {
502
+ yp_serialize_node(parser, (yp_node_t *)((yp_constant_path_write_node_t *)node)->target, buffer);
503
+ yp_serialize_location(parser, &((yp_constant_path_write_node_t *)node)->operator_loc, buffer);
504
+ yp_serialize_node(parser, (yp_node_t *)((yp_constant_path_write_node_t *)node)->value, buffer);
424
505
  break;
425
506
  }
426
507
  case YP_NODE_CONSTANT_READ_NODE: {
427
508
  break;
428
509
  }
510
+ case YP_NODE_CONSTANT_TARGET_NODE: {
511
+ break;
512
+ }
429
513
  case YP_NODE_CONSTANT_WRITE_NODE: {
430
- serialize_location(parser, &((yp_constant_write_node_t *)node)->name_loc, buffer);
431
- if (((yp_constant_write_node_t *)node)->value == NULL) {
432
- yp_buffer_append_u8(buffer, 0);
433
- } else {
434
- yp_serialize_node(parser, (yp_node_t *)((yp_constant_write_node_t *)node)->value, buffer);
435
- }
436
- if (((yp_constant_write_node_t *)node)->operator_loc.start == NULL) {
437
- yp_buffer_append_u8(buffer, 0);
438
- } else {
439
- yp_buffer_append_u8(buffer, 1);
440
- serialize_location(parser, &((yp_constant_write_node_t *)node)->operator_loc, buffer);
441
- }
514
+ yp_serialize_location(parser, &((yp_constant_write_node_t *)node)->name_loc, buffer);
515
+ yp_serialize_node(parser, (yp_node_t *)((yp_constant_write_node_t *)node)->value, buffer);
516
+ yp_serialize_location(parser, &((yp_constant_write_node_t *)node)->operator_loc, buffer);
442
517
  break;
443
518
  }
444
519
  case YP_NODE_DEF_NODE: {
@@ -446,7 +521,7 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
446
521
  // encoding of location u32s make us need to save this offset.
447
522
  size_t length_offset = buffer->length;
448
523
  yp_buffer_append_str(buffer, "\0\0\0\0", 4); /* consume 4 bytes, updated below */
449
- serialize_location(parser, &((yp_def_node_t *)node)->name_loc, buffer);
524
+ yp_serialize_location(parser, &((yp_def_node_t *)node)->name_loc, buffer);
450
525
  if (((yp_def_node_t *)node)->receiver == NULL) {
451
526
  yp_buffer_append_u8(buffer, 0);
452
527
  } else {
@@ -467,36 +542,36 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
467
542
  for (uint32_t index = 0; index < locals_size; index++) {
468
543
  yp_buffer_append_u32(buffer, yp_sizet_to_u32(((yp_def_node_t *)node)->locals.ids[index]));
469
544
  }
470
- serialize_location(parser, &((yp_def_node_t *)node)->def_keyword_loc, buffer);
545
+ yp_serialize_location(parser, &((yp_def_node_t *)node)->def_keyword_loc, buffer);
471
546
  if (((yp_def_node_t *)node)->operator_loc.start == NULL) {
472
547
  yp_buffer_append_u8(buffer, 0);
473
548
  } else {
474
549
  yp_buffer_append_u8(buffer, 1);
475
- serialize_location(parser, &((yp_def_node_t *)node)->operator_loc, buffer);
550
+ yp_serialize_location(parser, &((yp_def_node_t *)node)->operator_loc, buffer);
476
551
  }
477
552
  if (((yp_def_node_t *)node)->lparen_loc.start == NULL) {
478
553
  yp_buffer_append_u8(buffer, 0);
479
554
  } else {
480
555
  yp_buffer_append_u8(buffer, 1);
481
- serialize_location(parser, &((yp_def_node_t *)node)->lparen_loc, buffer);
556
+ yp_serialize_location(parser, &((yp_def_node_t *)node)->lparen_loc, buffer);
482
557
  }
483
558
  if (((yp_def_node_t *)node)->rparen_loc.start == NULL) {
484
559
  yp_buffer_append_u8(buffer, 0);
485
560
  } else {
486
561
  yp_buffer_append_u8(buffer, 1);
487
- serialize_location(parser, &((yp_def_node_t *)node)->rparen_loc, buffer);
562
+ yp_serialize_location(parser, &((yp_def_node_t *)node)->rparen_loc, buffer);
488
563
  }
489
564
  if (((yp_def_node_t *)node)->equal_loc.start == NULL) {
490
565
  yp_buffer_append_u8(buffer, 0);
491
566
  } else {
492
567
  yp_buffer_append_u8(buffer, 1);
493
- serialize_location(parser, &((yp_def_node_t *)node)->equal_loc, buffer);
568
+ yp_serialize_location(parser, &((yp_def_node_t *)node)->equal_loc, buffer);
494
569
  }
495
570
  if (((yp_def_node_t *)node)->end_keyword_loc.start == NULL) {
496
571
  yp_buffer_append_u8(buffer, 0);
497
572
  } else {
498
573
  yp_buffer_append_u8(buffer, 1);
499
- serialize_location(parser, &((yp_def_node_t *)node)->end_keyword_loc, buffer);
574
+ yp_serialize_location(parser, &((yp_def_node_t *)node)->end_keyword_loc, buffer);
500
575
  }
501
576
  // serialize length
502
577
  uint32_t length = yp_sizet_to_u32(buffer->length - offset - sizeof(uint32_t));
@@ -508,20 +583,20 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
508
583
  yp_buffer_append_u8(buffer, 0);
509
584
  } else {
510
585
  yp_buffer_append_u8(buffer, 1);
511
- serialize_location(parser, &((yp_defined_node_t *)node)->lparen_loc, buffer);
586
+ yp_serialize_location(parser, &((yp_defined_node_t *)node)->lparen_loc, buffer);
512
587
  }
513
588
  yp_serialize_node(parser, (yp_node_t *)((yp_defined_node_t *)node)->value, buffer);
514
589
  if (((yp_defined_node_t *)node)->rparen_loc.start == NULL) {
515
590
  yp_buffer_append_u8(buffer, 0);
516
591
  } else {
517
592
  yp_buffer_append_u8(buffer, 1);
518
- serialize_location(parser, &((yp_defined_node_t *)node)->rparen_loc, buffer);
593
+ yp_serialize_location(parser, &((yp_defined_node_t *)node)->rparen_loc, buffer);
519
594
  }
520
- serialize_location(parser, &((yp_defined_node_t *)node)->keyword_loc, buffer);
595
+ yp_serialize_location(parser, &((yp_defined_node_t *)node)->keyword_loc, buffer);
521
596
  break;
522
597
  }
523
598
  case YP_NODE_ELSE_NODE: {
524
- serialize_location(parser, &((yp_else_node_t *)node)->else_keyword_loc, buffer);
599
+ yp_serialize_location(parser, &((yp_else_node_t *)node)->else_keyword_loc, buffer);
525
600
  if (((yp_else_node_t *)node)->statements == NULL) {
526
601
  yp_buffer_append_u8(buffer, 0);
527
602
  } else {
@@ -531,33 +606,33 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
531
606
  yp_buffer_append_u8(buffer, 0);
532
607
  } else {
533
608
  yp_buffer_append_u8(buffer, 1);
534
- serialize_location(parser, &((yp_else_node_t *)node)->end_keyword_loc, buffer);
609
+ yp_serialize_location(parser, &((yp_else_node_t *)node)->end_keyword_loc, buffer);
535
610
  }
536
611
  break;
537
612
  }
538
613
  case YP_NODE_EMBEDDED_STATEMENTS_NODE: {
539
- serialize_location(parser, &((yp_embedded_statements_node_t *)node)->opening_loc, buffer);
614
+ yp_serialize_location(parser, &((yp_embedded_statements_node_t *)node)->opening_loc, buffer);
540
615
  if (((yp_embedded_statements_node_t *)node)->statements == NULL) {
541
616
  yp_buffer_append_u8(buffer, 0);
542
617
  } else {
543
618
  yp_serialize_node(parser, (yp_node_t *)((yp_embedded_statements_node_t *)node)->statements, buffer);
544
619
  }
545
- serialize_location(parser, &((yp_embedded_statements_node_t *)node)->closing_loc, buffer);
620
+ yp_serialize_location(parser, &((yp_embedded_statements_node_t *)node)->closing_loc, buffer);
546
621
  break;
547
622
  }
548
623
  case YP_NODE_EMBEDDED_VARIABLE_NODE: {
549
- serialize_location(parser, &((yp_embedded_variable_node_t *)node)->operator_loc, buffer);
624
+ yp_serialize_location(parser, &((yp_embedded_variable_node_t *)node)->operator_loc, buffer);
550
625
  yp_serialize_node(parser, (yp_node_t *)((yp_embedded_variable_node_t *)node)->variable, buffer);
551
626
  break;
552
627
  }
553
628
  case YP_NODE_ENSURE_NODE: {
554
- serialize_location(parser, &((yp_ensure_node_t *)node)->ensure_keyword_loc, buffer);
629
+ yp_serialize_location(parser, &((yp_ensure_node_t *)node)->ensure_keyword_loc, buffer);
555
630
  if (((yp_ensure_node_t *)node)->statements == NULL) {
556
631
  yp_buffer_append_u8(buffer, 0);
557
632
  } else {
558
633
  yp_serialize_node(parser, (yp_node_t *)((yp_ensure_node_t *)node)->statements, buffer);
559
634
  }
560
- serialize_location(parser, &((yp_ensure_node_t *)node)->end_keyword_loc, buffer);
635
+ yp_serialize_location(parser, &((yp_ensure_node_t *)node)->end_keyword_loc, buffer);
561
636
  break;
562
637
  }
563
638
  case YP_NODE_FALSE_NODE: {
@@ -580,13 +655,13 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
580
655
  yp_buffer_append_u8(buffer, 0);
581
656
  } else {
582
657
  yp_buffer_append_u8(buffer, 1);
583
- serialize_location(parser, &((yp_find_pattern_node_t *)node)->opening_loc, buffer);
658
+ yp_serialize_location(parser, &((yp_find_pattern_node_t *)node)->opening_loc, buffer);
584
659
  }
585
660
  if (((yp_find_pattern_node_t *)node)->closing_loc.start == NULL) {
586
661
  yp_buffer_append_u8(buffer, 0);
587
662
  } else {
588
663
  yp_buffer_append_u8(buffer, 1);
589
- serialize_location(parser, &((yp_find_pattern_node_t *)node)->closing_loc, buffer);
664
+ yp_serialize_location(parser, &((yp_find_pattern_node_t *)node)->closing_loc, buffer);
590
665
  }
591
666
  break;
592
667
  }
@@ -601,7 +676,7 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
601
676
  } else {
602
677
  yp_serialize_node(parser, (yp_node_t *)((yp_flip_flop_node_t *)node)->right, buffer);
603
678
  }
604
- serialize_location(parser, &((yp_flip_flop_node_t *)node)->operator_loc, buffer);
679
+ yp_serialize_location(parser, &((yp_flip_flop_node_t *)node)->operator_loc, buffer);
605
680
  yp_buffer_append_u32(buffer, node->flags >> 1);
606
681
  break;
607
682
  }
@@ -616,15 +691,15 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
616
691
  } else {
617
692
  yp_serialize_node(parser, (yp_node_t *)((yp_for_node_t *)node)->statements, buffer);
618
693
  }
619
- serialize_location(parser, &((yp_for_node_t *)node)->for_keyword_loc, buffer);
620
- serialize_location(parser, &((yp_for_node_t *)node)->in_keyword_loc, buffer);
694
+ yp_serialize_location(parser, &((yp_for_node_t *)node)->for_keyword_loc, buffer);
695
+ yp_serialize_location(parser, &((yp_for_node_t *)node)->in_keyword_loc, buffer);
621
696
  if (((yp_for_node_t *)node)->do_keyword_loc.start == NULL) {
622
697
  yp_buffer_append_u8(buffer, 0);
623
698
  } else {
624
699
  yp_buffer_append_u8(buffer, 1);
625
- serialize_location(parser, &((yp_for_node_t *)node)->do_keyword_loc, buffer);
700
+ yp_serialize_location(parser, &((yp_for_node_t *)node)->do_keyword_loc, buffer);
626
701
  }
627
- serialize_location(parser, &((yp_for_node_t *)node)->end_keyword_loc, buffer);
702
+ yp_serialize_location(parser, &((yp_for_node_t *)node)->end_keyword_loc, buffer);
628
703
  break;
629
704
  }
630
705
  case YP_NODE_FORWARDING_ARGUMENTS_NODE: {
@@ -641,32 +716,45 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
641
716
  }
642
717
  break;
643
718
  }
719
+ case YP_NODE_GLOBAL_VARIABLE_AND_WRITE_NODE: {
720
+ yp_serialize_location(parser, &((yp_global_variable_and_write_node_t *)node)->name_loc, buffer);
721
+ yp_serialize_location(parser, &((yp_global_variable_and_write_node_t *)node)->operator_loc, buffer);
722
+ yp_serialize_node(parser, (yp_node_t *)((yp_global_variable_and_write_node_t *)node)->value, buffer);
723
+ break;
724
+ }
725
+ case YP_NODE_GLOBAL_VARIABLE_OPERATOR_WRITE_NODE: {
726
+ yp_serialize_location(parser, &((yp_global_variable_operator_write_node_t *)node)->name_loc, buffer);
727
+ yp_serialize_location(parser, &((yp_global_variable_operator_write_node_t *)node)->operator_loc, buffer);
728
+ yp_serialize_node(parser, (yp_node_t *)((yp_global_variable_operator_write_node_t *)node)->value, buffer);
729
+ yp_buffer_append_u32(buffer, yp_sizet_to_u32(((yp_global_variable_operator_write_node_t *)node)->operator));
730
+ break;
731
+ }
732
+ case YP_NODE_GLOBAL_VARIABLE_OR_WRITE_NODE: {
733
+ yp_serialize_location(parser, &((yp_global_variable_or_write_node_t *)node)->name_loc, buffer);
734
+ yp_serialize_location(parser, &((yp_global_variable_or_write_node_t *)node)->operator_loc, buffer);
735
+ yp_serialize_node(parser, (yp_node_t *)((yp_global_variable_or_write_node_t *)node)->value, buffer);
736
+ break;
737
+ }
644
738
  case YP_NODE_GLOBAL_VARIABLE_READ_NODE: {
645
739
  break;
646
740
  }
741
+ case YP_NODE_GLOBAL_VARIABLE_TARGET_NODE: {
742
+ break;
743
+ }
647
744
  case YP_NODE_GLOBAL_VARIABLE_WRITE_NODE: {
648
- serialize_location(parser, &((yp_global_variable_write_node_t *)node)->name_loc, buffer);
649
- if (((yp_global_variable_write_node_t *)node)->operator_loc.start == NULL) {
650
- yp_buffer_append_u8(buffer, 0);
651
- } else {
652
- yp_buffer_append_u8(buffer, 1);
653
- serialize_location(parser, &((yp_global_variable_write_node_t *)node)->operator_loc, buffer);
654
- }
655
- if (((yp_global_variable_write_node_t *)node)->value == NULL) {
656
- yp_buffer_append_u8(buffer, 0);
657
- } else {
658
- yp_serialize_node(parser, (yp_node_t *)((yp_global_variable_write_node_t *)node)->value, buffer);
659
- }
745
+ yp_serialize_location(parser, &((yp_global_variable_write_node_t *)node)->name_loc, buffer);
746
+ yp_serialize_location(parser, &((yp_global_variable_write_node_t *)node)->operator_loc, buffer);
747
+ yp_serialize_node(parser, (yp_node_t *)((yp_global_variable_write_node_t *)node)->value, buffer);
660
748
  break;
661
749
  }
662
750
  case YP_NODE_HASH_NODE: {
663
- serialize_location(parser, &((yp_hash_node_t *)node)->opening_loc, buffer);
751
+ yp_serialize_location(parser, &((yp_hash_node_t *)node)->opening_loc, buffer);
664
752
  uint32_t elements_size = yp_sizet_to_u32(((yp_hash_node_t *)node)->elements.size);
665
753
  yp_buffer_append_u32(buffer, elements_size);
666
754
  for (uint32_t index = 0; index < elements_size; index++) {
667
755
  yp_serialize_node(parser, (yp_node_t *) ((yp_hash_node_t *)node)->elements.nodes[index], buffer);
668
756
  }
669
- serialize_location(parser, &((yp_hash_node_t *)node)->closing_loc, buffer);
757
+ yp_serialize_location(parser, &((yp_hash_node_t *)node)->closing_loc, buffer);
670
758
  break;
671
759
  }
672
760
  case YP_NODE_HASH_PATTERN_NODE: {
@@ -689,13 +777,13 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
689
777
  yp_buffer_append_u8(buffer, 0);
690
778
  } else {
691
779
  yp_buffer_append_u8(buffer, 1);
692
- serialize_location(parser, &((yp_hash_pattern_node_t *)node)->opening_loc, buffer);
780
+ yp_serialize_location(parser, &((yp_hash_pattern_node_t *)node)->opening_loc, buffer);
693
781
  }
694
782
  if (((yp_hash_pattern_node_t *)node)->closing_loc.start == NULL) {
695
783
  yp_buffer_append_u8(buffer, 0);
696
784
  } else {
697
785
  yp_buffer_append_u8(buffer, 1);
698
- serialize_location(parser, &((yp_hash_pattern_node_t *)node)->closing_loc, buffer);
786
+ yp_serialize_location(parser, &((yp_hash_pattern_node_t *)node)->closing_loc, buffer);
699
787
  }
700
788
  break;
701
789
  }
@@ -704,7 +792,7 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
704
792
  yp_buffer_append_u8(buffer, 0);
705
793
  } else {
706
794
  yp_buffer_append_u8(buffer, 1);
707
- serialize_location(parser, &((yp_if_node_t *)node)->if_keyword_loc, buffer);
795
+ yp_serialize_location(parser, &((yp_if_node_t *)node)->if_keyword_loc, buffer);
708
796
  }
709
797
  yp_serialize_node(parser, (yp_node_t *)((yp_if_node_t *)node)->predicate, buffer);
710
798
  if (((yp_if_node_t *)node)->statements == NULL) {
@@ -721,7 +809,7 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
721
809
  yp_buffer_append_u8(buffer, 0);
722
810
  } else {
723
811
  yp_buffer_append_u8(buffer, 1);
724
- serialize_location(parser, &((yp_if_node_t *)node)->end_keyword_loc, buffer);
812
+ yp_serialize_location(parser, &((yp_if_node_t *)node)->end_keyword_loc, buffer);
725
813
  }
726
814
  break;
727
815
  }
@@ -736,44 +824,57 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
736
824
  } else {
737
825
  yp_serialize_node(parser, (yp_node_t *)((yp_in_node_t *)node)->statements, buffer);
738
826
  }
739
- serialize_location(parser, &((yp_in_node_t *)node)->in_loc, buffer);
827
+ yp_serialize_location(parser, &((yp_in_node_t *)node)->in_loc, buffer);
740
828
  if (((yp_in_node_t *)node)->then_loc.start == NULL) {
741
829
  yp_buffer_append_u8(buffer, 0);
742
830
  } else {
743
831
  yp_buffer_append_u8(buffer, 1);
744
- serialize_location(parser, &((yp_in_node_t *)node)->then_loc, buffer);
832
+ yp_serialize_location(parser, &((yp_in_node_t *)node)->then_loc, buffer);
745
833
  }
746
834
  break;
747
835
  }
836
+ case YP_NODE_INSTANCE_VARIABLE_AND_WRITE_NODE: {
837
+ yp_serialize_location(parser, &((yp_instance_variable_and_write_node_t *)node)->name_loc, buffer);
838
+ yp_serialize_location(parser, &((yp_instance_variable_and_write_node_t *)node)->operator_loc, buffer);
839
+ yp_serialize_node(parser, (yp_node_t *)((yp_instance_variable_and_write_node_t *)node)->value, buffer);
840
+ break;
841
+ }
842
+ case YP_NODE_INSTANCE_VARIABLE_OPERATOR_WRITE_NODE: {
843
+ yp_serialize_location(parser, &((yp_instance_variable_operator_write_node_t *)node)->name_loc, buffer);
844
+ yp_serialize_location(parser, &((yp_instance_variable_operator_write_node_t *)node)->operator_loc, buffer);
845
+ yp_serialize_node(parser, (yp_node_t *)((yp_instance_variable_operator_write_node_t *)node)->value, buffer);
846
+ yp_buffer_append_u32(buffer, yp_sizet_to_u32(((yp_instance_variable_operator_write_node_t *)node)->operator));
847
+ break;
848
+ }
849
+ case YP_NODE_INSTANCE_VARIABLE_OR_WRITE_NODE: {
850
+ yp_serialize_location(parser, &((yp_instance_variable_or_write_node_t *)node)->name_loc, buffer);
851
+ yp_serialize_location(parser, &((yp_instance_variable_or_write_node_t *)node)->operator_loc, buffer);
852
+ yp_serialize_node(parser, (yp_node_t *)((yp_instance_variable_or_write_node_t *)node)->value, buffer);
853
+ break;
854
+ }
748
855
  case YP_NODE_INSTANCE_VARIABLE_READ_NODE: {
749
856
  break;
750
857
  }
858
+ case YP_NODE_INSTANCE_VARIABLE_TARGET_NODE: {
859
+ break;
860
+ }
751
861
  case YP_NODE_INSTANCE_VARIABLE_WRITE_NODE: {
752
- serialize_location(parser, &((yp_instance_variable_write_node_t *)node)->name_loc, buffer);
753
- if (((yp_instance_variable_write_node_t *)node)->value == NULL) {
754
- yp_buffer_append_u8(buffer, 0);
755
- } else {
756
- yp_serialize_node(parser, (yp_node_t *)((yp_instance_variable_write_node_t *)node)->value, buffer);
757
- }
758
- if (((yp_instance_variable_write_node_t *)node)->operator_loc.start == NULL) {
759
- yp_buffer_append_u8(buffer, 0);
760
- } else {
761
- yp_buffer_append_u8(buffer, 1);
762
- serialize_location(parser, &((yp_instance_variable_write_node_t *)node)->operator_loc, buffer);
763
- }
862
+ yp_serialize_location(parser, &((yp_instance_variable_write_node_t *)node)->name_loc, buffer);
863
+ yp_serialize_node(parser, (yp_node_t *)((yp_instance_variable_write_node_t *)node)->value, buffer);
864
+ yp_serialize_location(parser, &((yp_instance_variable_write_node_t *)node)->operator_loc, buffer);
764
865
  break;
765
866
  }
766
867
  case YP_NODE_INTEGER_NODE: {
767
868
  break;
768
869
  }
769
870
  case YP_NODE_INTERPOLATED_REGULAR_EXPRESSION_NODE: {
770
- serialize_location(parser, &((yp_interpolated_regular_expression_node_t *)node)->opening_loc, buffer);
871
+ yp_serialize_location(parser, &((yp_interpolated_regular_expression_node_t *)node)->opening_loc, buffer);
771
872
  uint32_t parts_size = yp_sizet_to_u32(((yp_interpolated_regular_expression_node_t *)node)->parts.size);
772
873
  yp_buffer_append_u32(buffer, parts_size);
773
874
  for (uint32_t index = 0; index < parts_size; index++) {
774
875
  yp_serialize_node(parser, (yp_node_t *) ((yp_interpolated_regular_expression_node_t *)node)->parts.nodes[index], buffer);
775
876
  }
776
- serialize_location(parser, &((yp_interpolated_regular_expression_node_t *)node)->closing_loc, buffer);
877
+ yp_serialize_location(parser, &((yp_interpolated_regular_expression_node_t *)node)->closing_loc, buffer);
777
878
  yp_buffer_append_u32(buffer, node->flags >> 1);
778
879
  break;
779
880
  }
@@ -782,7 +883,7 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
782
883
  yp_buffer_append_u8(buffer, 0);
783
884
  } else {
784
885
  yp_buffer_append_u8(buffer, 1);
785
- serialize_location(parser, &((yp_interpolated_string_node_t *)node)->opening_loc, buffer);
886
+ yp_serialize_location(parser, &((yp_interpolated_string_node_t *)node)->opening_loc, buffer);
786
887
  }
787
888
  uint32_t parts_size = yp_sizet_to_u32(((yp_interpolated_string_node_t *)node)->parts.size);
788
889
  yp_buffer_append_u32(buffer, parts_size);
@@ -793,7 +894,7 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
793
894
  yp_buffer_append_u8(buffer, 0);
794
895
  } else {
795
896
  yp_buffer_append_u8(buffer, 1);
796
- serialize_location(parser, &((yp_interpolated_string_node_t *)node)->closing_loc, buffer);
897
+ yp_serialize_location(parser, &((yp_interpolated_string_node_t *)node)->closing_loc, buffer);
797
898
  }
798
899
  break;
799
900
  }
@@ -802,7 +903,7 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
802
903
  yp_buffer_append_u8(buffer, 0);
803
904
  } else {
804
905
  yp_buffer_append_u8(buffer, 1);
805
- serialize_location(parser, &((yp_interpolated_symbol_node_t *)node)->opening_loc, buffer);
906
+ yp_serialize_location(parser, &((yp_interpolated_symbol_node_t *)node)->opening_loc, buffer);
806
907
  }
807
908
  uint32_t parts_size = yp_sizet_to_u32(((yp_interpolated_symbol_node_t *)node)->parts.size);
808
909
  yp_buffer_append_u32(buffer, parts_size);
@@ -813,18 +914,18 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
813
914
  yp_buffer_append_u8(buffer, 0);
814
915
  } else {
815
916
  yp_buffer_append_u8(buffer, 1);
816
- serialize_location(parser, &((yp_interpolated_symbol_node_t *)node)->closing_loc, buffer);
917
+ yp_serialize_location(parser, &((yp_interpolated_symbol_node_t *)node)->closing_loc, buffer);
817
918
  }
818
919
  break;
819
920
  }
820
921
  case YP_NODE_INTERPOLATED_X_STRING_NODE: {
821
- serialize_location(parser, &((yp_interpolated_x_string_node_t *)node)->opening_loc, buffer);
922
+ yp_serialize_location(parser, &((yp_interpolated_x_string_node_t *)node)->opening_loc, buffer);
822
923
  uint32_t parts_size = yp_sizet_to_u32(((yp_interpolated_x_string_node_t *)node)->parts.size);
823
924
  yp_buffer_append_u32(buffer, parts_size);
824
925
  for (uint32_t index = 0; index < parts_size; index++) {
825
926
  yp_serialize_node(parser, (yp_node_t *) ((yp_interpolated_x_string_node_t *)node)->parts.nodes[index], buffer);
826
927
  }
827
- serialize_location(parser, &((yp_interpolated_x_string_node_t *)node)->closing_loc, buffer);
928
+ yp_serialize_location(parser, &((yp_interpolated_x_string_node_t *)node)->closing_loc, buffer);
828
929
  break;
829
930
  }
830
931
  case YP_NODE_KEYWORD_HASH_NODE: {
@@ -836,7 +937,7 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
836
937
  break;
837
938
  }
838
939
  case YP_NODE_KEYWORD_PARAMETER_NODE: {
839
- serialize_location(parser, &((yp_keyword_parameter_node_t *)node)->name_loc, buffer);
940
+ yp_serialize_location(parser, &((yp_keyword_parameter_node_t *)node)->name_loc, buffer);
840
941
  if (((yp_keyword_parameter_node_t *)node)->value == NULL) {
841
942
  yp_buffer_append_u8(buffer, 0);
842
943
  } else {
@@ -845,12 +946,12 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
845
946
  break;
846
947
  }
847
948
  case YP_NODE_KEYWORD_REST_PARAMETER_NODE: {
848
- serialize_location(parser, &((yp_keyword_rest_parameter_node_t *)node)->operator_loc, buffer);
949
+ yp_serialize_location(parser, &((yp_keyword_rest_parameter_node_t *)node)->operator_loc, buffer);
849
950
  if (((yp_keyword_rest_parameter_node_t *)node)->name_loc.start == NULL) {
850
951
  yp_buffer_append_u8(buffer, 0);
851
952
  } else {
852
953
  yp_buffer_append_u8(buffer, 1);
853
- serialize_location(parser, &((yp_keyword_rest_parameter_node_t *)node)->name_loc, buffer);
954
+ yp_serialize_location(parser, &((yp_keyword_rest_parameter_node_t *)node)->name_loc, buffer);
854
955
  }
855
956
  break;
856
957
  }
@@ -860,7 +961,9 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
860
961
  for (uint32_t index = 0; index < locals_size; index++) {
861
962
  yp_buffer_append_u32(buffer, yp_sizet_to_u32(((yp_lambda_node_t *)node)->locals.ids[index]));
862
963
  }
863
- serialize_location(parser, &((yp_lambda_node_t *)node)->opening_loc, buffer);
964
+ yp_serialize_location(parser, &((yp_lambda_node_t *)node)->operator_loc, buffer);
965
+ yp_serialize_location(parser, &((yp_lambda_node_t *)node)->opening_loc, buffer);
966
+ yp_serialize_location(parser, &((yp_lambda_node_t *)node)->closing_loc, buffer);
864
967
  if (((yp_lambda_node_t *)node)->parameters == NULL) {
865
968
  yp_buffer_append_u8(buffer, 0);
866
969
  } else {
@@ -873,38 +976,59 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
873
976
  }
874
977
  break;
875
978
  }
979
+ case YP_NODE_LOCAL_VARIABLE_AND_WRITE_NODE: {
980
+ yp_serialize_location(parser, &((yp_local_variable_and_write_node_t *)node)->name_loc, buffer);
981
+ yp_serialize_location(parser, &((yp_local_variable_and_write_node_t *)node)->operator_loc, buffer);
982
+ yp_serialize_node(parser, (yp_node_t *)((yp_local_variable_and_write_node_t *)node)->value, buffer);
983
+ yp_buffer_append_u32(buffer, yp_sizet_to_u32(((yp_local_variable_and_write_node_t *)node)->constant_id));
984
+ yp_buffer_append_u32(buffer, ((yp_local_variable_and_write_node_t *)node)->depth);
985
+ break;
986
+ }
987
+ case YP_NODE_LOCAL_VARIABLE_OPERATOR_WRITE_NODE: {
988
+ yp_serialize_location(parser, &((yp_local_variable_operator_write_node_t *)node)->name_loc, buffer);
989
+ yp_serialize_location(parser, &((yp_local_variable_operator_write_node_t *)node)->operator_loc, buffer);
990
+ yp_serialize_node(parser, (yp_node_t *)((yp_local_variable_operator_write_node_t *)node)->value, buffer);
991
+ yp_buffer_append_u32(buffer, yp_sizet_to_u32(((yp_local_variable_operator_write_node_t *)node)->constant_id));
992
+ yp_buffer_append_u32(buffer, yp_sizet_to_u32(((yp_local_variable_operator_write_node_t *)node)->operator_id));
993
+ yp_buffer_append_u32(buffer, ((yp_local_variable_operator_write_node_t *)node)->depth);
994
+ break;
995
+ }
996
+ case YP_NODE_LOCAL_VARIABLE_OR_WRITE_NODE: {
997
+ yp_serialize_location(parser, &((yp_local_variable_or_write_node_t *)node)->name_loc, buffer);
998
+ yp_serialize_location(parser, &((yp_local_variable_or_write_node_t *)node)->operator_loc, buffer);
999
+ yp_serialize_node(parser, (yp_node_t *)((yp_local_variable_or_write_node_t *)node)->value, buffer);
1000
+ yp_buffer_append_u32(buffer, yp_sizet_to_u32(((yp_local_variable_or_write_node_t *)node)->constant_id));
1001
+ yp_buffer_append_u32(buffer, ((yp_local_variable_or_write_node_t *)node)->depth);
1002
+ break;
1003
+ }
876
1004
  case YP_NODE_LOCAL_VARIABLE_READ_NODE: {
877
1005
  yp_buffer_append_u32(buffer, yp_sizet_to_u32(((yp_local_variable_read_node_t *)node)->constant_id));
878
1006
  yp_buffer_append_u32(buffer, ((yp_local_variable_read_node_t *)node)->depth);
879
1007
  break;
880
1008
  }
1009
+ case YP_NODE_LOCAL_VARIABLE_TARGET_NODE: {
1010
+ yp_buffer_append_u32(buffer, yp_sizet_to_u32(((yp_local_variable_target_node_t *)node)->constant_id));
1011
+ yp_buffer_append_u32(buffer, ((yp_local_variable_target_node_t *)node)->depth);
1012
+ break;
1013
+ }
881
1014
  case YP_NODE_LOCAL_VARIABLE_WRITE_NODE: {
882
1015
  yp_buffer_append_u32(buffer, yp_sizet_to_u32(((yp_local_variable_write_node_t *)node)->constant_id));
883
1016
  yp_buffer_append_u32(buffer, ((yp_local_variable_write_node_t *)node)->depth);
884
- if (((yp_local_variable_write_node_t *)node)->value == NULL) {
885
- yp_buffer_append_u8(buffer, 0);
886
- } else {
887
- yp_serialize_node(parser, (yp_node_t *)((yp_local_variable_write_node_t *)node)->value, buffer);
888
- }
889
- serialize_location(parser, &((yp_local_variable_write_node_t *)node)->name_loc, buffer);
890
- if (((yp_local_variable_write_node_t *)node)->operator_loc.start == NULL) {
891
- yp_buffer_append_u8(buffer, 0);
892
- } else {
893
- yp_buffer_append_u8(buffer, 1);
894
- serialize_location(parser, &((yp_local_variable_write_node_t *)node)->operator_loc, buffer);
895
- }
1017
+ yp_serialize_node(parser, (yp_node_t *)((yp_local_variable_write_node_t *)node)->value, buffer);
1018
+ yp_serialize_location(parser, &((yp_local_variable_write_node_t *)node)->name_loc, buffer);
1019
+ yp_serialize_location(parser, &((yp_local_variable_write_node_t *)node)->operator_loc, buffer);
896
1020
  break;
897
1021
  }
898
1022
  case YP_NODE_MATCH_PREDICATE_NODE: {
899
1023
  yp_serialize_node(parser, (yp_node_t *)((yp_match_predicate_node_t *)node)->value, buffer);
900
1024
  yp_serialize_node(parser, (yp_node_t *)((yp_match_predicate_node_t *)node)->pattern, buffer);
901
- serialize_location(parser, &((yp_match_predicate_node_t *)node)->operator_loc, buffer);
1025
+ yp_serialize_location(parser, &((yp_match_predicate_node_t *)node)->operator_loc, buffer);
902
1026
  break;
903
1027
  }
904
1028
  case YP_NODE_MATCH_REQUIRED_NODE: {
905
1029
  yp_serialize_node(parser, (yp_node_t *)((yp_match_required_node_t *)node)->value, buffer);
906
1030
  yp_serialize_node(parser, (yp_node_t *)((yp_match_required_node_t *)node)->pattern, buffer);
907
- serialize_location(parser, &((yp_match_required_node_t *)node)->operator_loc, buffer);
1031
+ yp_serialize_location(parser, &((yp_match_required_node_t *)node)->operator_loc, buffer);
908
1032
  break;
909
1033
  }
910
1034
  case YP_NODE_MISSING_NODE: {
@@ -916,14 +1040,15 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
916
1040
  for (uint32_t index = 0; index < locals_size; index++) {
917
1041
  yp_buffer_append_u32(buffer, yp_sizet_to_u32(((yp_module_node_t *)node)->locals.ids[index]));
918
1042
  }
919
- serialize_location(parser, &((yp_module_node_t *)node)->module_keyword_loc, buffer);
1043
+ yp_serialize_location(parser, &((yp_module_node_t *)node)->module_keyword_loc, buffer);
920
1044
  yp_serialize_node(parser, (yp_node_t *)((yp_module_node_t *)node)->constant_path, buffer);
921
1045
  if (((yp_module_node_t *)node)->body == NULL) {
922
1046
  yp_buffer_append_u8(buffer, 0);
923
1047
  } else {
924
1048
  yp_serialize_node(parser, (yp_node_t *)((yp_module_node_t *)node)->body, buffer);
925
1049
  }
926
- serialize_location(parser, &((yp_module_node_t *)node)->end_keyword_loc, buffer);
1050
+ yp_serialize_location(parser, &((yp_module_node_t *)node)->end_keyword_loc, buffer);
1051
+ yp_serialize_string(parser, &((yp_module_node_t *)node)->name, buffer);
927
1052
  break;
928
1053
  }
929
1054
  case YP_NODE_MULTI_WRITE_NODE: {
@@ -936,7 +1061,7 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
936
1061
  yp_buffer_append_u8(buffer, 0);
937
1062
  } else {
938
1063
  yp_buffer_append_u8(buffer, 1);
939
- serialize_location(parser, &((yp_multi_write_node_t *)node)->operator_loc, buffer);
1064
+ yp_serialize_location(parser, &((yp_multi_write_node_t *)node)->operator_loc, buffer);
940
1065
  }
941
1066
  if (((yp_multi_write_node_t *)node)->value == NULL) {
942
1067
  yp_buffer_append_u8(buffer, 0);
@@ -947,13 +1072,13 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
947
1072
  yp_buffer_append_u8(buffer, 0);
948
1073
  } else {
949
1074
  yp_buffer_append_u8(buffer, 1);
950
- serialize_location(parser, &((yp_multi_write_node_t *)node)->lparen_loc, buffer);
1075
+ yp_serialize_location(parser, &((yp_multi_write_node_t *)node)->lparen_loc, buffer);
951
1076
  }
952
1077
  if (((yp_multi_write_node_t *)node)->rparen_loc.start == NULL) {
953
1078
  yp_buffer_append_u8(buffer, 0);
954
1079
  } else {
955
1080
  yp_buffer_append_u8(buffer, 1);
956
- serialize_location(parser, &((yp_multi_write_node_t *)node)->rparen_loc, buffer);
1081
+ yp_serialize_location(parser, &((yp_multi_write_node_t *)node)->rparen_loc, buffer);
957
1082
  }
958
1083
  break;
959
1084
  }
@@ -963,44 +1088,31 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
963
1088
  } else {
964
1089
  yp_serialize_node(parser, (yp_node_t *)((yp_next_node_t *)node)->arguments, buffer);
965
1090
  }
966
- serialize_location(parser, &((yp_next_node_t *)node)->keyword_loc, buffer);
1091
+ yp_serialize_location(parser, &((yp_next_node_t *)node)->keyword_loc, buffer);
967
1092
  break;
968
1093
  }
969
1094
  case YP_NODE_NIL_NODE: {
970
1095
  break;
971
1096
  }
972
1097
  case YP_NODE_NO_KEYWORDS_PARAMETER_NODE: {
973
- serialize_location(parser, &((yp_no_keywords_parameter_node_t *)node)->operator_loc, buffer);
974
- serialize_location(parser, &((yp_no_keywords_parameter_node_t *)node)->keyword_loc, buffer);
1098
+ yp_serialize_location(parser, &((yp_no_keywords_parameter_node_t *)node)->operator_loc, buffer);
1099
+ yp_serialize_location(parser, &((yp_no_keywords_parameter_node_t *)node)->keyword_loc, buffer);
975
1100
  break;
976
1101
  }
977
1102
  case YP_NODE_NUMBERED_REFERENCE_READ_NODE: {
978
1103
  break;
979
1104
  }
980
- case YP_NODE_OPERATOR_WRITE_NODE: {
981
- yp_serialize_node(parser, (yp_node_t *)((yp_operator_write_node_t *)node)->target, buffer);
982
- serialize_location(parser, &((yp_operator_write_node_t *)node)->operator_loc, buffer);
983
- yp_buffer_append_u32(buffer, yp_sizet_to_u32(((yp_operator_write_node_t *)node)->operator));
984
- yp_serialize_node(parser, (yp_node_t *)((yp_operator_write_node_t *)node)->value, buffer);
985
- break;
986
- }
987
1105
  case YP_NODE_OPTIONAL_PARAMETER_NODE: {
988
1106
  yp_buffer_append_u32(buffer, yp_sizet_to_u32(((yp_optional_parameter_node_t *)node)->constant_id));
989
- serialize_location(parser, &((yp_optional_parameter_node_t *)node)->name_loc, buffer);
990
- serialize_location(parser, &((yp_optional_parameter_node_t *)node)->operator_loc, buffer);
1107
+ yp_serialize_location(parser, &((yp_optional_parameter_node_t *)node)->name_loc, buffer);
1108
+ yp_serialize_location(parser, &((yp_optional_parameter_node_t *)node)->operator_loc, buffer);
991
1109
  yp_serialize_node(parser, (yp_node_t *)((yp_optional_parameter_node_t *)node)->value, buffer);
992
1110
  break;
993
1111
  }
994
1112
  case YP_NODE_OR_NODE: {
995
1113
  yp_serialize_node(parser, (yp_node_t *)((yp_or_node_t *)node)->left, buffer);
996
1114
  yp_serialize_node(parser, (yp_node_t *)((yp_or_node_t *)node)->right, buffer);
997
- serialize_location(parser, &((yp_or_node_t *)node)->operator_loc, buffer);
998
- break;
999
- }
1000
- case YP_NODE_OR_WRITE_NODE: {
1001
- yp_serialize_node(parser, (yp_node_t *)((yp_or_write_node_t *)node)->target, buffer);
1002
- yp_serialize_node(parser, (yp_node_t *)((yp_or_write_node_t *)node)->value, buffer);
1003
- serialize_location(parser, &((yp_or_write_node_t *)node)->operator_loc, buffer);
1115
+ yp_serialize_location(parser, &((yp_or_node_t *)node)->operator_loc, buffer);
1004
1116
  break;
1005
1117
  }
1006
1118
  case YP_NODE_PARAMETERS_NODE: {
@@ -1047,20 +1159,20 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
1047
1159
  } else {
1048
1160
  yp_serialize_node(parser, (yp_node_t *)((yp_parentheses_node_t *)node)->body, buffer);
1049
1161
  }
1050
- serialize_location(parser, &((yp_parentheses_node_t *)node)->opening_loc, buffer);
1051
- serialize_location(parser, &((yp_parentheses_node_t *)node)->closing_loc, buffer);
1162
+ yp_serialize_location(parser, &((yp_parentheses_node_t *)node)->opening_loc, buffer);
1163
+ yp_serialize_location(parser, &((yp_parentheses_node_t *)node)->closing_loc, buffer);
1052
1164
  break;
1053
1165
  }
1054
1166
  case YP_NODE_PINNED_EXPRESSION_NODE: {
1055
1167
  yp_serialize_node(parser, (yp_node_t *)((yp_pinned_expression_node_t *)node)->expression, buffer);
1056
- serialize_location(parser, &((yp_pinned_expression_node_t *)node)->operator_loc, buffer);
1057
- serialize_location(parser, &((yp_pinned_expression_node_t *)node)->lparen_loc, buffer);
1058
- serialize_location(parser, &((yp_pinned_expression_node_t *)node)->rparen_loc, buffer);
1168
+ yp_serialize_location(parser, &((yp_pinned_expression_node_t *)node)->operator_loc, buffer);
1169
+ yp_serialize_location(parser, &((yp_pinned_expression_node_t *)node)->lparen_loc, buffer);
1170
+ yp_serialize_location(parser, &((yp_pinned_expression_node_t *)node)->rparen_loc, buffer);
1059
1171
  break;
1060
1172
  }
1061
1173
  case YP_NODE_PINNED_VARIABLE_NODE: {
1062
1174
  yp_serialize_node(parser, (yp_node_t *)((yp_pinned_variable_node_t *)node)->variable, buffer);
1063
- serialize_location(parser, &((yp_pinned_variable_node_t *)node)->operator_loc, buffer);
1175
+ yp_serialize_location(parser, &((yp_pinned_variable_node_t *)node)->operator_loc, buffer);
1064
1176
  break;
1065
1177
  }
1066
1178
  case YP_NODE_POST_EXECUTION_NODE: {
@@ -1069,9 +1181,9 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
1069
1181
  } else {
1070
1182
  yp_serialize_node(parser, (yp_node_t *)((yp_post_execution_node_t *)node)->statements, buffer);
1071
1183
  }
1072
- serialize_location(parser, &((yp_post_execution_node_t *)node)->keyword_loc, buffer);
1073
- serialize_location(parser, &((yp_post_execution_node_t *)node)->opening_loc, buffer);
1074
- serialize_location(parser, &((yp_post_execution_node_t *)node)->closing_loc, buffer);
1184
+ yp_serialize_location(parser, &((yp_post_execution_node_t *)node)->keyword_loc, buffer);
1185
+ yp_serialize_location(parser, &((yp_post_execution_node_t *)node)->opening_loc, buffer);
1186
+ yp_serialize_location(parser, &((yp_post_execution_node_t *)node)->closing_loc, buffer);
1075
1187
  break;
1076
1188
  }
1077
1189
  case YP_NODE_PRE_EXECUTION_NODE: {
@@ -1080,9 +1192,9 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
1080
1192
  } else {
1081
1193
  yp_serialize_node(parser, (yp_node_t *)((yp_pre_execution_node_t *)node)->statements, buffer);
1082
1194
  }
1083
- serialize_location(parser, &((yp_pre_execution_node_t *)node)->keyword_loc, buffer);
1084
- serialize_location(parser, &((yp_pre_execution_node_t *)node)->opening_loc, buffer);
1085
- serialize_location(parser, &((yp_pre_execution_node_t *)node)->closing_loc, buffer);
1195
+ yp_serialize_location(parser, &((yp_pre_execution_node_t *)node)->keyword_loc, buffer);
1196
+ yp_serialize_location(parser, &((yp_pre_execution_node_t *)node)->opening_loc, buffer);
1197
+ yp_serialize_location(parser, &((yp_pre_execution_node_t *)node)->closing_loc, buffer);
1086
1198
  break;
1087
1199
  }
1088
1200
  case YP_NODE_PROGRAM_NODE: {
@@ -1105,7 +1217,7 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
1105
1217
  } else {
1106
1218
  yp_serialize_node(parser, (yp_node_t *)((yp_range_node_t *)node)->right, buffer);
1107
1219
  }
1108
- serialize_location(parser, &((yp_range_node_t *)node)->operator_loc, buffer);
1220
+ yp_serialize_location(parser, &((yp_range_node_t *)node)->operator_loc, buffer);
1109
1221
  yp_buffer_append_u32(buffer, node->flags >> 1);
1110
1222
  break;
1111
1223
  }
@@ -1117,12 +1229,10 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
1117
1229
  break;
1118
1230
  }
1119
1231
  case YP_NODE_REGULAR_EXPRESSION_NODE: {
1120
- serialize_location(parser, &((yp_regular_expression_node_t *)node)->opening_loc, buffer);
1121
- serialize_location(parser, &((yp_regular_expression_node_t *)node)->content_loc, buffer);
1122
- serialize_location(parser, &((yp_regular_expression_node_t *)node)->closing_loc, buffer);
1123
- uint32_t unescaped_length = yp_sizet_to_u32(yp_string_length(&((yp_regular_expression_node_t *)node)->unescaped));
1124
- yp_buffer_append_u32(buffer, unescaped_length);
1125
- yp_buffer_append_str(buffer, yp_string_source(&((yp_regular_expression_node_t *)node)->unescaped), unescaped_length);
1232
+ yp_serialize_location(parser, &((yp_regular_expression_node_t *)node)->opening_loc, buffer);
1233
+ yp_serialize_location(parser, &((yp_regular_expression_node_t *)node)->content_loc, buffer);
1234
+ yp_serialize_location(parser, &((yp_regular_expression_node_t *)node)->closing_loc, buffer);
1235
+ yp_serialize_string(parser, &((yp_regular_expression_node_t *)node)->unescaped, buffer);
1126
1236
  yp_buffer_append_u32(buffer, node->flags >> 1);
1127
1237
  break;
1128
1238
  }
@@ -1132,8 +1242,8 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
1132
1242
  for (uint32_t index = 0; index < parameters_size; index++) {
1133
1243
  yp_serialize_node(parser, (yp_node_t *) ((yp_required_destructured_parameter_node_t *)node)->parameters.nodes[index], buffer);
1134
1244
  }
1135
- serialize_location(parser, &((yp_required_destructured_parameter_node_t *)node)->opening_loc, buffer);
1136
- serialize_location(parser, &((yp_required_destructured_parameter_node_t *)node)->closing_loc, buffer);
1245
+ yp_serialize_location(parser, &((yp_required_destructured_parameter_node_t *)node)->opening_loc, buffer);
1246
+ yp_serialize_location(parser, &((yp_required_destructured_parameter_node_t *)node)->closing_loc, buffer);
1137
1247
  break;
1138
1248
  }
1139
1249
  case YP_NODE_REQUIRED_PARAMETER_NODE: {
@@ -1142,12 +1252,12 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
1142
1252
  }
1143
1253
  case YP_NODE_RESCUE_MODIFIER_NODE: {
1144
1254
  yp_serialize_node(parser, (yp_node_t *)((yp_rescue_modifier_node_t *)node)->expression, buffer);
1145
- serialize_location(parser, &((yp_rescue_modifier_node_t *)node)->keyword_loc, buffer);
1255
+ yp_serialize_location(parser, &((yp_rescue_modifier_node_t *)node)->keyword_loc, buffer);
1146
1256
  yp_serialize_node(parser, (yp_node_t *)((yp_rescue_modifier_node_t *)node)->rescue_expression, buffer);
1147
1257
  break;
1148
1258
  }
1149
1259
  case YP_NODE_RESCUE_NODE: {
1150
- serialize_location(parser, &((yp_rescue_node_t *)node)->keyword_loc, buffer);
1260
+ yp_serialize_location(parser, &((yp_rescue_node_t *)node)->keyword_loc, buffer);
1151
1261
  uint32_t exceptions_size = yp_sizet_to_u32(((yp_rescue_node_t *)node)->exceptions.size);
1152
1262
  yp_buffer_append_u32(buffer, exceptions_size);
1153
1263
  for (uint32_t index = 0; index < exceptions_size; index++) {
@@ -1157,7 +1267,7 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
1157
1267
  yp_buffer_append_u8(buffer, 0);
1158
1268
  } else {
1159
1269
  yp_buffer_append_u8(buffer, 1);
1160
- serialize_location(parser, &((yp_rescue_node_t *)node)->operator_loc, buffer);
1270
+ yp_serialize_location(parser, &((yp_rescue_node_t *)node)->operator_loc, buffer);
1161
1271
  }
1162
1272
  if (((yp_rescue_node_t *)node)->reference == NULL) {
1163
1273
  yp_buffer_append_u8(buffer, 0);
@@ -1177,12 +1287,12 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
1177
1287
  break;
1178
1288
  }
1179
1289
  case YP_NODE_REST_PARAMETER_NODE: {
1180
- serialize_location(parser, &((yp_rest_parameter_node_t *)node)->operator_loc, buffer);
1290
+ yp_serialize_location(parser, &((yp_rest_parameter_node_t *)node)->operator_loc, buffer);
1181
1291
  if (((yp_rest_parameter_node_t *)node)->name_loc.start == NULL) {
1182
1292
  yp_buffer_append_u8(buffer, 0);
1183
1293
  } else {
1184
1294
  yp_buffer_append_u8(buffer, 1);
1185
- serialize_location(parser, &((yp_rest_parameter_node_t *)node)->name_loc, buffer);
1295
+ yp_serialize_location(parser, &((yp_rest_parameter_node_t *)node)->name_loc, buffer);
1186
1296
  }
1187
1297
  break;
1188
1298
  }
@@ -1190,7 +1300,7 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
1190
1300
  break;
1191
1301
  }
1192
1302
  case YP_NODE_RETURN_NODE: {
1193
- serialize_location(parser, &((yp_return_node_t *)node)->keyword_loc, buffer);
1303
+ yp_serialize_location(parser, &((yp_return_node_t *)node)->keyword_loc, buffer);
1194
1304
  if (((yp_return_node_t *)node)->arguments == NULL) {
1195
1305
  yp_buffer_append_u8(buffer, 0);
1196
1306
  } else {
@@ -1207,31 +1317,29 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
1207
1317
  for (uint32_t index = 0; index < locals_size; index++) {
1208
1318
  yp_buffer_append_u32(buffer, yp_sizet_to_u32(((yp_singleton_class_node_t *)node)->locals.ids[index]));
1209
1319
  }
1210
- serialize_location(parser, &((yp_singleton_class_node_t *)node)->class_keyword_loc, buffer);
1211
- serialize_location(parser, &((yp_singleton_class_node_t *)node)->operator_loc, buffer);
1320
+ yp_serialize_location(parser, &((yp_singleton_class_node_t *)node)->class_keyword_loc, buffer);
1321
+ yp_serialize_location(parser, &((yp_singleton_class_node_t *)node)->operator_loc, buffer);
1212
1322
  yp_serialize_node(parser, (yp_node_t *)((yp_singleton_class_node_t *)node)->expression, buffer);
1213
1323
  if (((yp_singleton_class_node_t *)node)->body == NULL) {
1214
1324
  yp_buffer_append_u8(buffer, 0);
1215
1325
  } else {
1216
1326
  yp_serialize_node(parser, (yp_node_t *)((yp_singleton_class_node_t *)node)->body, buffer);
1217
1327
  }
1218
- serialize_location(parser, &((yp_singleton_class_node_t *)node)->end_keyword_loc, buffer);
1328
+ yp_serialize_location(parser, &((yp_singleton_class_node_t *)node)->end_keyword_loc, buffer);
1219
1329
  break;
1220
1330
  }
1221
1331
  case YP_NODE_SOURCE_ENCODING_NODE: {
1222
1332
  break;
1223
1333
  }
1224
1334
  case YP_NODE_SOURCE_FILE_NODE: {
1225
- uint32_t filepath_length = yp_sizet_to_u32(yp_string_length(&((yp_source_file_node_t *)node)->filepath));
1226
- yp_buffer_append_u32(buffer, filepath_length);
1227
- yp_buffer_append_str(buffer, yp_string_source(&((yp_source_file_node_t *)node)->filepath), filepath_length);
1335
+ yp_serialize_string(parser, &((yp_source_file_node_t *)node)->filepath, buffer);
1228
1336
  break;
1229
1337
  }
1230
1338
  case YP_NODE_SOURCE_LINE_NODE: {
1231
1339
  break;
1232
1340
  }
1233
1341
  case YP_NODE_SPLAT_NODE: {
1234
- serialize_location(parser, &((yp_splat_node_t *)node)->operator_loc, buffer);
1342
+ yp_serialize_location(parser, &((yp_splat_node_t *)node)->operator_loc, buffer);
1235
1343
  if (((yp_splat_node_t *)node)->expression == NULL) {
1236
1344
  yp_buffer_append_u8(buffer, 0);
1237
1345
  } else {
@@ -1257,27 +1365,25 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
1257
1365
  yp_buffer_append_u8(buffer, 0);
1258
1366
  } else {
1259
1367
  yp_buffer_append_u8(buffer, 1);
1260
- serialize_location(parser, &((yp_string_node_t *)node)->opening_loc, buffer);
1368
+ yp_serialize_location(parser, &((yp_string_node_t *)node)->opening_loc, buffer);
1261
1369
  }
1262
- serialize_location(parser, &((yp_string_node_t *)node)->content_loc, buffer);
1370
+ yp_serialize_location(parser, &((yp_string_node_t *)node)->content_loc, buffer);
1263
1371
  if (((yp_string_node_t *)node)->closing_loc.start == NULL) {
1264
1372
  yp_buffer_append_u8(buffer, 0);
1265
1373
  } else {
1266
1374
  yp_buffer_append_u8(buffer, 1);
1267
- serialize_location(parser, &((yp_string_node_t *)node)->closing_loc, buffer);
1375
+ yp_serialize_location(parser, &((yp_string_node_t *)node)->closing_loc, buffer);
1268
1376
  }
1269
- uint32_t unescaped_length = yp_sizet_to_u32(yp_string_length(&((yp_string_node_t *)node)->unescaped));
1270
- yp_buffer_append_u32(buffer, unescaped_length);
1271
- yp_buffer_append_str(buffer, yp_string_source(&((yp_string_node_t *)node)->unescaped), unescaped_length);
1377
+ yp_serialize_string(parser, &((yp_string_node_t *)node)->unescaped, buffer);
1272
1378
  break;
1273
1379
  }
1274
1380
  case YP_NODE_SUPER_NODE: {
1275
- serialize_location(parser, &((yp_super_node_t *)node)->keyword_loc, buffer);
1381
+ yp_serialize_location(parser, &((yp_super_node_t *)node)->keyword_loc, buffer);
1276
1382
  if (((yp_super_node_t *)node)->lparen_loc.start == NULL) {
1277
1383
  yp_buffer_append_u8(buffer, 0);
1278
1384
  } else {
1279
1385
  yp_buffer_append_u8(buffer, 1);
1280
- serialize_location(parser, &((yp_super_node_t *)node)->lparen_loc, buffer);
1386
+ yp_serialize_location(parser, &((yp_super_node_t *)node)->lparen_loc, buffer);
1281
1387
  }
1282
1388
  if (((yp_super_node_t *)node)->arguments == NULL) {
1283
1389
  yp_buffer_append_u8(buffer, 0);
@@ -1288,7 +1394,7 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
1288
1394
  yp_buffer_append_u8(buffer, 0);
1289
1395
  } else {
1290
1396
  yp_buffer_append_u8(buffer, 1);
1291
- serialize_location(parser, &((yp_super_node_t *)node)->rparen_loc, buffer);
1397
+ yp_serialize_location(parser, &((yp_super_node_t *)node)->rparen_loc, buffer);
1292
1398
  }
1293
1399
  if (((yp_super_node_t *)node)->block == NULL) {
1294
1400
  yp_buffer_append_u8(buffer, 0);
@@ -1302,18 +1408,21 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
1302
1408
  yp_buffer_append_u8(buffer, 0);
1303
1409
  } else {
1304
1410
  yp_buffer_append_u8(buffer, 1);
1305
- serialize_location(parser, &((yp_symbol_node_t *)node)->opening_loc, buffer);
1411
+ yp_serialize_location(parser, &((yp_symbol_node_t *)node)->opening_loc, buffer);
1412
+ }
1413
+ if (((yp_symbol_node_t *)node)->value_loc.start == NULL) {
1414
+ yp_buffer_append_u8(buffer, 0);
1415
+ } else {
1416
+ yp_buffer_append_u8(buffer, 1);
1417
+ yp_serialize_location(parser, &((yp_symbol_node_t *)node)->value_loc, buffer);
1306
1418
  }
1307
- serialize_location(parser, &((yp_symbol_node_t *)node)->value_loc, buffer);
1308
1419
  if (((yp_symbol_node_t *)node)->closing_loc.start == NULL) {
1309
1420
  yp_buffer_append_u8(buffer, 0);
1310
1421
  } else {
1311
1422
  yp_buffer_append_u8(buffer, 1);
1312
- serialize_location(parser, &((yp_symbol_node_t *)node)->closing_loc, buffer);
1423
+ yp_serialize_location(parser, &((yp_symbol_node_t *)node)->closing_loc, buffer);
1313
1424
  }
1314
- uint32_t unescaped_length = yp_sizet_to_u32(yp_string_length(&((yp_symbol_node_t *)node)->unescaped));
1315
- yp_buffer_append_u32(buffer, unescaped_length);
1316
- yp_buffer_append_str(buffer, yp_string_source(&((yp_symbol_node_t *)node)->unescaped), unescaped_length);
1425
+ yp_serialize_string(parser, &((yp_symbol_node_t *)node)->unescaped, buffer);
1317
1426
  break;
1318
1427
  }
1319
1428
  case YP_NODE_TRUE_NODE: {
@@ -1325,11 +1434,11 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
1325
1434
  for (uint32_t index = 0; index < names_size; index++) {
1326
1435
  yp_serialize_node(parser, (yp_node_t *) ((yp_undef_node_t *)node)->names.nodes[index], buffer);
1327
1436
  }
1328
- serialize_location(parser, &((yp_undef_node_t *)node)->keyword_loc, buffer);
1437
+ yp_serialize_location(parser, &((yp_undef_node_t *)node)->keyword_loc, buffer);
1329
1438
  break;
1330
1439
  }
1331
1440
  case YP_NODE_UNLESS_NODE: {
1332
- serialize_location(parser, &((yp_unless_node_t *)node)->keyword_loc, buffer);
1441
+ yp_serialize_location(parser, &((yp_unless_node_t *)node)->keyword_loc, buffer);
1333
1442
  yp_serialize_node(parser, (yp_node_t *)((yp_unless_node_t *)node)->predicate, buffer);
1334
1443
  if (((yp_unless_node_t *)node)->statements == NULL) {
1335
1444
  yp_buffer_append_u8(buffer, 0);
@@ -1345,12 +1454,18 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
1345
1454
  yp_buffer_append_u8(buffer, 0);
1346
1455
  } else {
1347
1456
  yp_buffer_append_u8(buffer, 1);
1348
- serialize_location(parser, &((yp_unless_node_t *)node)->end_keyword_loc, buffer);
1457
+ yp_serialize_location(parser, &((yp_unless_node_t *)node)->end_keyword_loc, buffer);
1349
1458
  }
1350
1459
  break;
1351
1460
  }
1352
1461
  case YP_NODE_UNTIL_NODE: {
1353
- serialize_location(parser, &((yp_until_node_t *)node)->keyword_loc, buffer);
1462
+ yp_serialize_location(parser, &((yp_until_node_t *)node)->keyword_loc, buffer);
1463
+ if (((yp_until_node_t *)node)->closing_loc.start == NULL) {
1464
+ yp_buffer_append_u8(buffer, 0);
1465
+ } else {
1466
+ yp_buffer_append_u8(buffer, 1);
1467
+ yp_serialize_location(parser, &((yp_until_node_t *)node)->closing_loc, buffer);
1468
+ }
1354
1469
  yp_serialize_node(parser, (yp_node_t *)((yp_until_node_t *)node)->predicate, buffer);
1355
1470
  if (((yp_until_node_t *)node)->statements == NULL) {
1356
1471
  yp_buffer_append_u8(buffer, 0);
@@ -1361,7 +1476,7 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
1361
1476
  break;
1362
1477
  }
1363
1478
  case YP_NODE_WHEN_NODE: {
1364
- serialize_location(parser, &((yp_when_node_t *)node)->keyword_loc, buffer);
1479
+ yp_serialize_location(parser, &((yp_when_node_t *)node)->keyword_loc, buffer);
1365
1480
  uint32_t conditions_size = yp_sizet_to_u32(((yp_when_node_t *)node)->conditions.size);
1366
1481
  yp_buffer_append_u32(buffer, conditions_size);
1367
1482
  for (uint32_t index = 0; index < conditions_size; index++) {
@@ -1375,7 +1490,13 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
1375
1490
  break;
1376
1491
  }
1377
1492
  case YP_NODE_WHILE_NODE: {
1378
- serialize_location(parser, &((yp_while_node_t *)node)->keyword_loc, buffer);
1493
+ yp_serialize_location(parser, &((yp_while_node_t *)node)->keyword_loc, buffer);
1494
+ if (((yp_while_node_t *)node)->closing_loc.start == NULL) {
1495
+ yp_buffer_append_u8(buffer, 0);
1496
+ } else {
1497
+ yp_buffer_append_u8(buffer, 1);
1498
+ yp_serialize_location(parser, &((yp_while_node_t *)node)->closing_loc, buffer);
1499
+ }
1379
1500
  yp_serialize_node(parser, (yp_node_t *)((yp_while_node_t *)node)->predicate, buffer);
1380
1501
  if (((yp_while_node_t *)node)->statements == NULL) {
1381
1502
  yp_buffer_append_u8(buffer, 0);
@@ -1386,21 +1507,19 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
1386
1507
  break;
1387
1508
  }
1388
1509
  case YP_NODE_X_STRING_NODE: {
1389
- serialize_location(parser, &((yp_x_string_node_t *)node)->opening_loc, buffer);
1390
- serialize_location(parser, &((yp_x_string_node_t *)node)->content_loc, buffer);
1391
- serialize_location(parser, &((yp_x_string_node_t *)node)->closing_loc, buffer);
1392
- uint32_t unescaped_length = yp_sizet_to_u32(yp_string_length(&((yp_x_string_node_t *)node)->unescaped));
1393
- yp_buffer_append_u32(buffer, unescaped_length);
1394
- yp_buffer_append_str(buffer, yp_string_source(&((yp_x_string_node_t *)node)->unescaped), unescaped_length);
1510
+ yp_serialize_location(parser, &((yp_x_string_node_t *)node)->opening_loc, buffer);
1511
+ yp_serialize_location(parser, &((yp_x_string_node_t *)node)->content_loc, buffer);
1512
+ yp_serialize_location(parser, &((yp_x_string_node_t *)node)->closing_loc, buffer);
1513
+ yp_serialize_string(parser, &((yp_x_string_node_t *)node)->unescaped, buffer);
1395
1514
  break;
1396
1515
  }
1397
1516
  case YP_NODE_YIELD_NODE: {
1398
- serialize_location(parser, &((yp_yield_node_t *)node)->keyword_loc, buffer);
1517
+ yp_serialize_location(parser, &((yp_yield_node_t *)node)->keyword_loc, buffer);
1399
1518
  if (((yp_yield_node_t *)node)->lparen_loc.start == NULL) {
1400
1519
  yp_buffer_append_u8(buffer, 0);
1401
1520
  } else {
1402
1521
  yp_buffer_append_u8(buffer, 1);
1403
- serialize_location(parser, &((yp_yield_node_t *)node)->lparen_loc, buffer);
1522
+ yp_serialize_location(parser, &((yp_yield_node_t *)node)->lparen_loc, buffer);
1404
1523
  }
1405
1524
  if (((yp_yield_node_t *)node)->arguments == NULL) {
1406
1525
  yp_buffer_append_u8(buffer, 0);
@@ -1411,14 +1530,15 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
1411
1530
  yp_buffer_append_u8(buffer, 0);
1412
1531
  } else {
1413
1532
  yp_buffer_append_u8(buffer, 1);
1414
- serialize_location(parser, &((yp_yield_node_t *)node)->rparen_loc, buffer);
1533
+ yp_serialize_location(parser, &((yp_yield_node_t *)node)->rparen_loc, buffer);
1415
1534
  }
1416
1535
  break;
1417
1536
  }
1418
1537
  }
1419
1538
  }
1420
1539
 
1421
- void yp_serialize_comment(yp_parser_t *parser, yp_comment_t *comment, yp_buffer_t *buffer) {
1540
+ static void
1541
+ yp_serialize_comment(yp_parser_t *parser, yp_comment_t *comment, yp_buffer_t *buffer) {
1422
1542
  // serialize type
1423
1543
  yp_buffer_append_u8(buffer, (uint8_t) comment->type);
1424
1544
 
@@ -1427,16 +1547,18 @@ void yp_serialize_comment(yp_parser_t *parser, yp_comment_t *comment, yp_buffer_
1427
1547
  yp_buffer_append_u32(buffer, yp_ptrdifft_to_u32(comment->end - comment->start));
1428
1548
  }
1429
1549
 
1430
- void yp_serialize_comment_list(yp_parser_t *parser, yp_list_t list, yp_buffer_t *buffer) {
1431
- yp_buffer_append_u32(buffer, yp_sizet_to_u32(yp_list_size(&list)));
1550
+ static void
1551
+ yp_serialize_comment_list(yp_parser_t *parser, yp_list_t *list, yp_buffer_t *buffer) {
1552
+ yp_buffer_append_u32(buffer, yp_sizet_to_u32(yp_list_size(list)));
1432
1553
 
1433
1554
  yp_comment_t *comment;
1434
- for (comment = (yp_comment_t *) list.head; comment != NULL; comment = (yp_comment_t *) comment->node.next) {
1555
+ for (comment = (yp_comment_t *) list->head; comment != NULL; comment = (yp_comment_t *) comment->node.next) {
1435
1556
  yp_serialize_comment(parser, comment, buffer);
1436
1557
  }
1437
1558
  }
1438
1559
 
1439
- void yp_serialize_diagnostic(yp_parser_t *parser, yp_diagnostic_t *diagnostic, yp_buffer_t *buffer) {
1560
+ static void
1561
+ yp_serialize_diagnostic(yp_parser_t *parser, yp_diagnostic_t *diagnostic, yp_buffer_t *buffer) {
1440
1562
  // serialize message
1441
1563
  size_t message_length = strlen(diagnostic->message);
1442
1564
  yp_buffer_append_u32(buffer, yp_sizet_to_u32(message_length));
@@ -1447,31 +1569,30 @@ void yp_serialize_diagnostic(yp_parser_t *parser, yp_diagnostic_t *diagnostic, y
1447
1569
  yp_buffer_append_u32(buffer, yp_ptrdifft_to_u32(diagnostic->end - diagnostic->start));
1448
1570
  }
1449
1571
 
1450
- void yp_serialize_diagnostic_list(yp_parser_t *parser, yp_list_t list, yp_buffer_t *buffer) {
1451
- yp_buffer_append_u32(buffer, yp_sizet_to_u32(yp_list_size(&list)));
1572
+ static void
1573
+ yp_serialize_diagnostic_list(yp_parser_t *parser, yp_list_t *list, yp_buffer_t *buffer) {
1574
+ yp_buffer_append_u32(buffer, yp_sizet_to_u32(yp_list_size(list)));
1452
1575
 
1453
1576
  yp_diagnostic_t *diagnostic;
1454
- for (diagnostic = (yp_diagnostic_t *) list.head; diagnostic != NULL; diagnostic = (yp_diagnostic_t *) diagnostic->node.next) {
1577
+ for (diagnostic = (yp_diagnostic_t *) list->head; diagnostic != NULL; diagnostic = (yp_diagnostic_t *) diagnostic->node.next) {
1455
1578
  yp_serialize_diagnostic(parser, diagnostic, buffer);
1456
1579
  }
1457
1580
  }
1458
1581
 
1459
- #line 145 "serialize.c.erb"
1460
- void
1461
- yp_serialize_content(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
1462
- // First, serialize the encoding of the parser.
1463
- size_t encoding_length = strlen(parser->encoding.name);
1582
+ static void
1583
+ yp_serialize_encoding(yp_encoding_t *encoding, yp_buffer_t *buffer) {
1584
+ size_t encoding_length = strlen(encoding->name);
1464
1585
  yp_buffer_append_u32(buffer, yp_sizet_to_u32(encoding_length));
1465
- yp_buffer_append_str(buffer, parser->encoding.name, encoding_length);
1466
-
1467
- // Serialize the comments
1468
- yp_serialize_comment_list(parser, parser->comment_list, buffer);
1469
-
1470
- // Serialize the errors
1471
- yp_serialize_diagnostic_list(parser, parser->error_list, buffer);
1586
+ yp_buffer_append_str(buffer, encoding->name, encoding_length);
1587
+ }
1472
1588
 
1473
- // Serialize the warnings
1474
- yp_serialize_diagnostic_list(parser, parser->warning_list, buffer);
1589
+ #line 181 "serialize.c.erb"
1590
+ void
1591
+ yp_serialize_content(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
1592
+ yp_serialize_encoding(&parser->encoding, buffer);
1593
+ yp_serialize_comment_list(parser, &parser->comment_list, buffer);
1594
+ yp_serialize_diagnostic_list(parser, &parser->error_list, buffer);
1595
+ yp_serialize_diagnostic_list(parser, &parser->warning_list, buffer);
1475
1596
 
1476
1597
  // Here we're going to leave space for the offset of the constant pool in
1477
1598
  // the buffer.
@@ -1535,16 +1656,35 @@ yp_lex_serialize(const char *source, size_t size, const char *filepath, yp_buffe
1535
1656
  yp_node_t *node = yp_parse(&parser);
1536
1657
 
1537
1658
  // Append 0 to mark end of tokens
1538
- yp_buffer_append_u32(buffer, 0);
1659
+ yp_buffer_append_u8(buffer, 0);
1539
1660
 
1540
- // Serialize the comments
1541
- yp_serialize_comment_list(&parser, parser.comment_list, buffer);
1661
+ yp_serialize_encoding(&parser.encoding, buffer);
1662
+ yp_serialize_comment_list(&parser, &parser.comment_list, buffer);
1663
+ yp_serialize_diagnostic_list(&parser, &parser.error_list, buffer);
1664
+ yp_serialize_diagnostic_list(&parser, &parser.warning_list, buffer);
1542
1665
 
1543
- // Serialize the errors
1544
- yp_serialize_diagnostic_list(&parser, parser.error_list, buffer);
1666
+ yp_node_destroy(&parser, node);
1667
+ yp_parser_free(&parser);
1668
+ }
1669
+
1670
+ // Parse and serialize both the AST and the tokens represented by the given
1671
+ // source to the given buffer.
1672
+ YP_EXPORTED_FUNCTION void
1673
+ yp_parse_lex_serialize(const char *source, size_t size, yp_buffer_t *buffer, const char *metadata) {
1674
+ yp_parser_t parser;
1675
+ yp_parser_init(&parser, source, size, NULL);
1676
+ if (metadata) yp_parser_metadata(&parser, metadata);
1677
+
1678
+ yp_lex_callback_t lex_callback = (yp_lex_callback_t) {
1679
+ .data = (void *) buffer,
1680
+ .callback = serialize_token,
1681
+ };
1682
+
1683
+ parser.lex_callback = &lex_callback;
1684
+ yp_node_t *node = yp_parse(&parser);
1545
1685
 
1546
- // Serialize the warnings
1547
- yp_serialize_diagnostic_list(&parser, parser.warning_list, buffer);
1686
+ yp_buffer_append_u8(buffer, 0);
1687
+ yp_serialize(&parser, node, buffer);
1548
1688
 
1549
1689
  yp_node_destroy(&parser, node);
1550
1690
  yp_parser_free(&parser);