Ruby 4.1.0dev (2026-03-05 revision 8a87cebd1874f8f9f68af8928191ee3f0d97bb28)
node.c
1/*----------------------------------------------------------------------------*/
2/* This file is generated by the templates/template.rb script and should not */
3/* be modified manually. See */
4/* templates/src/node.c.erb */
5/* if you are looking to modify the */
6/* template */
7/*----------------------------------------------------------------------------*/
8
9#line 2 "prism/templates/src/node.c.erb"
10#include "prism/node.h"
11
18static bool
19pm_node_list_grow(pm_node_list_t *list, size_t size) {
20 size_t requested_size = list->size + size;
21
22 // If the requested size caused overflow, return false.
23 if (requested_size < list->size) return false;
24
25 // If the requested size is within the existing capacity, return true.
26 if (requested_size < list->capacity) return true;
27
28 // Otherwise, reallocate the list to be twice as large as it was before.
29 size_t next_capacity = list->capacity == 0 ? 4 : list->capacity * 2;
30
31 // If multiplying by 2 caused overflow, return false.
32 if (next_capacity < list->capacity) return false;
33
34 // If we didn't get enough by doubling, keep doubling until we do.
35 while (requested_size > next_capacity) {
36 size_t double_capacity = next_capacity * 2;
37
38 // Ensure we didn't overflow by multiplying by 2.
39 if (double_capacity < next_capacity) return false;
40 next_capacity = double_capacity;
41 }
42
43 pm_node_t **nodes = (pm_node_t **) xrealloc_sized(
44 list->nodes,
45 sizeof(pm_node_t *) * next_capacity,
46 sizeof(pm_node_t *) * list->capacity
47 );
48 if (nodes == NULL) return false;
49
50 list->nodes = nodes;
51 list->capacity = next_capacity;
52 return true;
53}
54
58void
59pm_node_list_append(pm_node_list_t *list, pm_node_t *node) {
60 if (pm_node_list_grow(list, 1)) {
61 list->nodes[list->size++] = node;
62 }
63}
64
68void
69pm_node_list_prepend(pm_node_list_t *list, pm_node_t *node) {
70 if (pm_node_list_grow(list, 1)) {
71 memmove(list->nodes + 1, list->nodes, list->size * sizeof(pm_node_t *));
72 list->nodes[0] = node;
73 list->size++;
74 }
75}
76
80void
81pm_node_list_concat(pm_node_list_t *list, pm_node_list_t *other) {
82 if (other->size > 0 && pm_node_list_grow(list, other->size)) {
83 memcpy(list->nodes + list->size, other->nodes, other->size * sizeof(pm_node_t *));
84 list->size += other->size;
85 }
86}
87
91void
92pm_node_list_free(pm_node_list_t *list) {
93 if (list->capacity > 0) {
94 xfree_sized(list->nodes, sizeof(pm_node_t *) * list->capacity);
95 *list = (pm_node_list_t) { 0 };
96 }
97}
98
100pm_node_destroy(pm_parser_t *parser, pm_node_t *node);
101
105static void
106pm_node_list_destroy(pm_parser_t *parser, pm_node_list_t *list) {
107 pm_node_t *node;
108 PM_NODE_LIST_FOREACH(list, index, node) pm_node_destroy(parser, node);
109 pm_node_list_free(list);
110}
111
118pm_node_destroy(pm_parser_t *parser, pm_node_t *node) {
119 switch (PM_NODE_TYPE(node)) {
120#line 114 "prism/templates/src/node.c.erb"
121 case PM_ALIAS_GLOBAL_VARIABLE_NODE: {
123 pm_node_destroy(parser, (pm_node_t *)cast->new_name);
124 pm_node_destroy(parser, (pm_node_t *)cast->old_name);
125 xfree_sized(node, sizeof(pm_alias_global_variable_node_t));
126 break;
127 }
128#line 114 "prism/templates/src/node.c.erb"
129 case PM_ALIAS_METHOD_NODE: {
131 pm_node_destroy(parser, (pm_node_t *)cast->new_name);
132 pm_node_destroy(parser, (pm_node_t *)cast->old_name);
133 xfree_sized(node, sizeof(pm_alias_method_node_t));
134 break;
135 }
136#line 114 "prism/templates/src/node.c.erb"
137 case PM_ALTERNATION_PATTERN_NODE: {
139 pm_node_destroy(parser, (pm_node_t *)cast->left);
140 pm_node_destroy(parser, (pm_node_t *)cast->right);
141 xfree_sized(node, sizeof(pm_alternation_pattern_node_t));
142 break;
143 }
144#line 114 "prism/templates/src/node.c.erb"
145 case PM_AND_NODE: {
146 pm_and_node_t *cast = (pm_and_node_t *) node;
147 pm_node_destroy(parser, (pm_node_t *)cast->left);
148 pm_node_destroy(parser, (pm_node_t *)cast->right);
149 xfree_sized(node, sizeof(pm_and_node_t));
150 break;
151 }
152#line 114 "prism/templates/src/node.c.erb"
153 case PM_ARGUMENTS_NODE: {
155 pm_node_list_destroy(parser, &cast->arguments);
156 xfree_sized(node, sizeof(pm_arguments_node_t));
157 break;
158 }
159#line 114 "prism/templates/src/node.c.erb"
160 case PM_ARRAY_NODE: {
161 pm_array_node_t *cast = (pm_array_node_t *) node;
162 pm_node_list_destroy(parser, &cast->elements);
163 xfree_sized(node, sizeof(pm_array_node_t));
164 break;
165 }
166#line 114 "prism/templates/src/node.c.erb"
167 case PM_ARRAY_PATTERN_NODE: {
169 if (cast->constant != NULL) {
170 pm_node_destroy(parser, (pm_node_t *)cast->constant);
171 }
172 pm_node_list_destroy(parser, &cast->requireds);
173 if (cast->rest != NULL) {
174 pm_node_destroy(parser, (pm_node_t *)cast->rest);
175 }
176 pm_node_list_destroy(parser, &cast->posts);
177 xfree_sized(node, sizeof(pm_array_pattern_node_t));
178 break;
179 }
180#line 114 "prism/templates/src/node.c.erb"
181 case PM_ASSOC_NODE: {
182 pm_assoc_node_t *cast = (pm_assoc_node_t *) node;
183 pm_node_destroy(parser, (pm_node_t *)cast->key);
184 pm_node_destroy(parser, (pm_node_t *)cast->value);
185 xfree_sized(node, sizeof(pm_assoc_node_t));
186 break;
187 }
188#line 114 "prism/templates/src/node.c.erb"
189 case PM_ASSOC_SPLAT_NODE: {
191 if (cast->value != NULL) {
192 pm_node_destroy(parser, (pm_node_t *)cast->value);
193 }
194 xfree_sized(node, sizeof(pm_assoc_splat_node_t));
195 break;
196 }
197#line 114 "prism/templates/src/node.c.erb"
198 case PM_BACK_REFERENCE_READ_NODE: {
199 xfree_sized(node, sizeof(pm_back_reference_read_node_t));
200 break;
201 }
202#line 114 "prism/templates/src/node.c.erb"
203 case PM_BEGIN_NODE: {
204 pm_begin_node_t *cast = (pm_begin_node_t *) node;
205 if (cast->statements != NULL) {
206 pm_node_destroy(parser, (pm_node_t *)cast->statements);
207 }
208 if (cast->rescue_clause != NULL) {
209 pm_node_destroy(parser, (pm_node_t *)cast->rescue_clause);
210 }
211 if (cast->else_clause != NULL) {
212 pm_node_destroy(parser, (pm_node_t *)cast->else_clause);
213 }
214 if (cast->ensure_clause != NULL) {
215 pm_node_destroy(parser, (pm_node_t *)cast->ensure_clause);
216 }
217 xfree_sized(node, sizeof(pm_begin_node_t));
218 break;
219 }
220#line 114 "prism/templates/src/node.c.erb"
221 case PM_BLOCK_ARGUMENT_NODE: {
223 if (cast->expression != NULL) {
224 pm_node_destroy(parser, (pm_node_t *)cast->expression);
225 }
226 xfree_sized(node, sizeof(pm_block_argument_node_t));
227 break;
228 }
229#line 114 "prism/templates/src/node.c.erb"
230 case PM_BLOCK_LOCAL_VARIABLE_NODE: {
231 xfree_sized(node, sizeof(pm_block_local_variable_node_t));
232 break;
233 }
234#line 114 "prism/templates/src/node.c.erb"
235 case PM_BLOCK_NODE: {
236 pm_block_node_t *cast = (pm_block_node_t *) node;
237 pm_constant_id_list_free(&cast->locals);
238 if (cast->parameters != NULL) {
239 pm_node_destroy(parser, (pm_node_t *)cast->parameters);
240 }
241 if (cast->body != NULL) {
242 pm_node_destroy(parser, (pm_node_t *)cast->body);
243 }
244 xfree_sized(node, sizeof(pm_block_node_t));
245 break;
246 }
247#line 114 "prism/templates/src/node.c.erb"
248 case PM_BLOCK_PARAMETER_NODE: {
249 xfree_sized(node, sizeof(pm_block_parameter_node_t));
250 break;
251 }
252#line 114 "prism/templates/src/node.c.erb"
253 case PM_BLOCK_PARAMETERS_NODE: {
255 if (cast->parameters != NULL) {
256 pm_node_destroy(parser, (pm_node_t *)cast->parameters);
257 }
258 pm_node_list_destroy(parser, &cast->locals);
259 xfree_sized(node, sizeof(pm_block_parameters_node_t));
260 break;
261 }
262#line 114 "prism/templates/src/node.c.erb"
263 case PM_BREAK_NODE: {
264 pm_break_node_t *cast = (pm_break_node_t *) node;
265 if (cast->arguments != NULL) {
266 pm_node_destroy(parser, (pm_node_t *)cast->arguments);
267 }
268 xfree_sized(node, sizeof(pm_break_node_t));
269 break;
270 }
271#line 114 "prism/templates/src/node.c.erb"
272 case PM_CALL_AND_WRITE_NODE: {
274 if (cast->receiver != NULL) {
275 pm_node_destroy(parser, (pm_node_t *)cast->receiver);
276 }
277 pm_node_destroy(parser, (pm_node_t *)cast->value);
278 xfree_sized(node, sizeof(pm_call_and_write_node_t));
279 break;
280 }
281#line 114 "prism/templates/src/node.c.erb"
282 case PM_CALL_NODE: {
283 pm_call_node_t *cast = (pm_call_node_t *) node;
284 if (cast->receiver != NULL) {
285 pm_node_destroy(parser, (pm_node_t *)cast->receiver);
286 }
287 if (cast->arguments != NULL) {
288 pm_node_destroy(parser, (pm_node_t *)cast->arguments);
289 }
290 if (cast->block != NULL) {
291 pm_node_destroy(parser, (pm_node_t *)cast->block);
292 }
293 xfree_sized(node, sizeof(pm_call_node_t));
294 break;
295 }
296#line 114 "prism/templates/src/node.c.erb"
297 case PM_CALL_OPERATOR_WRITE_NODE: {
299 if (cast->receiver != NULL) {
300 pm_node_destroy(parser, (pm_node_t *)cast->receiver);
301 }
302 pm_node_destroy(parser, (pm_node_t *)cast->value);
303 xfree_sized(node, sizeof(pm_call_operator_write_node_t));
304 break;
305 }
306#line 114 "prism/templates/src/node.c.erb"
307 case PM_CALL_OR_WRITE_NODE: {
309 if (cast->receiver != NULL) {
310 pm_node_destroy(parser, (pm_node_t *)cast->receiver);
311 }
312 pm_node_destroy(parser, (pm_node_t *)cast->value);
313 xfree_sized(node, sizeof(pm_call_or_write_node_t));
314 break;
315 }
316#line 114 "prism/templates/src/node.c.erb"
317 case PM_CALL_TARGET_NODE: {
319 pm_node_destroy(parser, (pm_node_t *)cast->receiver);
320 xfree_sized(node, sizeof(pm_call_target_node_t));
321 break;
322 }
323#line 114 "prism/templates/src/node.c.erb"
324 case PM_CAPTURE_PATTERN_NODE: {
326 pm_node_destroy(parser, (pm_node_t *)cast->value);
327 pm_node_destroy(parser, (pm_node_t *)cast->target);
328 xfree_sized(node, sizeof(pm_capture_pattern_node_t));
329 break;
330 }
331#line 114 "prism/templates/src/node.c.erb"
332 case PM_CASE_MATCH_NODE: {
334 if (cast->predicate != NULL) {
335 pm_node_destroy(parser, (pm_node_t *)cast->predicate);
336 }
337 pm_node_list_destroy(parser, &cast->conditions);
338 if (cast->else_clause != NULL) {
339 pm_node_destroy(parser, (pm_node_t *)cast->else_clause);
340 }
341 xfree_sized(node, sizeof(pm_case_match_node_t));
342 break;
343 }
344#line 114 "prism/templates/src/node.c.erb"
345 case PM_CASE_NODE: {
346 pm_case_node_t *cast = (pm_case_node_t *) node;
347 if (cast->predicate != NULL) {
348 pm_node_destroy(parser, (pm_node_t *)cast->predicate);
349 }
350 pm_node_list_destroy(parser, &cast->conditions);
351 if (cast->else_clause != NULL) {
352 pm_node_destroy(parser, (pm_node_t *)cast->else_clause);
353 }
354 xfree_sized(node, sizeof(pm_case_node_t));
355 break;
356 }
357#line 114 "prism/templates/src/node.c.erb"
358 case PM_CLASS_NODE: {
359 pm_class_node_t *cast = (pm_class_node_t *) node;
360 pm_constant_id_list_free(&cast->locals);
361 pm_node_destroy(parser, (pm_node_t *)cast->constant_path);
362 if (cast->superclass != NULL) {
363 pm_node_destroy(parser, (pm_node_t *)cast->superclass);
364 }
365 if (cast->body != NULL) {
366 pm_node_destroy(parser, (pm_node_t *)cast->body);
367 }
368 xfree_sized(node, sizeof(pm_class_node_t));
369 break;
370 }
371#line 114 "prism/templates/src/node.c.erb"
372 case PM_CLASS_VARIABLE_AND_WRITE_NODE: {
374 pm_node_destroy(parser, (pm_node_t *)cast->value);
375 xfree_sized(node, sizeof(pm_class_variable_and_write_node_t));
376 break;
377 }
378#line 114 "prism/templates/src/node.c.erb"
379 case PM_CLASS_VARIABLE_OPERATOR_WRITE_NODE: {
381 pm_node_destroy(parser, (pm_node_t *)cast->value);
382 xfree_sized(node, sizeof(pm_class_variable_operator_write_node_t));
383 break;
384 }
385#line 114 "prism/templates/src/node.c.erb"
386 case PM_CLASS_VARIABLE_OR_WRITE_NODE: {
388 pm_node_destroy(parser, (pm_node_t *)cast->value);
389 xfree_sized(node, sizeof(pm_class_variable_or_write_node_t));
390 break;
391 }
392#line 114 "prism/templates/src/node.c.erb"
393 case PM_CLASS_VARIABLE_READ_NODE: {
394 xfree_sized(node, sizeof(pm_class_variable_read_node_t));
395 break;
396 }
397#line 114 "prism/templates/src/node.c.erb"
398 case PM_CLASS_VARIABLE_TARGET_NODE: {
399 xfree_sized(node, sizeof(pm_class_variable_target_node_t));
400 break;
401 }
402#line 114 "prism/templates/src/node.c.erb"
403 case PM_CLASS_VARIABLE_WRITE_NODE: {
405 pm_node_destroy(parser, (pm_node_t *)cast->value);
406 xfree_sized(node, sizeof(pm_class_variable_write_node_t));
407 break;
408 }
409#line 114 "prism/templates/src/node.c.erb"
410 case PM_CONSTANT_AND_WRITE_NODE: {
412 pm_node_destroy(parser, (pm_node_t *)cast->value);
413 xfree_sized(node, sizeof(pm_constant_and_write_node_t));
414 break;
415 }
416#line 114 "prism/templates/src/node.c.erb"
417 case PM_CONSTANT_OPERATOR_WRITE_NODE: {
419 pm_node_destroy(parser, (pm_node_t *)cast->value);
420 xfree_sized(node, sizeof(pm_constant_operator_write_node_t));
421 break;
422 }
423#line 114 "prism/templates/src/node.c.erb"
424 case PM_CONSTANT_OR_WRITE_NODE: {
426 pm_node_destroy(parser, (pm_node_t *)cast->value);
427 xfree_sized(node, sizeof(pm_constant_or_write_node_t));
428 break;
429 }
430#line 114 "prism/templates/src/node.c.erb"
431 case PM_CONSTANT_PATH_AND_WRITE_NODE: {
433 pm_node_destroy(parser, (pm_node_t *)cast->target);
434 pm_node_destroy(parser, (pm_node_t *)cast->value);
435 xfree_sized(node, sizeof(pm_constant_path_and_write_node_t));
436 break;
437 }
438#line 114 "prism/templates/src/node.c.erb"
439 case PM_CONSTANT_PATH_NODE: {
441 if (cast->parent != NULL) {
442 pm_node_destroy(parser, (pm_node_t *)cast->parent);
443 }
444 xfree_sized(node, sizeof(pm_constant_path_node_t));
445 break;
446 }
447#line 114 "prism/templates/src/node.c.erb"
448 case PM_CONSTANT_PATH_OPERATOR_WRITE_NODE: {
450 pm_node_destroy(parser, (pm_node_t *)cast->target);
451 pm_node_destroy(parser, (pm_node_t *)cast->value);
452 xfree_sized(node, sizeof(pm_constant_path_operator_write_node_t));
453 break;
454 }
455#line 114 "prism/templates/src/node.c.erb"
456 case PM_CONSTANT_PATH_OR_WRITE_NODE: {
458 pm_node_destroy(parser, (pm_node_t *)cast->target);
459 pm_node_destroy(parser, (pm_node_t *)cast->value);
460 xfree_sized(node, sizeof(pm_constant_path_or_write_node_t));
461 break;
462 }
463#line 114 "prism/templates/src/node.c.erb"
464 case PM_CONSTANT_PATH_TARGET_NODE: {
466 if (cast->parent != NULL) {
467 pm_node_destroy(parser, (pm_node_t *)cast->parent);
468 }
469 xfree_sized(node, sizeof(pm_constant_path_target_node_t));
470 break;
471 }
472#line 114 "prism/templates/src/node.c.erb"
473 case PM_CONSTANT_PATH_WRITE_NODE: {
475 pm_node_destroy(parser, (pm_node_t *)cast->target);
476 pm_node_destroy(parser, (pm_node_t *)cast->value);
477 xfree_sized(node, sizeof(pm_constant_path_write_node_t));
478 break;
479 }
480#line 114 "prism/templates/src/node.c.erb"
481 case PM_CONSTANT_READ_NODE: {
482 xfree_sized(node, sizeof(pm_constant_read_node_t));
483 break;
484 }
485#line 114 "prism/templates/src/node.c.erb"
486 case PM_CONSTANT_TARGET_NODE: {
487 xfree_sized(node, sizeof(pm_constant_target_node_t));
488 break;
489 }
490#line 114 "prism/templates/src/node.c.erb"
491 case PM_CONSTANT_WRITE_NODE: {
493 pm_node_destroy(parser, (pm_node_t *)cast->value);
494 xfree_sized(node, sizeof(pm_constant_write_node_t));
495 break;
496 }
497#line 114 "prism/templates/src/node.c.erb"
498 case PM_DEF_NODE: {
499 pm_def_node_t *cast = (pm_def_node_t *) node;
500 if (cast->receiver != NULL) {
501 pm_node_destroy(parser, (pm_node_t *)cast->receiver);
502 }
503 if (cast->parameters != NULL) {
504 pm_node_destroy(parser, (pm_node_t *)cast->parameters);
505 }
506 if (cast->body != NULL) {
507 pm_node_destroy(parser, (pm_node_t *)cast->body);
508 }
509 pm_constant_id_list_free(&cast->locals);
510 xfree_sized(node, sizeof(pm_def_node_t));
511 break;
512 }
513#line 114 "prism/templates/src/node.c.erb"
514 case PM_DEFINED_NODE: {
515 pm_defined_node_t *cast = (pm_defined_node_t *) node;
516 pm_node_destroy(parser, (pm_node_t *)cast->value);
517 xfree_sized(node, sizeof(pm_defined_node_t));
518 break;
519 }
520#line 114 "prism/templates/src/node.c.erb"
521 case PM_ELSE_NODE: {
522 pm_else_node_t *cast = (pm_else_node_t *) node;
523 if (cast->statements != NULL) {
524 pm_node_destroy(parser, (pm_node_t *)cast->statements);
525 }
526 xfree_sized(node, sizeof(pm_else_node_t));
527 break;
528 }
529#line 114 "prism/templates/src/node.c.erb"
530 case PM_EMBEDDED_STATEMENTS_NODE: {
532 if (cast->statements != NULL) {
533 pm_node_destroy(parser, (pm_node_t *)cast->statements);
534 }
535 xfree_sized(node, sizeof(pm_embedded_statements_node_t));
536 break;
537 }
538#line 114 "prism/templates/src/node.c.erb"
539 case PM_EMBEDDED_VARIABLE_NODE: {
541 pm_node_destroy(parser, (pm_node_t *)cast->variable);
542 xfree_sized(node, sizeof(pm_embedded_variable_node_t));
543 break;
544 }
545#line 114 "prism/templates/src/node.c.erb"
546 case PM_ENSURE_NODE: {
547 pm_ensure_node_t *cast = (pm_ensure_node_t *) node;
548 if (cast->statements != NULL) {
549 pm_node_destroy(parser, (pm_node_t *)cast->statements);
550 }
551 xfree_sized(node, sizeof(pm_ensure_node_t));
552 break;
553 }
554#line 114 "prism/templates/src/node.c.erb"
555 case PM_FALSE_NODE: {
556 xfree_sized(node, sizeof(pm_false_node_t));
557 break;
558 }
559#line 114 "prism/templates/src/node.c.erb"
560 case PM_FIND_PATTERN_NODE: {
562 if (cast->constant != NULL) {
563 pm_node_destroy(parser, (pm_node_t *)cast->constant);
564 }
565 pm_node_destroy(parser, (pm_node_t *)cast->left);
566 pm_node_list_destroy(parser, &cast->requireds);
567 pm_node_destroy(parser, (pm_node_t *)cast->right);
568 xfree_sized(node, sizeof(pm_find_pattern_node_t));
569 break;
570 }
571#line 114 "prism/templates/src/node.c.erb"
572 case PM_FLIP_FLOP_NODE: {
574 if (cast->left != NULL) {
575 pm_node_destroy(parser, (pm_node_t *)cast->left);
576 }
577 if (cast->right != NULL) {
578 pm_node_destroy(parser, (pm_node_t *)cast->right);
579 }
580 xfree_sized(node, sizeof(pm_flip_flop_node_t));
581 break;
582 }
583#line 114 "prism/templates/src/node.c.erb"
584 case PM_FLOAT_NODE: {
585 xfree_sized(node, sizeof(pm_float_node_t));
586 break;
587 }
588#line 114 "prism/templates/src/node.c.erb"
589 case PM_FOR_NODE: {
590 pm_for_node_t *cast = (pm_for_node_t *) node;
591 pm_node_destroy(parser, (pm_node_t *)cast->index);
592 pm_node_destroy(parser, (pm_node_t *)cast->collection);
593 if (cast->statements != NULL) {
594 pm_node_destroy(parser, (pm_node_t *)cast->statements);
595 }
596 xfree_sized(node, sizeof(pm_for_node_t));
597 break;
598 }
599#line 114 "prism/templates/src/node.c.erb"
600 case PM_FORWARDING_ARGUMENTS_NODE: {
601 xfree_sized(node, sizeof(pm_forwarding_arguments_node_t));
602 break;
603 }
604#line 114 "prism/templates/src/node.c.erb"
605 case PM_FORWARDING_PARAMETER_NODE: {
606 xfree_sized(node, sizeof(pm_forwarding_parameter_node_t));
607 break;
608 }
609#line 114 "prism/templates/src/node.c.erb"
610 case PM_FORWARDING_SUPER_NODE: {
612 if (cast->block != NULL) {
613 pm_node_destroy(parser, (pm_node_t *)cast->block);
614 }
615 xfree_sized(node, sizeof(pm_forwarding_super_node_t));
616 break;
617 }
618#line 114 "prism/templates/src/node.c.erb"
619 case PM_GLOBAL_VARIABLE_AND_WRITE_NODE: {
621 pm_node_destroy(parser, (pm_node_t *)cast->value);
622 xfree_sized(node, sizeof(pm_global_variable_and_write_node_t));
623 break;
624 }
625#line 114 "prism/templates/src/node.c.erb"
626 case PM_GLOBAL_VARIABLE_OPERATOR_WRITE_NODE: {
628 pm_node_destroy(parser, (pm_node_t *)cast->value);
629 xfree_sized(node, sizeof(pm_global_variable_operator_write_node_t));
630 break;
631 }
632#line 114 "prism/templates/src/node.c.erb"
633 case PM_GLOBAL_VARIABLE_OR_WRITE_NODE: {
635 pm_node_destroy(parser, (pm_node_t *)cast->value);
636 xfree_sized(node, sizeof(pm_global_variable_or_write_node_t));
637 break;
638 }
639#line 114 "prism/templates/src/node.c.erb"
640 case PM_GLOBAL_VARIABLE_READ_NODE: {
641 xfree_sized(node, sizeof(pm_global_variable_read_node_t));
642 break;
643 }
644#line 114 "prism/templates/src/node.c.erb"
645 case PM_GLOBAL_VARIABLE_TARGET_NODE: {
646 xfree_sized(node, sizeof(pm_global_variable_target_node_t));
647 break;
648 }
649#line 114 "prism/templates/src/node.c.erb"
650 case PM_GLOBAL_VARIABLE_WRITE_NODE: {
652 pm_node_destroy(parser, (pm_node_t *)cast->value);
653 xfree_sized(node, sizeof(pm_global_variable_write_node_t));
654 break;
655 }
656#line 114 "prism/templates/src/node.c.erb"
657 case PM_HASH_NODE: {
658 pm_hash_node_t *cast = (pm_hash_node_t *) node;
659 pm_node_list_destroy(parser, &cast->elements);
660 xfree_sized(node, sizeof(pm_hash_node_t));
661 break;
662 }
663#line 114 "prism/templates/src/node.c.erb"
664 case PM_HASH_PATTERN_NODE: {
666 if (cast->constant != NULL) {
667 pm_node_destroy(parser, (pm_node_t *)cast->constant);
668 }
669 pm_node_list_destroy(parser, &cast->elements);
670 if (cast->rest != NULL) {
671 pm_node_destroy(parser, (pm_node_t *)cast->rest);
672 }
673 xfree_sized(node, sizeof(pm_hash_pattern_node_t));
674 break;
675 }
676#line 114 "prism/templates/src/node.c.erb"
677 case PM_IF_NODE: {
678 pm_if_node_t *cast = (pm_if_node_t *) node;
679 pm_node_destroy(parser, (pm_node_t *)cast->predicate);
680 if (cast->statements != NULL) {
681 pm_node_destroy(parser, (pm_node_t *)cast->statements);
682 }
683 if (cast->subsequent != NULL) {
684 pm_node_destroy(parser, (pm_node_t *)cast->subsequent);
685 }
686 xfree_sized(node, sizeof(pm_if_node_t));
687 break;
688 }
689#line 114 "prism/templates/src/node.c.erb"
690 case PM_IMAGINARY_NODE: {
692 pm_node_destroy(parser, (pm_node_t *)cast->numeric);
693 xfree_sized(node, sizeof(pm_imaginary_node_t));
694 break;
695 }
696#line 114 "prism/templates/src/node.c.erb"
697 case PM_IMPLICIT_NODE: {
698 pm_implicit_node_t *cast = (pm_implicit_node_t *) node;
699 pm_node_destroy(parser, (pm_node_t *)cast->value);
700 xfree_sized(node, sizeof(pm_implicit_node_t));
701 break;
702 }
703#line 114 "prism/templates/src/node.c.erb"
704 case PM_IMPLICIT_REST_NODE: {
705 xfree_sized(node, sizeof(pm_implicit_rest_node_t));
706 break;
707 }
708#line 114 "prism/templates/src/node.c.erb"
709 case PM_IN_NODE: {
710 pm_in_node_t *cast = (pm_in_node_t *) node;
711 pm_node_destroy(parser, (pm_node_t *)cast->pattern);
712 if (cast->statements != NULL) {
713 pm_node_destroy(parser, (pm_node_t *)cast->statements);
714 }
715 xfree_sized(node, sizeof(pm_in_node_t));
716 break;
717 }
718#line 114 "prism/templates/src/node.c.erb"
719 case PM_INDEX_AND_WRITE_NODE: {
721 if (cast->receiver != NULL) {
722 pm_node_destroy(parser, (pm_node_t *)cast->receiver);
723 }
724 if (cast->arguments != NULL) {
725 pm_node_destroy(parser, (pm_node_t *)cast->arguments);
726 }
727 if (cast->block != NULL) {
728 pm_node_destroy(parser, (pm_node_t *)cast->block);
729 }
730 pm_node_destroy(parser, (pm_node_t *)cast->value);
731 xfree_sized(node, sizeof(pm_index_and_write_node_t));
732 break;
733 }
734#line 114 "prism/templates/src/node.c.erb"
735 case PM_INDEX_OPERATOR_WRITE_NODE: {
737 if (cast->receiver != NULL) {
738 pm_node_destroy(parser, (pm_node_t *)cast->receiver);
739 }
740 if (cast->arguments != NULL) {
741 pm_node_destroy(parser, (pm_node_t *)cast->arguments);
742 }
743 if (cast->block != NULL) {
744 pm_node_destroy(parser, (pm_node_t *)cast->block);
745 }
746 pm_node_destroy(parser, (pm_node_t *)cast->value);
747 xfree_sized(node, sizeof(pm_index_operator_write_node_t));
748 break;
749 }
750#line 114 "prism/templates/src/node.c.erb"
751 case PM_INDEX_OR_WRITE_NODE: {
753 if (cast->receiver != NULL) {
754 pm_node_destroy(parser, (pm_node_t *)cast->receiver);
755 }
756 if (cast->arguments != NULL) {
757 pm_node_destroy(parser, (pm_node_t *)cast->arguments);
758 }
759 if (cast->block != NULL) {
760 pm_node_destroy(parser, (pm_node_t *)cast->block);
761 }
762 pm_node_destroy(parser, (pm_node_t *)cast->value);
763 xfree_sized(node, sizeof(pm_index_or_write_node_t));
764 break;
765 }
766#line 114 "prism/templates/src/node.c.erb"
767 case PM_INDEX_TARGET_NODE: {
769 pm_node_destroy(parser, (pm_node_t *)cast->receiver);
770 if (cast->arguments != NULL) {
771 pm_node_destroy(parser, (pm_node_t *)cast->arguments);
772 }
773 if (cast->block != NULL) {
774 pm_node_destroy(parser, (pm_node_t *)cast->block);
775 }
776 xfree_sized(node, sizeof(pm_index_target_node_t));
777 break;
778 }
779#line 114 "prism/templates/src/node.c.erb"
780 case PM_INSTANCE_VARIABLE_AND_WRITE_NODE: {
782 pm_node_destroy(parser, (pm_node_t *)cast->value);
783 xfree_sized(node, sizeof(pm_instance_variable_and_write_node_t));
784 break;
785 }
786#line 114 "prism/templates/src/node.c.erb"
787 case PM_INSTANCE_VARIABLE_OPERATOR_WRITE_NODE: {
789 pm_node_destroy(parser, (pm_node_t *)cast->value);
790 xfree_sized(node, sizeof(pm_instance_variable_operator_write_node_t));
791 break;
792 }
793#line 114 "prism/templates/src/node.c.erb"
794 case PM_INSTANCE_VARIABLE_OR_WRITE_NODE: {
796 pm_node_destroy(parser, (pm_node_t *)cast->value);
797 xfree_sized(node, sizeof(pm_instance_variable_or_write_node_t));
798 break;
799 }
800#line 114 "prism/templates/src/node.c.erb"
801 case PM_INSTANCE_VARIABLE_READ_NODE: {
802 xfree_sized(node, sizeof(pm_instance_variable_read_node_t));
803 break;
804 }
805#line 114 "prism/templates/src/node.c.erb"
806 case PM_INSTANCE_VARIABLE_TARGET_NODE: {
807 xfree_sized(node, sizeof(pm_instance_variable_target_node_t));
808 break;
809 }
810#line 114 "prism/templates/src/node.c.erb"
811 case PM_INSTANCE_VARIABLE_WRITE_NODE: {
813 pm_node_destroy(parser, (pm_node_t *)cast->value);
814 xfree_sized(node, sizeof(pm_instance_variable_write_node_t));
815 break;
816 }
817#line 114 "prism/templates/src/node.c.erb"
818 case PM_INTEGER_NODE: {
819 pm_integer_node_t *cast = (pm_integer_node_t *) node;
820 pm_integer_free(&cast->value);
821 xfree_sized(node, sizeof(pm_integer_node_t));
822 break;
823 }
824#line 114 "prism/templates/src/node.c.erb"
825 case PM_INTERPOLATED_MATCH_LAST_LINE_NODE: {
827 pm_node_list_destroy(parser, &cast->parts);
828 xfree_sized(node, sizeof(pm_interpolated_match_last_line_node_t));
829 break;
830 }
831#line 114 "prism/templates/src/node.c.erb"
832 case PM_INTERPOLATED_REGULAR_EXPRESSION_NODE: {
834 pm_node_list_destroy(parser, &cast->parts);
835 xfree_sized(node, sizeof(pm_interpolated_regular_expression_node_t));
836 break;
837 }
838#line 114 "prism/templates/src/node.c.erb"
839 case PM_INTERPOLATED_STRING_NODE: {
841 pm_node_list_destroy(parser, &cast->parts);
842 xfree_sized(node, sizeof(pm_interpolated_string_node_t));
843 break;
844 }
845#line 114 "prism/templates/src/node.c.erb"
846 case PM_INTERPOLATED_SYMBOL_NODE: {
848 pm_node_list_destroy(parser, &cast->parts);
849 xfree_sized(node, sizeof(pm_interpolated_symbol_node_t));
850 break;
851 }
852#line 114 "prism/templates/src/node.c.erb"
853 case PM_INTERPOLATED_X_STRING_NODE: {
855 pm_node_list_destroy(parser, &cast->parts);
856 xfree_sized(node, sizeof(pm_interpolated_x_string_node_t));
857 break;
858 }
859#line 114 "prism/templates/src/node.c.erb"
860 case PM_IT_LOCAL_VARIABLE_READ_NODE: {
861 xfree_sized(node, sizeof(pm_it_local_variable_read_node_t));
862 break;
863 }
864#line 114 "prism/templates/src/node.c.erb"
865 case PM_IT_PARAMETERS_NODE: {
866 xfree_sized(node, sizeof(pm_it_parameters_node_t));
867 break;
868 }
869#line 114 "prism/templates/src/node.c.erb"
870 case PM_KEYWORD_HASH_NODE: {
872 pm_node_list_destroy(parser, &cast->elements);
873 xfree_sized(node, sizeof(pm_keyword_hash_node_t));
874 break;
875 }
876#line 114 "prism/templates/src/node.c.erb"
877 case PM_KEYWORD_REST_PARAMETER_NODE: {
878 xfree_sized(node, sizeof(pm_keyword_rest_parameter_node_t));
879 break;
880 }
881#line 114 "prism/templates/src/node.c.erb"
882 case PM_LAMBDA_NODE: {
883 pm_lambda_node_t *cast = (pm_lambda_node_t *) node;
884 pm_constant_id_list_free(&cast->locals);
885 if (cast->parameters != NULL) {
886 pm_node_destroy(parser, (pm_node_t *)cast->parameters);
887 }
888 if (cast->body != NULL) {
889 pm_node_destroy(parser, (pm_node_t *)cast->body);
890 }
891 xfree_sized(node, sizeof(pm_lambda_node_t));
892 break;
893 }
894#line 114 "prism/templates/src/node.c.erb"
895 case PM_LOCAL_VARIABLE_AND_WRITE_NODE: {
897 pm_node_destroy(parser, (pm_node_t *)cast->value);
898 xfree_sized(node, sizeof(pm_local_variable_and_write_node_t));
899 break;
900 }
901#line 114 "prism/templates/src/node.c.erb"
902 case PM_LOCAL_VARIABLE_OPERATOR_WRITE_NODE: {
904 pm_node_destroy(parser, (pm_node_t *)cast->value);
905 xfree_sized(node, sizeof(pm_local_variable_operator_write_node_t));
906 break;
907 }
908#line 114 "prism/templates/src/node.c.erb"
909 case PM_LOCAL_VARIABLE_OR_WRITE_NODE: {
911 pm_node_destroy(parser, (pm_node_t *)cast->value);
912 xfree_sized(node, sizeof(pm_local_variable_or_write_node_t));
913 break;
914 }
915#line 114 "prism/templates/src/node.c.erb"
916 case PM_LOCAL_VARIABLE_READ_NODE: {
917 xfree_sized(node, sizeof(pm_local_variable_read_node_t));
918 break;
919 }
920#line 114 "prism/templates/src/node.c.erb"
921 case PM_LOCAL_VARIABLE_TARGET_NODE: {
922 xfree_sized(node, sizeof(pm_local_variable_target_node_t));
923 break;
924 }
925#line 114 "prism/templates/src/node.c.erb"
926 case PM_LOCAL_VARIABLE_WRITE_NODE: {
928 pm_node_destroy(parser, (pm_node_t *)cast->value);
929 xfree_sized(node, sizeof(pm_local_variable_write_node_t));
930 break;
931 }
932#line 114 "prism/templates/src/node.c.erb"
933 case PM_MATCH_LAST_LINE_NODE: {
936 xfree_sized(node, sizeof(pm_match_last_line_node_t));
937 break;
938 }
939#line 114 "prism/templates/src/node.c.erb"
940 case PM_MATCH_PREDICATE_NODE: {
942 pm_node_destroy(parser, (pm_node_t *)cast->value);
943 pm_node_destroy(parser, (pm_node_t *)cast->pattern);
944 xfree_sized(node, sizeof(pm_match_predicate_node_t));
945 break;
946 }
947#line 114 "prism/templates/src/node.c.erb"
948 case PM_MATCH_REQUIRED_NODE: {
950 pm_node_destroy(parser, (pm_node_t *)cast->value);
951 pm_node_destroy(parser, (pm_node_t *)cast->pattern);
952 xfree_sized(node, sizeof(pm_match_required_node_t));
953 break;
954 }
955#line 114 "prism/templates/src/node.c.erb"
956 case PM_MATCH_WRITE_NODE: {
958 pm_node_destroy(parser, (pm_node_t *)cast->call);
959 pm_node_list_destroy(parser, &cast->targets);
960 xfree_sized(node, sizeof(pm_match_write_node_t));
961 break;
962 }
963#line 114 "prism/templates/src/node.c.erb"
964 case PM_MISSING_NODE: {
965 xfree_sized(node, sizeof(pm_missing_node_t));
966 break;
967 }
968#line 114 "prism/templates/src/node.c.erb"
969 case PM_MODULE_NODE: {
970 pm_module_node_t *cast = (pm_module_node_t *) node;
971 pm_constant_id_list_free(&cast->locals);
972 pm_node_destroy(parser, (pm_node_t *)cast->constant_path);
973 if (cast->body != NULL) {
974 pm_node_destroy(parser, (pm_node_t *)cast->body);
975 }
976 xfree_sized(node, sizeof(pm_module_node_t));
977 break;
978 }
979#line 114 "prism/templates/src/node.c.erb"
980 case PM_MULTI_TARGET_NODE: {
982 pm_node_list_destroy(parser, &cast->lefts);
983 if (cast->rest != NULL) {
984 pm_node_destroy(parser, (pm_node_t *)cast->rest);
985 }
986 pm_node_list_destroy(parser, &cast->rights);
987 xfree_sized(node, sizeof(pm_multi_target_node_t));
988 break;
989 }
990#line 114 "prism/templates/src/node.c.erb"
991 case PM_MULTI_WRITE_NODE: {
993 pm_node_list_destroy(parser, &cast->lefts);
994 if (cast->rest != NULL) {
995 pm_node_destroy(parser, (pm_node_t *)cast->rest);
996 }
997 pm_node_list_destroy(parser, &cast->rights);
998 pm_node_destroy(parser, (pm_node_t *)cast->value);
999 xfree_sized(node, sizeof(pm_multi_write_node_t));
1000 break;
1001 }
1002#line 114 "prism/templates/src/node.c.erb"
1003 case PM_NEXT_NODE: {
1004 pm_next_node_t *cast = (pm_next_node_t *) node;
1005 if (cast->arguments != NULL) {
1006 pm_node_destroy(parser, (pm_node_t *)cast->arguments);
1007 }
1008 xfree_sized(node, sizeof(pm_next_node_t));
1009 break;
1010 }
1011#line 114 "prism/templates/src/node.c.erb"
1012 case PM_NIL_NODE: {
1013 xfree_sized(node, sizeof(pm_nil_node_t));
1014 break;
1015 }
1016#line 114 "prism/templates/src/node.c.erb"
1017 case PM_NO_BLOCK_PARAMETER_NODE: {
1018 xfree_sized(node, sizeof(pm_no_block_parameter_node_t));
1019 break;
1020 }
1021#line 114 "prism/templates/src/node.c.erb"
1022 case PM_NO_KEYWORDS_PARAMETER_NODE: {
1023 xfree_sized(node, sizeof(pm_no_keywords_parameter_node_t));
1024 break;
1025 }
1026#line 114 "prism/templates/src/node.c.erb"
1027 case PM_NUMBERED_PARAMETERS_NODE: {
1028 xfree_sized(node, sizeof(pm_numbered_parameters_node_t));
1029 break;
1030 }
1031#line 114 "prism/templates/src/node.c.erb"
1032 case PM_NUMBERED_REFERENCE_READ_NODE: {
1033 xfree_sized(node, sizeof(pm_numbered_reference_read_node_t));
1034 break;
1035 }
1036#line 114 "prism/templates/src/node.c.erb"
1037 case PM_OPTIONAL_KEYWORD_PARAMETER_NODE: {
1039 pm_node_destroy(parser, (pm_node_t *)cast->value);
1040 xfree_sized(node, sizeof(pm_optional_keyword_parameter_node_t));
1041 break;
1042 }
1043#line 114 "prism/templates/src/node.c.erb"
1044 case PM_OPTIONAL_PARAMETER_NODE: {
1046 pm_node_destroy(parser, (pm_node_t *)cast->value);
1047 xfree_sized(node, sizeof(pm_optional_parameter_node_t));
1048 break;
1049 }
1050#line 114 "prism/templates/src/node.c.erb"
1051 case PM_OR_NODE: {
1052 pm_or_node_t *cast = (pm_or_node_t *) node;
1053 pm_node_destroy(parser, (pm_node_t *)cast->left);
1054 pm_node_destroy(parser, (pm_node_t *)cast->right);
1055 xfree_sized(node, sizeof(pm_or_node_t));
1056 break;
1057 }
1058#line 114 "prism/templates/src/node.c.erb"
1059 case PM_PARAMETERS_NODE: {
1061 pm_node_list_destroy(parser, &cast->requireds);
1062 pm_node_list_destroy(parser, &cast->optionals);
1063 if (cast->rest != NULL) {
1064 pm_node_destroy(parser, (pm_node_t *)cast->rest);
1065 }
1066 pm_node_list_destroy(parser, &cast->posts);
1067 pm_node_list_destroy(parser, &cast->keywords);
1068 if (cast->keyword_rest != NULL) {
1069 pm_node_destroy(parser, (pm_node_t *)cast->keyword_rest);
1070 }
1071 if (cast->block != NULL) {
1072 pm_node_destroy(parser, (pm_node_t *)cast->block);
1073 }
1074 xfree_sized(node, sizeof(pm_parameters_node_t));
1075 break;
1076 }
1077#line 114 "prism/templates/src/node.c.erb"
1078 case PM_PARENTHESES_NODE: {
1080 if (cast->body != NULL) {
1081 pm_node_destroy(parser, (pm_node_t *)cast->body);
1082 }
1083 xfree_sized(node, sizeof(pm_parentheses_node_t));
1084 break;
1085 }
1086#line 114 "prism/templates/src/node.c.erb"
1087 case PM_PINNED_EXPRESSION_NODE: {
1089 pm_node_destroy(parser, (pm_node_t *)cast->expression);
1090 xfree_sized(node, sizeof(pm_pinned_expression_node_t));
1091 break;
1092 }
1093#line 114 "prism/templates/src/node.c.erb"
1094 case PM_PINNED_VARIABLE_NODE: {
1096 pm_node_destroy(parser, (pm_node_t *)cast->variable);
1097 xfree_sized(node, sizeof(pm_pinned_variable_node_t));
1098 break;
1099 }
1100#line 114 "prism/templates/src/node.c.erb"
1101 case PM_POST_EXECUTION_NODE: {
1103 if (cast->statements != NULL) {
1104 pm_node_destroy(parser, (pm_node_t *)cast->statements);
1105 }
1106 xfree_sized(node, sizeof(pm_post_execution_node_t));
1107 break;
1108 }
1109#line 114 "prism/templates/src/node.c.erb"
1110 case PM_PRE_EXECUTION_NODE: {
1112 if (cast->statements != NULL) {
1113 pm_node_destroy(parser, (pm_node_t *)cast->statements);
1114 }
1115 xfree_sized(node, sizeof(pm_pre_execution_node_t));
1116 break;
1117 }
1118#line 114 "prism/templates/src/node.c.erb"
1119 case PM_PROGRAM_NODE: {
1120 pm_program_node_t *cast = (pm_program_node_t *) node;
1121 pm_constant_id_list_free(&cast->locals);
1122 pm_node_destroy(parser, (pm_node_t *)cast->statements);
1123 xfree_sized(node, sizeof(pm_program_node_t));
1124 break;
1125 }
1126#line 114 "prism/templates/src/node.c.erb"
1127 case PM_RANGE_NODE: {
1128 pm_range_node_t *cast = (pm_range_node_t *) node;
1129 if (cast->left != NULL) {
1130 pm_node_destroy(parser, (pm_node_t *)cast->left);
1131 }
1132 if (cast->right != NULL) {
1133 pm_node_destroy(parser, (pm_node_t *)cast->right);
1134 }
1135 xfree_sized(node, sizeof(pm_range_node_t));
1136 break;
1137 }
1138#line 114 "prism/templates/src/node.c.erb"
1139 case PM_RATIONAL_NODE: {
1140 pm_rational_node_t *cast = (pm_rational_node_t *) node;
1141 pm_integer_free(&cast->numerator);
1143 xfree_sized(node, sizeof(pm_rational_node_t));
1144 break;
1145 }
1146#line 114 "prism/templates/src/node.c.erb"
1147 case PM_REDO_NODE: {
1148 xfree_sized(node, sizeof(pm_redo_node_t));
1149 break;
1150 }
1151#line 114 "prism/templates/src/node.c.erb"
1152 case PM_REGULAR_EXPRESSION_NODE: {
1154 pm_string_free(&cast->unescaped);
1155 xfree_sized(node, sizeof(pm_regular_expression_node_t));
1156 break;
1157 }
1158#line 114 "prism/templates/src/node.c.erb"
1159 case PM_REQUIRED_KEYWORD_PARAMETER_NODE: {
1160 xfree_sized(node, sizeof(pm_required_keyword_parameter_node_t));
1161 break;
1162 }
1163#line 114 "prism/templates/src/node.c.erb"
1164 case PM_REQUIRED_PARAMETER_NODE: {
1165 xfree_sized(node, sizeof(pm_required_parameter_node_t));
1166 break;
1167 }
1168#line 114 "prism/templates/src/node.c.erb"
1169 case PM_RESCUE_MODIFIER_NODE: {
1171 pm_node_destroy(parser, (pm_node_t *)cast->expression);
1172 pm_node_destroy(parser, (pm_node_t *)cast->rescue_expression);
1173 xfree_sized(node, sizeof(pm_rescue_modifier_node_t));
1174 break;
1175 }
1176#line 114 "prism/templates/src/node.c.erb"
1177 case PM_RESCUE_NODE: {
1178 pm_rescue_node_t *cast = (pm_rescue_node_t *) node;
1179 pm_node_list_destroy(parser, &cast->exceptions);
1180 if (cast->reference != NULL) {
1181 pm_node_destroy(parser, (pm_node_t *)cast->reference);
1182 }
1183 if (cast->statements != NULL) {
1184 pm_node_destroy(parser, (pm_node_t *)cast->statements);
1185 }
1186 if (cast->subsequent != NULL) {
1187 pm_node_destroy(parser, (pm_node_t *)cast->subsequent);
1188 }
1189 xfree_sized(node, sizeof(pm_rescue_node_t));
1190 break;
1191 }
1192#line 114 "prism/templates/src/node.c.erb"
1193 case PM_REST_PARAMETER_NODE: {
1194 xfree_sized(node, sizeof(pm_rest_parameter_node_t));
1195 break;
1196 }
1197#line 114 "prism/templates/src/node.c.erb"
1198 case PM_RETRY_NODE: {
1199 xfree_sized(node, sizeof(pm_retry_node_t));
1200 break;
1201 }
1202#line 114 "prism/templates/src/node.c.erb"
1203 case PM_RETURN_NODE: {
1204 pm_return_node_t *cast = (pm_return_node_t *) node;
1205 if (cast->arguments != NULL) {
1206 pm_node_destroy(parser, (pm_node_t *)cast->arguments);
1207 }
1208 xfree_sized(node, sizeof(pm_return_node_t));
1209 break;
1210 }
1211#line 114 "prism/templates/src/node.c.erb"
1212 case PM_SELF_NODE: {
1213 xfree_sized(node, sizeof(pm_self_node_t));
1214 break;
1215 }
1216#line 114 "prism/templates/src/node.c.erb"
1217 case PM_SHAREABLE_CONSTANT_NODE: {
1219 pm_node_destroy(parser, (pm_node_t *)cast->write);
1220 xfree_sized(node, sizeof(pm_shareable_constant_node_t));
1221 break;
1222 }
1223#line 114 "prism/templates/src/node.c.erb"
1224 case PM_SINGLETON_CLASS_NODE: {
1226 pm_constant_id_list_free(&cast->locals);
1227 pm_node_destroy(parser, (pm_node_t *)cast->expression);
1228 if (cast->body != NULL) {
1229 pm_node_destroy(parser, (pm_node_t *)cast->body);
1230 }
1231 xfree_sized(node, sizeof(pm_singleton_class_node_t));
1232 break;
1233 }
1234#line 114 "prism/templates/src/node.c.erb"
1235 case PM_SOURCE_ENCODING_NODE: {
1236 xfree_sized(node, sizeof(pm_source_encoding_node_t));
1237 break;
1238 }
1239#line 114 "prism/templates/src/node.c.erb"
1240 case PM_SOURCE_FILE_NODE: {
1242 pm_string_free(&cast->filepath);
1243 xfree_sized(node, sizeof(pm_source_file_node_t));
1244 break;
1245 }
1246#line 114 "prism/templates/src/node.c.erb"
1247 case PM_SOURCE_LINE_NODE: {
1248 xfree_sized(node, sizeof(pm_source_line_node_t));
1249 break;
1250 }
1251#line 114 "prism/templates/src/node.c.erb"
1252 case PM_SPLAT_NODE: {
1253 pm_splat_node_t *cast = (pm_splat_node_t *) node;
1254 if (cast->expression != NULL) {
1255 pm_node_destroy(parser, (pm_node_t *)cast->expression);
1256 }
1257 xfree_sized(node, sizeof(pm_splat_node_t));
1258 break;
1259 }
1260#line 114 "prism/templates/src/node.c.erb"
1261 case PM_STATEMENTS_NODE: {
1263 pm_node_list_destroy(parser, &cast->body);
1264 xfree_sized(node, sizeof(pm_statements_node_t));
1265 break;
1266 }
1267#line 114 "prism/templates/src/node.c.erb"
1268 case PM_STRING_NODE: {
1269 pm_string_node_t *cast = (pm_string_node_t *) node;
1270 pm_string_free(&cast->unescaped);
1271 xfree_sized(node, sizeof(pm_string_node_t));
1272 break;
1273 }
1274#line 114 "prism/templates/src/node.c.erb"
1275 case PM_SUPER_NODE: {
1276 pm_super_node_t *cast = (pm_super_node_t *) node;
1277 if (cast->arguments != NULL) {
1278 pm_node_destroy(parser, (pm_node_t *)cast->arguments);
1279 }
1280 if (cast->block != NULL) {
1281 pm_node_destroy(parser, (pm_node_t *)cast->block);
1282 }
1283 xfree_sized(node, sizeof(pm_super_node_t));
1284 break;
1285 }
1286#line 114 "prism/templates/src/node.c.erb"
1287 case PM_SYMBOL_NODE: {
1288 pm_symbol_node_t *cast = (pm_symbol_node_t *) node;
1289 pm_string_free(&cast->unescaped);
1290 xfree_sized(node, sizeof(pm_symbol_node_t));
1291 break;
1292 }
1293#line 114 "prism/templates/src/node.c.erb"
1294 case PM_TRUE_NODE: {
1295 xfree_sized(node, sizeof(pm_true_node_t));
1296 break;
1297 }
1298#line 114 "prism/templates/src/node.c.erb"
1299 case PM_UNDEF_NODE: {
1300 pm_undef_node_t *cast = (pm_undef_node_t *) node;
1301 pm_node_list_destroy(parser, &cast->names);
1302 xfree_sized(node, sizeof(pm_undef_node_t));
1303 break;
1304 }
1305#line 114 "prism/templates/src/node.c.erb"
1306 case PM_UNLESS_NODE: {
1307 pm_unless_node_t *cast = (pm_unless_node_t *) node;
1308 pm_node_destroy(parser, (pm_node_t *)cast->predicate);
1309 if (cast->statements != NULL) {
1310 pm_node_destroy(parser, (pm_node_t *)cast->statements);
1311 }
1312 if (cast->else_clause != NULL) {
1313 pm_node_destroy(parser, (pm_node_t *)cast->else_clause);
1314 }
1315 xfree_sized(node, sizeof(pm_unless_node_t));
1316 break;
1317 }
1318#line 114 "prism/templates/src/node.c.erb"
1319 case PM_UNTIL_NODE: {
1320 pm_until_node_t *cast = (pm_until_node_t *) node;
1321 pm_node_destroy(parser, (pm_node_t *)cast->predicate);
1322 if (cast->statements != NULL) {
1323 pm_node_destroy(parser, (pm_node_t *)cast->statements);
1324 }
1325 xfree_sized(node, sizeof(pm_until_node_t));
1326 break;
1327 }
1328#line 114 "prism/templates/src/node.c.erb"
1329 case PM_WHEN_NODE: {
1330 pm_when_node_t *cast = (pm_when_node_t *) node;
1331 pm_node_list_destroy(parser, &cast->conditions);
1332 if (cast->statements != NULL) {
1333 pm_node_destroy(parser, (pm_node_t *)cast->statements);
1334 }
1335 xfree_sized(node, sizeof(pm_when_node_t));
1336 break;
1337 }
1338#line 114 "prism/templates/src/node.c.erb"
1339 case PM_WHILE_NODE: {
1340 pm_while_node_t *cast = (pm_while_node_t *) node;
1341 pm_node_destroy(parser, (pm_node_t *)cast->predicate);
1342 if (cast->statements != NULL) {
1343 pm_node_destroy(parser, (pm_node_t *)cast->statements);
1344 }
1345 xfree_sized(node, sizeof(pm_while_node_t));
1346 break;
1347 }
1348#line 114 "prism/templates/src/node.c.erb"
1349 case PM_X_STRING_NODE: {
1350 pm_x_string_node_t *cast = (pm_x_string_node_t *) node;
1351 pm_string_free(&cast->unescaped);
1352 xfree_sized(node, sizeof(pm_x_string_node_t));
1353 break;
1354 }
1355#line 114 "prism/templates/src/node.c.erb"
1356 case PM_YIELD_NODE: {
1357 pm_yield_node_t *cast = (pm_yield_node_t *) node;
1358 if (cast->arguments != NULL) {
1359 pm_node_destroy(parser, (pm_node_t *)cast->arguments);
1360 }
1361 xfree_sized(node, sizeof(pm_yield_node_t));
1362 break;
1363 }
1364#line 144 "prism/templates/src/node.c.erb"
1365 default:
1366 assert(false && "unreachable");
1367 break;
1368 }
1369}
1370
1374PRISM_EXPORTED_FUNCTION const char *
1375pm_node_type_to_str(pm_node_type_t node_type)
1376{
1377 switch (node_type) {
1378 case PM_ALIAS_GLOBAL_VARIABLE_NODE:
1379 return "PM_ALIAS_GLOBAL_VARIABLE_NODE";
1380 case PM_ALIAS_METHOD_NODE:
1381 return "PM_ALIAS_METHOD_NODE";
1382 case PM_ALTERNATION_PATTERN_NODE:
1383 return "PM_ALTERNATION_PATTERN_NODE";
1384 case PM_AND_NODE:
1385 return "PM_AND_NODE";
1386 case PM_ARGUMENTS_NODE:
1387 return "PM_ARGUMENTS_NODE";
1388 case PM_ARRAY_NODE:
1389 return "PM_ARRAY_NODE";
1390 case PM_ARRAY_PATTERN_NODE:
1391 return "PM_ARRAY_PATTERN_NODE";
1392 case PM_ASSOC_NODE:
1393 return "PM_ASSOC_NODE";
1394 case PM_ASSOC_SPLAT_NODE:
1395 return "PM_ASSOC_SPLAT_NODE";
1396 case PM_BACK_REFERENCE_READ_NODE:
1397 return "PM_BACK_REFERENCE_READ_NODE";
1398 case PM_BEGIN_NODE:
1399 return "PM_BEGIN_NODE";
1400 case PM_BLOCK_ARGUMENT_NODE:
1401 return "PM_BLOCK_ARGUMENT_NODE";
1402 case PM_BLOCK_LOCAL_VARIABLE_NODE:
1403 return "PM_BLOCK_LOCAL_VARIABLE_NODE";
1404 case PM_BLOCK_NODE:
1405 return "PM_BLOCK_NODE";
1406 case PM_BLOCK_PARAMETER_NODE:
1407 return "PM_BLOCK_PARAMETER_NODE";
1408 case PM_BLOCK_PARAMETERS_NODE:
1409 return "PM_BLOCK_PARAMETERS_NODE";
1410 case PM_BREAK_NODE:
1411 return "PM_BREAK_NODE";
1412 case PM_CALL_AND_WRITE_NODE:
1413 return "PM_CALL_AND_WRITE_NODE";
1414 case PM_CALL_NODE:
1415 return "PM_CALL_NODE";
1416 case PM_CALL_OPERATOR_WRITE_NODE:
1417 return "PM_CALL_OPERATOR_WRITE_NODE";
1418 case PM_CALL_OR_WRITE_NODE:
1419 return "PM_CALL_OR_WRITE_NODE";
1420 case PM_CALL_TARGET_NODE:
1421 return "PM_CALL_TARGET_NODE";
1422 case PM_CAPTURE_PATTERN_NODE:
1423 return "PM_CAPTURE_PATTERN_NODE";
1424 case PM_CASE_MATCH_NODE:
1425 return "PM_CASE_MATCH_NODE";
1426 case PM_CASE_NODE:
1427 return "PM_CASE_NODE";
1428 case PM_CLASS_NODE:
1429 return "PM_CLASS_NODE";
1430 case PM_CLASS_VARIABLE_AND_WRITE_NODE:
1431 return "PM_CLASS_VARIABLE_AND_WRITE_NODE";
1432 case PM_CLASS_VARIABLE_OPERATOR_WRITE_NODE:
1433 return "PM_CLASS_VARIABLE_OPERATOR_WRITE_NODE";
1434 case PM_CLASS_VARIABLE_OR_WRITE_NODE:
1435 return "PM_CLASS_VARIABLE_OR_WRITE_NODE";
1436 case PM_CLASS_VARIABLE_READ_NODE:
1437 return "PM_CLASS_VARIABLE_READ_NODE";
1438 case PM_CLASS_VARIABLE_TARGET_NODE:
1439 return "PM_CLASS_VARIABLE_TARGET_NODE";
1440 case PM_CLASS_VARIABLE_WRITE_NODE:
1441 return "PM_CLASS_VARIABLE_WRITE_NODE";
1442 case PM_CONSTANT_AND_WRITE_NODE:
1443 return "PM_CONSTANT_AND_WRITE_NODE";
1444 case PM_CONSTANT_OPERATOR_WRITE_NODE:
1445 return "PM_CONSTANT_OPERATOR_WRITE_NODE";
1446 case PM_CONSTANT_OR_WRITE_NODE:
1447 return "PM_CONSTANT_OR_WRITE_NODE";
1448 case PM_CONSTANT_PATH_AND_WRITE_NODE:
1449 return "PM_CONSTANT_PATH_AND_WRITE_NODE";
1450 case PM_CONSTANT_PATH_NODE:
1451 return "PM_CONSTANT_PATH_NODE";
1452 case PM_CONSTANT_PATH_OPERATOR_WRITE_NODE:
1453 return "PM_CONSTANT_PATH_OPERATOR_WRITE_NODE";
1454 case PM_CONSTANT_PATH_OR_WRITE_NODE:
1455 return "PM_CONSTANT_PATH_OR_WRITE_NODE";
1456 case PM_CONSTANT_PATH_TARGET_NODE:
1457 return "PM_CONSTANT_PATH_TARGET_NODE";
1458 case PM_CONSTANT_PATH_WRITE_NODE:
1459 return "PM_CONSTANT_PATH_WRITE_NODE";
1460 case PM_CONSTANT_READ_NODE:
1461 return "PM_CONSTANT_READ_NODE";
1462 case PM_CONSTANT_TARGET_NODE:
1463 return "PM_CONSTANT_TARGET_NODE";
1464 case PM_CONSTANT_WRITE_NODE:
1465 return "PM_CONSTANT_WRITE_NODE";
1466 case PM_DEF_NODE:
1467 return "PM_DEF_NODE";
1468 case PM_DEFINED_NODE:
1469 return "PM_DEFINED_NODE";
1470 case PM_ELSE_NODE:
1471 return "PM_ELSE_NODE";
1472 case PM_EMBEDDED_STATEMENTS_NODE:
1473 return "PM_EMBEDDED_STATEMENTS_NODE";
1474 case PM_EMBEDDED_VARIABLE_NODE:
1475 return "PM_EMBEDDED_VARIABLE_NODE";
1476 case PM_ENSURE_NODE:
1477 return "PM_ENSURE_NODE";
1478 case PM_FALSE_NODE:
1479 return "PM_FALSE_NODE";
1480 case PM_FIND_PATTERN_NODE:
1481 return "PM_FIND_PATTERN_NODE";
1482 case PM_FLIP_FLOP_NODE:
1483 return "PM_FLIP_FLOP_NODE";
1484 case PM_FLOAT_NODE:
1485 return "PM_FLOAT_NODE";
1486 case PM_FOR_NODE:
1487 return "PM_FOR_NODE";
1488 case PM_FORWARDING_ARGUMENTS_NODE:
1489 return "PM_FORWARDING_ARGUMENTS_NODE";
1490 case PM_FORWARDING_PARAMETER_NODE:
1491 return "PM_FORWARDING_PARAMETER_NODE";
1492 case PM_FORWARDING_SUPER_NODE:
1493 return "PM_FORWARDING_SUPER_NODE";
1494 case PM_GLOBAL_VARIABLE_AND_WRITE_NODE:
1495 return "PM_GLOBAL_VARIABLE_AND_WRITE_NODE";
1496 case PM_GLOBAL_VARIABLE_OPERATOR_WRITE_NODE:
1497 return "PM_GLOBAL_VARIABLE_OPERATOR_WRITE_NODE";
1498 case PM_GLOBAL_VARIABLE_OR_WRITE_NODE:
1499 return "PM_GLOBAL_VARIABLE_OR_WRITE_NODE";
1500 case PM_GLOBAL_VARIABLE_READ_NODE:
1501 return "PM_GLOBAL_VARIABLE_READ_NODE";
1502 case PM_GLOBAL_VARIABLE_TARGET_NODE:
1503 return "PM_GLOBAL_VARIABLE_TARGET_NODE";
1504 case PM_GLOBAL_VARIABLE_WRITE_NODE:
1505 return "PM_GLOBAL_VARIABLE_WRITE_NODE";
1506 case PM_HASH_NODE:
1507 return "PM_HASH_NODE";
1508 case PM_HASH_PATTERN_NODE:
1509 return "PM_HASH_PATTERN_NODE";
1510 case PM_IF_NODE:
1511 return "PM_IF_NODE";
1512 case PM_IMAGINARY_NODE:
1513 return "PM_IMAGINARY_NODE";
1514 case PM_IMPLICIT_NODE:
1515 return "PM_IMPLICIT_NODE";
1516 case PM_IMPLICIT_REST_NODE:
1517 return "PM_IMPLICIT_REST_NODE";
1518 case PM_IN_NODE:
1519 return "PM_IN_NODE";
1520 case PM_INDEX_AND_WRITE_NODE:
1521 return "PM_INDEX_AND_WRITE_NODE";
1522 case PM_INDEX_OPERATOR_WRITE_NODE:
1523 return "PM_INDEX_OPERATOR_WRITE_NODE";
1524 case PM_INDEX_OR_WRITE_NODE:
1525 return "PM_INDEX_OR_WRITE_NODE";
1526 case PM_INDEX_TARGET_NODE:
1527 return "PM_INDEX_TARGET_NODE";
1528 case PM_INSTANCE_VARIABLE_AND_WRITE_NODE:
1529 return "PM_INSTANCE_VARIABLE_AND_WRITE_NODE";
1530 case PM_INSTANCE_VARIABLE_OPERATOR_WRITE_NODE:
1531 return "PM_INSTANCE_VARIABLE_OPERATOR_WRITE_NODE";
1532 case PM_INSTANCE_VARIABLE_OR_WRITE_NODE:
1533 return "PM_INSTANCE_VARIABLE_OR_WRITE_NODE";
1534 case PM_INSTANCE_VARIABLE_READ_NODE:
1535 return "PM_INSTANCE_VARIABLE_READ_NODE";
1536 case PM_INSTANCE_VARIABLE_TARGET_NODE:
1537 return "PM_INSTANCE_VARIABLE_TARGET_NODE";
1538 case PM_INSTANCE_VARIABLE_WRITE_NODE:
1539 return "PM_INSTANCE_VARIABLE_WRITE_NODE";
1540 case PM_INTEGER_NODE:
1541 return "PM_INTEGER_NODE";
1542 case PM_INTERPOLATED_MATCH_LAST_LINE_NODE:
1543 return "PM_INTERPOLATED_MATCH_LAST_LINE_NODE";
1544 case PM_INTERPOLATED_REGULAR_EXPRESSION_NODE:
1545 return "PM_INTERPOLATED_REGULAR_EXPRESSION_NODE";
1546 case PM_INTERPOLATED_STRING_NODE:
1547 return "PM_INTERPOLATED_STRING_NODE";
1548 case PM_INTERPOLATED_SYMBOL_NODE:
1549 return "PM_INTERPOLATED_SYMBOL_NODE";
1550 case PM_INTERPOLATED_X_STRING_NODE:
1551 return "PM_INTERPOLATED_X_STRING_NODE";
1552 case PM_IT_LOCAL_VARIABLE_READ_NODE:
1553 return "PM_IT_LOCAL_VARIABLE_READ_NODE";
1554 case PM_IT_PARAMETERS_NODE:
1555 return "PM_IT_PARAMETERS_NODE";
1556 case PM_KEYWORD_HASH_NODE:
1557 return "PM_KEYWORD_HASH_NODE";
1558 case PM_KEYWORD_REST_PARAMETER_NODE:
1559 return "PM_KEYWORD_REST_PARAMETER_NODE";
1560 case PM_LAMBDA_NODE:
1561 return "PM_LAMBDA_NODE";
1562 case PM_LOCAL_VARIABLE_AND_WRITE_NODE:
1563 return "PM_LOCAL_VARIABLE_AND_WRITE_NODE";
1564 case PM_LOCAL_VARIABLE_OPERATOR_WRITE_NODE:
1565 return "PM_LOCAL_VARIABLE_OPERATOR_WRITE_NODE";
1566 case PM_LOCAL_VARIABLE_OR_WRITE_NODE:
1567 return "PM_LOCAL_VARIABLE_OR_WRITE_NODE";
1568 case PM_LOCAL_VARIABLE_READ_NODE:
1569 return "PM_LOCAL_VARIABLE_READ_NODE";
1570 case PM_LOCAL_VARIABLE_TARGET_NODE:
1571 return "PM_LOCAL_VARIABLE_TARGET_NODE";
1572 case PM_LOCAL_VARIABLE_WRITE_NODE:
1573 return "PM_LOCAL_VARIABLE_WRITE_NODE";
1574 case PM_MATCH_LAST_LINE_NODE:
1575 return "PM_MATCH_LAST_LINE_NODE";
1576 case PM_MATCH_PREDICATE_NODE:
1577 return "PM_MATCH_PREDICATE_NODE";
1578 case PM_MATCH_REQUIRED_NODE:
1579 return "PM_MATCH_REQUIRED_NODE";
1580 case PM_MATCH_WRITE_NODE:
1581 return "PM_MATCH_WRITE_NODE";
1582 case PM_MISSING_NODE:
1583 return "PM_MISSING_NODE";
1584 case PM_MODULE_NODE:
1585 return "PM_MODULE_NODE";
1586 case PM_MULTI_TARGET_NODE:
1587 return "PM_MULTI_TARGET_NODE";
1588 case PM_MULTI_WRITE_NODE:
1589 return "PM_MULTI_WRITE_NODE";
1590 case PM_NEXT_NODE:
1591 return "PM_NEXT_NODE";
1592 case PM_NIL_NODE:
1593 return "PM_NIL_NODE";
1594 case PM_NO_BLOCK_PARAMETER_NODE:
1595 return "PM_NO_BLOCK_PARAMETER_NODE";
1596 case PM_NO_KEYWORDS_PARAMETER_NODE:
1597 return "PM_NO_KEYWORDS_PARAMETER_NODE";
1598 case PM_NUMBERED_PARAMETERS_NODE:
1599 return "PM_NUMBERED_PARAMETERS_NODE";
1600 case PM_NUMBERED_REFERENCE_READ_NODE:
1601 return "PM_NUMBERED_REFERENCE_READ_NODE";
1602 case PM_OPTIONAL_KEYWORD_PARAMETER_NODE:
1603 return "PM_OPTIONAL_KEYWORD_PARAMETER_NODE";
1604 case PM_OPTIONAL_PARAMETER_NODE:
1605 return "PM_OPTIONAL_PARAMETER_NODE";
1606 case PM_OR_NODE:
1607 return "PM_OR_NODE";
1608 case PM_PARAMETERS_NODE:
1609 return "PM_PARAMETERS_NODE";
1610 case PM_PARENTHESES_NODE:
1611 return "PM_PARENTHESES_NODE";
1612 case PM_PINNED_EXPRESSION_NODE:
1613 return "PM_PINNED_EXPRESSION_NODE";
1614 case PM_PINNED_VARIABLE_NODE:
1615 return "PM_PINNED_VARIABLE_NODE";
1616 case PM_POST_EXECUTION_NODE:
1617 return "PM_POST_EXECUTION_NODE";
1618 case PM_PRE_EXECUTION_NODE:
1619 return "PM_PRE_EXECUTION_NODE";
1620 case PM_PROGRAM_NODE:
1621 return "PM_PROGRAM_NODE";
1622 case PM_RANGE_NODE:
1623 return "PM_RANGE_NODE";
1624 case PM_RATIONAL_NODE:
1625 return "PM_RATIONAL_NODE";
1626 case PM_REDO_NODE:
1627 return "PM_REDO_NODE";
1628 case PM_REGULAR_EXPRESSION_NODE:
1629 return "PM_REGULAR_EXPRESSION_NODE";
1630 case PM_REQUIRED_KEYWORD_PARAMETER_NODE:
1631 return "PM_REQUIRED_KEYWORD_PARAMETER_NODE";
1632 case PM_REQUIRED_PARAMETER_NODE:
1633 return "PM_REQUIRED_PARAMETER_NODE";
1634 case PM_RESCUE_MODIFIER_NODE:
1635 return "PM_RESCUE_MODIFIER_NODE";
1636 case PM_RESCUE_NODE:
1637 return "PM_RESCUE_NODE";
1638 case PM_REST_PARAMETER_NODE:
1639 return "PM_REST_PARAMETER_NODE";
1640 case PM_RETRY_NODE:
1641 return "PM_RETRY_NODE";
1642 case PM_RETURN_NODE:
1643 return "PM_RETURN_NODE";
1644 case PM_SELF_NODE:
1645 return "PM_SELF_NODE";
1646 case PM_SHAREABLE_CONSTANT_NODE:
1647 return "PM_SHAREABLE_CONSTANT_NODE";
1648 case PM_SINGLETON_CLASS_NODE:
1649 return "PM_SINGLETON_CLASS_NODE";
1650 case PM_SOURCE_ENCODING_NODE:
1651 return "PM_SOURCE_ENCODING_NODE";
1652 case PM_SOURCE_FILE_NODE:
1653 return "PM_SOURCE_FILE_NODE";
1654 case PM_SOURCE_LINE_NODE:
1655 return "PM_SOURCE_LINE_NODE";
1656 case PM_SPLAT_NODE:
1657 return "PM_SPLAT_NODE";
1658 case PM_STATEMENTS_NODE:
1659 return "PM_STATEMENTS_NODE";
1660 case PM_STRING_NODE:
1661 return "PM_STRING_NODE";
1662 case PM_SUPER_NODE:
1663 return "PM_SUPER_NODE";
1664 case PM_SYMBOL_NODE:
1665 return "PM_SYMBOL_NODE";
1666 case PM_TRUE_NODE:
1667 return "PM_TRUE_NODE";
1668 case PM_UNDEF_NODE:
1669 return "PM_UNDEF_NODE";
1670 case PM_UNLESS_NODE:
1671 return "PM_UNLESS_NODE";
1672 case PM_UNTIL_NODE:
1673 return "PM_UNTIL_NODE";
1674 case PM_WHEN_NODE:
1675 return "PM_WHEN_NODE";
1676 case PM_WHILE_NODE:
1677 return "PM_WHILE_NODE";
1678 case PM_X_STRING_NODE:
1679 return "PM_X_STRING_NODE";
1680 case PM_YIELD_NODE:
1681 return "PM_YIELD_NODE";
1682 }
1683 return "";
1684}
1685
1695pm_visit_node(const pm_node_t *node, bool (*visitor)(const pm_node_t *node, void *data), void *data) {
1696 if (visitor(node, data)) pm_visit_child_nodes(node, visitor, data);
1697}
1698
1705pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *node, void *data), void *data) {
1706 switch (PM_NODE_TYPE(node)) {
1707 case PM_ALIAS_GLOBAL_VARIABLE_NODE: {
1709
1710 // Visit the new_name field
1711 pm_visit_node((const pm_node_t *) cast->new_name, visitor, data);
1712
1713 // Visit the old_name field
1714 pm_visit_node((const pm_node_t *) cast->old_name, visitor, data);
1715
1716 break;
1717 }
1718 case PM_ALIAS_METHOD_NODE: {
1719 const pm_alias_method_node_t *cast = (const pm_alias_method_node_t *) node;
1720
1721 // Visit the new_name field
1722 pm_visit_node((const pm_node_t *) cast->new_name, visitor, data);
1723
1724 // Visit the old_name field
1725 pm_visit_node((const pm_node_t *) cast->old_name, visitor, data);
1726
1727 break;
1728 }
1729 case PM_ALTERNATION_PATTERN_NODE: {
1731
1732 // Visit the left field
1733 pm_visit_node((const pm_node_t *) cast->left, visitor, data);
1734
1735 // Visit the right field
1736 pm_visit_node((const pm_node_t *) cast->right, visitor, data);
1737
1738 break;
1739 }
1740 case PM_AND_NODE: {
1741 const pm_and_node_t *cast = (const pm_and_node_t *) node;
1742
1743 // Visit the left field
1744 pm_visit_node((const pm_node_t *) cast->left, visitor, data);
1745
1746 // Visit the right field
1747 pm_visit_node((const pm_node_t *) cast->right, visitor, data);
1748
1749 break;
1750 }
1751 case PM_ARGUMENTS_NODE: {
1752 const pm_arguments_node_t *cast = (const pm_arguments_node_t *) node;
1753
1754 // Visit the arguments field
1755 const pm_node_list_t *arguments = &cast->arguments;
1756 for (size_t index = 0; index < arguments->size; index++) {
1757 pm_visit_node(arguments->nodes[index], visitor, data);
1758 }
1759
1760 break;
1761 }
1762 case PM_ARRAY_NODE: {
1763 const pm_array_node_t *cast = (const pm_array_node_t *) node;
1764
1765 // Visit the elements field
1766 const pm_node_list_t *elements = &cast->elements;
1767 for (size_t index = 0; index < elements->size; index++) {
1768 pm_visit_node(elements->nodes[index], visitor, data);
1769 }
1770
1771 break;
1772 }
1773 case PM_ARRAY_PATTERN_NODE: {
1774 const pm_array_pattern_node_t *cast = (const pm_array_pattern_node_t *) node;
1775
1776 // Visit the constant field
1777 if (cast->constant != NULL) {
1778 pm_visit_node((const pm_node_t *) cast->constant, visitor, data);
1779 }
1780
1781 // Visit the requireds field
1782 const pm_node_list_t *requireds = &cast->requireds;
1783 for (size_t index = 0; index < requireds->size; index++) {
1784 pm_visit_node(requireds->nodes[index], visitor, data);
1785 }
1786
1787 // Visit the rest field
1788 if (cast->rest != NULL) {
1789 pm_visit_node((const pm_node_t *) cast->rest, visitor, data);
1790 }
1791
1792 // Visit the posts field
1793 const pm_node_list_t *posts = &cast->posts;
1794 for (size_t index = 0; index < posts->size; index++) {
1795 pm_visit_node(posts->nodes[index], visitor, data);
1796 }
1797
1798 break;
1799 }
1800 case PM_ASSOC_NODE: {
1801 const pm_assoc_node_t *cast = (const pm_assoc_node_t *) node;
1802
1803 // Visit the key field
1804 pm_visit_node((const pm_node_t *) cast->key, visitor, data);
1805
1806 // Visit the value field
1807 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
1808
1809 break;
1810 }
1811 case PM_ASSOC_SPLAT_NODE: {
1812 const pm_assoc_splat_node_t *cast = (const pm_assoc_splat_node_t *) node;
1813
1814 // Visit the value field
1815 if (cast->value != NULL) {
1816 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
1817 }
1818
1819 break;
1820 }
1821 case PM_BACK_REFERENCE_READ_NODE:
1822 break;
1823 case PM_BEGIN_NODE: {
1824 const pm_begin_node_t *cast = (const pm_begin_node_t *) node;
1825
1826 // Visit the statements field
1827 if (cast->statements != NULL) {
1828 pm_visit_node((const pm_node_t *) cast->statements, visitor, data);
1829 }
1830
1831 // Visit the rescue_clause field
1832 if (cast->rescue_clause != NULL) {
1833 pm_visit_node((const pm_node_t *) cast->rescue_clause, visitor, data);
1834 }
1835
1836 // Visit the else_clause field
1837 if (cast->else_clause != NULL) {
1838 pm_visit_node((const pm_node_t *) cast->else_clause, visitor, data);
1839 }
1840
1841 // Visit the ensure_clause field
1842 if (cast->ensure_clause != NULL) {
1843 pm_visit_node((const pm_node_t *) cast->ensure_clause, visitor, data);
1844 }
1845
1846 break;
1847 }
1848 case PM_BLOCK_ARGUMENT_NODE: {
1849 const pm_block_argument_node_t *cast = (const pm_block_argument_node_t *) node;
1850
1851 // Visit the expression field
1852 if (cast->expression != NULL) {
1853 pm_visit_node((const pm_node_t *) cast->expression, visitor, data);
1854 }
1855
1856 break;
1857 }
1858 case PM_BLOCK_LOCAL_VARIABLE_NODE:
1859 break;
1860 case PM_BLOCK_NODE: {
1861 const pm_block_node_t *cast = (const pm_block_node_t *) node;
1862
1863 // Visit the parameters field
1864 if (cast->parameters != NULL) {
1865 pm_visit_node((const pm_node_t *) cast->parameters, visitor, data);
1866 }
1867
1868 // Visit the body field
1869 if (cast->body != NULL) {
1870 pm_visit_node((const pm_node_t *) cast->body, visitor, data);
1871 }
1872
1873 break;
1874 }
1875 case PM_BLOCK_PARAMETER_NODE:
1876 break;
1877 case PM_BLOCK_PARAMETERS_NODE: {
1878 const pm_block_parameters_node_t *cast = (const pm_block_parameters_node_t *) node;
1879
1880 // Visit the parameters field
1881 if (cast->parameters != NULL) {
1882 pm_visit_node((const pm_node_t *) cast->parameters, visitor, data);
1883 }
1884
1885 // Visit the locals field
1886 const pm_node_list_t *locals = &cast->locals;
1887 for (size_t index = 0; index < locals->size; index++) {
1888 pm_visit_node(locals->nodes[index], visitor, data);
1889 }
1890
1891 break;
1892 }
1893 case PM_BREAK_NODE: {
1894 const pm_break_node_t *cast = (const pm_break_node_t *) node;
1895
1896 // Visit the arguments field
1897 if (cast->arguments != NULL) {
1898 pm_visit_node((const pm_node_t *) cast->arguments, visitor, data);
1899 }
1900
1901 break;
1902 }
1903 case PM_CALL_AND_WRITE_NODE: {
1904 const pm_call_and_write_node_t *cast = (const pm_call_and_write_node_t *) node;
1905
1906 // Visit the receiver field
1907 if (cast->receiver != NULL) {
1908 pm_visit_node((const pm_node_t *) cast->receiver, visitor, data);
1909 }
1910
1911 // Visit the value field
1912 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
1913
1914 break;
1915 }
1916 case PM_CALL_NODE: {
1917 const pm_call_node_t *cast = (const pm_call_node_t *) node;
1918
1919 // Visit the receiver field
1920 if (cast->receiver != NULL) {
1921 pm_visit_node((const pm_node_t *) cast->receiver, visitor, data);
1922 }
1923
1924 // Visit the arguments field
1925 if (cast->arguments != NULL) {
1926 pm_visit_node((const pm_node_t *) cast->arguments, visitor, data);
1927 }
1928
1929 // Visit the block field
1930 if (cast->block != NULL) {
1931 pm_visit_node((const pm_node_t *) cast->block, visitor, data);
1932 }
1933
1934 break;
1935 }
1936 case PM_CALL_OPERATOR_WRITE_NODE: {
1938
1939 // Visit the receiver field
1940 if (cast->receiver != NULL) {
1941 pm_visit_node((const pm_node_t *) cast->receiver, visitor, data);
1942 }
1943
1944 // Visit the value field
1945 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
1946
1947 break;
1948 }
1949 case PM_CALL_OR_WRITE_NODE: {
1950 const pm_call_or_write_node_t *cast = (const pm_call_or_write_node_t *) node;
1951
1952 // Visit the receiver field
1953 if (cast->receiver != NULL) {
1954 pm_visit_node((const pm_node_t *) cast->receiver, visitor, data);
1955 }
1956
1957 // Visit the value field
1958 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
1959
1960 break;
1961 }
1962 case PM_CALL_TARGET_NODE: {
1963 const pm_call_target_node_t *cast = (const pm_call_target_node_t *) node;
1964
1965 // Visit the receiver field
1966 pm_visit_node((const pm_node_t *) cast->receiver, visitor, data);
1967
1968 break;
1969 }
1970 case PM_CAPTURE_PATTERN_NODE: {
1971 const pm_capture_pattern_node_t *cast = (const pm_capture_pattern_node_t *) node;
1972
1973 // Visit the value field
1974 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
1975
1976 // Visit the target field
1977 pm_visit_node((const pm_node_t *) cast->target, visitor, data);
1978
1979 break;
1980 }
1981 case PM_CASE_MATCH_NODE: {
1982 const pm_case_match_node_t *cast = (const pm_case_match_node_t *) node;
1983
1984 // Visit the predicate field
1985 if (cast->predicate != NULL) {
1986 pm_visit_node((const pm_node_t *) cast->predicate, visitor, data);
1987 }
1988
1989 // Visit the conditions field
1990 const pm_node_list_t *conditions = &cast->conditions;
1991 for (size_t index = 0; index < conditions->size; index++) {
1992 pm_visit_node(conditions->nodes[index], visitor, data);
1993 }
1994
1995 // Visit the else_clause field
1996 if (cast->else_clause != NULL) {
1997 pm_visit_node((const pm_node_t *) cast->else_clause, visitor, data);
1998 }
1999
2000 break;
2001 }
2002 case PM_CASE_NODE: {
2003 const pm_case_node_t *cast = (const pm_case_node_t *) node;
2004
2005 // Visit the predicate field
2006 if (cast->predicate != NULL) {
2007 pm_visit_node((const pm_node_t *) cast->predicate, visitor, data);
2008 }
2009
2010 // Visit the conditions field
2011 const pm_node_list_t *conditions = &cast->conditions;
2012 for (size_t index = 0; index < conditions->size; index++) {
2013 pm_visit_node(conditions->nodes[index], visitor, data);
2014 }
2015
2016 // Visit the else_clause field
2017 if (cast->else_clause != NULL) {
2018 pm_visit_node((const pm_node_t *) cast->else_clause, visitor, data);
2019 }
2020
2021 break;
2022 }
2023 case PM_CLASS_NODE: {
2024 const pm_class_node_t *cast = (const pm_class_node_t *) node;
2025
2026 // Visit the constant_path field
2027 pm_visit_node((const pm_node_t *) cast->constant_path, visitor, data);
2028
2029 // Visit the superclass field
2030 if (cast->superclass != NULL) {
2031 pm_visit_node((const pm_node_t *) cast->superclass, visitor, data);
2032 }
2033
2034 // Visit the body field
2035 if (cast->body != NULL) {
2036 pm_visit_node((const pm_node_t *) cast->body, visitor, data);
2037 }
2038
2039 break;
2040 }
2041 case PM_CLASS_VARIABLE_AND_WRITE_NODE: {
2043
2044 // Visit the value field
2045 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
2046
2047 break;
2048 }
2049 case PM_CLASS_VARIABLE_OPERATOR_WRITE_NODE: {
2051
2052 // Visit the value field
2053 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
2054
2055 break;
2056 }
2057 case PM_CLASS_VARIABLE_OR_WRITE_NODE: {
2059
2060 // Visit the value field
2061 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
2062
2063 break;
2064 }
2065 case PM_CLASS_VARIABLE_READ_NODE:
2066 break;
2067 case PM_CLASS_VARIABLE_TARGET_NODE:
2068 break;
2069 case PM_CLASS_VARIABLE_WRITE_NODE: {
2071
2072 // Visit the value field
2073 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
2074
2075 break;
2076 }
2077 case PM_CONSTANT_AND_WRITE_NODE: {
2079
2080 // Visit the value field
2081 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
2082
2083 break;
2084 }
2085 case PM_CONSTANT_OPERATOR_WRITE_NODE: {
2087
2088 // Visit the value field
2089 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
2090
2091 break;
2092 }
2093 case PM_CONSTANT_OR_WRITE_NODE: {
2094 const pm_constant_or_write_node_t *cast = (const pm_constant_or_write_node_t *) node;
2095
2096 // Visit the value field
2097 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
2098
2099 break;
2100 }
2101 case PM_CONSTANT_PATH_AND_WRITE_NODE: {
2103
2104 // Visit the target field
2105 pm_visit_node((const pm_node_t *) cast->target, visitor, data);
2106
2107 // Visit the value field
2108 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
2109
2110 break;
2111 }
2112 case PM_CONSTANT_PATH_NODE: {
2113 const pm_constant_path_node_t *cast = (const pm_constant_path_node_t *) node;
2114
2115 // Visit the parent field
2116 if (cast->parent != NULL) {
2117 pm_visit_node((const pm_node_t *) cast->parent, visitor, data);
2118 }
2119
2120 break;
2121 }
2122 case PM_CONSTANT_PATH_OPERATOR_WRITE_NODE: {
2124
2125 // Visit the target field
2126 pm_visit_node((const pm_node_t *) cast->target, visitor, data);
2127
2128 // Visit the value field
2129 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
2130
2131 break;
2132 }
2133 case PM_CONSTANT_PATH_OR_WRITE_NODE: {
2135
2136 // Visit the target field
2137 pm_visit_node((const pm_node_t *) cast->target, visitor, data);
2138
2139 // Visit the value field
2140 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
2141
2142 break;
2143 }
2144 case PM_CONSTANT_PATH_TARGET_NODE: {
2146
2147 // Visit the parent field
2148 if (cast->parent != NULL) {
2149 pm_visit_node((const pm_node_t *) cast->parent, visitor, data);
2150 }
2151
2152 break;
2153 }
2154 case PM_CONSTANT_PATH_WRITE_NODE: {
2156
2157 // Visit the target field
2158 pm_visit_node((const pm_node_t *) cast->target, visitor, data);
2159
2160 // Visit the value field
2161 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
2162
2163 break;
2164 }
2165 case PM_CONSTANT_READ_NODE:
2166 break;
2167 case PM_CONSTANT_TARGET_NODE:
2168 break;
2169 case PM_CONSTANT_WRITE_NODE: {
2170 const pm_constant_write_node_t *cast = (const pm_constant_write_node_t *) node;
2171
2172 // Visit the value field
2173 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
2174
2175 break;
2176 }
2177 case PM_DEF_NODE: {
2178 const pm_def_node_t *cast = (const pm_def_node_t *) node;
2179
2180 // Visit the receiver field
2181 if (cast->receiver != NULL) {
2182 pm_visit_node((const pm_node_t *) cast->receiver, visitor, data);
2183 }
2184
2185 // Visit the parameters field
2186 if (cast->parameters != NULL) {
2187 pm_visit_node((const pm_node_t *) cast->parameters, visitor, data);
2188 }
2189
2190 // Visit the body field
2191 if (cast->body != NULL) {
2192 pm_visit_node((const pm_node_t *) cast->body, visitor, data);
2193 }
2194
2195 break;
2196 }
2197 case PM_DEFINED_NODE: {
2198 const pm_defined_node_t *cast = (const pm_defined_node_t *) node;
2199
2200 // Visit the value field
2201 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
2202
2203 break;
2204 }
2205 case PM_ELSE_NODE: {
2206 const pm_else_node_t *cast = (const pm_else_node_t *) node;
2207
2208 // Visit the statements field
2209 if (cast->statements != NULL) {
2210 pm_visit_node((const pm_node_t *) cast->statements, visitor, data);
2211 }
2212
2213 break;
2214 }
2215 case PM_EMBEDDED_STATEMENTS_NODE: {
2217
2218 // Visit the statements field
2219 if (cast->statements != NULL) {
2220 pm_visit_node((const pm_node_t *) cast->statements, visitor, data);
2221 }
2222
2223 break;
2224 }
2225 case PM_EMBEDDED_VARIABLE_NODE: {
2226 const pm_embedded_variable_node_t *cast = (const pm_embedded_variable_node_t *) node;
2227
2228 // Visit the variable field
2229 pm_visit_node((const pm_node_t *) cast->variable, visitor, data);
2230
2231 break;
2232 }
2233 case PM_ENSURE_NODE: {
2234 const pm_ensure_node_t *cast = (const pm_ensure_node_t *) node;
2235
2236 // Visit the statements field
2237 if (cast->statements != NULL) {
2238 pm_visit_node((const pm_node_t *) cast->statements, visitor, data);
2239 }
2240
2241 break;
2242 }
2243 case PM_FALSE_NODE:
2244 break;
2245 case PM_FIND_PATTERN_NODE: {
2246 const pm_find_pattern_node_t *cast = (const pm_find_pattern_node_t *) node;
2247
2248 // Visit the constant field
2249 if (cast->constant != NULL) {
2250 pm_visit_node((const pm_node_t *) cast->constant, visitor, data);
2251 }
2252
2253 // Visit the left field
2254 pm_visit_node((const pm_node_t *) cast->left, visitor, data);
2255
2256 // Visit the requireds field
2257 const pm_node_list_t *requireds = &cast->requireds;
2258 for (size_t index = 0; index < requireds->size; index++) {
2259 pm_visit_node(requireds->nodes[index], visitor, data);
2260 }
2261
2262 // Visit the right field
2263 pm_visit_node((const pm_node_t *) cast->right, visitor, data);
2264
2265 break;
2266 }
2267 case PM_FLIP_FLOP_NODE: {
2268 const pm_flip_flop_node_t *cast = (const pm_flip_flop_node_t *) node;
2269
2270 // Visit the left field
2271 if (cast->left != NULL) {
2272 pm_visit_node((const pm_node_t *) cast->left, visitor, data);
2273 }
2274
2275 // Visit the right field
2276 if (cast->right != NULL) {
2277 pm_visit_node((const pm_node_t *) cast->right, visitor, data);
2278 }
2279
2280 break;
2281 }
2282 case PM_FLOAT_NODE:
2283 break;
2284 case PM_FOR_NODE: {
2285 const pm_for_node_t *cast = (const pm_for_node_t *) node;
2286
2287 // Visit the index field
2288 pm_visit_node((const pm_node_t *) cast->index, visitor, data);
2289
2290 // Visit the collection field
2291 pm_visit_node((const pm_node_t *) cast->collection, visitor, data);
2292
2293 // Visit the statements field
2294 if (cast->statements != NULL) {
2295 pm_visit_node((const pm_node_t *) cast->statements, visitor, data);
2296 }
2297
2298 break;
2299 }
2300 case PM_FORWARDING_ARGUMENTS_NODE:
2301 break;
2302 case PM_FORWARDING_PARAMETER_NODE:
2303 break;
2304 case PM_FORWARDING_SUPER_NODE: {
2305 const pm_forwarding_super_node_t *cast = (const pm_forwarding_super_node_t *) node;
2306
2307 // Visit the block field
2308 if (cast->block != NULL) {
2309 pm_visit_node((const pm_node_t *) cast->block, visitor, data);
2310 }
2311
2312 break;
2313 }
2314 case PM_GLOBAL_VARIABLE_AND_WRITE_NODE: {
2316
2317 // Visit the value field
2318 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
2319
2320 break;
2321 }
2322 case PM_GLOBAL_VARIABLE_OPERATOR_WRITE_NODE: {
2324
2325 // Visit the value field
2326 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
2327
2328 break;
2329 }
2330 case PM_GLOBAL_VARIABLE_OR_WRITE_NODE: {
2332
2333 // Visit the value field
2334 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
2335
2336 break;
2337 }
2338 case PM_GLOBAL_VARIABLE_READ_NODE:
2339 break;
2340 case PM_GLOBAL_VARIABLE_TARGET_NODE:
2341 break;
2342 case PM_GLOBAL_VARIABLE_WRITE_NODE: {
2344
2345 // Visit the value field
2346 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
2347
2348 break;
2349 }
2350 case PM_HASH_NODE: {
2351 const pm_hash_node_t *cast = (const pm_hash_node_t *) node;
2352
2353 // Visit the elements field
2354 const pm_node_list_t *elements = &cast->elements;
2355 for (size_t index = 0; index < elements->size; index++) {
2356 pm_visit_node(elements->nodes[index], visitor, data);
2357 }
2358
2359 break;
2360 }
2361 case PM_HASH_PATTERN_NODE: {
2362 const pm_hash_pattern_node_t *cast = (const pm_hash_pattern_node_t *) node;
2363
2364 // Visit the constant field
2365 if (cast->constant != NULL) {
2366 pm_visit_node((const pm_node_t *) cast->constant, visitor, data);
2367 }
2368
2369 // Visit the elements field
2370 const pm_node_list_t *elements = &cast->elements;
2371 for (size_t index = 0; index < elements->size; index++) {
2372 pm_visit_node(elements->nodes[index], visitor, data);
2373 }
2374
2375 // Visit the rest field
2376 if (cast->rest != NULL) {
2377 pm_visit_node((const pm_node_t *) cast->rest, visitor, data);
2378 }
2379
2380 break;
2381 }
2382 case PM_IF_NODE: {
2383 const pm_if_node_t *cast = (const pm_if_node_t *) node;
2384
2385 // Visit the predicate field
2386 pm_visit_node((const pm_node_t *) cast->predicate, visitor, data);
2387
2388 // Visit the statements field
2389 if (cast->statements != NULL) {
2390 pm_visit_node((const pm_node_t *) cast->statements, visitor, data);
2391 }
2392
2393 // Visit the subsequent field
2394 if (cast->subsequent != NULL) {
2395 pm_visit_node((const pm_node_t *) cast->subsequent, visitor, data);
2396 }
2397
2398 break;
2399 }
2400 case PM_IMAGINARY_NODE: {
2401 const pm_imaginary_node_t *cast = (const pm_imaginary_node_t *) node;
2402
2403 // Visit the numeric field
2404 pm_visit_node((const pm_node_t *) cast->numeric, visitor, data);
2405
2406 break;
2407 }
2408 case PM_IMPLICIT_NODE: {
2409 const pm_implicit_node_t *cast = (const pm_implicit_node_t *) node;
2410
2411 // Visit the value field
2412 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
2413
2414 break;
2415 }
2416 case PM_IMPLICIT_REST_NODE:
2417 break;
2418 case PM_IN_NODE: {
2419 const pm_in_node_t *cast = (const pm_in_node_t *) node;
2420
2421 // Visit the pattern field
2422 pm_visit_node((const pm_node_t *) cast->pattern, visitor, data);
2423
2424 // Visit the statements field
2425 if (cast->statements != NULL) {
2426 pm_visit_node((const pm_node_t *) cast->statements, visitor, data);
2427 }
2428
2429 break;
2430 }
2431 case PM_INDEX_AND_WRITE_NODE: {
2432 const pm_index_and_write_node_t *cast = (const pm_index_and_write_node_t *) node;
2433
2434 // Visit the receiver field
2435 if (cast->receiver != NULL) {
2436 pm_visit_node((const pm_node_t *) cast->receiver, visitor, data);
2437 }
2438
2439 // Visit the arguments field
2440 if (cast->arguments != NULL) {
2441 pm_visit_node((const pm_node_t *) cast->arguments, visitor, data);
2442 }
2443
2444 // Visit the block field
2445 if (cast->block != NULL) {
2446 pm_visit_node((const pm_node_t *) cast->block, visitor, data);
2447 }
2448
2449 // Visit the value field
2450 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
2451
2452 break;
2453 }
2454 case PM_INDEX_OPERATOR_WRITE_NODE: {
2456
2457 // Visit the receiver field
2458 if (cast->receiver != NULL) {
2459 pm_visit_node((const pm_node_t *) cast->receiver, visitor, data);
2460 }
2461
2462 // Visit the arguments field
2463 if (cast->arguments != NULL) {
2464 pm_visit_node((const pm_node_t *) cast->arguments, visitor, data);
2465 }
2466
2467 // Visit the block field
2468 if (cast->block != NULL) {
2469 pm_visit_node((const pm_node_t *) cast->block, visitor, data);
2470 }
2471
2472 // Visit the value field
2473 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
2474
2475 break;
2476 }
2477 case PM_INDEX_OR_WRITE_NODE: {
2478 const pm_index_or_write_node_t *cast = (const pm_index_or_write_node_t *) node;
2479
2480 // Visit the receiver field
2481 if (cast->receiver != NULL) {
2482 pm_visit_node((const pm_node_t *) cast->receiver, visitor, data);
2483 }
2484
2485 // Visit the arguments field
2486 if (cast->arguments != NULL) {
2487 pm_visit_node((const pm_node_t *) cast->arguments, visitor, data);
2488 }
2489
2490 // Visit the block field
2491 if (cast->block != NULL) {
2492 pm_visit_node((const pm_node_t *) cast->block, visitor, data);
2493 }
2494
2495 // Visit the value field
2496 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
2497
2498 break;
2499 }
2500 case PM_INDEX_TARGET_NODE: {
2501 const pm_index_target_node_t *cast = (const pm_index_target_node_t *) node;
2502
2503 // Visit the receiver field
2504 pm_visit_node((const pm_node_t *) cast->receiver, visitor, data);
2505
2506 // Visit the arguments field
2507 if (cast->arguments != NULL) {
2508 pm_visit_node((const pm_node_t *) cast->arguments, visitor, data);
2509 }
2510
2511 // Visit the block field
2512 if (cast->block != NULL) {
2513 pm_visit_node((const pm_node_t *) cast->block, visitor, data);
2514 }
2515
2516 break;
2517 }
2518 case PM_INSTANCE_VARIABLE_AND_WRITE_NODE: {
2520
2521 // Visit the value field
2522 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
2523
2524 break;
2525 }
2526 case PM_INSTANCE_VARIABLE_OPERATOR_WRITE_NODE: {
2528
2529 // Visit the value field
2530 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
2531
2532 break;
2533 }
2534 case PM_INSTANCE_VARIABLE_OR_WRITE_NODE: {
2536
2537 // Visit the value field
2538 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
2539
2540 break;
2541 }
2542 case PM_INSTANCE_VARIABLE_READ_NODE:
2543 break;
2544 case PM_INSTANCE_VARIABLE_TARGET_NODE:
2545 break;
2546 case PM_INSTANCE_VARIABLE_WRITE_NODE: {
2548
2549 // Visit the value field
2550 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
2551
2552 break;
2553 }
2554 case PM_INTEGER_NODE:
2555 break;
2556 case PM_INTERPOLATED_MATCH_LAST_LINE_NODE: {
2558
2559 // Visit the parts field
2560 const pm_node_list_t *parts = &cast->parts;
2561 for (size_t index = 0; index < parts->size; index++) {
2562 pm_visit_node(parts->nodes[index], visitor, data);
2563 }
2564
2565 break;
2566 }
2567 case PM_INTERPOLATED_REGULAR_EXPRESSION_NODE: {
2569
2570 // Visit the parts field
2571 const pm_node_list_t *parts = &cast->parts;
2572 for (size_t index = 0; index < parts->size; index++) {
2573 pm_visit_node(parts->nodes[index], visitor, data);
2574 }
2575
2576 break;
2577 }
2578 case PM_INTERPOLATED_STRING_NODE: {
2580
2581 // Visit the parts field
2582 const pm_node_list_t *parts = &cast->parts;
2583 for (size_t index = 0; index < parts->size; index++) {
2584 pm_visit_node(parts->nodes[index], visitor, data);
2585 }
2586
2587 break;
2588 }
2589 case PM_INTERPOLATED_SYMBOL_NODE: {
2591
2592 // Visit the parts field
2593 const pm_node_list_t *parts = &cast->parts;
2594 for (size_t index = 0; index < parts->size; index++) {
2595 pm_visit_node(parts->nodes[index], visitor, data);
2596 }
2597
2598 break;
2599 }
2600 case PM_INTERPOLATED_X_STRING_NODE: {
2602
2603 // Visit the parts field
2604 const pm_node_list_t *parts = &cast->parts;
2605 for (size_t index = 0; index < parts->size; index++) {
2606 pm_visit_node(parts->nodes[index], visitor, data);
2607 }
2608
2609 break;
2610 }
2611 case PM_IT_LOCAL_VARIABLE_READ_NODE:
2612 break;
2613 case PM_IT_PARAMETERS_NODE:
2614 break;
2615 case PM_KEYWORD_HASH_NODE: {
2616 const pm_keyword_hash_node_t *cast = (const pm_keyword_hash_node_t *) node;
2617
2618 // Visit the elements field
2619 const pm_node_list_t *elements = &cast->elements;
2620 for (size_t index = 0; index < elements->size; index++) {
2621 pm_visit_node(elements->nodes[index], visitor, data);
2622 }
2623
2624 break;
2625 }
2626 case PM_KEYWORD_REST_PARAMETER_NODE:
2627 break;
2628 case PM_LAMBDA_NODE: {
2629 const pm_lambda_node_t *cast = (const pm_lambda_node_t *) node;
2630
2631 // Visit the parameters field
2632 if (cast->parameters != NULL) {
2633 pm_visit_node((const pm_node_t *) cast->parameters, visitor, data);
2634 }
2635
2636 // Visit the body field
2637 if (cast->body != NULL) {
2638 pm_visit_node((const pm_node_t *) cast->body, visitor, data);
2639 }
2640
2641 break;
2642 }
2643 case PM_LOCAL_VARIABLE_AND_WRITE_NODE: {
2645
2646 // Visit the value field
2647 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
2648
2649 break;
2650 }
2651 case PM_LOCAL_VARIABLE_OPERATOR_WRITE_NODE: {
2653
2654 // Visit the value field
2655 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
2656
2657 break;
2658 }
2659 case PM_LOCAL_VARIABLE_OR_WRITE_NODE: {
2661
2662 // Visit the value field
2663 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
2664
2665 break;
2666 }
2667 case PM_LOCAL_VARIABLE_READ_NODE:
2668 break;
2669 case PM_LOCAL_VARIABLE_TARGET_NODE:
2670 break;
2671 case PM_LOCAL_VARIABLE_WRITE_NODE: {
2673
2674 // Visit the value field
2675 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
2676
2677 break;
2678 }
2679 case PM_MATCH_LAST_LINE_NODE:
2680 break;
2681 case PM_MATCH_PREDICATE_NODE: {
2682 const pm_match_predicate_node_t *cast = (const pm_match_predicate_node_t *) node;
2683
2684 // Visit the value field
2685 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
2686
2687 // Visit the pattern field
2688 pm_visit_node((const pm_node_t *) cast->pattern, visitor, data);
2689
2690 break;
2691 }
2692 case PM_MATCH_REQUIRED_NODE: {
2693 const pm_match_required_node_t *cast = (const pm_match_required_node_t *) node;
2694
2695 // Visit the value field
2696 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
2697
2698 // Visit the pattern field
2699 pm_visit_node((const pm_node_t *) cast->pattern, visitor, data);
2700
2701 break;
2702 }
2703 case PM_MATCH_WRITE_NODE: {
2704 const pm_match_write_node_t *cast = (const pm_match_write_node_t *) node;
2705
2706 // Visit the call field
2707 pm_visit_node((const pm_node_t *) cast->call, visitor, data);
2708
2709 // Visit the targets field
2710 const pm_node_list_t *targets = &cast->targets;
2711 for (size_t index = 0; index < targets->size; index++) {
2712 pm_visit_node(targets->nodes[index], visitor, data);
2713 }
2714
2715 break;
2716 }
2717 case PM_MISSING_NODE:
2718 break;
2719 case PM_MODULE_NODE: {
2720 const pm_module_node_t *cast = (const pm_module_node_t *) node;
2721
2722 // Visit the constant_path field
2723 pm_visit_node((const pm_node_t *) cast->constant_path, visitor, data);
2724
2725 // Visit the body field
2726 if (cast->body != NULL) {
2727 pm_visit_node((const pm_node_t *) cast->body, visitor, data);
2728 }
2729
2730 break;
2731 }
2732 case PM_MULTI_TARGET_NODE: {
2733 const pm_multi_target_node_t *cast = (const pm_multi_target_node_t *) node;
2734
2735 // Visit the lefts field
2736 const pm_node_list_t *lefts = &cast->lefts;
2737 for (size_t index = 0; index < lefts->size; index++) {
2738 pm_visit_node(lefts->nodes[index], visitor, data);
2739 }
2740
2741 // Visit the rest field
2742 if (cast->rest != NULL) {
2743 pm_visit_node((const pm_node_t *) cast->rest, visitor, data);
2744 }
2745
2746 // Visit the rights field
2747 const pm_node_list_t *rights = &cast->rights;
2748 for (size_t index = 0; index < rights->size; index++) {
2749 pm_visit_node(rights->nodes[index], visitor, data);
2750 }
2751
2752 break;
2753 }
2754 case PM_MULTI_WRITE_NODE: {
2755 const pm_multi_write_node_t *cast = (const pm_multi_write_node_t *) node;
2756
2757 // Visit the lefts field
2758 const pm_node_list_t *lefts = &cast->lefts;
2759 for (size_t index = 0; index < lefts->size; index++) {
2760 pm_visit_node(lefts->nodes[index], visitor, data);
2761 }
2762
2763 // Visit the rest field
2764 if (cast->rest != NULL) {
2765 pm_visit_node((const pm_node_t *) cast->rest, visitor, data);
2766 }
2767
2768 // Visit the rights field
2769 const pm_node_list_t *rights = &cast->rights;
2770 for (size_t index = 0; index < rights->size; index++) {
2771 pm_visit_node(rights->nodes[index], visitor, data);
2772 }
2773
2774 // Visit the value field
2775 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
2776
2777 break;
2778 }
2779 case PM_NEXT_NODE: {
2780 const pm_next_node_t *cast = (const pm_next_node_t *) node;
2781
2782 // Visit the arguments field
2783 if (cast->arguments != NULL) {
2784 pm_visit_node((const pm_node_t *) cast->arguments, visitor, data);
2785 }
2786
2787 break;
2788 }
2789 case PM_NIL_NODE:
2790 break;
2791 case PM_NO_BLOCK_PARAMETER_NODE:
2792 break;
2793 case PM_NO_KEYWORDS_PARAMETER_NODE:
2794 break;
2795 case PM_NUMBERED_PARAMETERS_NODE:
2796 break;
2797 case PM_NUMBERED_REFERENCE_READ_NODE:
2798 break;
2799 case PM_OPTIONAL_KEYWORD_PARAMETER_NODE: {
2801
2802 // Visit the value field
2803 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
2804
2805 break;
2806 }
2807 case PM_OPTIONAL_PARAMETER_NODE: {
2809
2810 // Visit the value field
2811 pm_visit_node((const pm_node_t *) cast->value, visitor, data);
2812
2813 break;
2814 }
2815 case PM_OR_NODE: {
2816 const pm_or_node_t *cast = (const pm_or_node_t *) node;
2817
2818 // Visit the left field
2819 pm_visit_node((const pm_node_t *) cast->left, visitor, data);
2820
2821 // Visit the right field
2822 pm_visit_node((const pm_node_t *) cast->right, visitor, data);
2823
2824 break;
2825 }
2826 case PM_PARAMETERS_NODE: {
2827 const pm_parameters_node_t *cast = (const pm_parameters_node_t *) node;
2828
2829 // Visit the requireds field
2830 const pm_node_list_t *requireds = &cast->requireds;
2831 for (size_t index = 0; index < requireds->size; index++) {
2832 pm_visit_node(requireds->nodes[index], visitor, data);
2833 }
2834
2835 // Visit the optionals field
2836 const pm_node_list_t *optionals = &cast->optionals;
2837 for (size_t index = 0; index < optionals->size; index++) {
2838 pm_visit_node(optionals->nodes[index], visitor, data);
2839 }
2840
2841 // Visit the rest field
2842 if (cast->rest != NULL) {
2843 pm_visit_node((const pm_node_t *) cast->rest, visitor, data);
2844 }
2845
2846 // Visit the posts field
2847 const pm_node_list_t *posts = &cast->posts;
2848 for (size_t index = 0; index < posts->size; index++) {
2849 pm_visit_node(posts->nodes[index], visitor, data);
2850 }
2851
2852 // Visit the keywords field
2853 const pm_node_list_t *keywords = &cast->keywords;
2854 for (size_t index = 0; index < keywords->size; index++) {
2855 pm_visit_node(keywords->nodes[index], visitor, data);
2856 }
2857
2858 // Visit the keyword_rest field
2859 if (cast->keyword_rest != NULL) {
2860 pm_visit_node((const pm_node_t *) cast->keyword_rest, visitor, data);
2861 }
2862
2863 // Visit the block field
2864 if (cast->block != NULL) {
2865 pm_visit_node((const pm_node_t *) cast->block, visitor, data);
2866 }
2867
2868 break;
2869 }
2870 case PM_PARENTHESES_NODE: {
2871 const pm_parentheses_node_t *cast = (const pm_parentheses_node_t *) node;
2872
2873 // Visit the body field
2874 if (cast->body != NULL) {
2875 pm_visit_node((const pm_node_t *) cast->body, visitor, data);
2876 }
2877
2878 break;
2879 }
2880 case PM_PINNED_EXPRESSION_NODE: {
2881 const pm_pinned_expression_node_t *cast = (const pm_pinned_expression_node_t *) node;
2882
2883 // Visit the expression field
2884 pm_visit_node((const pm_node_t *) cast->expression, visitor, data);
2885
2886 break;
2887 }
2888 case PM_PINNED_VARIABLE_NODE: {
2889 const pm_pinned_variable_node_t *cast = (const pm_pinned_variable_node_t *) node;
2890
2891 // Visit the variable field
2892 pm_visit_node((const pm_node_t *) cast->variable, visitor, data);
2893
2894 break;
2895 }
2896 case PM_POST_EXECUTION_NODE: {
2897 const pm_post_execution_node_t *cast = (const pm_post_execution_node_t *) node;
2898
2899 // Visit the statements field
2900 if (cast->statements != NULL) {
2901 pm_visit_node((const pm_node_t *) cast->statements, visitor, data);
2902 }
2903
2904 break;
2905 }
2906 case PM_PRE_EXECUTION_NODE: {
2907 const pm_pre_execution_node_t *cast = (const pm_pre_execution_node_t *) node;
2908
2909 // Visit the statements field
2910 if (cast->statements != NULL) {
2911 pm_visit_node((const pm_node_t *) cast->statements, visitor, data);
2912 }
2913
2914 break;
2915 }
2916 case PM_PROGRAM_NODE: {
2917 const pm_program_node_t *cast = (const pm_program_node_t *) node;
2918
2919 // Visit the statements field
2920 pm_visit_node((const pm_node_t *) cast->statements, visitor, data);
2921
2922 break;
2923 }
2924 case PM_RANGE_NODE: {
2925 const pm_range_node_t *cast = (const pm_range_node_t *) node;
2926
2927 // Visit the left field
2928 if (cast->left != NULL) {
2929 pm_visit_node((const pm_node_t *) cast->left, visitor, data);
2930 }
2931
2932 // Visit the right field
2933 if (cast->right != NULL) {
2934 pm_visit_node((const pm_node_t *) cast->right, visitor, data);
2935 }
2936
2937 break;
2938 }
2939 case PM_RATIONAL_NODE:
2940 break;
2941 case PM_REDO_NODE:
2942 break;
2943 case PM_REGULAR_EXPRESSION_NODE:
2944 break;
2945 case PM_REQUIRED_KEYWORD_PARAMETER_NODE:
2946 break;
2947 case PM_REQUIRED_PARAMETER_NODE:
2948 break;
2949 case PM_RESCUE_MODIFIER_NODE: {
2950 const pm_rescue_modifier_node_t *cast = (const pm_rescue_modifier_node_t *) node;
2951
2952 // Visit the expression field
2953 pm_visit_node((const pm_node_t *) cast->expression, visitor, data);
2954
2955 // Visit the rescue_expression field
2956 pm_visit_node((const pm_node_t *) cast->rescue_expression, visitor, data);
2957
2958 break;
2959 }
2960 case PM_RESCUE_NODE: {
2961 const pm_rescue_node_t *cast = (const pm_rescue_node_t *) node;
2962
2963 // Visit the exceptions field
2964 const pm_node_list_t *exceptions = &cast->exceptions;
2965 for (size_t index = 0; index < exceptions->size; index++) {
2966 pm_visit_node(exceptions->nodes[index], visitor, data);
2967 }
2968
2969 // Visit the reference field
2970 if (cast->reference != NULL) {
2971 pm_visit_node((const pm_node_t *) cast->reference, visitor, data);
2972 }
2973
2974 // Visit the statements field
2975 if (cast->statements != NULL) {
2976 pm_visit_node((const pm_node_t *) cast->statements, visitor, data);
2977 }
2978
2979 // Visit the subsequent field
2980 if (cast->subsequent != NULL) {
2981 pm_visit_node((const pm_node_t *) cast->subsequent, visitor, data);
2982 }
2983
2984 break;
2985 }
2986 case PM_REST_PARAMETER_NODE:
2987 break;
2988 case PM_RETRY_NODE:
2989 break;
2990 case PM_RETURN_NODE: {
2991 const pm_return_node_t *cast = (const pm_return_node_t *) node;
2992
2993 // Visit the arguments field
2994 if (cast->arguments != NULL) {
2995 pm_visit_node((const pm_node_t *) cast->arguments, visitor, data);
2996 }
2997
2998 break;
2999 }
3000 case PM_SELF_NODE:
3001 break;
3002 case PM_SHAREABLE_CONSTANT_NODE: {
3004
3005 // Visit the write field
3006 pm_visit_node((const pm_node_t *) cast->write, visitor, data);
3007
3008 break;
3009 }
3010 case PM_SINGLETON_CLASS_NODE: {
3011 const pm_singleton_class_node_t *cast = (const pm_singleton_class_node_t *) node;
3012
3013 // Visit the expression field
3014 pm_visit_node((const pm_node_t *) cast->expression, visitor, data);
3015
3016 // Visit the body field
3017 if (cast->body != NULL) {
3018 pm_visit_node((const pm_node_t *) cast->body, visitor, data);
3019 }
3020
3021 break;
3022 }
3023 case PM_SOURCE_ENCODING_NODE:
3024 break;
3025 case PM_SOURCE_FILE_NODE:
3026 break;
3027 case PM_SOURCE_LINE_NODE:
3028 break;
3029 case PM_SPLAT_NODE: {
3030 const pm_splat_node_t *cast = (const pm_splat_node_t *) node;
3031
3032 // Visit the expression field
3033 if (cast->expression != NULL) {
3034 pm_visit_node((const pm_node_t *) cast->expression, visitor, data);
3035 }
3036
3037 break;
3038 }
3039 case PM_STATEMENTS_NODE: {
3040 const pm_statements_node_t *cast = (const pm_statements_node_t *) node;
3041
3042 // Visit the body field
3043 const pm_node_list_t *body = &cast->body;
3044 for (size_t index = 0; index < body->size; index++) {
3045 pm_visit_node(body->nodes[index], visitor, data);
3046 }
3047
3048 break;
3049 }
3050 case PM_STRING_NODE:
3051 break;
3052 case PM_SUPER_NODE: {
3053 const pm_super_node_t *cast = (const pm_super_node_t *) node;
3054
3055 // Visit the arguments field
3056 if (cast->arguments != NULL) {
3057 pm_visit_node((const pm_node_t *) cast->arguments, visitor, data);
3058 }
3059
3060 // Visit the block field
3061 if (cast->block != NULL) {
3062 pm_visit_node((const pm_node_t *) cast->block, visitor, data);
3063 }
3064
3065 break;
3066 }
3067 case PM_SYMBOL_NODE:
3068 break;
3069 case PM_TRUE_NODE:
3070 break;
3071 case PM_UNDEF_NODE: {
3072 const pm_undef_node_t *cast = (const pm_undef_node_t *) node;
3073
3074 // Visit the names field
3075 const pm_node_list_t *names = &cast->names;
3076 for (size_t index = 0; index < names->size; index++) {
3077 pm_visit_node(names->nodes[index], visitor, data);
3078 }
3079
3080 break;
3081 }
3082 case PM_UNLESS_NODE: {
3083 const pm_unless_node_t *cast = (const pm_unless_node_t *) node;
3084
3085 // Visit the predicate field
3086 pm_visit_node((const pm_node_t *) cast->predicate, visitor, data);
3087
3088 // Visit the statements field
3089 if (cast->statements != NULL) {
3090 pm_visit_node((const pm_node_t *) cast->statements, visitor, data);
3091 }
3092
3093 // Visit the else_clause field
3094 if (cast->else_clause != NULL) {
3095 pm_visit_node((const pm_node_t *) cast->else_clause, visitor, data);
3096 }
3097
3098 break;
3099 }
3100 case PM_UNTIL_NODE: {
3101 const pm_until_node_t *cast = (const pm_until_node_t *) node;
3102
3103 // Visit the predicate field
3104 pm_visit_node((const pm_node_t *) cast->predicate, visitor, data);
3105
3106 // Visit the statements field
3107 if (cast->statements != NULL) {
3108 pm_visit_node((const pm_node_t *) cast->statements, visitor, data);
3109 }
3110
3111 break;
3112 }
3113 case PM_WHEN_NODE: {
3114 const pm_when_node_t *cast = (const pm_when_node_t *) node;
3115
3116 // Visit the conditions field
3117 const pm_node_list_t *conditions = &cast->conditions;
3118 for (size_t index = 0; index < conditions->size; index++) {
3119 pm_visit_node(conditions->nodes[index], visitor, data);
3120 }
3121
3122 // Visit the statements field
3123 if (cast->statements != NULL) {
3124 pm_visit_node((const pm_node_t *) cast->statements, visitor, data);
3125 }
3126
3127 break;
3128 }
3129 case PM_WHILE_NODE: {
3130 const pm_while_node_t *cast = (const pm_while_node_t *) node;
3131
3132 // Visit the predicate field
3133 pm_visit_node((const pm_node_t *) cast->predicate, visitor, data);
3134
3135 // Visit the statements field
3136 if (cast->statements != NULL) {
3137 pm_visit_node((const pm_node_t *) cast->statements, visitor, data);
3138 }
3139
3140 break;
3141 }
3142 case PM_X_STRING_NODE:
3143 break;
3144 case PM_YIELD_NODE: {
3145 const pm_yield_node_t *cast = (const pm_yield_node_t *) node;
3146
3147 // Visit the arguments field
3148 if (cast->arguments != NULL) {
3149 pm_visit_node((const pm_node_t *) cast->arguments, visitor, data);
3150 }
3151
3152 break;
3153 }
3154 case PM_SCOPE_NODE:
3155 break;
3156 }
3157}
3158
3159// We optionally support dumping to JSON. For systems that don't want or need
3160// this functionality, it can be turned off with the PRISM_EXCLUDE_JSON define.
3161#ifndef PRISM_EXCLUDE_JSON
3162
3163static void
3164pm_dump_json_constant(pm_buffer_t *buffer, const pm_parser_t *parser, pm_constant_id_t constant_id) {
3165 const pm_constant_t *constant = pm_constant_pool_id_to_constant(&parser->constant_pool, constant_id);
3166 pm_buffer_append_byte(buffer, '"');
3167 pm_buffer_append_source(buffer, constant->start, constant->length, PM_BUFFER_ESCAPING_JSON);
3168 pm_buffer_append_byte(buffer, '"');
3169}
3170
3171static void
3172pm_dump_json_location(pm_buffer_t *buffer, const pm_location_t *location) {
3173 pm_buffer_append_format(buffer, "{\"start\":%" PRIu32 ",\"length\":%" PRIu32 "}", location->start, location->length);
3174}
3175
3180pm_dump_json(pm_buffer_t *buffer, const pm_parser_t *parser, const pm_node_t *node) {
3181 switch (PM_NODE_TYPE(node)) {
3182 case PM_ALIAS_GLOBAL_VARIABLE_NODE: {
3183 pm_buffer_append_string(buffer, "{\"type\":\"AliasGlobalVariableNode\",\"location\":", 45);
3184
3186 pm_dump_json_location(buffer, &cast->base.location);
3187
3188 // Dump the new_name field
3189 pm_buffer_append_byte(buffer, ',');
3190 pm_buffer_append_string(buffer, "\"new_name\":", 11);
3191 pm_dump_json(buffer, parser, (const pm_node_t *) cast->new_name);
3192
3193 // Dump the old_name field
3194 pm_buffer_append_byte(buffer, ',');
3195 pm_buffer_append_string(buffer, "\"old_name\":", 11);
3196 pm_dump_json(buffer, parser, (const pm_node_t *) cast->old_name);
3197
3198 // Dump the keyword_loc field
3199 pm_buffer_append_byte(buffer, ',');
3200 pm_buffer_append_string(buffer, "\"keyword_loc\":", 14);
3201 pm_dump_json_location(buffer, &cast->keyword_loc);
3202
3203 pm_buffer_append_byte(buffer, '}');
3204 break;
3205 }
3206 case PM_ALIAS_METHOD_NODE: {
3207 pm_buffer_append_string(buffer, "{\"type\":\"AliasMethodNode\",\"location\":", 37);
3208
3209 const pm_alias_method_node_t *cast = (const pm_alias_method_node_t *) node;
3210 pm_dump_json_location(buffer, &cast->base.location);
3211
3212 // Dump the new_name field
3213 pm_buffer_append_byte(buffer, ',');
3214 pm_buffer_append_string(buffer, "\"new_name\":", 11);
3215 pm_dump_json(buffer, parser, (const pm_node_t *) cast->new_name);
3216
3217 // Dump the old_name field
3218 pm_buffer_append_byte(buffer, ',');
3219 pm_buffer_append_string(buffer, "\"old_name\":", 11);
3220 pm_dump_json(buffer, parser, (const pm_node_t *) cast->old_name);
3221
3222 // Dump the keyword_loc field
3223 pm_buffer_append_byte(buffer, ',');
3224 pm_buffer_append_string(buffer, "\"keyword_loc\":", 14);
3225 pm_dump_json_location(buffer, &cast->keyword_loc);
3226
3227 pm_buffer_append_byte(buffer, '}');
3228 break;
3229 }
3230 case PM_ALTERNATION_PATTERN_NODE: {
3231 pm_buffer_append_string(buffer, "{\"type\":\"AlternationPatternNode\",\"location\":", 44);
3232
3234 pm_dump_json_location(buffer, &cast->base.location);
3235
3236 // Dump the left field
3237 pm_buffer_append_byte(buffer, ',');
3238 pm_buffer_append_string(buffer, "\"left\":", 7);
3239 pm_dump_json(buffer, parser, (const pm_node_t *) cast->left);
3240
3241 // Dump the right field
3242 pm_buffer_append_byte(buffer, ',');
3243 pm_buffer_append_string(buffer, "\"right\":", 8);
3244 pm_dump_json(buffer, parser, (const pm_node_t *) cast->right);
3245
3246 // Dump the operator_loc field
3247 pm_buffer_append_byte(buffer, ',');
3248 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
3249 pm_dump_json_location(buffer, &cast->operator_loc);
3250
3251 pm_buffer_append_byte(buffer, '}');
3252 break;
3253 }
3254 case PM_AND_NODE: {
3255 pm_buffer_append_string(buffer, "{\"type\":\"AndNode\",\"location\":", 29);
3256
3257 const pm_and_node_t *cast = (const pm_and_node_t *) node;
3258 pm_dump_json_location(buffer, &cast->base.location);
3259
3260 // Dump the left field
3261 pm_buffer_append_byte(buffer, ',');
3262 pm_buffer_append_string(buffer, "\"left\":", 7);
3263 pm_dump_json(buffer, parser, (const pm_node_t *) cast->left);
3264
3265 // Dump the right field
3266 pm_buffer_append_byte(buffer, ',');
3267 pm_buffer_append_string(buffer, "\"right\":", 8);
3268 pm_dump_json(buffer, parser, (const pm_node_t *) cast->right);
3269
3270 // Dump the operator_loc field
3271 pm_buffer_append_byte(buffer, ',');
3272 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
3273 pm_dump_json_location(buffer, &cast->operator_loc);
3274
3275 pm_buffer_append_byte(buffer, '}');
3276 break;
3277 }
3278 case PM_ARGUMENTS_NODE: {
3279 pm_buffer_append_string(buffer, "{\"type\":\"ArgumentsNode\",\"location\":", 35);
3280
3281 const pm_arguments_node_t *cast = (const pm_arguments_node_t *) node;
3282 pm_dump_json_location(buffer, &cast->base.location);
3283
3284 // Dump the ArgumentsNodeFlags field
3285 pm_buffer_append_byte(buffer, ',');
3286 pm_buffer_append_string(buffer, "\"ArgumentsNodeFlags\":", 21);
3287 size_t flags = 0;
3288 pm_buffer_append_byte(buffer, '[');
3289 if (PM_NODE_FLAG_P(cast, PM_ARGUMENTS_NODE_FLAGS_CONTAINS_FORWARDING)) {
3290 if (flags != 0) pm_buffer_append_byte(buffer, ',');
3291 pm_buffer_append_string(buffer, "\"CONTAINS_FORWARDING\"", 21);
3292 flags++;
3293 }
3294 if (PM_NODE_FLAG_P(cast, PM_ARGUMENTS_NODE_FLAGS_CONTAINS_KEYWORDS)) {
3295 if (flags != 0) pm_buffer_append_byte(buffer, ',');
3296 pm_buffer_append_string(buffer, "\"CONTAINS_KEYWORDS\"", 19);
3297 flags++;
3298 }
3299 if (PM_NODE_FLAG_P(cast, PM_ARGUMENTS_NODE_FLAGS_CONTAINS_KEYWORD_SPLAT)) {
3300 if (flags != 0) pm_buffer_append_byte(buffer, ',');
3301 pm_buffer_append_string(buffer, "\"CONTAINS_KEYWORD_SPLAT\"", 24);
3302 flags++;
3303 }
3304 if (PM_NODE_FLAG_P(cast, PM_ARGUMENTS_NODE_FLAGS_CONTAINS_SPLAT)) {
3305 if (flags != 0) pm_buffer_append_byte(buffer, ',');
3306 pm_buffer_append_string(buffer, "\"CONTAINS_SPLAT\"", 16);
3307 flags++;
3308 }
3309 if (PM_NODE_FLAG_P(cast, PM_ARGUMENTS_NODE_FLAGS_CONTAINS_MULTIPLE_SPLATS)) {
3310 if (flags != 0) pm_buffer_append_byte(buffer, ',');
3311 pm_buffer_append_string(buffer, "\"CONTAINS_MULTIPLE_SPLATS\"", 26);
3312 flags++;
3313 }
3314 pm_buffer_append_byte(buffer, ']');
3315
3316 // Dump the arguments field
3317 pm_buffer_append_byte(buffer, ',');
3318 pm_buffer_append_string(buffer, "\"arguments\":", 12);
3319 const pm_node_list_t *arguments = &cast->arguments;
3320 pm_buffer_append_byte(buffer, '[');
3321
3322 for (size_t index = 0; index < arguments->size; index++) {
3323 if (index != 0) pm_buffer_append_byte(buffer, ',');
3324 pm_dump_json(buffer, parser, arguments->nodes[index]);
3325 }
3326 pm_buffer_append_byte(buffer, ']');
3327
3328 pm_buffer_append_byte(buffer, '}');
3329 break;
3330 }
3331 case PM_ARRAY_NODE: {
3332 pm_buffer_append_string(buffer, "{\"type\":\"ArrayNode\",\"location\":", 31);
3333
3334 const pm_array_node_t *cast = (const pm_array_node_t *) node;
3335 pm_dump_json_location(buffer, &cast->base.location);
3336
3337 // Dump the ArrayNodeFlags field
3338 pm_buffer_append_byte(buffer, ',');
3339 pm_buffer_append_string(buffer, "\"ArrayNodeFlags\":", 17);
3340 size_t flags = 0;
3341 pm_buffer_append_byte(buffer, '[');
3342 if (PM_NODE_FLAG_P(cast, PM_ARRAY_NODE_FLAGS_CONTAINS_SPLAT)) {
3343 if (flags != 0) pm_buffer_append_byte(buffer, ',');
3344 pm_buffer_append_string(buffer, "\"CONTAINS_SPLAT\"", 16);
3345 flags++;
3346 }
3347 pm_buffer_append_byte(buffer, ']');
3348
3349 // Dump the elements field
3350 pm_buffer_append_byte(buffer, ',');
3351 pm_buffer_append_string(buffer, "\"elements\":", 11);
3352 const pm_node_list_t *elements = &cast->elements;
3353 pm_buffer_append_byte(buffer, '[');
3354
3355 for (size_t index = 0; index < elements->size; index++) {
3356 if (index != 0) pm_buffer_append_byte(buffer, ',');
3357 pm_dump_json(buffer, parser, elements->nodes[index]);
3358 }
3359 pm_buffer_append_byte(buffer, ']');
3360
3361 // Dump the opening_loc field
3362 pm_buffer_append_byte(buffer, ',');
3363 pm_buffer_append_string(buffer, "\"opening_loc\":", 14);
3364 if (cast->opening_loc.length != 0) {
3365 pm_dump_json_location(buffer, &cast->opening_loc);
3366 } else {
3367 pm_buffer_append_string(buffer, "null", 4);
3368 }
3369
3370 // Dump the closing_loc field
3371 pm_buffer_append_byte(buffer, ',');
3372 pm_buffer_append_string(buffer, "\"closing_loc\":", 14);
3373 if (cast->closing_loc.length != 0) {
3374 pm_dump_json_location(buffer, &cast->closing_loc);
3375 } else {
3376 pm_buffer_append_string(buffer, "null", 4);
3377 }
3378
3379 pm_buffer_append_byte(buffer, '}');
3380 break;
3381 }
3382 case PM_ARRAY_PATTERN_NODE: {
3383 pm_buffer_append_string(buffer, "{\"type\":\"ArrayPatternNode\",\"location\":", 38);
3384
3385 const pm_array_pattern_node_t *cast = (const pm_array_pattern_node_t *) node;
3386 pm_dump_json_location(buffer, &cast->base.location);
3387
3388 // Dump the constant field
3389 pm_buffer_append_byte(buffer, ',');
3390 pm_buffer_append_string(buffer, "\"constant\":", 11);
3391 if (cast->constant != NULL) {
3392 pm_dump_json(buffer, parser, (const pm_node_t *) cast->constant);
3393 } else {
3394 pm_buffer_append_string(buffer, "null", 4);
3395 }
3396
3397 // Dump the requireds field
3398 pm_buffer_append_byte(buffer, ',');
3399 pm_buffer_append_string(buffer, "\"requireds\":", 12);
3400 const pm_node_list_t *requireds = &cast->requireds;
3401 pm_buffer_append_byte(buffer, '[');
3402
3403 for (size_t index = 0; index < requireds->size; index++) {
3404 if (index != 0) pm_buffer_append_byte(buffer, ',');
3405 pm_dump_json(buffer, parser, requireds->nodes[index]);
3406 }
3407 pm_buffer_append_byte(buffer, ']');
3408
3409 // Dump the rest field
3410 pm_buffer_append_byte(buffer, ',');
3411 pm_buffer_append_string(buffer, "\"rest\":", 7);
3412 if (cast->rest != NULL) {
3413 pm_dump_json(buffer, parser, (const pm_node_t *) cast->rest);
3414 } else {
3415 pm_buffer_append_string(buffer, "null", 4);
3416 }
3417
3418 // Dump the posts field
3419 pm_buffer_append_byte(buffer, ',');
3420 pm_buffer_append_string(buffer, "\"posts\":", 8);
3421 const pm_node_list_t *posts = &cast->posts;
3422 pm_buffer_append_byte(buffer, '[');
3423
3424 for (size_t index = 0; index < posts->size; index++) {
3425 if (index != 0) pm_buffer_append_byte(buffer, ',');
3426 pm_dump_json(buffer, parser, posts->nodes[index]);
3427 }
3428 pm_buffer_append_byte(buffer, ']');
3429
3430 // Dump the opening_loc field
3431 pm_buffer_append_byte(buffer, ',');
3432 pm_buffer_append_string(buffer, "\"opening_loc\":", 14);
3433 if (cast->opening_loc.length != 0) {
3434 pm_dump_json_location(buffer, &cast->opening_loc);
3435 } else {
3436 pm_buffer_append_string(buffer, "null", 4);
3437 }
3438
3439 // Dump the closing_loc field
3440 pm_buffer_append_byte(buffer, ',');
3441 pm_buffer_append_string(buffer, "\"closing_loc\":", 14);
3442 if (cast->closing_loc.length != 0) {
3443 pm_dump_json_location(buffer, &cast->closing_loc);
3444 } else {
3445 pm_buffer_append_string(buffer, "null", 4);
3446 }
3447
3448 pm_buffer_append_byte(buffer, '}');
3449 break;
3450 }
3451 case PM_ASSOC_NODE: {
3452 pm_buffer_append_string(buffer, "{\"type\":\"AssocNode\",\"location\":", 31);
3453
3454 const pm_assoc_node_t *cast = (const pm_assoc_node_t *) node;
3455 pm_dump_json_location(buffer, &cast->base.location);
3456
3457 // Dump the key field
3458 pm_buffer_append_byte(buffer, ',');
3459 pm_buffer_append_string(buffer, "\"key\":", 6);
3460 pm_dump_json(buffer, parser, (const pm_node_t *) cast->key);
3461
3462 // Dump the value field
3463 pm_buffer_append_byte(buffer, ',');
3464 pm_buffer_append_string(buffer, "\"value\":", 8);
3465 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
3466
3467 // Dump the operator_loc field
3468 pm_buffer_append_byte(buffer, ',');
3469 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
3470 if (cast->operator_loc.length != 0) {
3471 pm_dump_json_location(buffer, &cast->operator_loc);
3472 } else {
3473 pm_buffer_append_string(buffer, "null", 4);
3474 }
3475
3476 pm_buffer_append_byte(buffer, '}');
3477 break;
3478 }
3479 case PM_ASSOC_SPLAT_NODE: {
3480 pm_buffer_append_string(buffer, "{\"type\":\"AssocSplatNode\",\"location\":", 36);
3481
3482 const pm_assoc_splat_node_t *cast = (const pm_assoc_splat_node_t *) node;
3483 pm_dump_json_location(buffer, &cast->base.location);
3484
3485 // Dump the value field
3486 pm_buffer_append_byte(buffer, ',');
3487 pm_buffer_append_string(buffer, "\"value\":", 8);
3488 if (cast->value != NULL) {
3489 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
3490 } else {
3491 pm_buffer_append_string(buffer, "null", 4);
3492 }
3493
3494 // Dump the operator_loc field
3495 pm_buffer_append_byte(buffer, ',');
3496 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
3497 pm_dump_json_location(buffer, &cast->operator_loc);
3498
3499 pm_buffer_append_byte(buffer, '}');
3500 break;
3501 }
3502 case PM_BACK_REFERENCE_READ_NODE: {
3503 pm_buffer_append_string(buffer, "{\"type\":\"BackReferenceReadNode\",\"location\":", 43);
3504
3506 pm_dump_json_location(buffer, &cast->base.location);
3507
3508 // Dump the name field
3509 pm_buffer_append_byte(buffer, ',');
3510 pm_buffer_append_string(buffer, "\"name\":", 7);
3511 pm_dump_json_constant(buffer, parser, cast->name);
3512
3513 pm_buffer_append_byte(buffer, '}');
3514 break;
3515 }
3516 case PM_BEGIN_NODE: {
3517 pm_buffer_append_string(buffer, "{\"type\":\"BeginNode\",\"location\":", 31);
3518
3519 const pm_begin_node_t *cast = (const pm_begin_node_t *) node;
3520 pm_dump_json_location(buffer, &cast->base.location);
3521
3522 // Dump the begin_keyword_loc field
3523 pm_buffer_append_byte(buffer, ',');
3524 pm_buffer_append_string(buffer, "\"begin_keyword_loc\":", 20);
3525 if (cast->begin_keyword_loc.length != 0) {
3526 pm_dump_json_location(buffer, &cast->begin_keyword_loc);
3527 } else {
3528 pm_buffer_append_string(buffer, "null", 4);
3529 }
3530
3531 // Dump the statements field
3532 pm_buffer_append_byte(buffer, ',');
3533 pm_buffer_append_string(buffer, "\"statements\":", 13);
3534 if (cast->statements != NULL) {
3535 pm_dump_json(buffer, parser, (const pm_node_t *) cast->statements);
3536 } else {
3537 pm_buffer_append_string(buffer, "null", 4);
3538 }
3539
3540 // Dump the rescue_clause field
3541 pm_buffer_append_byte(buffer, ',');
3542 pm_buffer_append_string(buffer, "\"rescue_clause\":", 16);
3543 if (cast->rescue_clause != NULL) {
3544 pm_dump_json(buffer, parser, (const pm_node_t *) cast->rescue_clause);
3545 } else {
3546 pm_buffer_append_string(buffer, "null", 4);
3547 }
3548
3549 // Dump the else_clause field
3550 pm_buffer_append_byte(buffer, ',');
3551 pm_buffer_append_string(buffer, "\"else_clause\":", 14);
3552 if (cast->else_clause != NULL) {
3553 pm_dump_json(buffer, parser, (const pm_node_t *) cast->else_clause);
3554 } else {
3555 pm_buffer_append_string(buffer, "null", 4);
3556 }
3557
3558 // Dump the ensure_clause field
3559 pm_buffer_append_byte(buffer, ',');
3560 pm_buffer_append_string(buffer, "\"ensure_clause\":", 16);
3561 if (cast->ensure_clause != NULL) {
3562 pm_dump_json(buffer, parser, (const pm_node_t *) cast->ensure_clause);
3563 } else {
3564 pm_buffer_append_string(buffer, "null", 4);
3565 }
3566
3567 // Dump the end_keyword_loc field
3568 pm_buffer_append_byte(buffer, ',');
3569 pm_buffer_append_string(buffer, "\"end_keyword_loc\":", 18);
3570 if (cast->end_keyword_loc.length != 0) {
3571 pm_dump_json_location(buffer, &cast->end_keyword_loc);
3572 } else {
3573 pm_buffer_append_string(buffer, "null", 4);
3574 }
3575
3576 pm_buffer_append_byte(buffer, '}');
3577 break;
3578 }
3579 case PM_BLOCK_ARGUMENT_NODE: {
3580 pm_buffer_append_string(buffer, "{\"type\":\"BlockArgumentNode\",\"location\":", 39);
3581
3582 const pm_block_argument_node_t *cast = (const pm_block_argument_node_t *) node;
3583 pm_dump_json_location(buffer, &cast->base.location);
3584
3585 // Dump the expression field
3586 pm_buffer_append_byte(buffer, ',');
3587 pm_buffer_append_string(buffer, "\"expression\":", 13);
3588 if (cast->expression != NULL) {
3589 pm_dump_json(buffer, parser, (const pm_node_t *) cast->expression);
3590 } else {
3591 pm_buffer_append_string(buffer, "null", 4);
3592 }
3593
3594 // Dump the operator_loc field
3595 pm_buffer_append_byte(buffer, ',');
3596 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
3597 pm_dump_json_location(buffer, &cast->operator_loc);
3598
3599 pm_buffer_append_byte(buffer, '}');
3600 break;
3601 }
3602 case PM_BLOCK_LOCAL_VARIABLE_NODE: {
3603 pm_buffer_append_string(buffer, "{\"type\":\"BlockLocalVariableNode\",\"location\":", 44);
3604
3606 pm_dump_json_location(buffer, &cast->base.location);
3607
3608 // Dump the ParameterFlags field
3609 pm_buffer_append_byte(buffer, ',');
3610 pm_buffer_append_string(buffer, "\"ParameterFlags\":", 17);
3611 size_t flags = 0;
3612 pm_buffer_append_byte(buffer, '[');
3613 if (PM_NODE_FLAG_P(cast, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) {
3614 if (flags != 0) pm_buffer_append_byte(buffer, ',');
3615 pm_buffer_append_string(buffer, "\"REPEATED_PARAMETER\"", 20);
3616 flags++;
3617 }
3618 pm_buffer_append_byte(buffer, ']');
3619
3620 // Dump the name field
3621 pm_buffer_append_byte(buffer, ',');
3622 pm_buffer_append_string(buffer, "\"name\":", 7);
3623 pm_dump_json_constant(buffer, parser, cast->name);
3624
3625 pm_buffer_append_byte(buffer, '}');
3626 break;
3627 }
3628 case PM_BLOCK_NODE: {
3629 pm_buffer_append_string(buffer, "{\"type\":\"BlockNode\",\"location\":", 31);
3630
3631 const pm_block_node_t *cast = (const pm_block_node_t *) node;
3632 pm_dump_json_location(buffer, &cast->base.location);
3633
3634 // Dump the locals field
3635 pm_buffer_append_byte(buffer, ',');
3636 pm_buffer_append_string(buffer, "\"locals\":", 9);
3637 const pm_constant_id_list_t *locals = &cast->locals;
3638 pm_buffer_append_byte(buffer, '[');
3639
3640 for (size_t index = 0; index < locals->size; index++) {
3641 if (index != 0) pm_buffer_append_byte(buffer, ',');
3642 pm_dump_json_constant(buffer, parser, locals->ids[index]);
3643 }
3644 pm_buffer_append_byte(buffer, ']');
3645
3646 // Dump the parameters field
3647 pm_buffer_append_byte(buffer, ',');
3648 pm_buffer_append_string(buffer, "\"parameters\":", 13);
3649 if (cast->parameters != NULL) {
3650 pm_dump_json(buffer, parser, (const pm_node_t *) cast->parameters);
3651 } else {
3652 pm_buffer_append_string(buffer, "null", 4);
3653 }
3654
3655 // Dump the body field
3656 pm_buffer_append_byte(buffer, ',');
3657 pm_buffer_append_string(buffer, "\"body\":", 7);
3658 if (cast->body != NULL) {
3659 pm_dump_json(buffer, parser, (const pm_node_t *) cast->body);
3660 } else {
3661 pm_buffer_append_string(buffer, "null", 4);
3662 }
3663
3664 // Dump the opening_loc field
3665 pm_buffer_append_byte(buffer, ',');
3666 pm_buffer_append_string(buffer, "\"opening_loc\":", 14);
3667 pm_dump_json_location(buffer, &cast->opening_loc);
3668
3669 // Dump the closing_loc field
3670 pm_buffer_append_byte(buffer, ',');
3671 pm_buffer_append_string(buffer, "\"closing_loc\":", 14);
3672 pm_dump_json_location(buffer, &cast->closing_loc);
3673
3674 pm_buffer_append_byte(buffer, '}');
3675 break;
3676 }
3677 case PM_BLOCK_PARAMETER_NODE: {
3678 pm_buffer_append_string(buffer, "{\"type\":\"BlockParameterNode\",\"location\":", 40);
3679
3680 const pm_block_parameter_node_t *cast = (const pm_block_parameter_node_t *) node;
3681 pm_dump_json_location(buffer, &cast->base.location);
3682
3683 // Dump the ParameterFlags field
3684 pm_buffer_append_byte(buffer, ',');
3685 pm_buffer_append_string(buffer, "\"ParameterFlags\":", 17);
3686 size_t flags = 0;
3687 pm_buffer_append_byte(buffer, '[');
3688 if (PM_NODE_FLAG_P(cast, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) {
3689 if (flags != 0) pm_buffer_append_byte(buffer, ',');
3690 pm_buffer_append_string(buffer, "\"REPEATED_PARAMETER\"", 20);
3691 flags++;
3692 }
3693 pm_buffer_append_byte(buffer, ']');
3694
3695 // Dump the name field
3696 pm_buffer_append_byte(buffer, ',');
3697 pm_buffer_append_string(buffer, "\"name\":", 7);
3698 if (cast->name != PM_CONSTANT_ID_UNSET) {
3699 pm_dump_json_constant(buffer, parser, cast->name);
3700 } else {
3701 pm_buffer_append_string(buffer, "null", 4);
3702 }
3703
3704 // Dump the name_loc field
3705 pm_buffer_append_byte(buffer, ',');
3706 pm_buffer_append_string(buffer, "\"name_loc\":", 11);
3707 if (cast->name_loc.length != 0) {
3708 pm_dump_json_location(buffer, &cast->name_loc);
3709 } else {
3710 pm_buffer_append_string(buffer, "null", 4);
3711 }
3712
3713 // Dump the operator_loc field
3714 pm_buffer_append_byte(buffer, ',');
3715 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
3716 pm_dump_json_location(buffer, &cast->operator_loc);
3717
3718 pm_buffer_append_byte(buffer, '}');
3719 break;
3720 }
3721 case PM_BLOCK_PARAMETERS_NODE: {
3722 pm_buffer_append_string(buffer, "{\"type\":\"BlockParametersNode\",\"location\":", 41);
3723
3724 const pm_block_parameters_node_t *cast = (const pm_block_parameters_node_t *) node;
3725 pm_dump_json_location(buffer, &cast->base.location);
3726
3727 // Dump the parameters field
3728 pm_buffer_append_byte(buffer, ',');
3729 pm_buffer_append_string(buffer, "\"parameters\":", 13);
3730 if (cast->parameters != NULL) {
3731 pm_dump_json(buffer, parser, (const pm_node_t *) cast->parameters);
3732 } else {
3733 pm_buffer_append_string(buffer, "null", 4);
3734 }
3735
3736 // Dump the locals field
3737 pm_buffer_append_byte(buffer, ',');
3738 pm_buffer_append_string(buffer, "\"locals\":", 9);
3739 const pm_node_list_t *locals = &cast->locals;
3740 pm_buffer_append_byte(buffer, '[');
3741
3742 for (size_t index = 0; index < locals->size; index++) {
3743 if (index != 0) pm_buffer_append_byte(buffer, ',');
3744 pm_dump_json(buffer, parser, locals->nodes[index]);
3745 }
3746 pm_buffer_append_byte(buffer, ']');
3747
3748 // Dump the opening_loc field
3749 pm_buffer_append_byte(buffer, ',');
3750 pm_buffer_append_string(buffer, "\"opening_loc\":", 14);
3751 if (cast->opening_loc.length != 0) {
3752 pm_dump_json_location(buffer, &cast->opening_loc);
3753 } else {
3754 pm_buffer_append_string(buffer, "null", 4);
3755 }
3756
3757 // Dump the closing_loc field
3758 pm_buffer_append_byte(buffer, ',');
3759 pm_buffer_append_string(buffer, "\"closing_loc\":", 14);
3760 if (cast->closing_loc.length != 0) {
3761 pm_dump_json_location(buffer, &cast->closing_loc);
3762 } else {
3763 pm_buffer_append_string(buffer, "null", 4);
3764 }
3765
3766 pm_buffer_append_byte(buffer, '}');
3767 break;
3768 }
3769 case PM_BREAK_NODE: {
3770 pm_buffer_append_string(buffer, "{\"type\":\"BreakNode\",\"location\":", 31);
3771
3772 const pm_break_node_t *cast = (const pm_break_node_t *) node;
3773 pm_dump_json_location(buffer, &cast->base.location);
3774
3775 // Dump the arguments field
3776 pm_buffer_append_byte(buffer, ',');
3777 pm_buffer_append_string(buffer, "\"arguments\":", 12);
3778 if (cast->arguments != NULL) {
3779 pm_dump_json(buffer, parser, (const pm_node_t *) cast->arguments);
3780 } else {
3781 pm_buffer_append_string(buffer, "null", 4);
3782 }
3783
3784 // Dump the keyword_loc field
3785 pm_buffer_append_byte(buffer, ',');
3786 pm_buffer_append_string(buffer, "\"keyword_loc\":", 14);
3787 pm_dump_json_location(buffer, &cast->keyword_loc);
3788
3789 pm_buffer_append_byte(buffer, '}');
3790 break;
3791 }
3792 case PM_CALL_AND_WRITE_NODE: {
3793 pm_buffer_append_string(buffer, "{\"type\":\"CallAndWriteNode\",\"location\":", 38);
3794
3795 const pm_call_and_write_node_t *cast = (const pm_call_and_write_node_t *) node;
3796 pm_dump_json_location(buffer, &cast->base.location);
3797
3798 // Dump the CallNodeFlags field
3799 pm_buffer_append_byte(buffer, ',');
3800 pm_buffer_append_string(buffer, "\"CallNodeFlags\":", 16);
3801 size_t flags = 0;
3802 pm_buffer_append_byte(buffer, '[');
3803 if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_SAFE_NAVIGATION)) {
3804 if (flags != 0) pm_buffer_append_byte(buffer, ',');
3805 pm_buffer_append_string(buffer, "\"SAFE_NAVIGATION\"", 17);
3806 flags++;
3807 }
3808 if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_VARIABLE_CALL)) {
3809 if (flags != 0) pm_buffer_append_byte(buffer, ',');
3810 pm_buffer_append_string(buffer, "\"VARIABLE_CALL\"", 15);
3811 flags++;
3812 }
3813 if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_ATTRIBUTE_WRITE)) {
3814 if (flags != 0) pm_buffer_append_byte(buffer, ',');
3815 pm_buffer_append_string(buffer, "\"ATTRIBUTE_WRITE\"", 17);
3816 flags++;
3817 }
3818 if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_IGNORE_VISIBILITY)) {
3819 if (flags != 0) pm_buffer_append_byte(buffer, ',');
3820 pm_buffer_append_string(buffer, "\"IGNORE_VISIBILITY\"", 19);
3821 flags++;
3822 }
3823 pm_buffer_append_byte(buffer, ']');
3824
3825 // Dump the receiver field
3826 pm_buffer_append_byte(buffer, ',');
3827 pm_buffer_append_string(buffer, "\"receiver\":", 11);
3828 if (cast->receiver != NULL) {
3829 pm_dump_json(buffer, parser, (const pm_node_t *) cast->receiver);
3830 } else {
3831 pm_buffer_append_string(buffer, "null", 4);
3832 }
3833
3834 // Dump the call_operator_loc field
3835 pm_buffer_append_byte(buffer, ',');
3836 pm_buffer_append_string(buffer, "\"call_operator_loc\":", 20);
3837 if (cast->call_operator_loc.length != 0) {
3838 pm_dump_json_location(buffer, &cast->call_operator_loc);
3839 } else {
3840 pm_buffer_append_string(buffer, "null", 4);
3841 }
3842
3843 // Dump the message_loc field
3844 pm_buffer_append_byte(buffer, ',');
3845 pm_buffer_append_string(buffer, "\"message_loc\":", 14);
3846 if (cast->message_loc.length != 0) {
3847 pm_dump_json_location(buffer, &cast->message_loc);
3848 } else {
3849 pm_buffer_append_string(buffer, "null", 4);
3850 }
3851
3852 // Dump the read_name field
3853 pm_buffer_append_byte(buffer, ',');
3854 pm_buffer_append_string(buffer, "\"read_name\":", 12);
3855 pm_dump_json_constant(buffer, parser, cast->read_name);
3856
3857 // Dump the write_name field
3858 pm_buffer_append_byte(buffer, ',');
3859 pm_buffer_append_string(buffer, "\"write_name\":", 13);
3860 pm_dump_json_constant(buffer, parser, cast->write_name);
3861
3862 // Dump the operator_loc field
3863 pm_buffer_append_byte(buffer, ',');
3864 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
3865 pm_dump_json_location(buffer, &cast->operator_loc);
3866
3867 // Dump the value field
3868 pm_buffer_append_byte(buffer, ',');
3869 pm_buffer_append_string(buffer, "\"value\":", 8);
3870 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
3871
3872 pm_buffer_append_byte(buffer, '}');
3873 break;
3874 }
3875 case PM_CALL_NODE: {
3876 pm_buffer_append_string(buffer, "{\"type\":\"CallNode\",\"location\":", 30);
3877
3878 const pm_call_node_t *cast = (const pm_call_node_t *) node;
3879 pm_dump_json_location(buffer, &cast->base.location);
3880
3881 // Dump the CallNodeFlags field
3882 pm_buffer_append_byte(buffer, ',');
3883 pm_buffer_append_string(buffer, "\"CallNodeFlags\":", 16);
3884 size_t flags = 0;
3885 pm_buffer_append_byte(buffer, '[');
3886 if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_SAFE_NAVIGATION)) {
3887 if (flags != 0) pm_buffer_append_byte(buffer, ',');
3888 pm_buffer_append_string(buffer, "\"SAFE_NAVIGATION\"", 17);
3889 flags++;
3890 }
3891 if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_VARIABLE_CALL)) {
3892 if (flags != 0) pm_buffer_append_byte(buffer, ',');
3893 pm_buffer_append_string(buffer, "\"VARIABLE_CALL\"", 15);
3894 flags++;
3895 }
3896 if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_ATTRIBUTE_WRITE)) {
3897 if (flags != 0) pm_buffer_append_byte(buffer, ',');
3898 pm_buffer_append_string(buffer, "\"ATTRIBUTE_WRITE\"", 17);
3899 flags++;
3900 }
3901 if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_IGNORE_VISIBILITY)) {
3902 if (flags != 0) pm_buffer_append_byte(buffer, ',');
3903 pm_buffer_append_string(buffer, "\"IGNORE_VISIBILITY\"", 19);
3904 flags++;
3905 }
3906 pm_buffer_append_byte(buffer, ']');
3907
3908 // Dump the receiver field
3909 pm_buffer_append_byte(buffer, ',');
3910 pm_buffer_append_string(buffer, "\"receiver\":", 11);
3911 if (cast->receiver != NULL) {
3912 pm_dump_json(buffer, parser, (const pm_node_t *) cast->receiver);
3913 } else {
3914 pm_buffer_append_string(buffer, "null", 4);
3915 }
3916
3917 // Dump the call_operator_loc field
3918 pm_buffer_append_byte(buffer, ',');
3919 pm_buffer_append_string(buffer, "\"call_operator_loc\":", 20);
3920 if (cast->call_operator_loc.length != 0) {
3921 pm_dump_json_location(buffer, &cast->call_operator_loc);
3922 } else {
3923 pm_buffer_append_string(buffer, "null", 4);
3924 }
3925
3926 // Dump the name field
3927 pm_buffer_append_byte(buffer, ',');
3928 pm_buffer_append_string(buffer, "\"name\":", 7);
3929 pm_dump_json_constant(buffer, parser, cast->name);
3930
3931 // Dump the message_loc field
3932 pm_buffer_append_byte(buffer, ',');
3933 pm_buffer_append_string(buffer, "\"message_loc\":", 14);
3934 if (cast->message_loc.length != 0) {
3935 pm_dump_json_location(buffer, &cast->message_loc);
3936 } else {
3937 pm_buffer_append_string(buffer, "null", 4);
3938 }
3939
3940 // Dump the opening_loc field
3941 pm_buffer_append_byte(buffer, ',');
3942 pm_buffer_append_string(buffer, "\"opening_loc\":", 14);
3943 if (cast->opening_loc.length != 0) {
3944 pm_dump_json_location(buffer, &cast->opening_loc);
3945 } else {
3946 pm_buffer_append_string(buffer, "null", 4);
3947 }
3948
3949 // Dump the arguments field
3950 pm_buffer_append_byte(buffer, ',');
3951 pm_buffer_append_string(buffer, "\"arguments\":", 12);
3952 if (cast->arguments != NULL) {
3953 pm_dump_json(buffer, parser, (const pm_node_t *) cast->arguments);
3954 } else {
3955 pm_buffer_append_string(buffer, "null", 4);
3956 }
3957
3958 // Dump the closing_loc field
3959 pm_buffer_append_byte(buffer, ',');
3960 pm_buffer_append_string(buffer, "\"closing_loc\":", 14);
3961 if (cast->closing_loc.length != 0) {
3962 pm_dump_json_location(buffer, &cast->closing_loc);
3963 } else {
3964 pm_buffer_append_string(buffer, "null", 4);
3965 }
3966
3967 // Dump the equal_loc field
3968 pm_buffer_append_byte(buffer, ',');
3969 pm_buffer_append_string(buffer, "\"equal_loc\":", 12);
3970 if (cast->equal_loc.length != 0) {
3971 pm_dump_json_location(buffer, &cast->equal_loc);
3972 } else {
3973 pm_buffer_append_string(buffer, "null", 4);
3974 }
3975
3976 // Dump the block field
3977 pm_buffer_append_byte(buffer, ',');
3978 pm_buffer_append_string(buffer, "\"block\":", 8);
3979 if (cast->block != NULL) {
3980 pm_dump_json(buffer, parser, (const pm_node_t *) cast->block);
3981 } else {
3982 pm_buffer_append_string(buffer, "null", 4);
3983 }
3984
3985 pm_buffer_append_byte(buffer, '}');
3986 break;
3987 }
3988 case PM_CALL_OPERATOR_WRITE_NODE: {
3989 pm_buffer_append_string(buffer, "{\"type\":\"CallOperatorWriteNode\",\"location\":", 43);
3990
3992 pm_dump_json_location(buffer, &cast->base.location);
3993
3994 // Dump the CallNodeFlags field
3995 pm_buffer_append_byte(buffer, ',');
3996 pm_buffer_append_string(buffer, "\"CallNodeFlags\":", 16);
3997 size_t flags = 0;
3998 pm_buffer_append_byte(buffer, '[');
3999 if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_SAFE_NAVIGATION)) {
4000 if (flags != 0) pm_buffer_append_byte(buffer, ',');
4001 pm_buffer_append_string(buffer, "\"SAFE_NAVIGATION\"", 17);
4002 flags++;
4003 }
4004 if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_VARIABLE_CALL)) {
4005 if (flags != 0) pm_buffer_append_byte(buffer, ',');
4006 pm_buffer_append_string(buffer, "\"VARIABLE_CALL\"", 15);
4007 flags++;
4008 }
4009 if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_ATTRIBUTE_WRITE)) {
4010 if (flags != 0) pm_buffer_append_byte(buffer, ',');
4011 pm_buffer_append_string(buffer, "\"ATTRIBUTE_WRITE\"", 17);
4012 flags++;
4013 }
4014 if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_IGNORE_VISIBILITY)) {
4015 if (flags != 0) pm_buffer_append_byte(buffer, ',');
4016 pm_buffer_append_string(buffer, "\"IGNORE_VISIBILITY\"", 19);
4017 flags++;
4018 }
4019 pm_buffer_append_byte(buffer, ']');
4020
4021 // Dump the receiver field
4022 pm_buffer_append_byte(buffer, ',');
4023 pm_buffer_append_string(buffer, "\"receiver\":", 11);
4024 if (cast->receiver != NULL) {
4025 pm_dump_json(buffer, parser, (const pm_node_t *) cast->receiver);
4026 } else {
4027 pm_buffer_append_string(buffer, "null", 4);
4028 }
4029
4030 // Dump the call_operator_loc field
4031 pm_buffer_append_byte(buffer, ',');
4032 pm_buffer_append_string(buffer, "\"call_operator_loc\":", 20);
4033 if (cast->call_operator_loc.length != 0) {
4034 pm_dump_json_location(buffer, &cast->call_operator_loc);
4035 } else {
4036 pm_buffer_append_string(buffer, "null", 4);
4037 }
4038
4039 // Dump the message_loc field
4040 pm_buffer_append_byte(buffer, ',');
4041 pm_buffer_append_string(buffer, "\"message_loc\":", 14);
4042 if (cast->message_loc.length != 0) {
4043 pm_dump_json_location(buffer, &cast->message_loc);
4044 } else {
4045 pm_buffer_append_string(buffer, "null", 4);
4046 }
4047
4048 // Dump the read_name field
4049 pm_buffer_append_byte(buffer, ',');
4050 pm_buffer_append_string(buffer, "\"read_name\":", 12);
4051 pm_dump_json_constant(buffer, parser, cast->read_name);
4052
4053 // Dump the write_name field
4054 pm_buffer_append_byte(buffer, ',');
4055 pm_buffer_append_string(buffer, "\"write_name\":", 13);
4056 pm_dump_json_constant(buffer, parser, cast->write_name);
4057
4058 // Dump the binary_operator field
4059 pm_buffer_append_byte(buffer, ',');
4060 pm_buffer_append_string(buffer, "\"binary_operator\":", 18);
4061 pm_dump_json_constant(buffer, parser, cast->binary_operator);
4062
4063 // Dump the binary_operator_loc field
4064 pm_buffer_append_byte(buffer, ',');
4065 pm_buffer_append_string(buffer, "\"binary_operator_loc\":", 22);
4066 pm_dump_json_location(buffer, &cast->binary_operator_loc);
4067
4068 // Dump the value field
4069 pm_buffer_append_byte(buffer, ',');
4070 pm_buffer_append_string(buffer, "\"value\":", 8);
4071 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
4072
4073 pm_buffer_append_byte(buffer, '}');
4074 break;
4075 }
4076 case PM_CALL_OR_WRITE_NODE: {
4077 pm_buffer_append_string(buffer, "{\"type\":\"CallOrWriteNode\",\"location\":", 37);
4078
4079 const pm_call_or_write_node_t *cast = (const pm_call_or_write_node_t *) node;
4080 pm_dump_json_location(buffer, &cast->base.location);
4081
4082 // Dump the CallNodeFlags field
4083 pm_buffer_append_byte(buffer, ',');
4084 pm_buffer_append_string(buffer, "\"CallNodeFlags\":", 16);
4085 size_t flags = 0;
4086 pm_buffer_append_byte(buffer, '[');
4087 if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_SAFE_NAVIGATION)) {
4088 if (flags != 0) pm_buffer_append_byte(buffer, ',');
4089 pm_buffer_append_string(buffer, "\"SAFE_NAVIGATION\"", 17);
4090 flags++;
4091 }
4092 if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_VARIABLE_CALL)) {
4093 if (flags != 0) pm_buffer_append_byte(buffer, ',');
4094 pm_buffer_append_string(buffer, "\"VARIABLE_CALL\"", 15);
4095 flags++;
4096 }
4097 if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_ATTRIBUTE_WRITE)) {
4098 if (flags != 0) pm_buffer_append_byte(buffer, ',');
4099 pm_buffer_append_string(buffer, "\"ATTRIBUTE_WRITE\"", 17);
4100 flags++;
4101 }
4102 if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_IGNORE_VISIBILITY)) {
4103 if (flags != 0) pm_buffer_append_byte(buffer, ',');
4104 pm_buffer_append_string(buffer, "\"IGNORE_VISIBILITY\"", 19);
4105 flags++;
4106 }
4107 pm_buffer_append_byte(buffer, ']');
4108
4109 // Dump the receiver field
4110 pm_buffer_append_byte(buffer, ',');
4111 pm_buffer_append_string(buffer, "\"receiver\":", 11);
4112 if (cast->receiver != NULL) {
4113 pm_dump_json(buffer, parser, (const pm_node_t *) cast->receiver);
4114 } else {
4115 pm_buffer_append_string(buffer, "null", 4);
4116 }
4117
4118 // Dump the call_operator_loc field
4119 pm_buffer_append_byte(buffer, ',');
4120 pm_buffer_append_string(buffer, "\"call_operator_loc\":", 20);
4121 if (cast->call_operator_loc.length != 0) {
4122 pm_dump_json_location(buffer, &cast->call_operator_loc);
4123 } else {
4124 pm_buffer_append_string(buffer, "null", 4);
4125 }
4126
4127 // Dump the message_loc field
4128 pm_buffer_append_byte(buffer, ',');
4129 pm_buffer_append_string(buffer, "\"message_loc\":", 14);
4130 if (cast->message_loc.length != 0) {
4131 pm_dump_json_location(buffer, &cast->message_loc);
4132 } else {
4133 pm_buffer_append_string(buffer, "null", 4);
4134 }
4135
4136 // Dump the read_name field
4137 pm_buffer_append_byte(buffer, ',');
4138 pm_buffer_append_string(buffer, "\"read_name\":", 12);
4139 pm_dump_json_constant(buffer, parser, cast->read_name);
4140
4141 // Dump the write_name field
4142 pm_buffer_append_byte(buffer, ',');
4143 pm_buffer_append_string(buffer, "\"write_name\":", 13);
4144 pm_dump_json_constant(buffer, parser, cast->write_name);
4145
4146 // Dump the operator_loc field
4147 pm_buffer_append_byte(buffer, ',');
4148 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
4149 pm_dump_json_location(buffer, &cast->operator_loc);
4150
4151 // Dump the value field
4152 pm_buffer_append_byte(buffer, ',');
4153 pm_buffer_append_string(buffer, "\"value\":", 8);
4154 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
4155
4156 pm_buffer_append_byte(buffer, '}');
4157 break;
4158 }
4159 case PM_CALL_TARGET_NODE: {
4160 pm_buffer_append_string(buffer, "{\"type\":\"CallTargetNode\",\"location\":", 36);
4161
4162 const pm_call_target_node_t *cast = (const pm_call_target_node_t *) node;
4163 pm_dump_json_location(buffer, &cast->base.location);
4164
4165 // Dump the CallNodeFlags field
4166 pm_buffer_append_byte(buffer, ',');
4167 pm_buffer_append_string(buffer, "\"CallNodeFlags\":", 16);
4168 size_t flags = 0;
4169 pm_buffer_append_byte(buffer, '[');
4170 if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_SAFE_NAVIGATION)) {
4171 if (flags != 0) pm_buffer_append_byte(buffer, ',');
4172 pm_buffer_append_string(buffer, "\"SAFE_NAVIGATION\"", 17);
4173 flags++;
4174 }
4175 if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_VARIABLE_CALL)) {
4176 if (flags != 0) pm_buffer_append_byte(buffer, ',');
4177 pm_buffer_append_string(buffer, "\"VARIABLE_CALL\"", 15);
4178 flags++;
4179 }
4180 if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_ATTRIBUTE_WRITE)) {
4181 if (flags != 0) pm_buffer_append_byte(buffer, ',');
4182 pm_buffer_append_string(buffer, "\"ATTRIBUTE_WRITE\"", 17);
4183 flags++;
4184 }
4185 if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_IGNORE_VISIBILITY)) {
4186 if (flags != 0) pm_buffer_append_byte(buffer, ',');
4187 pm_buffer_append_string(buffer, "\"IGNORE_VISIBILITY\"", 19);
4188 flags++;
4189 }
4190 pm_buffer_append_byte(buffer, ']');
4191
4192 // Dump the receiver field
4193 pm_buffer_append_byte(buffer, ',');
4194 pm_buffer_append_string(buffer, "\"receiver\":", 11);
4195 pm_dump_json(buffer, parser, (const pm_node_t *) cast->receiver);
4196
4197 // Dump the call_operator_loc field
4198 pm_buffer_append_byte(buffer, ',');
4199 pm_buffer_append_string(buffer, "\"call_operator_loc\":", 20);
4200 pm_dump_json_location(buffer, &cast->call_operator_loc);
4201
4202 // Dump the name field
4203 pm_buffer_append_byte(buffer, ',');
4204 pm_buffer_append_string(buffer, "\"name\":", 7);
4205 pm_dump_json_constant(buffer, parser, cast->name);
4206
4207 // Dump the message_loc field
4208 pm_buffer_append_byte(buffer, ',');
4209 pm_buffer_append_string(buffer, "\"message_loc\":", 14);
4210 pm_dump_json_location(buffer, &cast->message_loc);
4211
4212 pm_buffer_append_byte(buffer, '}');
4213 break;
4214 }
4215 case PM_CAPTURE_PATTERN_NODE: {
4216 pm_buffer_append_string(buffer, "{\"type\":\"CapturePatternNode\",\"location\":", 40);
4217
4218 const pm_capture_pattern_node_t *cast = (const pm_capture_pattern_node_t *) node;
4219 pm_dump_json_location(buffer, &cast->base.location);
4220
4221 // Dump the value field
4222 pm_buffer_append_byte(buffer, ',');
4223 pm_buffer_append_string(buffer, "\"value\":", 8);
4224 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
4225
4226 // Dump the target field
4227 pm_buffer_append_byte(buffer, ',');
4228 pm_buffer_append_string(buffer, "\"target\":", 9);
4229 pm_dump_json(buffer, parser, (const pm_node_t *) cast->target);
4230
4231 // Dump the operator_loc field
4232 pm_buffer_append_byte(buffer, ',');
4233 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
4234 pm_dump_json_location(buffer, &cast->operator_loc);
4235
4236 pm_buffer_append_byte(buffer, '}');
4237 break;
4238 }
4239 case PM_CASE_MATCH_NODE: {
4240 pm_buffer_append_string(buffer, "{\"type\":\"CaseMatchNode\",\"location\":", 35);
4241
4242 const pm_case_match_node_t *cast = (const pm_case_match_node_t *) node;
4243 pm_dump_json_location(buffer, &cast->base.location);
4244
4245 // Dump the predicate field
4246 pm_buffer_append_byte(buffer, ',');
4247 pm_buffer_append_string(buffer, "\"predicate\":", 12);
4248 if (cast->predicate != NULL) {
4249 pm_dump_json(buffer, parser, (const pm_node_t *) cast->predicate);
4250 } else {
4251 pm_buffer_append_string(buffer, "null", 4);
4252 }
4253
4254 // Dump the conditions field
4255 pm_buffer_append_byte(buffer, ',');
4256 pm_buffer_append_string(buffer, "\"conditions\":", 13);
4257 const pm_node_list_t *conditions = &cast->conditions;
4258 pm_buffer_append_byte(buffer, '[');
4259
4260 for (size_t index = 0; index < conditions->size; index++) {
4261 if (index != 0) pm_buffer_append_byte(buffer, ',');
4262 pm_dump_json(buffer, parser, conditions->nodes[index]);
4263 }
4264 pm_buffer_append_byte(buffer, ']');
4265
4266 // Dump the else_clause field
4267 pm_buffer_append_byte(buffer, ',');
4268 pm_buffer_append_string(buffer, "\"else_clause\":", 14);
4269 if (cast->else_clause != NULL) {
4270 pm_dump_json(buffer, parser, (const pm_node_t *) cast->else_clause);
4271 } else {
4272 pm_buffer_append_string(buffer, "null", 4);
4273 }
4274
4275 // Dump the case_keyword_loc field
4276 pm_buffer_append_byte(buffer, ',');
4277 pm_buffer_append_string(buffer, "\"case_keyword_loc\":", 19);
4278 pm_dump_json_location(buffer, &cast->case_keyword_loc);
4279
4280 // Dump the end_keyword_loc field
4281 pm_buffer_append_byte(buffer, ',');
4282 pm_buffer_append_string(buffer, "\"end_keyword_loc\":", 18);
4283 pm_dump_json_location(buffer, &cast->end_keyword_loc);
4284
4285 pm_buffer_append_byte(buffer, '}');
4286 break;
4287 }
4288 case PM_CASE_NODE: {
4289 pm_buffer_append_string(buffer, "{\"type\":\"CaseNode\",\"location\":", 30);
4290
4291 const pm_case_node_t *cast = (const pm_case_node_t *) node;
4292 pm_dump_json_location(buffer, &cast->base.location);
4293
4294 // Dump the predicate field
4295 pm_buffer_append_byte(buffer, ',');
4296 pm_buffer_append_string(buffer, "\"predicate\":", 12);
4297 if (cast->predicate != NULL) {
4298 pm_dump_json(buffer, parser, (const pm_node_t *) cast->predicate);
4299 } else {
4300 pm_buffer_append_string(buffer, "null", 4);
4301 }
4302
4303 // Dump the conditions field
4304 pm_buffer_append_byte(buffer, ',');
4305 pm_buffer_append_string(buffer, "\"conditions\":", 13);
4306 const pm_node_list_t *conditions = &cast->conditions;
4307 pm_buffer_append_byte(buffer, '[');
4308
4309 for (size_t index = 0; index < conditions->size; index++) {
4310 if (index != 0) pm_buffer_append_byte(buffer, ',');
4311 pm_dump_json(buffer, parser, conditions->nodes[index]);
4312 }
4313 pm_buffer_append_byte(buffer, ']');
4314
4315 // Dump the else_clause field
4316 pm_buffer_append_byte(buffer, ',');
4317 pm_buffer_append_string(buffer, "\"else_clause\":", 14);
4318 if (cast->else_clause != NULL) {
4319 pm_dump_json(buffer, parser, (const pm_node_t *) cast->else_clause);
4320 } else {
4321 pm_buffer_append_string(buffer, "null", 4);
4322 }
4323
4324 // Dump the case_keyword_loc field
4325 pm_buffer_append_byte(buffer, ',');
4326 pm_buffer_append_string(buffer, "\"case_keyword_loc\":", 19);
4327 pm_dump_json_location(buffer, &cast->case_keyword_loc);
4328
4329 // Dump the end_keyword_loc field
4330 pm_buffer_append_byte(buffer, ',');
4331 pm_buffer_append_string(buffer, "\"end_keyword_loc\":", 18);
4332 pm_dump_json_location(buffer, &cast->end_keyword_loc);
4333
4334 pm_buffer_append_byte(buffer, '}');
4335 break;
4336 }
4337 case PM_CLASS_NODE: {
4338 pm_buffer_append_string(buffer, "{\"type\":\"ClassNode\",\"location\":", 31);
4339
4340 const pm_class_node_t *cast = (const pm_class_node_t *) node;
4341 pm_dump_json_location(buffer, &cast->base.location);
4342
4343 // Dump the locals field
4344 pm_buffer_append_byte(buffer, ',');
4345 pm_buffer_append_string(buffer, "\"locals\":", 9);
4346 const pm_constant_id_list_t *locals = &cast->locals;
4347 pm_buffer_append_byte(buffer, '[');
4348
4349 for (size_t index = 0; index < locals->size; index++) {
4350 if (index != 0) pm_buffer_append_byte(buffer, ',');
4351 pm_dump_json_constant(buffer, parser, locals->ids[index]);
4352 }
4353 pm_buffer_append_byte(buffer, ']');
4354
4355 // Dump the class_keyword_loc field
4356 pm_buffer_append_byte(buffer, ',');
4357 pm_buffer_append_string(buffer, "\"class_keyword_loc\":", 20);
4358 pm_dump_json_location(buffer, &cast->class_keyword_loc);
4359
4360 // Dump the constant_path field
4361 pm_buffer_append_byte(buffer, ',');
4362 pm_buffer_append_string(buffer, "\"constant_path\":", 16);
4363 pm_dump_json(buffer, parser, (const pm_node_t *) cast->constant_path);
4364
4365 // Dump the inheritance_operator_loc field
4366 pm_buffer_append_byte(buffer, ',');
4367 pm_buffer_append_string(buffer, "\"inheritance_operator_loc\":", 27);
4368 if (cast->inheritance_operator_loc.length != 0) {
4369 pm_dump_json_location(buffer, &cast->inheritance_operator_loc);
4370 } else {
4371 pm_buffer_append_string(buffer, "null", 4);
4372 }
4373
4374 // Dump the superclass field
4375 pm_buffer_append_byte(buffer, ',');
4376 pm_buffer_append_string(buffer, "\"superclass\":", 13);
4377 if (cast->superclass != NULL) {
4378 pm_dump_json(buffer, parser, (const pm_node_t *) cast->superclass);
4379 } else {
4380 pm_buffer_append_string(buffer, "null", 4);
4381 }
4382
4383 // Dump the body field
4384 pm_buffer_append_byte(buffer, ',');
4385 pm_buffer_append_string(buffer, "\"body\":", 7);
4386 if (cast->body != NULL) {
4387 pm_dump_json(buffer, parser, (const pm_node_t *) cast->body);
4388 } else {
4389 pm_buffer_append_string(buffer, "null", 4);
4390 }
4391
4392 // Dump the end_keyword_loc field
4393 pm_buffer_append_byte(buffer, ',');
4394 pm_buffer_append_string(buffer, "\"end_keyword_loc\":", 18);
4395 pm_dump_json_location(buffer, &cast->end_keyword_loc);
4396
4397 // Dump the name field
4398 pm_buffer_append_byte(buffer, ',');
4399 pm_buffer_append_string(buffer, "\"name\":", 7);
4400 pm_dump_json_constant(buffer, parser, cast->name);
4401
4402 pm_buffer_append_byte(buffer, '}');
4403 break;
4404 }
4405 case PM_CLASS_VARIABLE_AND_WRITE_NODE: {
4406 pm_buffer_append_string(buffer, "{\"type\":\"ClassVariableAndWriteNode\",\"location\":", 47);
4407
4409 pm_dump_json_location(buffer, &cast->base.location);
4410
4411 // Dump the name field
4412 pm_buffer_append_byte(buffer, ',');
4413 pm_buffer_append_string(buffer, "\"name\":", 7);
4414 pm_dump_json_constant(buffer, parser, cast->name);
4415
4416 // Dump the name_loc field
4417 pm_buffer_append_byte(buffer, ',');
4418 pm_buffer_append_string(buffer, "\"name_loc\":", 11);
4419 pm_dump_json_location(buffer, &cast->name_loc);
4420
4421 // Dump the operator_loc field
4422 pm_buffer_append_byte(buffer, ',');
4423 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
4424 pm_dump_json_location(buffer, &cast->operator_loc);
4425
4426 // Dump the value field
4427 pm_buffer_append_byte(buffer, ',');
4428 pm_buffer_append_string(buffer, "\"value\":", 8);
4429 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
4430
4431 pm_buffer_append_byte(buffer, '}');
4432 break;
4433 }
4434 case PM_CLASS_VARIABLE_OPERATOR_WRITE_NODE: {
4435 pm_buffer_append_string(buffer, "{\"type\":\"ClassVariableOperatorWriteNode\",\"location\":", 52);
4436
4438 pm_dump_json_location(buffer, &cast->base.location);
4439
4440 // Dump the name field
4441 pm_buffer_append_byte(buffer, ',');
4442 pm_buffer_append_string(buffer, "\"name\":", 7);
4443 pm_dump_json_constant(buffer, parser, cast->name);
4444
4445 // Dump the name_loc field
4446 pm_buffer_append_byte(buffer, ',');
4447 pm_buffer_append_string(buffer, "\"name_loc\":", 11);
4448 pm_dump_json_location(buffer, &cast->name_loc);
4449
4450 // Dump the binary_operator_loc field
4451 pm_buffer_append_byte(buffer, ',');
4452 pm_buffer_append_string(buffer, "\"binary_operator_loc\":", 22);
4453 pm_dump_json_location(buffer, &cast->binary_operator_loc);
4454
4455 // Dump the value field
4456 pm_buffer_append_byte(buffer, ',');
4457 pm_buffer_append_string(buffer, "\"value\":", 8);
4458 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
4459
4460 // Dump the binary_operator field
4461 pm_buffer_append_byte(buffer, ',');
4462 pm_buffer_append_string(buffer, "\"binary_operator\":", 18);
4463 pm_dump_json_constant(buffer, parser, cast->binary_operator);
4464
4465 pm_buffer_append_byte(buffer, '}');
4466 break;
4467 }
4468 case PM_CLASS_VARIABLE_OR_WRITE_NODE: {
4469 pm_buffer_append_string(buffer, "{\"type\":\"ClassVariableOrWriteNode\",\"location\":", 46);
4470
4472 pm_dump_json_location(buffer, &cast->base.location);
4473
4474 // Dump the name field
4475 pm_buffer_append_byte(buffer, ',');
4476 pm_buffer_append_string(buffer, "\"name\":", 7);
4477 pm_dump_json_constant(buffer, parser, cast->name);
4478
4479 // Dump the name_loc field
4480 pm_buffer_append_byte(buffer, ',');
4481 pm_buffer_append_string(buffer, "\"name_loc\":", 11);
4482 pm_dump_json_location(buffer, &cast->name_loc);
4483
4484 // Dump the operator_loc field
4485 pm_buffer_append_byte(buffer, ',');
4486 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
4487 pm_dump_json_location(buffer, &cast->operator_loc);
4488
4489 // Dump the value field
4490 pm_buffer_append_byte(buffer, ',');
4491 pm_buffer_append_string(buffer, "\"value\":", 8);
4492 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
4493
4494 pm_buffer_append_byte(buffer, '}');
4495 break;
4496 }
4497 case PM_CLASS_VARIABLE_READ_NODE: {
4498 pm_buffer_append_string(buffer, "{\"type\":\"ClassVariableReadNode\",\"location\":", 43);
4499
4501 pm_dump_json_location(buffer, &cast->base.location);
4502
4503 // Dump the name field
4504 pm_buffer_append_byte(buffer, ',');
4505 pm_buffer_append_string(buffer, "\"name\":", 7);
4506 pm_dump_json_constant(buffer, parser, cast->name);
4507
4508 pm_buffer_append_byte(buffer, '}');
4509 break;
4510 }
4511 case PM_CLASS_VARIABLE_TARGET_NODE: {
4512 pm_buffer_append_string(buffer, "{\"type\":\"ClassVariableTargetNode\",\"location\":", 45);
4513
4515 pm_dump_json_location(buffer, &cast->base.location);
4516
4517 // Dump the name field
4518 pm_buffer_append_byte(buffer, ',');
4519 pm_buffer_append_string(buffer, "\"name\":", 7);
4520 pm_dump_json_constant(buffer, parser, cast->name);
4521
4522 pm_buffer_append_byte(buffer, '}');
4523 break;
4524 }
4525 case PM_CLASS_VARIABLE_WRITE_NODE: {
4526 pm_buffer_append_string(buffer, "{\"type\":\"ClassVariableWriteNode\",\"location\":", 44);
4527
4529 pm_dump_json_location(buffer, &cast->base.location);
4530
4531 // Dump the name field
4532 pm_buffer_append_byte(buffer, ',');
4533 pm_buffer_append_string(buffer, "\"name\":", 7);
4534 pm_dump_json_constant(buffer, parser, cast->name);
4535
4536 // Dump the name_loc field
4537 pm_buffer_append_byte(buffer, ',');
4538 pm_buffer_append_string(buffer, "\"name_loc\":", 11);
4539 pm_dump_json_location(buffer, &cast->name_loc);
4540
4541 // Dump the value field
4542 pm_buffer_append_byte(buffer, ',');
4543 pm_buffer_append_string(buffer, "\"value\":", 8);
4544 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
4545
4546 // Dump the operator_loc field
4547 pm_buffer_append_byte(buffer, ',');
4548 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
4549 pm_dump_json_location(buffer, &cast->operator_loc);
4550
4551 pm_buffer_append_byte(buffer, '}');
4552 break;
4553 }
4554 case PM_CONSTANT_AND_WRITE_NODE: {
4555 pm_buffer_append_string(buffer, "{\"type\":\"ConstantAndWriteNode\",\"location\":", 42);
4556
4558 pm_dump_json_location(buffer, &cast->base.location);
4559
4560 // Dump the name field
4561 pm_buffer_append_byte(buffer, ',');
4562 pm_buffer_append_string(buffer, "\"name\":", 7);
4563 pm_dump_json_constant(buffer, parser, cast->name);
4564
4565 // Dump the name_loc field
4566 pm_buffer_append_byte(buffer, ',');
4567 pm_buffer_append_string(buffer, "\"name_loc\":", 11);
4568 pm_dump_json_location(buffer, &cast->name_loc);
4569
4570 // Dump the operator_loc field
4571 pm_buffer_append_byte(buffer, ',');
4572 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
4573 pm_dump_json_location(buffer, &cast->operator_loc);
4574
4575 // Dump the value field
4576 pm_buffer_append_byte(buffer, ',');
4577 pm_buffer_append_string(buffer, "\"value\":", 8);
4578 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
4579
4580 pm_buffer_append_byte(buffer, '}');
4581 break;
4582 }
4583 case PM_CONSTANT_OPERATOR_WRITE_NODE: {
4584 pm_buffer_append_string(buffer, "{\"type\":\"ConstantOperatorWriteNode\",\"location\":", 47);
4585
4587 pm_dump_json_location(buffer, &cast->base.location);
4588
4589 // Dump the name field
4590 pm_buffer_append_byte(buffer, ',');
4591 pm_buffer_append_string(buffer, "\"name\":", 7);
4592 pm_dump_json_constant(buffer, parser, cast->name);
4593
4594 // Dump the name_loc field
4595 pm_buffer_append_byte(buffer, ',');
4596 pm_buffer_append_string(buffer, "\"name_loc\":", 11);
4597 pm_dump_json_location(buffer, &cast->name_loc);
4598
4599 // Dump the binary_operator_loc field
4600 pm_buffer_append_byte(buffer, ',');
4601 pm_buffer_append_string(buffer, "\"binary_operator_loc\":", 22);
4602 pm_dump_json_location(buffer, &cast->binary_operator_loc);
4603
4604 // Dump the value field
4605 pm_buffer_append_byte(buffer, ',');
4606 pm_buffer_append_string(buffer, "\"value\":", 8);
4607 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
4608
4609 // Dump the binary_operator field
4610 pm_buffer_append_byte(buffer, ',');
4611 pm_buffer_append_string(buffer, "\"binary_operator\":", 18);
4612 pm_dump_json_constant(buffer, parser, cast->binary_operator);
4613
4614 pm_buffer_append_byte(buffer, '}');
4615 break;
4616 }
4617 case PM_CONSTANT_OR_WRITE_NODE: {
4618 pm_buffer_append_string(buffer, "{\"type\":\"ConstantOrWriteNode\",\"location\":", 41);
4619
4620 const pm_constant_or_write_node_t *cast = (const pm_constant_or_write_node_t *) node;
4621 pm_dump_json_location(buffer, &cast->base.location);
4622
4623 // Dump the name field
4624 pm_buffer_append_byte(buffer, ',');
4625 pm_buffer_append_string(buffer, "\"name\":", 7);
4626 pm_dump_json_constant(buffer, parser, cast->name);
4627
4628 // Dump the name_loc field
4629 pm_buffer_append_byte(buffer, ',');
4630 pm_buffer_append_string(buffer, "\"name_loc\":", 11);
4631 pm_dump_json_location(buffer, &cast->name_loc);
4632
4633 // Dump the operator_loc field
4634 pm_buffer_append_byte(buffer, ',');
4635 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
4636 pm_dump_json_location(buffer, &cast->operator_loc);
4637
4638 // Dump the value field
4639 pm_buffer_append_byte(buffer, ',');
4640 pm_buffer_append_string(buffer, "\"value\":", 8);
4641 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
4642
4643 pm_buffer_append_byte(buffer, '}');
4644 break;
4645 }
4646 case PM_CONSTANT_PATH_AND_WRITE_NODE: {
4647 pm_buffer_append_string(buffer, "{\"type\":\"ConstantPathAndWriteNode\",\"location\":", 46);
4648
4650 pm_dump_json_location(buffer, &cast->base.location);
4651
4652 // Dump the target field
4653 pm_buffer_append_byte(buffer, ',');
4654 pm_buffer_append_string(buffer, "\"target\":", 9);
4655 pm_dump_json(buffer, parser, (const pm_node_t *) cast->target);
4656
4657 // Dump the operator_loc field
4658 pm_buffer_append_byte(buffer, ',');
4659 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
4660 pm_dump_json_location(buffer, &cast->operator_loc);
4661
4662 // Dump the value field
4663 pm_buffer_append_byte(buffer, ',');
4664 pm_buffer_append_string(buffer, "\"value\":", 8);
4665 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
4666
4667 pm_buffer_append_byte(buffer, '}');
4668 break;
4669 }
4670 case PM_CONSTANT_PATH_NODE: {
4671 pm_buffer_append_string(buffer, "{\"type\":\"ConstantPathNode\",\"location\":", 38);
4672
4673 const pm_constant_path_node_t *cast = (const pm_constant_path_node_t *) node;
4674 pm_dump_json_location(buffer, &cast->base.location);
4675
4676 // Dump the parent field
4677 pm_buffer_append_byte(buffer, ',');
4678 pm_buffer_append_string(buffer, "\"parent\":", 9);
4679 if (cast->parent != NULL) {
4680 pm_dump_json(buffer, parser, (const pm_node_t *) cast->parent);
4681 } else {
4682 pm_buffer_append_string(buffer, "null", 4);
4683 }
4684
4685 // Dump the name field
4686 pm_buffer_append_byte(buffer, ',');
4687 pm_buffer_append_string(buffer, "\"name\":", 7);
4688 if (cast->name != PM_CONSTANT_ID_UNSET) {
4689 pm_dump_json_constant(buffer, parser, cast->name);
4690 } else {
4691 pm_buffer_append_string(buffer, "null", 4);
4692 }
4693
4694 // Dump the delimiter_loc field
4695 pm_buffer_append_byte(buffer, ',');
4696 pm_buffer_append_string(buffer, "\"delimiter_loc\":", 16);
4697 pm_dump_json_location(buffer, &cast->delimiter_loc);
4698
4699 // Dump the name_loc field
4700 pm_buffer_append_byte(buffer, ',');
4701 pm_buffer_append_string(buffer, "\"name_loc\":", 11);
4702 pm_dump_json_location(buffer, &cast->name_loc);
4703
4704 pm_buffer_append_byte(buffer, '}');
4705 break;
4706 }
4707 case PM_CONSTANT_PATH_OPERATOR_WRITE_NODE: {
4708 pm_buffer_append_string(buffer, "{\"type\":\"ConstantPathOperatorWriteNode\",\"location\":", 51);
4709
4711 pm_dump_json_location(buffer, &cast->base.location);
4712
4713 // Dump the target field
4714 pm_buffer_append_byte(buffer, ',');
4715 pm_buffer_append_string(buffer, "\"target\":", 9);
4716 pm_dump_json(buffer, parser, (const pm_node_t *) cast->target);
4717
4718 // Dump the binary_operator_loc field
4719 pm_buffer_append_byte(buffer, ',');
4720 pm_buffer_append_string(buffer, "\"binary_operator_loc\":", 22);
4721 pm_dump_json_location(buffer, &cast->binary_operator_loc);
4722
4723 // Dump the value field
4724 pm_buffer_append_byte(buffer, ',');
4725 pm_buffer_append_string(buffer, "\"value\":", 8);
4726 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
4727
4728 // Dump the binary_operator field
4729 pm_buffer_append_byte(buffer, ',');
4730 pm_buffer_append_string(buffer, "\"binary_operator\":", 18);
4731 pm_dump_json_constant(buffer, parser, cast->binary_operator);
4732
4733 pm_buffer_append_byte(buffer, '}');
4734 break;
4735 }
4736 case PM_CONSTANT_PATH_OR_WRITE_NODE: {
4737 pm_buffer_append_string(buffer, "{\"type\":\"ConstantPathOrWriteNode\",\"location\":", 45);
4738
4740 pm_dump_json_location(buffer, &cast->base.location);
4741
4742 // Dump the target field
4743 pm_buffer_append_byte(buffer, ',');
4744 pm_buffer_append_string(buffer, "\"target\":", 9);
4745 pm_dump_json(buffer, parser, (const pm_node_t *) cast->target);
4746
4747 // Dump the operator_loc field
4748 pm_buffer_append_byte(buffer, ',');
4749 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
4750 pm_dump_json_location(buffer, &cast->operator_loc);
4751
4752 // Dump the value field
4753 pm_buffer_append_byte(buffer, ',');
4754 pm_buffer_append_string(buffer, "\"value\":", 8);
4755 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
4756
4757 pm_buffer_append_byte(buffer, '}');
4758 break;
4759 }
4760 case PM_CONSTANT_PATH_TARGET_NODE: {
4761 pm_buffer_append_string(buffer, "{\"type\":\"ConstantPathTargetNode\",\"location\":", 44);
4762
4764 pm_dump_json_location(buffer, &cast->base.location);
4765
4766 // Dump the parent field
4767 pm_buffer_append_byte(buffer, ',');
4768 pm_buffer_append_string(buffer, "\"parent\":", 9);
4769 if (cast->parent != NULL) {
4770 pm_dump_json(buffer, parser, (const pm_node_t *) cast->parent);
4771 } else {
4772 pm_buffer_append_string(buffer, "null", 4);
4773 }
4774
4775 // Dump the name field
4776 pm_buffer_append_byte(buffer, ',');
4777 pm_buffer_append_string(buffer, "\"name\":", 7);
4778 if (cast->name != PM_CONSTANT_ID_UNSET) {
4779 pm_dump_json_constant(buffer, parser, cast->name);
4780 } else {
4781 pm_buffer_append_string(buffer, "null", 4);
4782 }
4783
4784 // Dump the delimiter_loc field
4785 pm_buffer_append_byte(buffer, ',');
4786 pm_buffer_append_string(buffer, "\"delimiter_loc\":", 16);
4787 pm_dump_json_location(buffer, &cast->delimiter_loc);
4788
4789 // Dump the name_loc field
4790 pm_buffer_append_byte(buffer, ',');
4791 pm_buffer_append_string(buffer, "\"name_loc\":", 11);
4792 pm_dump_json_location(buffer, &cast->name_loc);
4793
4794 pm_buffer_append_byte(buffer, '}');
4795 break;
4796 }
4797 case PM_CONSTANT_PATH_WRITE_NODE: {
4798 pm_buffer_append_string(buffer, "{\"type\":\"ConstantPathWriteNode\",\"location\":", 43);
4799
4801 pm_dump_json_location(buffer, &cast->base.location);
4802
4803 // Dump the target field
4804 pm_buffer_append_byte(buffer, ',');
4805 pm_buffer_append_string(buffer, "\"target\":", 9);
4806 pm_dump_json(buffer, parser, (const pm_node_t *) cast->target);
4807
4808 // Dump the operator_loc field
4809 pm_buffer_append_byte(buffer, ',');
4810 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
4811 pm_dump_json_location(buffer, &cast->operator_loc);
4812
4813 // Dump the value field
4814 pm_buffer_append_byte(buffer, ',');
4815 pm_buffer_append_string(buffer, "\"value\":", 8);
4816 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
4817
4818 pm_buffer_append_byte(buffer, '}');
4819 break;
4820 }
4821 case PM_CONSTANT_READ_NODE: {
4822 pm_buffer_append_string(buffer, "{\"type\":\"ConstantReadNode\",\"location\":", 38);
4823
4824 const pm_constant_read_node_t *cast = (const pm_constant_read_node_t *) node;
4825 pm_dump_json_location(buffer, &cast->base.location);
4826
4827 // Dump the name field
4828 pm_buffer_append_byte(buffer, ',');
4829 pm_buffer_append_string(buffer, "\"name\":", 7);
4830 pm_dump_json_constant(buffer, parser, cast->name);
4831
4832 pm_buffer_append_byte(buffer, '}');
4833 break;
4834 }
4835 case PM_CONSTANT_TARGET_NODE: {
4836 pm_buffer_append_string(buffer, "{\"type\":\"ConstantTargetNode\",\"location\":", 40);
4837
4838 const pm_constant_target_node_t *cast = (const pm_constant_target_node_t *) node;
4839 pm_dump_json_location(buffer, &cast->base.location);
4840
4841 // Dump the name field
4842 pm_buffer_append_byte(buffer, ',');
4843 pm_buffer_append_string(buffer, "\"name\":", 7);
4844 pm_dump_json_constant(buffer, parser, cast->name);
4845
4846 pm_buffer_append_byte(buffer, '}');
4847 break;
4848 }
4849 case PM_CONSTANT_WRITE_NODE: {
4850 pm_buffer_append_string(buffer, "{\"type\":\"ConstantWriteNode\",\"location\":", 39);
4851
4852 const pm_constant_write_node_t *cast = (const pm_constant_write_node_t *) node;
4853 pm_dump_json_location(buffer, &cast->base.location);
4854
4855 // Dump the name field
4856 pm_buffer_append_byte(buffer, ',');
4857 pm_buffer_append_string(buffer, "\"name\":", 7);
4858 pm_dump_json_constant(buffer, parser, cast->name);
4859
4860 // Dump the name_loc field
4861 pm_buffer_append_byte(buffer, ',');
4862 pm_buffer_append_string(buffer, "\"name_loc\":", 11);
4863 pm_dump_json_location(buffer, &cast->name_loc);
4864
4865 // Dump the value field
4866 pm_buffer_append_byte(buffer, ',');
4867 pm_buffer_append_string(buffer, "\"value\":", 8);
4868 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
4869
4870 // Dump the operator_loc field
4871 pm_buffer_append_byte(buffer, ',');
4872 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
4873 pm_dump_json_location(buffer, &cast->operator_loc);
4874
4875 pm_buffer_append_byte(buffer, '}');
4876 break;
4877 }
4878 case PM_DEF_NODE: {
4879 pm_buffer_append_string(buffer, "{\"type\":\"DefNode\",\"location\":", 29);
4880
4881 const pm_def_node_t *cast = (const pm_def_node_t *) node;
4882 pm_dump_json_location(buffer, &cast->base.location);
4883
4884 // Dump the name field
4885 pm_buffer_append_byte(buffer, ',');
4886 pm_buffer_append_string(buffer, "\"name\":", 7);
4887 pm_dump_json_constant(buffer, parser, cast->name);
4888
4889 // Dump the name_loc field
4890 pm_buffer_append_byte(buffer, ',');
4891 pm_buffer_append_string(buffer, "\"name_loc\":", 11);
4892 pm_dump_json_location(buffer, &cast->name_loc);
4893
4894 // Dump the receiver field
4895 pm_buffer_append_byte(buffer, ',');
4896 pm_buffer_append_string(buffer, "\"receiver\":", 11);
4897 if (cast->receiver != NULL) {
4898 pm_dump_json(buffer, parser, (const pm_node_t *) cast->receiver);
4899 } else {
4900 pm_buffer_append_string(buffer, "null", 4);
4901 }
4902
4903 // Dump the parameters field
4904 pm_buffer_append_byte(buffer, ',');
4905 pm_buffer_append_string(buffer, "\"parameters\":", 13);
4906 if (cast->parameters != NULL) {
4907 pm_dump_json(buffer, parser, (const pm_node_t *) cast->parameters);
4908 } else {
4909 pm_buffer_append_string(buffer, "null", 4);
4910 }
4911
4912 // Dump the body field
4913 pm_buffer_append_byte(buffer, ',');
4914 pm_buffer_append_string(buffer, "\"body\":", 7);
4915 if (cast->body != NULL) {
4916 pm_dump_json(buffer, parser, (const pm_node_t *) cast->body);
4917 } else {
4918 pm_buffer_append_string(buffer, "null", 4);
4919 }
4920
4921 // Dump the locals field
4922 pm_buffer_append_byte(buffer, ',');
4923 pm_buffer_append_string(buffer, "\"locals\":", 9);
4924 const pm_constant_id_list_t *locals = &cast->locals;
4925 pm_buffer_append_byte(buffer, '[');
4926
4927 for (size_t index = 0; index < locals->size; index++) {
4928 if (index != 0) pm_buffer_append_byte(buffer, ',');
4929 pm_dump_json_constant(buffer, parser, locals->ids[index]);
4930 }
4931 pm_buffer_append_byte(buffer, ']');
4932
4933 // Dump the def_keyword_loc field
4934 pm_buffer_append_byte(buffer, ',');
4935 pm_buffer_append_string(buffer, "\"def_keyword_loc\":", 18);
4936 pm_dump_json_location(buffer, &cast->def_keyword_loc);
4937
4938 // Dump the operator_loc field
4939 pm_buffer_append_byte(buffer, ',');
4940 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
4941 if (cast->operator_loc.length != 0) {
4942 pm_dump_json_location(buffer, &cast->operator_loc);
4943 } else {
4944 pm_buffer_append_string(buffer, "null", 4);
4945 }
4946
4947 // Dump the lparen_loc field
4948 pm_buffer_append_byte(buffer, ',');
4949 pm_buffer_append_string(buffer, "\"lparen_loc\":", 13);
4950 if (cast->lparen_loc.length != 0) {
4951 pm_dump_json_location(buffer, &cast->lparen_loc);
4952 } else {
4953 pm_buffer_append_string(buffer, "null", 4);
4954 }
4955
4956 // Dump the rparen_loc field
4957 pm_buffer_append_byte(buffer, ',');
4958 pm_buffer_append_string(buffer, "\"rparen_loc\":", 13);
4959 if (cast->rparen_loc.length != 0) {
4960 pm_dump_json_location(buffer, &cast->rparen_loc);
4961 } else {
4962 pm_buffer_append_string(buffer, "null", 4);
4963 }
4964
4965 // Dump the equal_loc field
4966 pm_buffer_append_byte(buffer, ',');
4967 pm_buffer_append_string(buffer, "\"equal_loc\":", 12);
4968 if (cast->equal_loc.length != 0) {
4969 pm_dump_json_location(buffer, &cast->equal_loc);
4970 } else {
4971 pm_buffer_append_string(buffer, "null", 4);
4972 }
4973
4974 // Dump the end_keyword_loc field
4975 pm_buffer_append_byte(buffer, ',');
4976 pm_buffer_append_string(buffer, "\"end_keyword_loc\":", 18);
4977 if (cast->end_keyword_loc.length != 0) {
4978 pm_dump_json_location(buffer, &cast->end_keyword_loc);
4979 } else {
4980 pm_buffer_append_string(buffer, "null", 4);
4981 }
4982
4983 pm_buffer_append_byte(buffer, '}');
4984 break;
4985 }
4986 case PM_DEFINED_NODE: {
4987 pm_buffer_append_string(buffer, "{\"type\":\"DefinedNode\",\"location\":", 33);
4988
4989 const pm_defined_node_t *cast = (const pm_defined_node_t *) node;
4990 pm_dump_json_location(buffer, &cast->base.location);
4991
4992 // Dump the lparen_loc field
4993 pm_buffer_append_byte(buffer, ',');
4994 pm_buffer_append_string(buffer, "\"lparen_loc\":", 13);
4995 if (cast->lparen_loc.length != 0) {
4996 pm_dump_json_location(buffer, &cast->lparen_loc);
4997 } else {
4998 pm_buffer_append_string(buffer, "null", 4);
4999 }
5000
5001 // Dump the value field
5002 pm_buffer_append_byte(buffer, ',');
5003 pm_buffer_append_string(buffer, "\"value\":", 8);
5004 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
5005
5006 // Dump the rparen_loc field
5007 pm_buffer_append_byte(buffer, ',');
5008 pm_buffer_append_string(buffer, "\"rparen_loc\":", 13);
5009 if (cast->rparen_loc.length != 0) {
5010 pm_dump_json_location(buffer, &cast->rparen_loc);
5011 } else {
5012 pm_buffer_append_string(buffer, "null", 4);
5013 }
5014
5015 // Dump the keyword_loc field
5016 pm_buffer_append_byte(buffer, ',');
5017 pm_buffer_append_string(buffer, "\"keyword_loc\":", 14);
5018 pm_dump_json_location(buffer, &cast->keyword_loc);
5019
5020 pm_buffer_append_byte(buffer, '}');
5021 break;
5022 }
5023 case PM_ELSE_NODE: {
5024 pm_buffer_append_string(buffer, "{\"type\":\"ElseNode\",\"location\":", 30);
5025
5026 const pm_else_node_t *cast = (const pm_else_node_t *) node;
5027 pm_dump_json_location(buffer, &cast->base.location);
5028
5029 // Dump the else_keyword_loc field
5030 pm_buffer_append_byte(buffer, ',');
5031 pm_buffer_append_string(buffer, "\"else_keyword_loc\":", 19);
5032 pm_dump_json_location(buffer, &cast->else_keyword_loc);
5033
5034 // Dump the statements field
5035 pm_buffer_append_byte(buffer, ',');
5036 pm_buffer_append_string(buffer, "\"statements\":", 13);
5037 if (cast->statements != NULL) {
5038 pm_dump_json(buffer, parser, (const pm_node_t *) cast->statements);
5039 } else {
5040 pm_buffer_append_string(buffer, "null", 4);
5041 }
5042
5043 // Dump the end_keyword_loc field
5044 pm_buffer_append_byte(buffer, ',');
5045 pm_buffer_append_string(buffer, "\"end_keyword_loc\":", 18);
5046 if (cast->end_keyword_loc.length != 0) {
5047 pm_dump_json_location(buffer, &cast->end_keyword_loc);
5048 } else {
5049 pm_buffer_append_string(buffer, "null", 4);
5050 }
5051
5052 pm_buffer_append_byte(buffer, '}');
5053 break;
5054 }
5055 case PM_EMBEDDED_STATEMENTS_NODE: {
5056 pm_buffer_append_string(buffer, "{\"type\":\"EmbeddedStatementsNode\",\"location\":", 44);
5057
5059 pm_dump_json_location(buffer, &cast->base.location);
5060
5061 // Dump the opening_loc field
5062 pm_buffer_append_byte(buffer, ',');
5063 pm_buffer_append_string(buffer, "\"opening_loc\":", 14);
5064 pm_dump_json_location(buffer, &cast->opening_loc);
5065
5066 // Dump the statements field
5067 pm_buffer_append_byte(buffer, ',');
5068 pm_buffer_append_string(buffer, "\"statements\":", 13);
5069 if (cast->statements != NULL) {
5070 pm_dump_json(buffer, parser, (const pm_node_t *) cast->statements);
5071 } else {
5072 pm_buffer_append_string(buffer, "null", 4);
5073 }
5074
5075 // Dump the closing_loc field
5076 pm_buffer_append_byte(buffer, ',');
5077 pm_buffer_append_string(buffer, "\"closing_loc\":", 14);
5078 pm_dump_json_location(buffer, &cast->closing_loc);
5079
5080 pm_buffer_append_byte(buffer, '}');
5081 break;
5082 }
5083 case PM_EMBEDDED_VARIABLE_NODE: {
5084 pm_buffer_append_string(buffer, "{\"type\":\"EmbeddedVariableNode\",\"location\":", 42);
5085
5086 const pm_embedded_variable_node_t *cast = (const pm_embedded_variable_node_t *) node;
5087 pm_dump_json_location(buffer, &cast->base.location);
5088
5089 // Dump the operator_loc field
5090 pm_buffer_append_byte(buffer, ',');
5091 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
5092 pm_dump_json_location(buffer, &cast->operator_loc);
5093
5094 // Dump the variable field
5095 pm_buffer_append_byte(buffer, ',');
5096 pm_buffer_append_string(buffer, "\"variable\":", 11);
5097 pm_dump_json(buffer, parser, (const pm_node_t *) cast->variable);
5098
5099 pm_buffer_append_byte(buffer, '}');
5100 break;
5101 }
5102 case PM_ENSURE_NODE: {
5103 pm_buffer_append_string(buffer, "{\"type\":\"EnsureNode\",\"location\":", 32);
5104
5105 const pm_ensure_node_t *cast = (const pm_ensure_node_t *) node;
5106 pm_dump_json_location(buffer, &cast->base.location);
5107
5108 // Dump the ensure_keyword_loc field
5109 pm_buffer_append_byte(buffer, ',');
5110 pm_buffer_append_string(buffer, "\"ensure_keyword_loc\":", 21);
5111 pm_dump_json_location(buffer, &cast->ensure_keyword_loc);
5112
5113 // Dump the statements field
5114 pm_buffer_append_byte(buffer, ',');
5115 pm_buffer_append_string(buffer, "\"statements\":", 13);
5116 if (cast->statements != NULL) {
5117 pm_dump_json(buffer, parser, (const pm_node_t *) cast->statements);
5118 } else {
5119 pm_buffer_append_string(buffer, "null", 4);
5120 }
5121
5122 // Dump the end_keyword_loc field
5123 pm_buffer_append_byte(buffer, ',');
5124 pm_buffer_append_string(buffer, "\"end_keyword_loc\":", 18);
5125 pm_dump_json_location(buffer, &cast->end_keyword_loc);
5126
5127 pm_buffer_append_byte(buffer, '}');
5128 break;
5129 }
5130 case PM_FALSE_NODE: {
5131 pm_buffer_append_string(buffer, "{\"type\":\"FalseNode\",\"location\":", 31);
5132
5133 const pm_false_node_t *cast = (const pm_false_node_t *) node;
5134 pm_dump_json_location(buffer, &cast->base.location);
5135
5136 pm_buffer_append_byte(buffer, '}');
5137 break;
5138 }
5139 case PM_FIND_PATTERN_NODE: {
5140 pm_buffer_append_string(buffer, "{\"type\":\"FindPatternNode\",\"location\":", 37);
5141
5142 const pm_find_pattern_node_t *cast = (const pm_find_pattern_node_t *) node;
5143 pm_dump_json_location(buffer, &cast->base.location);
5144
5145 // Dump the constant field
5146 pm_buffer_append_byte(buffer, ',');
5147 pm_buffer_append_string(buffer, "\"constant\":", 11);
5148 if (cast->constant != NULL) {
5149 pm_dump_json(buffer, parser, (const pm_node_t *) cast->constant);
5150 } else {
5151 pm_buffer_append_string(buffer, "null", 4);
5152 }
5153
5154 // Dump the left field
5155 pm_buffer_append_byte(buffer, ',');
5156 pm_buffer_append_string(buffer, "\"left\":", 7);
5157 pm_dump_json(buffer, parser, (const pm_node_t *) cast->left);
5158
5159 // Dump the requireds field
5160 pm_buffer_append_byte(buffer, ',');
5161 pm_buffer_append_string(buffer, "\"requireds\":", 12);
5162 const pm_node_list_t *requireds = &cast->requireds;
5163 pm_buffer_append_byte(buffer, '[');
5164
5165 for (size_t index = 0; index < requireds->size; index++) {
5166 if (index != 0) pm_buffer_append_byte(buffer, ',');
5167 pm_dump_json(buffer, parser, requireds->nodes[index]);
5168 }
5169 pm_buffer_append_byte(buffer, ']');
5170
5171 // Dump the right field
5172 pm_buffer_append_byte(buffer, ',');
5173 pm_buffer_append_string(buffer, "\"right\":", 8);
5174 pm_dump_json(buffer, parser, (const pm_node_t *) cast->right);
5175
5176 // Dump the opening_loc field
5177 pm_buffer_append_byte(buffer, ',');
5178 pm_buffer_append_string(buffer, "\"opening_loc\":", 14);
5179 if (cast->opening_loc.length != 0) {
5180 pm_dump_json_location(buffer, &cast->opening_loc);
5181 } else {
5182 pm_buffer_append_string(buffer, "null", 4);
5183 }
5184
5185 // Dump the closing_loc field
5186 pm_buffer_append_byte(buffer, ',');
5187 pm_buffer_append_string(buffer, "\"closing_loc\":", 14);
5188 if (cast->closing_loc.length != 0) {
5189 pm_dump_json_location(buffer, &cast->closing_loc);
5190 } else {
5191 pm_buffer_append_string(buffer, "null", 4);
5192 }
5193
5194 pm_buffer_append_byte(buffer, '}');
5195 break;
5196 }
5197 case PM_FLIP_FLOP_NODE: {
5198 pm_buffer_append_string(buffer, "{\"type\":\"FlipFlopNode\",\"location\":", 34);
5199
5200 const pm_flip_flop_node_t *cast = (const pm_flip_flop_node_t *) node;
5201 pm_dump_json_location(buffer, &cast->base.location);
5202
5203 // Dump the RangeFlags field
5204 pm_buffer_append_byte(buffer, ',');
5205 pm_buffer_append_string(buffer, "\"RangeFlags\":", 13);
5206 size_t flags = 0;
5207 pm_buffer_append_byte(buffer, '[');
5208 if (PM_NODE_FLAG_P(cast, PM_RANGE_FLAGS_EXCLUDE_END)) {
5209 if (flags != 0) pm_buffer_append_byte(buffer, ',');
5210 pm_buffer_append_string(buffer, "\"EXCLUDE_END\"", 13);
5211 flags++;
5212 }
5213 pm_buffer_append_byte(buffer, ']');
5214
5215 // Dump the left field
5216 pm_buffer_append_byte(buffer, ',');
5217 pm_buffer_append_string(buffer, "\"left\":", 7);
5218 if (cast->left != NULL) {
5219 pm_dump_json(buffer, parser, (const pm_node_t *) cast->left);
5220 } else {
5221 pm_buffer_append_string(buffer, "null", 4);
5222 }
5223
5224 // Dump the right field
5225 pm_buffer_append_byte(buffer, ',');
5226 pm_buffer_append_string(buffer, "\"right\":", 8);
5227 if (cast->right != NULL) {
5228 pm_dump_json(buffer, parser, (const pm_node_t *) cast->right);
5229 } else {
5230 pm_buffer_append_string(buffer, "null", 4);
5231 }
5232
5233 // Dump the operator_loc field
5234 pm_buffer_append_byte(buffer, ',');
5235 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
5236 pm_dump_json_location(buffer, &cast->operator_loc);
5237
5238 pm_buffer_append_byte(buffer, '}');
5239 break;
5240 }
5241 case PM_FLOAT_NODE: {
5242 pm_buffer_append_string(buffer, "{\"type\":\"FloatNode\",\"location\":", 31);
5243
5244 const pm_float_node_t *cast = (const pm_float_node_t *) node;
5245 pm_dump_json_location(buffer, &cast->base.location);
5246
5247 // Dump the value field
5248 pm_buffer_append_byte(buffer, ',');
5249 pm_buffer_append_string(buffer, "\"value\":", 8);
5250 pm_buffer_append_format(buffer, "%f", cast->value);
5251
5252 pm_buffer_append_byte(buffer, '}');
5253 break;
5254 }
5255 case PM_FOR_NODE: {
5256 pm_buffer_append_string(buffer, "{\"type\":\"ForNode\",\"location\":", 29);
5257
5258 const pm_for_node_t *cast = (const pm_for_node_t *) node;
5259 pm_dump_json_location(buffer, &cast->base.location);
5260
5261 // Dump the index field
5262 pm_buffer_append_byte(buffer, ',');
5263 pm_buffer_append_string(buffer, "\"index\":", 8);
5264 pm_dump_json(buffer, parser, (const pm_node_t *) cast->index);
5265
5266 // Dump the collection field
5267 pm_buffer_append_byte(buffer, ',');
5268 pm_buffer_append_string(buffer, "\"collection\":", 13);
5269 pm_dump_json(buffer, parser, (const pm_node_t *) cast->collection);
5270
5271 // Dump the statements field
5272 pm_buffer_append_byte(buffer, ',');
5273 pm_buffer_append_string(buffer, "\"statements\":", 13);
5274 if (cast->statements != NULL) {
5275 pm_dump_json(buffer, parser, (const pm_node_t *) cast->statements);
5276 } else {
5277 pm_buffer_append_string(buffer, "null", 4);
5278 }
5279
5280 // Dump the for_keyword_loc field
5281 pm_buffer_append_byte(buffer, ',');
5282 pm_buffer_append_string(buffer, "\"for_keyword_loc\":", 18);
5283 pm_dump_json_location(buffer, &cast->for_keyword_loc);
5284
5285 // Dump the in_keyword_loc field
5286 pm_buffer_append_byte(buffer, ',');
5287 pm_buffer_append_string(buffer, "\"in_keyword_loc\":", 17);
5288 pm_dump_json_location(buffer, &cast->in_keyword_loc);
5289
5290 // Dump the do_keyword_loc field
5291 pm_buffer_append_byte(buffer, ',');
5292 pm_buffer_append_string(buffer, "\"do_keyword_loc\":", 17);
5293 if (cast->do_keyword_loc.length != 0) {
5294 pm_dump_json_location(buffer, &cast->do_keyword_loc);
5295 } else {
5296 pm_buffer_append_string(buffer, "null", 4);
5297 }
5298
5299 // Dump the end_keyword_loc field
5300 pm_buffer_append_byte(buffer, ',');
5301 pm_buffer_append_string(buffer, "\"end_keyword_loc\":", 18);
5302 pm_dump_json_location(buffer, &cast->end_keyword_loc);
5303
5304 pm_buffer_append_byte(buffer, '}');
5305 break;
5306 }
5307 case PM_FORWARDING_ARGUMENTS_NODE: {
5308 pm_buffer_append_string(buffer, "{\"type\":\"ForwardingArgumentsNode\",\"location\":", 45);
5309
5311 pm_dump_json_location(buffer, &cast->base.location);
5312
5313 pm_buffer_append_byte(buffer, '}');
5314 break;
5315 }
5316 case PM_FORWARDING_PARAMETER_NODE: {
5317 pm_buffer_append_string(buffer, "{\"type\":\"ForwardingParameterNode\",\"location\":", 45);
5318
5320 pm_dump_json_location(buffer, &cast->base.location);
5321
5322 pm_buffer_append_byte(buffer, '}');
5323 break;
5324 }
5325 case PM_FORWARDING_SUPER_NODE: {
5326 pm_buffer_append_string(buffer, "{\"type\":\"ForwardingSuperNode\",\"location\":", 41);
5327
5328 const pm_forwarding_super_node_t *cast = (const pm_forwarding_super_node_t *) node;
5329 pm_dump_json_location(buffer, &cast->base.location);
5330
5331 // Dump the block field
5332 pm_buffer_append_byte(buffer, ',');
5333 pm_buffer_append_string(buffer, "\"block\":", 8);
5334 if (cast->block != NULL) {
5335 pm_dump_json(buffer, parser, (const pm_node_t *) cast->block);
5336 } else {
5337 pm_buffer_append_string(buffer, "null", 4);
5338 }
5339
5340 pm_buffer_append_byte(buffer, '}');
5341 break;
5342 }
5343 case PM_GLOBAL_VARIABLE_AND_WRITE_NODE: {
5344 pm_buffer_append_string(buffer, "{\"type\":\"GlobalVariableAndWriteNode\",\"location\":", 48);
5345
5347 pm_dump_json_location(buffer, &cast->base.location);
5348
5349 // Dump the name field
5350 pm_buffer_append_byte(buffer, ',');
5351 pm_buffer_append_string(buffer, "\"name\":", 7);
5352 pm_dump_json_constant(buffer, parser, cast->name);
5353
5354 // Dump the name_loc field
5355 pm_buffer_append_byte(buffer, ',');
5356 pm_buffer_append_string(buffer, "\"name_loc\":", 11);
5357 pm_dump_json_location(buffer, &cast->name_loc);
5358
5359 // Dump the operator_loc field
5360 pm_buffer_append_byte(buffer, ',');
5361 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
5362 pm_dump_json_location(buffer, &cast->operator_loc);
5363
5364 // Dump the value field
5365 pm_buffer_append_byte(buffer, ',');
5366 pm_buffer_append_string(buffer, "\"value\":", 8);
5367 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
5368
5369 pm_buffer_append_byte(buffer, '}');
5370 break;
5371 }
5372 case PM_GLOBAL_VARIABLE_OPERATOR_WRITE_NODE: {
5373 pm_buffer_append_string(buffer, "{\"type\":\"GlobalVariableOperatorWriteNode\",\"location\":", 53);
5374
5376 pm_dump_json_location(buffer, &cast->base.location);
5377
5378 // Dump the name field
5379 pm_buffer_append_byte(buffer, ',');
5380 pm_buffer_append_string(buffer, "\"name\":", 7);
5381 pm_dump_json_constant(buffer, parser, cast->name);
5382
5383 // Dump the name_loc field
5384 pm_buffer_append_byte(buffer, ',');
5385 pm_buffer_append_string(buffer, "\"name_loc\":", 11);
5386 pm_dump_json_location(buffer, &cast->name_loc);
5387
5388 // Dump the binary_operator_loc field
5389 pm_buffer_append_byte(buffer, ',');
5390 pm_buffer_append_string(buffer, "\"binary_operator_loc\":", 22);
5391 pm_dump_json_location(buffer, &cast->binary_operator_loc);
5392
5393 // Dump the value field
5394 pm_buffer_append_byte(buffer, ',');
5395 pm_buffer_append_string(buffer, "\"value\":", 8);
5396 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
5397
5398 // Dump the binary_operator field
5399 pm_buffer_append_byte(buffer, ',');
5400 pm_buffer_append_string(buffer, "\"binary_operator\":", 18);
5401 pm_dump_json_constant(buffer, parser, cast->binary_operator);
5402
5403 pm_buffer_append_byte(buffer, '}');
5404 break;
5405 }
5406 case PM_GLOBAL_VARIABLE_OR_WRITE_NODE: {
5407 pm_buffer_append_string(buffer, "{\"type\":\"GlobalVariableOrWriteNode\",\"location\":", 47);
5408
5410 pm_dump_json_location(buffer, &cast->base.location);
5411
5412 // Dump the name field
5413 pm_buffer_append_byte(buffer, ',');
5414 pm_buffer_append_string(buffer, "\"name\":", 7);
5415 pm_dump_json_constant(buffer, parser, cast->name);
5416
5417 // Dump the name_loc field
5418 pm_buffer_append_byte(buffer, ',');
5419 pm_buffer_append_string(buffer, "\"name_loc\":", 11);
5420 pm_dump_json_location(buffer, &cast->name_loc);
5421
5422 // Dump the operator_loc field
5423 pm_buffer_append_byte(buffer, ',');
5424 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
5425 pm_dump_json_location(buffer, &cast->operator_loc);
5426
5427 // Dump the value field
5428 pm_buffer_append_byte(buffer, ',');
5429 pm_buffer_append_string(buffer, "\"value\":", 8);
5430 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
5431
5432 pm_buffer_append_byte(buffer, '}');
5433 break;
5434 }
5435 case PM_GLOBAL_VARIABLE_READ_NODE: {
5436 pm_buffer_append_string(buffer, "{\"type\":\"GlobalVariableReadNode\",\"location\":", 44);
5437
5439 pm_dump_json_location(buffer, &cast->base.location);
5440
5441 // Dump the name field
5442 pm_buffer_append_byte(buffer, ',');
5443 pm_buffer_append_string(buffer, "\"name\":", 7);
5444 pm_dump_json_constant(buffer, parser, cast->name);
5445
5446 pm_buffer_append_byte(buffer, '}');
5447 break;
5448 }
5449 case PM_GLOBAL_VARIABLE_TARGET_NODE: {
5450 pm_buffer_append_string(buffer, "{\"type\":\"GlobalVariableTargetNode\",\"location\":", 46);
5451
5453 pm_dump_json_location(buffer, &cast->base.location);
5454
5455 // Dump the name field
5456 pm_buffer_append_byte(buffer, ',');
5457 pm_buffer_append_string(buffer, "\"name\":", 7);
5458 pm_dump_json_constant(buffer, parser, cast->name);
5459
5460 pm_buffer_append_byte(buffer, '}');
5461 break;
5462 }
5463 case PM_GLOBAL_VARIABLE_WRITE_NODE: {
5464 pm_buffer_append_string(buffer, "{\"type\":\"GlobalVariableWriteNode\",\"location\":", 45);
5465
5467 pm_dump_json_location(buffer, &cast->base.location);
5468
5469 // Dump the name field
5470 pm_buffer_append_byte(buffer, ',');
5471 pm_buffer_append_string(buffer, "\"name\":", 7);
5472 pm_dump_json_constant(buffer, parser, cast->name);
5473
5474 // Dump the name_loc field
5475 pm_buffer_append_byte(buffer, ',');
5476 pm_buffer_append_string(buffer, "\"name_loc\":", 11);
5477 pm_dump_json_location(buffer, &cast->name_loc);
5478
5479 // Dump the value field
5480 pm_buffer_append_byte(buffer, ',');
5481 pm_buffer_append_string(buffer, "\"value\":", 8);
5482 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
5483
5484 // Dump the operator_loc field
5485 pm_buffer_append_byte(buffer, ',');
5486 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
5487 pm_dump_json_location(buffer, &cast->operator_loc);
5488
5489 pm_buffer_append_byte(buffer, '}');
5490 break;
5491 }
5492 case PM_HASH_NODE: {
5493 pm_buffer_append_string(buffer, "{\"type\":\"HashNode\",\"location\":", 30);
5494
5495 const pm_hash_node_t *cast = (const pm_hash_node_t *) node;
5496 pm_dump_json_location(buffer, &cast->base.location);
5497
5498 // Dump the opening_loc field
5499 pm_buffer_append_byte(buffer, ',');
5500 pm_buffer_append_string(buffer, "\"opening_loc\":", 14);
5501 pm_dump_json_location(buffer, &cast->opening_loc);
5502
5503 // Dump the elements field
5504 pm_buffer_append_byte(buffer, ',');
5505 pm_buffer_append_string(buffer, "\"elements\":", 11);
5506 const pm_node_list_t *elements = &cast->elements;
5507 pm_buffer_append_byte(buffer, '[');
5508
5509 for (size_t index = 0; index < elements->size; index++) {
5510 if (index != 0) pm_buffer_append_byte(buffer, ',');
5511 pm_dump_json(buffer, parser, elements->nodes[index]);
5512 }
5513 pm_buffer_append_byte(buffer, ']');
5514
5515 // Dump the closing_loc field
5516 pm_buffer_append_byte(buffer, ',');
5517 pm_buffer_append_string(buffer, "\"closing_loc\":", 14);
5518 pm_dump_json_location(buffer, &cast->closing_loc);
5519
5520 pm_buffer_append_byte(buffer, '}');
5521 break;
5522 }
5523 case PM_HASH_PATTERN_NODE: {
5524 pm_buffer_append_string(buffer, "{\"type\":\"HashPatternNode\",\"location\":", 37);
5525
5526 const pm_hash_pattern_node_t *cast = (const pm_hash_pattern_node_t *) node;
5527 pm_dump_json_location(buffer, &cast->base.location);
5528
5529 // Dump the constant field
5530 pm_buffer_append_byte(buffer, ',');
5531 pm_buffer_append_string(buffer, "\"constant\":", 11);
5532 if (cast->constant != NULL) {
5533 pm_dump_json(buffer, parser, (const pm_node_t *) cast->constant);
5534 } else {
5535 pm_buffer_append_string(buffer, "null", 4);
5536 }
5537
5538 // Dump the elements field
5539 pm_buffer_append_byte(buffer, ',');
5540 pm_buffer_append_string(buffer, "\"elements\":", 11);
5541 const pm_node_list_t *elements = &cast->elements;
5542 pm_buffer_append_byte(buffer, '[');
5543
5544 for (size_t index = 0; index < elements->size; index++) {
5545 if (index != 0) pm_buffer_append_byte(buffer, ',');
5546 pm_dump_json(buffer, parser, elements->nodes[index]);
5547 }
5548 pm_buffer_append_byte(buffer, ']');
5549
5550 // Dump the rest field
5551 pm_buffer_append_byte(buffer, ',');
5552 pm_buffer_append_string(buffer, "\"rest\":", 7);
5553 if (cast->rest != NULL) {
5554 pm_dump_json(buffer, parser, (const pm_node_t *) cast->rest);
5555 } else {
5556 pm_buffer_append_string(buffer, "null", 4);
5557 }
5558
5559 // Dump the opening_loc field
5560 pm_buffer_append_byte(buffer, ',');
5561 pm_buffer_append_string(buffer, "\"opening_loc\":", 14);
5562 if (cast->opening_loc.length != 0) {
5563 pm_dump_json_location(buffer, &cast->opening_loc);
5564 } else {
5565 pm_buffer_append_string(buffer, "null", 4);
5566 }
5567
5568 // Dump the closing_loc field
5569 pm_buffer_append_byte(buffer, ',');
5570 pm_buffer_append_string(buffer, "\"closing_loc\":", 14);
5571 if (cast->closing_loc.length != 0) {
5572 pm_dump_json_location(buffer, &cast->closing_loc);
5573 } else {
5574 pm_buffer_append_string(buffer, "null", 4);
5575 }
5576
5577 pm_buffer_append_byte(buffer, '}');
5578 break;
5579 }
5580 case PM_IF_NODE: {
5581 pm_buffer_append_string(buffer, "{\"type\":\"IfNode\",\"location\":", 28);
5582
5583 const pm_if_node_t *cast = (const pm_if_node_t *) node;
5584 pm_dump_json_location(buffer, &cast->base.location);
5585
5586 // Dump the if_keyword_loc field
5587 pm_buffer_append_byte(buffer, ',');
5588 pm_buffer_append_string(buffer, "\"if_keyword_loc\":", 17);
5589 if (cast->if_keyword_loc.length != 0) {
5590 pm_dump_json_location(buffer, &cast->if_keyword_loc);
5591 } else {
5592 pm_buffer_append_string(buffer, "null", 4);
5593 }
5594
5595 // Dump the predicate field
5596 pm_buffer_append_byte(buffer, ',');
5597 pm_buffer_append_string(buffer, "\"predicate\":", 12);
5598 pm_dump_json(buffer, parser, (const pm_node_t *) cast->predicate);
5599
5600 // Dump the then_keyword_loc field
5601 pm_buffer_append_byte(buffer, ',');
5602 pm_buffer_append_string(buffer, "\"then_keyword_loc\":", 19);
5603 if (cast->then_keyword_loc.length != 0) {
5604 pm_dump_json_location(buffer, &cast->then_keyword_loc);
5605 } else {
5606 pm_buffer_append_string(buffer, "null", 4);
5607 }
5608
5609 // Dump the statements field
5610 pm_buffer_append_byte(buffer, ',');
5611 pm_buffer_append_string(buffer, "\"statements\":", 13);
5612 if (cast->statements != NULL) {
5613 pm_dump_json(buffer, parser, (const pm_node_t *) cast->statements);
5614 } else {
5615 pm_buffer_append_string(buffer, "null", 4);
5616 }
5617
5618 // Dump the subsequent field
5619 pm_buffer_append_byte(buffer, ',');
5620 pm_buffer_append_string(buffer, "\"subsequent\":", 13);
5621 if (cast->subsequent != NULL) {
5622 pm_dump_json(buffer, parser, (const pm_node_t *) cast->subsequent);
5623 } else {
5624 pm_buffer_append_string(buffer, "null", 4);
5625 }
5626
5627 // Dump the end_keyword_loc field
5628 pm_buffer_append_byte(buffer, ',');
5629 pm_buffer_append_string(buffer, "\"end_keyword_loc\":", 18);
5630 if (cast->end_keyword_loc.length != 0) {
5631 pm_dump_json_location(buffer, &cast->end_keyword_loc);
5632 } else {
5633 pm_buffer_append_string(buffer, "null", 4);
5634 }
5635
5636 pm_buffer_append_byte(buffer, '}');
5637 break;
5638 }
5639 case PM_IMAGINARY_NODE: {
5640 pm_buffer_append_string(buffer, "{\"type\":\"ImaginaryNode\",\"location\":", 35);
5641
5642 const pm_imaginary_node_t *cast = (const pm_imaginary_node_t *) node;
5643 pm_dump_json_location(buffer, &cast->base.location);
5644
5645 // Dump the numeric field
5646 pm_buffer_append_byte(buffer, ',');
5647 pm_buffer_append_string(buffer, "\"numeric\":", 10);
5648 pm_dump_json(buffer, parser, (const pm_node_t *) cast->numeric);
5649
5650 pm_buffer_append_byte(buffer, '}');
5651 break;
5652 }
5653 case PM_IMPLICIT_NODE: {
5654 pm_buffer_append_string(buffer, "{\"type\":\"ImplicitNode\",\"location\":", 34);
5655
5656 const pm_implicit_node_t *cast = (const pm_implicit_node_t *) node;
5657 pm_dump_json_location(buffer, &cast->base.location);
5658
5659 // Dump the value field
5660 pm_buffer_append_byte(buffer, ',');
5661 pm_buffer_append_string(buffer, "\"value\":", 8);
5662 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
5663
5664 pm_buffer_append_byte(buffer, '}');
5665 break;
5666 }
5667 case PM_IMPLICIT_REST_NODE: {
5668 pm_buffer_append_string(buffer, "{\"type\":\"ImplicitRestNode\",\"location\":", 38);
5669
5670 const pm_implicit_rest_node_t *cast = (const pm_implicit_rest_node_t *) node;
5671 pm_dump_json_location(buffer, &cast->base.location);
5672
5673 pm_buffer_append_byte(buffer, '}');
5674 break;
5675 }
5676 case PM_IN_NODE: {
5677 pm_buffer_append_string(buffer, "{\"type\":\"InNode\",\"location\":", 28);
5678
5679 const pm_in_node_t *cast = (const pm_in_node_t *) node;
5680 pm_dump_json_location(buffer, &cast->base.location);
5681
5682 // Dump the pattern field
5683 pm_buffer_append_byte(buffer, ',');
5684 pm_buffer_append_string(buffer, "\"pattern\":", 10);
5685 pm_dump_json(buffer, parser, (const pm_node_t *) cast->pattern);
5686
5687 // Dump the statements field
5688 pm_buffer_append_byte(buffer, ',');
5689 pm_buffer_append_string(buffer, "\"statements\":", 13);
5690 if (cast->statements != NULL) {
5691 pm_dump_json(buffer, parser, (const pm_node_t *) cast->statements);
5692 } else {
5693 pm_buffer_append_string(buffer, "null", 4);
5694 }
5695
5696 // Dump the in_loc field
5697 pm_buffer_append_byte(buffer, ',');
5698 pm_buffer_append_string(buffer, "\"in_loc\":", 9);
5699 pm_dump_json_location(buffer, &cast->in_loc);
5700
5701 // Dump the then_loc field
5702 pm_buffer_append_byte(buffer, ',');
5703 pm_buffer_append_string(buffer, "\"then_loc\":", 11);
5704 if (cast->then_loc.length != 0) {
5705 pm_dump_json_location(buffer, &cast->then_loc);
5706 } else {
5707 pm_buffer_append_string(buffer, "null", 4);
5708 }
5709
5710 pm_buffer_append_byte(buffer, '}');
5711 break;
5712 }
5713 case PM_INDEX_AND_WRITE_NODE: {
5714 pm_buffer_append_string(buffer, "{\"type\":\"IndexAndWriteNode\",\"location\":", 39);
5715
5716 const pm_index_and_write_node_t *cast = (const pm_index_and_write_node_t *) node;
5717 pm_dump_json_location(buffer, &cast->base.location);
5718
5719 // Dump the CallNodeFlags field
5720 pm_buffer_append_byte(buffer, ',');
5721 pm_buffer_append_string(buffer, "\"CallNodeFlags\":", 16);
5722 size_t flags = 0;
5723 pm_buffer_append_byte(buffer, '[');
5724 if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_SAFE_NAVIGATION)) {
5725 if (flags != 0) pm_buffer_append_byte(buffer, ',');
5726 pm_buffer_append_string(buffer, "\"SAFE_NAVIGATION\"", 17);
5727 flags++;
5728 }
5729 if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_VARIABLE_CALL)) {
5730 if (flags != 0) pm_buffer_append_byte(buffer, ',');
5731 pm_buffer_append_string(buffer, "\"VARIABLE_CALL\"", 15);
5732 flags++;
5733 }
5734 if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_ATTRIBUTE_WRITE)) {
5735 if (flags != 0) pm_buffer_append_byte(buffer, ',');
5736 pm_buffer_append_string(buffer, "\"ATTRIBUTE_WRITE\"", 17);
5737 flags++;
5738 }
5739 if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_IGNORE_VISIBILITY)) {
5740 if (flags != 0) pm_buffer_append_byte(buffer, ',');
5741 pm_buffer_append_string(buffer, "\"IGNORE_VISIBILITY\"", 19);
5742 flags++;
5743 }
5744 pm_buffer_append_byte(buffer, ']');
5745
5746 // Dump the receiver field
5747 pm_buffer_append_byte(buffer, ',');
5748 pm_buffer_append_string(buffer, "\"receiver\":", 11);
5749 if (cast->receiver != NULL) {
5750 pm_dump_json(buffer, parser, (const pm_node_t *) cast->receiver);
5751 } else {
5752 pm_buffer_append_string(buffer, "null", 4);
5753 }
5754
5755 // Dump the call_operator_loc field
5756 pm_buffer_append_byte(buffer, ',');
5757 pm_buffer_append_string(buffer, "\"call_operator_loc\":", 20);
5758 if (cast->call_operator_loc.length != 0) {
5759 pm_dump_json_location(buffer, &cast->call_operator_loc);
5760 } else {
5761 pm_buffer_append_string(buffer, "null", 4);
5762 }
5763
5764 // Dump the opening_loc field
5765 pm_buffer_append_byte(buffer, ',');
5766 pm_buffer_append_string(buffer, "\"opening_loc\":", 14);
5767 pm_dump_json_location(buffer, &cast->opening_loc);
5768
5769 // Dump the arguments field
5770 pm_buffer_append_byte(buffer, ',');
5771 pm_buffer_append_string(buffer, "\"arguments\":", 12);
5772 if (cast->arguments != NULL) {
5773 pm_dump_json(buffer, parser, (const pm_node_t *) cast->arguments);
5774 } else {
5775 pm_buffer_append_string(buffer, "null", 4);
5776 }
5777
5778 // Dump the closing_loc field
5779 pm_buffer_append_byte(buffer, ',');
5780 pm_buffer_append_string(buffer, "\"closing_loc\":", 14);
5781 pm_dump_json_location(buffer, &cast->closing_loc);
5782
5783 // Dump the block field
5784 pm_buffer_append_byte(buffer, ',');
5785 pm_buffer_append_string(buffer, "\"block\":", 8);
5786 if (cast->block != NULL) {
5787 pm_dump_json(buffer, parser, (const pm_node_t *) cast->block);
5788 } else {
5789 pm_buffer_append_string(buffer, "null", 4);
5790 }
5791
5792 // Dump the operator_loc field
5793 pm_buffer_append_byte(buffer, ',');
5794 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
5795 pm_dump_json_location(buffer, &cast->operator_loc);
5796
5797 // Dump the value field
5798 pm_buffer_append_byte(buffer, ',');
5799 pm_buffer_append_string(buffer, "\"value\":", 8);
5800 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
5801
5802 pm_buffer_append_byte(buffer, '}');
5803 break;
5804 }
5805 case PM_INDEX_OPERATOR_WRITE_NODE: {
5806 pm_buffer_append_string(buffer, "{\"type\":\"IndexOperatorWriteNode\",\"location\":", 44);
5807
5809 pm_dump_json_location(buffer, &cast->base.location);
5810
5811 // Dump the CallNodeFlags field
5812 pm_buffer_append_byte(buffer, ',');
5813 pm_buffer_append_string(buffer, "\"CallNodeFlags\":", 16);
5814 size_t flags = 0;
5815 pm_buffer_append_byte(buffer, '[');
5816 if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_SAFE_NAVIGATION)) {
5817 if (flags != 0) pm_buffer_append_byte(buffer, ',');
5818 pm_buffer_append_string(buffer, "\"SAFE_NAVIGATION\"", 17);
5819 flags++;
5820 }
5821 if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_VARIABLE_CALL)) {
5822 if (flags != 0) pm_buffer_append_byte(buffer, ',');
5823 pm_buffer_append_string(buffer, "\"VARIABLE_CALL\"", 15);
5824 flags++;
5825 }
5826 if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_ATTRIBUTE_WRITE)) {
5827 if (flags != 0) pm_buffer_append_byte(buffer, ',');
5828 pm_buffer_append_string(buffer, "\"ATTRIBUTE_WRITE\"", 17);
5829 flags++;
5830 }
5831 if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_IGNORE_VISIBILITY)) {
5832 if (flags != 0) pm_buffer_append_byte(buffer, ',');
5833 pm_buffer_append_string(buffer, "\"IGNORE_VISIBILITY\"", 19);
5834 flags++;
5835 }
5836 pm_buffer_append_byte(buffer, ']');
5837
5838 // Dump the receiver field
5839 pm_buffer_append_byte(buffer, ',');
5840 pm_buffer_append_string(buffer, "\"receiver\":", 11);
5841 if (cast->receiver != NULL) {
5842 pm_dump_json(buffer, parser, (const pm_node_t *) cast->receiver);
5843 } else {
5844 pm_buffer_append_string(buffer, "null", 4);
5845 }
5846
5847 // Dump the call_operator_loc field
5848 pm_buffer_append_byte(buffer, ',');
5849 pm_buffer_append_string(buffer, "\"call_operator_loc\":", 20);
5850 if (cast->call_operator_loc.length != 0) {
5851 pm_dump_json_location(buffer, &cast->call_operator_loc);
5852 } else {
5853 pm_buffer_append_string(buffer, "null", 4);
5854 }
5855
5856 // Dump the opening_loc field
5857 pm_buffer_append_byte(buffer, ',');
5858 pm_buffer_append_string(buffer, "\"opening_loc\":", 14);
5859 pm_dump_json_location(buffer, &cast->opening_loc);
5860
5861 // Dump the arguments field
5862 pm_buffer_append_byte(buffer, ',');
5863 pm_buffer_append_string(buffer, "\"arguments\":", 12);
5864 if (cast->arguments != NULL) {
5865 pm_dump_json(buffer, parser, (const pm_node_t *) cast->arguments);
5866 } else {
5867 pm_buffer_append_string(buffer, "null", 4);
5868 }
5869
5870 // Dump the closing_loc field
5871 pm_buffer_append_byte(buffer, ',');
5872 pm_buffer_append_string(buffer, "\"closing_loc\":", 14);
5873 pm_dump_json_location(buffer, &cast->closing_loc);
5874
5875 // Dump the block field
5876 pm_buffer_append_byte(buffer, ',');
5877 pm_buffer_append_string(buffer, "\"block\":", 8);
5878 if (cast->block != NULL) {
5879 pm_dump_json(buffer, parser, (const pm_node_t *) cast->block);
5880 } else {
5881 pm_buffer_append_string(buffer, "null", 4);
5882 }
5883
5884 // Dump the binary_operator field
5885 pm_buffer_append_byte(buffer, ',');
5886 pm_buffer_append_string(buffer, "\"binary_operator\":", 18);
5887 pm_dump_json_constant(buffer, parser, cast->binary_operator);
5888
5889 // Dump the binary_operator_loc field
5890 pm_buffer_append_byte(buffer, ',');
5891 pm_buffer_append_string(buffer, "\"binary_operator_loc\":", 22);
5892 pm_dump_json_location(buffer, &cast->binary_operator_loc);
5893
5894 // Dump the value field
5895 pm_buffer_append_byte(buffer, ',');
5896 pm_buffer_append_string(buffer, "\"value\":", 8);
5897 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
5898
5899 pm_buffer_append_byte(buffer, '}');
5900 break;
5901 }
5902 case PM_INDEX_OR_WRITE_NODE: {
5903 pm_buffer_append_string(buffer, "{\"type\":\"IndexOrWriteNode\",\"location\":", 38);
5904
5905 const pm_index_or_write_node_t *cast = (const pm_index_or_write_node_t *) node;
5906 pm_dump_json_location(buffer, &cast->base.location);
5907
5908 // Dump the CallNodeFlags field
5909 pm_buffer_append_byte(buffer, ',');
5910 pm_buffer_append_string(buffer, "\"CallNodeFlags\":", 16);
5911 size_t flags = 0;
5912 pm_buffer_append_byte(buffer, '[');
5913 if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_SAFE_NAVIGATION)) {
5914 if (flags != 0) pm_buffer_append_byte(buffer, ',');
5915 pm_buffer_append_string(buffer, "\"SAFE_NAVIGATION\"", 17);
5916 flags++;
5917 }
5918 if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_VARIABLE_CALL)) {
5919 if (flags != 0) pm_buffer_append_byte(buffer, ',');
5920 pm_buffer_append_string(buffer, "\"VARIABLE_CALL\"", 15);
5921 flags++;
5922 }
5923 if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_ATTRIBUTE_WRITE)) {
5924 if (flags != 0) pm_buffer_append_byte(buffer, ',');
5925 pm_buffer_append_string(buffer, "\"ATTRIBUTE_WRITE\"", 17);
5926 flags++;
5927 }
5928 if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_IGNORE_VISIBILITY)) {
5929 if (flags != 0) pm_buffer_append_byte(buffer, ',');
5930 pm_buffer_append_string(buffer, "\"IGNORE_VISIBILITY\"", 19);
5931 flags++;
5932 }
5933 pm_buffer_append_byte(buffer, ']');
5934
5935 // Dump the receiver field
5936 pm_buffer_append_byte(buffer, ',');
5937 pm_buffer_append_string(buffer, "\"receiver\":", 11);
5938 if (cast->receiver != NULL) {
5939 pm_dump_json(buffer, parser, (const pm_node_t *) cast->receiver);
5940 } else {
5941 pm_buffer_append_string(buffer, "null", 4);
5942 }
5943
5944 // Dump the call_operator_loc field
5945 pm_buffer_append_byte(buffer, ',');
5946 pm_buffer_append_string(buffer, "\"call_operator_loc\":", 20);
5947 if (cast->call_operator_loc.length != 0) {
5948 pm_dump_json_location(buffer, &cast->call_operator_loc);
5949 } else {
5950 pm_buffer_append_string(buffer, "null", 4);
5951 }
5952
5953 // Dump the opening_loc field
5954 pm_buffer_append_byte(buffer, ',');
5955 pm_buffer_append_string(buffer, "\"opening_loc\":", 14);
5956 pm_dump_json_location(buffer, &cast->opening_loc);
5957
5958 // Dump the arguments field
5959 pm_buffer_append_byte(buffer, ',');
5960 pm_buffer_append_string(buffer, "\"arguments\":", 12);
5961 if (cast->arguments != NULL) {
5962 pm_dump_json(buffer, parser, (const pm_node_t *) cast->arguments);
5963 } else {
5964 pm_buffer_append_string(buffer, "null", 4);
5965 }
5966
5967 // Dump the closing_loc field
5968 pm_buffer_append_byte(buffer, ',');
5969 pm_buffer_append_string(buffer, "\"closing_loc\":", 14);
5970 pm_dump_json_location(buffer, &cast->closing_loc);
5971
5972 // Dump the block field
5973 pm_buffer_append_byte(buffer, ',');
5974 pm_buffer_append_string(buffer, "\"block\":", 8);
5975 if (cast->block != NULL) {
5976 pm_dump_json(buffer, parser, (const pm_node_t *) cast->block);
5977 } else {
5978 pm_buffer_append_string(buffer, "null", 4);
5979 }
5980
5981 // Dump the operator_loc field
5982 pm_buffer_append_byte(buffer, ',');
5983 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
5984 pm_dump_json_location(buffer, &cast->operator_loc);
5985
5986 // Dump the value field
5987 pm_buffer_append_byte(buffer, ',');
5988 pm_buffer_append_string(buffer, "\"value\":", 8);
5989 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
5990
5991 pm_buffer_append_byte(buffer, '}');
5992 break;
5993 }
5994 case PM_INDEX_TARGET_NODE: {
5995 pm_buffer_append_string(buffer, "{\"type\":\"IndexTargetNode\",\"location\":", 37);
5996
5997 const pm_index_target_node_t *cast = (const pm_index_target_node_t *) node;
5998 pm_dump_json_location(buffer, &cast->base.location);
5999
6000 // Dump the CallNodeFlags field
6001 pm_buffer_append_byte(buffer, ',');
6002 pm_buffer_append_string(buffer, "\"CallNodeFlags\":", 16);
6003 size_t flags = 0;
6004 pm_buffer_append_byte(buffer, '[');
6005 if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_SAFE_NAVIGATION)) {
6006 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6007 pm_buffer_append_string(buffer, "\"SAFE_NAVIGATION\"", 17);
6008 flags++;
6009 }
6010 if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_VARIABLE_CALL)) {
6011 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6012 pm_buffer_append_string(buffer, "\"VARIABLE_CALL\"", 15);
6013 flags++;
6014 }
6015 if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_ATTRIBUTE_WRITE)) {
6016 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6017 pm_buffer_append_string(buffer, "\"ATTRIBUTE_WRITE\"", 17);
6018 flags++;
6019 }
6020 if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_IGNORE_VISIBILITY)) {
6021 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6022 pm_buffer_append_string(buffer, "\"IGNORE_VISIBILITY\"", 19);
6023 flags++;
6024 }
6025 pm_buffer_append_byte(buffer, ']');
6026
6027 // Dump the receiver field
6028 pm_buffer_append_byte(buffer, ',');
6029 pm_buffer_append_string(buffer, "\"receiver\":", 11);
6030 pm_dump_json(buffer, parser, (const pm_node_t *) cast->receiver);
6031
6032 // Dump the opening_loc field
6033 pm_buffer_append_byte(buffer, ',');
6034 pm_buffer_append_string(buffer, "\"opening_loc\":", 14);
6035 pm_dump_json_location(buffer, &cast->opening_loc);
6036
6037 // Dump the arguments field
6038 pm_buffer_append_byte(buffer, ',');
6039 pm_buffer_append_string(buffer, "\"arguments\":", 12);
6040 if (cast->arguments != NULL) {
6041 pm_dump_json(buffer, parser, (const pm_node_t *) cast->arguments);
6042 } else {
6043 pm_buffer_append_string(buffer, "null", 4);
6044 }
6045
6046 // Dump the closing_loc field
6047 pm_buffer_append_byte(buffer, ',');
6048 pm_buffer_append_string(buffer, "\"closing_loc\":", 14);
6049 pm_dump_json_location(buffer, &cast->closing_loc);
6050
6051 // Dump the block field
6052 pm_buffer_append_byte(buffer, ',');
6053 pm_buffer_append_string(buffer, "\"block\":", 8);
6054 if (cast->block != NULL) {
6055 pm_dump_json(buffer, parser, (const pm_node_t *) cast->block);
6056 } else {
6057 pm_buffer_append_string(buffer, "null", 4);
6058 }
6059
6060 pm_buffer_append_byte(buffer, '}');
6061 break;
6062 }
6063 case PM_INSTANCE_VARIABLE_AND_WRITE_NODE: {
6064 pm_buffer_append_string(buffer, "{\"type\":\"InstanceVariableAndWriteNode\",\"location\":", 50);
6065
6067 pm_dump_json_location(buffer, &cast->base.location);
6068
6069 // Dump the name field
6070 pm_buffer_append_byte(buffer, ',');
6071 pm_buffer_append_string(buffer, "\"name\":", 7);
6072 pm_dump_json_constant(buffer, parser, cast->name);
6073
6074 // Dump the name_loc field
6075 pm_buffer_append_byte(buffer, ',');
6076 pm_buffer_append_string(buffer, "\"name_loc\":", 11);
6077 pm_dump_json_location(buffer, &cast->name_loc);
6078
6079 // Dump the operator_loc field
6080 pm_buffer_append_byte(buffer, ',');
6081 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
6082 pm_dump_json_location(buffer, &cast->operator_loc);
6083
6084 // Dump the value field
6085 pm_buffer_append_byte(buffer, ',');
6086 pm_buffer_append_string(buffer, "\"value\":", 8);
6087 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
6088
6089 pm_buffer_append_byte(buffer, '}');
6090 break;
6091 }
6092 case PM_INSTANCE_VARIABLE_OPERATOR_WRITE_NODE: {
6093 pm_buffer_append_string(buffer, "{\"type\":\"InstanceVariableOperatorWriteNode\",\"location\":", 55);
6094
6096 pm_dump_json_location(buffer, &cast->base.location);
6097
6098 // Dump the name field
6099 pm_buffer_append_byte(buffer, ',');
6100 pm_buffer_append_string(buffer, "\"name\":", 7);
6101 pm_dump_json_constant(buffer, parser, cast->name);
6102
6103 // Dump the name_loc field
6104 pm_buffer_append_byte(buffer, ',');
6105 pm_buffer_append_string(buffer, "\"name_loc\":", 11);
6106 pm_dump_json_location(buffer, &cast->name_loc);
6107
6108 // Dump the binary_operator_loc field
6109 pm_buffer_append_byte(buffer, ',');
6110 pm_buffer_append_string(buffer, "\"binary_operator_loc\":", 22);
6111 pm_dump_json_location(buffer, &cast->binary_operator_loc);
6112
6113 // Dump the value field
6114 pm_buffer_append_byte(buffer, ',');
6115 pm_buffer_append_string(buffer, "\"value\":", 8);
6116 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
6117
6118 // Dump the binary_operator field
6119 pm_buffer_append_byte(buffer, ',');
6120 pm_buffer_append_string(buffer, "\"binary_operator\":", 18);
6121 pm_dump_json_constant(buffer, parser, cast->binary_operator);
6122
6123 pm_buffer_append_byte(buffer, '}');
6124 break;
6125 }
6126 case PM_INSTANCE_VARIABLE_OR_WRITE_NODE: {
6127 pm_buffer_append_string(buffer, "{\"type\":\"InstanceVariableOrWriteNode\",\"location\":", 49);
6128
6130 pm_dump_json_location(buffer, &cast->base.location);
6131
6132 // Dump the name field
6133 pm_buffer_append_byte(buffer, ',');
6134 pm_buffer_append_string(buffer, "\"name\":", 7);
6135 pm_dump_json_constant(buffer, parser, cast->name);
6136
6137 // Dump the name_loc field
6138 pm_buffer_append_byte(buffer, ',');
6139 pm_buffer_append_string(buffer, "\"name_loc\":", 11);
6140 pm_dump_json_location(buffer, &cast->name_loc);
6141
6142 // Dump the operator_loc field
6143 pm_buffer_append_byte(buffer, ',');
6144 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
6145 pm_dump_json_location(buffer, &cast->operator_loc);
6146
6147 // Dump the value field
6148 pm_buffer_append_byte(buffer, ',');
6149 pm_buffer_append_string(buffer, "\"value\":", 8);
6150 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
6151
6152 pm_buffer_append_byte(buffer, '}');
6153 break;
6154 }
6155 case PM_INSTANCE_VARIABLE_READ_NODE: {
6156 pm_buffer_append_string(buffer, "{\"type\":\"InstanceVariableReadNode\",\"location\":", 46);
6157
6159 pm_dump_json_location(buffer, &cast->base.location);
6160
6161 // Dump the name field
6162 pm_buffer_append_byte(buffer, ',');
6163 pm_buffer_append_string(buffer, "\"name\":", 7);
6164 pm_dump_json_constant(buffer, parser, cast->name);
6165
6166 pm_buffer_append_byte(buffer, '}');
6167 break;
6168 }
6169 case PM_INSTANCE_VARIABLE_TARGET_NODE: {
6170 pm_buffer_append_string(buffer, "{\"type\":\"InstanceVariableTargetNode\",\"location\":", 48);
6171
6173 pm_dump_json_location(buffer, &cast->base.location);
6174
6175 // Dump the name field
6176 pm_buffer_append_byte(buffer, ',');
6177 pm_buffer_append_string(buffer, "\"name\":", 7);
6178 pm_dump_json_constant(buffer, parser, cast->name);
6179
6180 pm_buffer_append_byte(buffer, '}');
6181 break;
6182 }
6183 case PM_INSTANCE_VARIABLE_WRITE_NODE: {
6184 pm_buffer_append_string(buffer, "{\"type\":\"InstanceVariableWriteNode\",\"location\":", 47);
6185
6187 pm_dump_json_location(buffer, &cast->base.location);
6188
6189 // Dump the name field
6190 pm_buffer_append_byte(buffer, ',');
6191 pm_buffer_append_string(buffer, "\"name\":", 7);
6192 pm_dump_json_constant(buffer, parser, cast->name);
6193
6194 // Dump the name_loc field
6195 pm_buffer_append_byte(buffer, ',');
6196 pm_buffer_append_string(buffer, "\"name_loc\":", 11);
6197 pm_dump_json_location(buffer, &cast->name_loc);
6198
6199 // Dump the value field
6200 pm_buffer_append_byte(buffer, ',');
6201 pm_buffer_append_string(buffer, "\"value\":", 8);
6202 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
6203
6204 // Dump the operator_loc field
6205 pm_buffer_append_byte(buffer, ',');
6206 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
6207 pm_dump_json_location(buffer, &cast->operator_loc);
6208
6209 pm_buffer_append_byte(buffer, '}');
6210 break;
6211 }
6212 case PM_INTEGER_NODE: {
6213 pm_buffer_append_string(buffer, "{\"type\":\"IntegerNode\",\"location\":", 33);
6214
6215 const pm_integer_node_t *cast = (const pm_integer_node_t *) node;
6216 pm_dump_json_location(buffer, &cast->base.location);
6217
6218 // Dump the IntegerBaseFlags field
6219 pm_buffer_append_byte(buffer, ',');
6220 pm_buffer_append_string(buffer, "\"IntegerBaseFlags\":", 19);
6221 size_t flags = 0;
6222 pm_buffer_append_byte(buffer, '[');
6223 if (PM_NODE_FLAG_P(cast, PM_INTEGER_BASE_FLAGS_BINARY)) {
6224 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6225 pm_buffer_append_string(buffer, "\"BINARY\"", 8);
6226 flags++;
6227 }
6228 if (PM_NODE_FLAG_P(cast, PM_INTEGER_BASE_FLAGS_DECIMAL)) {
6229 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6230 pm_buffer_append_string(buffer, "\"DECIMAL\"", 9);
6231 flags++;
6232 }
6233 if (PM_NODE_FLAG_P(cast, PM_INTEGER_BASE_FLAGS_OCTAL)) {
6234 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6235 pm_buffer_append_string(buffer, "\"OCTAL\"", 7);
6236 flags++;
6237 }
6238 if (PM_NODE_FLAG_P(cast, PM_INTEGER_BASE_FLAGS_HEXADECIMAL)) {
6239 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6240 pm_buffer_append_string(buffer, "\"HEXADECIMAL\"", 13);
6241 flags++;
6242 }
6243 pm_buffer_append_byte(buffer, ']');
6244
6245 // Dump the value field
6246 pm_buffer_append_byte(buffer, ',');
6247 pm_buffer_append_string(buffer, "\"value\":", 8);
6248 pm_integer_string(buffer, &cast->value);
6249
6250 pm_buffer_append_byte(buffer, '}');
6251 break;
6252 }
6253 case PM_INTERPOLATED_MATCH_LAST_LINE_NODE: {
6254 pm_buffer_append_string(buffer, "{\"type\":\"InterpolatedMatchLastLineNode\",\"location\":", 51);
6255
6257 pm_dump_json_location(buffer, &cast->base.location);
6258
6259 // Dump the RegularExpressionFlags field
6260 pm_buffer_append_byte(buffer, ',');
6261 pm_buffer_append_string(buffer, "\"RegularExpressionFlags\":", 25);
6262 size_t flags = 0;
6263 pm_buffer_append_byte(buffer, '[');
6264 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_IGNORE_CASE)) {
6265 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6266 pm_buffer_append_string(buffer, "\"IGNORE_CASE\"", 13);
6267 flags++;
6268 }
6269 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_EXTENDED)) {
6270 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6271 pm_buffer_append_string(buffer, "\"EXTENDED\"", 10);
6272 flags++;
6273 }
6274 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_MULTI_LINE)) {
6275 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6276 pm_buffer_append_string(buffer, "\"MULTI_LINE\"", 12);
6277 flags++;
6278 }
6279 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_ONCE)) {
6280 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6281 pm_buffer_append_string(buffer, "\"ONCE\"", 6);
6282 flags++;
6283 }
6284 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_EUC_JP)) {
6285 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6286 pm_buffer_append_string(buffer, "\"EUC_JP\"", 8);
6287 flags++;
6288 }
6289 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_ASCII_8BIT)) {
6290 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6291 pm_buffer_append_string(buffer, "\"ASCII_8BIT\"", 12);
6292 flags++;
6293 }
6294 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_WINDOWS_31J)) {
6295 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6296 pm_buffer_append_string(buffer, "\"WINDOWS_31J\"", 13);
6297 flags++;
6298 }
6299 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_UTF_8)) {
6300 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6301 pm_buffer_append_string(buffer, "\"UTF_8\"", 7);
6302 flags++;
6303 }
6304 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_FORCED_UTF8_ENCODING)) {
6305 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6306 pm_buffer_append_string(buffer, "\"FORCED_UTF8_ENCODING\"", 22);
6307 flags++;
6308 }
6309 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_FORCED_BINARY_ENCODING)) {
6310 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6311 pm_buffer_append_string(buffer, "\"FORCED_BINARY_ENCODING\"", 24);
6312 flags++;
6313 }
6314 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_FORCED_US_ASCII_ENCODING)) {
6315 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6316 pm_buffer_append_string(buffer, "\"FORCED_US_ASCII_ENCODING\"", 26);
6317 flags++;
6318 }
6319 pm_buffer_append_byte(buffer, ']');
6320
6321 // Dump the opening_loc field
6322 pm_buffer_append_byte(buffer, ',');
6323 pm_buffer_append_string(buffer, "\"opening_loc\":", 14);
6324 pm_dump_json_location(buffer, &cast->opening_loc);
6325
6326 // Dump the parts field
6327 pm_buffer_append_byte(buffer, ',');
6328 pm_buffer_append_string(buffer, "\"parts\":", 8);
6329 const pm_node_list_t *parts = &cast->parts;
6330 pm_buffer_append_byte(buffer, '[');
6331
6332 for (size_t index = 0; index < parts->size; index++) {
6333 if (index != 0) pm_buffer_append_byte(buffer, ',');
6334 pm_dump_json(buffer, parser, parts->nodes[index]);
6335 }
6336 pm_buffer_append_byte(buffer, ']');
6337
6338 // Dump the closing_loc field
6339 pm_buffer_append_byte(buffer, ',');
6340 pm_buffer_append_string(buffer, "\"closing_loc\":", 14);
6341 pm_dump_json_location(buffer, &cast->closing_loc);
6342
6343 pm_buffer_append_byte(buffer, '}');
6344 break;
6345 }
6346 case PM_INTERPOLATED_REGULAR_EXPRESSION_NODE: {
6347 pm_buffer_append_string(buffer, "{\"type\":\"InterpolatedRegularExpressionNode\",\"location\":", 55);
6348
6350 pm_dump_json_location(buffer, &cast->base.location);
6351
6352 // Dump the RegularExpressionFlags field
6353 pm_buffer_append_byte(buffer, ',');
6354 pm_buffer_append_string(buffer, "\"RegularExpressionFlags\":", 25);
6355 size_t flags = 0;
6356 pm_buffer_append_byte(buffer, '[');
6357 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_IGNORE_CASE)) {
6358 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6359 pm_buffer_append_string(buffer, "\"IGNORE_CASE\"", 13);
6360 flags++;
6361 }
6362 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_EXTENDED)) {
6363 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6364 pm_buffer_append_string(buffer, "\"EXTENDED\"", 10);
6365 flags++;
6366 }
6367 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_MULTI_LINE)) {
6368 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6369 pm_buffer_append_string(buffer, "\"MULTI_LINE\"", 12);
6370 flags++;
6371 }
6372 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_ONCE)) {
6373 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6374 pm_buffer_append_string(buffer, "\"ONCE\"", 6);
6375 flags++;
6376 }
6377 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_EUC_JP)) {
6378 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6379 pm_buffer_append_string(buffer, "\"EUC_JP\"", 8);
6380 flags++;
6381 }
6382 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_ASCII_8BIT)) {
6383 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6384 pm_buffer_append_string(buffer, "\"ASCII_8BIT\"", 12);
6385 flags++;
6386 }
6387 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_WINDOWS_31J)) {
6388 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6389 pm_buffer_append_string(buffer, "\"WINDOWS_31J\"", 13);
6390 flags++;
6391 }
6392 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_UTF_8)) {
6393 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6394 pm_buffer_append_string(buffer, "\"UTF_8\"", 7);
6395 flags++;
6396 }
6397 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_FORCED_UTF8_ENCODING)) {
6398 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6399 pm_buffer_append_string(buffer, "\"FORCED_UTF8_ENCODING\"", 22);
6400 flags++;
6401 }
6402 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_FORCED_BINARY_ENCODING)) {
6403 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6404 pm_buffer_append_string(buffer, "\"FORCED_BINARY_ENCODING\"", 24);
6405 flags++;
6406 }
6407 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_FORCED_US_ASCII_ENCODING)) {
6408 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6409 pm_buffer_append_string(buffer, "\"FORCED_US_ASCII_ENCODING\"", 26);
6410 flags++;
6411 }
6412 pm_buffer_append_byte(buffer, ']');
6413
6414 // Dump the opening_loc field
6415 pm_buffer_append_byte(buffer, ',');
6416 pm_buffer_append_string(buffer, "\"opening_loc\":", 14);
6417 pm_dump_json_location(buffer, &cast->opening_loc);
6418
6419 // Dump the parts field
6420 pm_buffer_append_byte(buffer, ',');
6421 pm_buffer_append_string(buffer, "\"parts\":", 8);
6422 const pm_node_list_t *parts = &cast->parts;
6423 pm_buffer_append_byte(buffer, '[');
6424
6425 for (size_t index = 0; index < parts->size; index++) {
6426 if (index != 0) pm_buffer_append_byte(buffer, ',');
6427 pm_dump_json(buffer, parser, parts->nodes[index]);
6428 }
6429 pm_buffer_append_byte(buffer, ']');
6430
6431 // Dump the closing_loc field
6432 pm_buffer_append_byte(buffer, ',');
6433 pm_buffer_append_string(buffer, "\"closing_loc\":", 14);
6434 pm_dump_json_location(buffer, &cast->closing_loc);
6435
6436 pm_buffer_append_byte(buffer, '}');
6437 break;
6438 }
6439 case PM_INTERPOLATED_STRING_NODE: {
6440 pm_buffer_append_string(buffer, "{\"type\":\"InterpolatedStringNode\",\"location\":", 44);
6441
6443 pm_dump_json_location(buffer, &cast->base.location);
6444
6445 // Dump the InterpolatedStringNodeFlags field
6446 pm_buffer_append_byte(buffer, ',');
6447 pm_buffer_append_string(buffer, "\"InterpolatedStringNodeFlags\":", 30);
6448 size_t flags = 0;
6449 pm_buffer_append_byte(buffer, '[');
6450 if (PM_NODE_FLAG_P(cast, PM_INTERPOLATED_STRING_NODE_FLAGS_FROZEN)) {
6451 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6452 pm_buffer_append_string(buffer, "\"FROZEN\"", 8);
6453 flags++;
6454 }
6455 if (PM_NODE_FLAG_P(cast, PM_INTERPOLATED_STRING_NODE_FLAGS_MUTABLE)) {
6456 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6457 pm_buffer_append_string(buffer, "\"MUTABLE\"", 9);
6458 flags++;
6459 }
6460 pm_buffer_append_byte(buffer, ']');
6461
6462 // Dump the opening_loc field
6463 pm_buffer_append_byte(buffer, ',');
6464 pm_buffer_append_string(buffer, "\"opening_loc\":", 14);
6465 if (cast->opening_loc.length != 0) {
6466 pm_dump_json_location(buffer, &cast->opening_loc);
6467 } else {
6468 pm_buffer_append_string(buffer, "null", 4);
6469 }
6470
6471 // Dump the parts field
6472 pm_buffer_append_byte(buffer, ',');
6473 pm_buffer_append_string(buffer, "\"parts\":", 8);
6474 const pm_node_list_t *parts = &cast->parts;
6475 pm_buffer_append_byte(buffer, '[');
6476
6477 for (size_t index = 0; index < parts->size; index++) {
6478 if (index != 0) pm_buffer_append_byte(buffer, ',');
6479 pm_dump_json(buffer, parser, parts->nodes[index]);
6480 }
6481 pm_buffer_append_byte(buffer, ']');
6482
6483 // Dump the closing_loc field
6484 pm_buffer_append_byte(buffer, ',');
6485 pm_buffer_append_string(buffer, "\"closing_loc\":", 14);
6486 if (cast->closing_loc.length != 0) {
6487 pm_dump_json_location(buffer, &cast->closing_loc);
6488 } else {
6489 pm_buffer_append_string(buffer, "null", 4);
6490 }
6491
6492 pm_buffer_append_byte(buffer, '}');
6493 break;
6494 }
6495 case PM_INTERPOLATED_SYMBOL_NODE: {
6496 pm_buffer_append_string(buffer, "{\"type\":\"InterpolatedSymbolNode\",\"location\":", 44);
6497
6499 pm_dump_json_location(buffer, &cast->base.location);
6500
6501 // Dump the opening_loc field
6502 pm_buffer_append_byte(buffer, ',');
6503 pm_buffer_append_string(buffer, "\"opening_loc\":", 14);
6504 if (cast->opening_loc.length != 0) {
6505 pm_dump_json_location(buffer, &cast->opening_loc);
6506 } else {
6507 pm_buffer_append_string(buffer, "null", 4);
6508 }
6509
6510 // Dump the parts field
6511 pm_buffer_append_byte(buffer, ',');
6512 pm_buffer_append_string(buffer, "\"parts\":", 8);
6513 const pm_node_list_t *parts = &cast->parts;
6514 pm_buffer_append_byte(buffer, '[');
6515
6516 for (size_t index = 0; index < parts->size; index++) {
6517 if (index != 0) pm_buffer_append_byte(buffer, ',');
6518 pm_dump_json(buffer, parser, parts->nodes[index]);
6519 }
6520 pm_buffer_append_byte(buffer, ']');
6521
6522 // Dump the closing_loc field
6523 pm_buffer_append_byte(buffer, ',');
6524 pm_buffer_append_string(buffer, "\"closing_loc\":", 14);
6525 if (cast->closing_loc.length != 0) {
6526 pm_dump_json_location(buffer, &cast->closing_loc);
6527 } else {
6528 pm_buffer_append_string(buffer, "null", 4);
6529 }
6530
6531 pm_buffer_append_byte(buffer, '}');
6532 break;
6533 }
6534 case PM_INTERPOLATED_X_STRING_NODE: {
6535 pm_buffer_append_string(buffer, "{\"type\":\"InterpolatedXStringNode\",\"location\":", 45);
6536
6538 pm_dump_json_location(buffer, &cast->base.location);
6539
6540 // Dump the opening_loc field
6541 pm_buffer_append_byte(buffer, ',');
6542 pm_buffer_append_string(buffer, "\"opening_loc\":", 14);
6543 pm_dump_json_location(buffer, &cast->opening_loc);
6544
6545 // Dump the parts field
6546 pm_buffer_append_byte(buffer, ',');
6547 pm_buffer_append_string(buffer, "\"parts\":", 8);
6548 const pm_node_list_t *parts = &cast->parts;
6549 pm_buffer_append_byte(buffer, '[');
6550
6551 for (size_t index = 0; index < parts->size; index++) {
6552 if (index != 0) pm_buffer_append_byte(buffer, ',');
6553 pm_dump_json(buffer, parser, parts->nodes[index]);
6554 }
6555 pm_buffer_append_byte(buffer, ']');
6556
6557 // Dump the closing_loc field
6558 pm_buffer_append_byte(buffer, ',');
6559 pm_buffer_append_string(buffer, "\"closing_loc\":", 14);
6560 pm_dump_json_location(buffer, &cast->closing_loc);
6561
6562 pm_buffer_append_byte(buffer, '}');
6563 break;
6564 }
6565 case PM_IT_LOCAL_VARIABLE_READ_NODE: {
6566 pm_buffer_append_string(buffer, "{\"type\":\"ItLocalVariableReadNode\",\"location\":", 45);
6567
6569 pm_dump_json_location(buffer, &cast->base.location);
6570
6571 pm_buffer_append_byte(buffer, '}');
6572 break;
6573 }
6574 case PM_IT_PARAMETERS_NODE: {
6575 pm_buffer_append_string(buffer, "{\"type\":\"ItParametersNode\",\"location\":", 38);
6576
6577 const pm_it_parameters_node_t *cast = (const pm_it_parameters_node_t *) node;
6578 pm_dump_json_location(buffer, &cast->base.location);
6579
6580 pm_buffer_append_byte(buffer, '}');
6581 break;
6582 }
6583 case PM_KEYWORD_HASH_NODE: {
6584 pm_buffer_append_string(buffer, "{\"type\":\"KeywordHashNode\",\"location\":", 37);
6585
6586 const pm_keyword_hash_node_t *cast = (const pm_keyword_hash_node_t *) node;
6587 pm_dump_json_location(buffer, &cast->base.location);
6588
6589 // Dump the KeywordHashNodeFlags field
6590 pm_buffer_append_byte(buffer, ',');
6591 pm_buffer_append_string(buffer, "\"KeywordHashNodeFlags\":", 23);
6592 size_t flags = 0;
6593 pm_buffer_append_byte(buffer, '[');
6594 if (PM_NODE_FLAG_P(cast, PM_KEYWORD_HASH_NODE_FLAGS_SYMBOL_KEYS)) {
6595 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6596 pm_buffer_append_string(buffer, "\"SYMBOL_KEYS\"", 13);
6597 flags++;
6598 }
6599 pm_buffer_append_byte(buffer, ']');
6600
6601 // Dump the elements field
6602 pm_buffer_append_byte(buffer, ',');
6603 pm_buffer_append_string(buffer, "\"elements\":", 11);
6604 const pm_node_list_t *elements = &cast->elements;
6605 pm_buffer_append_byte(buffer, '[');
6606
6607 for (size_t index = 0; index < elements->size; index++) {
6608 if (index != 0) pm_buffer_append_byte(buffer, ',');
6609 pm_dump_json(buffer, parser, elements->nodes[index]);
6610 }
6611 pm_buffer_append_byte(buffer, ']');
6612
6613 pm_buffer_append_byte(buffer, '}');
6614 break;
6615 }
6616 case PM_KEYWORD_REST_PARAMETER_NODE: {
6617 pm_buffer_append_string(buffer, "{\"type\":\"KeywordRestParameterNode\",\"location\":", 46);
6618
6620 pm_dump_json_location(buffer, &cast->base.location);
6621
6622 // Dump the ParameterFlags field
6623 pm_buffer_append_byte(buffer, ',');
6624 pm_buffer_append_string(buffer, "\"ParameterFlags\":", 17);
6625 size_t flags = 0;
6626 pm_buffer_append_byte(buffer, '[');
6627 if (PM_NODE_FLAG_P(cast, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) {
6628 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6629 pm_buffer_append_string(buffer, "\"REPEATED_PARAMETER\"", 20);
6630 flags++;
6631 }
6632 pm_buffer_append_byte(buffer, ']');
6633
6634 // Dump the name field
6635 pm_buffer_append_byte(buffer, ',');
6636 pm_buffer_append_string(buffer, "\"name\":", 7);
6637 if (cast->name != PM_CONSTANT_ID_UNSET) {
6638 pm_dump_json_constant(buffer, parser, cast->name);
6639 } else {
6640 pm_buffer_append_string(buffer, "null", 4);
6641 }
6642
6643 // Dump the name_loc field
6644 pm_buffer_append_byte(buffer, ',');
6645 pm_buffer_append_string(buffer, "\"name_loc\":", 11);
6646 if (cast->name_loc.length != 0) {
6647 pm_dump_json_location(buffer, &cast->name_loc);
6648 } else {
6649 pm_buffer_append_string(buffer, "null", 4);
6650 }
6651
6652 // Dump the operator_loc field
6653 pm_buffer_append_byte(buffer, ',');
6654 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
6655 pm_dump_json_location(buffer, &cast->operator_loc);
6656
6657 pm_buffer_append_byte(buffer, '}');
6658 break;
6659 }
6660 case PM_LAMBDA_NODE: {
6661 pm_buffer_append_string(buffer, "{\"type\":\"LambdaNode\",\"location\":", 32);
6662
6663 const pm_lambda_node_t *cast = (const pm_lambda_node_t *) node;
6664 pm_dump_json_location(buffer, &cast->base.location);
6665
6666 // Dump the locals field
6667 pm_buffer_append_byte(buffer, ',');
6668 pm_buffer_append_string(buffer, "\"locals\":", 9);
6669 const pm_constant_id_list_t *locals = &cast->locals;
6670 pm_buffer_append_byte(buffer, '[');
6671
6672 for (size_t index = 0; index < locals->size; index++) {
6673 if (index != 0) pm_buffer_append_byte(buffer, ',');
6674 pm_dump_json_constant(buffer, parser, locals->ids[index]);
6675 }
6676 pm_buffer_append_byte(buffer, ']');
6677
6678 // Dump the operator_loc field
6679 pm_buffer_append_byte(buffer, ',');
6680 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
6681 pm_dump_json_location(buffer, &cast->operator_loc);
6682
6683 // Dump the opening_loc field
6684 pm_buffer_append_byte(buffer, ',');
6685 pm_buffer_append_string(buffer, "\"opening_loc\":", 14);
6686 pm_dump_json_location(buffer, &cast->opening_loc);
6687
6688 // Dump the closing_loc field
6689 pm_buffer_append_byte(buffer, ',');
6690 pm_buffer_append_string(buffer, "\"closing_loc\":", 14);
6691 pm_dump_json_location(buffer, &cast->closing_loc);
6692
6693 // Dump the parameters field
6694 pm_buffer_append_byte(buffer, ',');
6695 pm_buffer_append_string(buffer, "\"parameters\":", 13);
6696 if (cast->parameters != NULL) {
6697 pm_dump_json(buffer, parser, (const pm_node_t *) cast->parameters);
6698 } else {
6699 pm_buffer_append_string(buffer, "null", 4);
6700 }
6701
6702 // Dump the body field
6703 pm_buffer_append_byte(buffer, ',');
6704 pm_buffer_append_string(buffer, "\"body\":", 7);
6705 if (cast->body != NULL) {
6706 pm_dump_json(buffer, parser, (const pm_node_t *) cast->body);
6707 } else {
6708 pm_buffer_append_string(buffer, "null", 4);
6709 }
6710
6711 pm_buffer_append_byte(buffer, '}');
6712 break;
6713 }
6714 case PM_LOCAL_VARIABLE_AND_WRITE_NODE: {
6715 pm_buffer_append_string(buffer, "{\"type\":\"LocalVariableAndWriteNode\",\"location\":", 47);
6716
6718 pm_dump_json_location(buffer, &cast->base.location);
6719
6720 // Dump the name_loc field
6721 pm_buffer_append_byte(buffer, ',');
6722 pm_buffer_append_string(buffer, "\"name_loc\":", 11);
6723 pm_dump_json_location(buffer, &cast->name_loc);
6724
6725 // Dump the operator_loc field
6726 pm_buffer_append_byte(buffer, ',');
6727 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
6728 pm_dump_json_location(buffer, &cast->operator_loc);
6729
6730 // Dump the value field
6731 pm_buffer_append_byte(buffer, ',');
6732 pm_buffer_append_string(buffer, "\"value\":", 8);
6733 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
6734
6735 // Dump the name field
6736 pm_buffer_append_byte(buffer, ',');
6737 pm_buffer_append_string(buffer, "\"name\":", 7);
6738 pm_dump_json_constant(buffer, parser, cast->name);
6739
6740 // Dump the depth field
6741 pm_buffer_append_byte(buffer, ',');
6742 pm_buffer_append_string(buffer, "\"depth\":", 8);
6743 pm_buffer_append_format(buffer, "%" PRIu32, cast->depth);
6744
6745 pm_buffer_append_byte(buffer, '}');
6746 break;
6747 }
6748 case PM_LOCAL_VARIABLE_OPERATOR_WRITE_NODE: {
6749 pm_buffer_append_string(buffer, "{\"type\":\"LocalVariableOperatorWriteNode\",\"location\":", 52);
6750
6752 pm_dump_json_location(buffer, &cast->base.location);
6753
6754 // Dump the name_loc field
6755 pm_buffer_append_byte(buffer, ',');
6756 pm_buffer_append_string(buffer, "\"name_loc\":", 11);
6757 pm_dump_json_location(buffer, &cast->name_loc);
6758
6759 // Dump the binary_operator_loc field
6760 pm_buffer_append_byte(buffer, ',');
6761 pm_buffer_append_string(buffer, "\"binary_operator_loc\":", 22);
6762 pm_dump_json_location(buffer, &cast->binary_operator_loc);
6763
6764 // Dump the value field
6765 pm_buffer_append_byte(buffer, ',');
6766 pm_buffer_append_string(buffer, "\"value\":", 8);
6767 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
6768
6769 // Dump the name field
6770 pm_buffer_append_byte(buffer, ',');
6771 pm_buffer_append_string(buffer, "\"name\":", 7);
6772 pm_dump_json_constant(buffer, parser, cast->name);
6773
6774 // Dump the binary_operator field
6775 pm_buffer_append_byte(buffer, ',');
6776 pm_buffer_append_string(buffer, "\"binary_operator\":", 18);
6777 pm_dump_json_constant(buffer, parser, cast->binary_operator);
6778
6779 // Dump the depth field
6780 pm_buffer_append_byte(buffer, ',');
6781 pm_buffer_append_string(buffer, "\"depth\":", 8);
6782 pm_buffer_append_format(buffer, "%" PRIu32, cast->depth);
6783
6784 pm_buffer_append_byte(buffer, '}');
6785 break;
6786 }
6787 case PM_LOCAL_VARIABLE_OR_WRITE_NODE: {
6788 pm_buffer_append_string(buffer, "{\"type\":\"LocalVariableOrWriteNode\",\"location\":", 46);
6789
6791 pm_dump_json_location(buffer, &cast->base.location);
6792
6793 // Dump the name_loc field
6794 pm_buffer_append_byte(buffer, ',');
6795 pm_buffer_append_string(buffer, "\"name_loc\":", 11);
6796 pm_dump_json_location(buffer, &cast->name_loc);
6797
6798 // Dump the operator_loc field
6799 pm_buffer_append_byte(buffer, ',');
6800 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
6801 pm_dump_json_location(buffer, &cast->operator_loc);
6802
6803 // Dump the value field
6804 pm_buffer_append_byte(buffer, ',');
6805 pm_buffer_append_string(buffer, "\"value\":", 8);
6806 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
6807
6808 // Dump the name field
6809 pm_buffer_append_byte(buffer, ',');
6810 pm_buffer_append_string(buffer, "\"name\":", 7);
6811 pm_dump_json_constant(buffer, parser, cast->name);
6812
6813 // Dump the depth field
6814 pm_buffer_append_byte(buffer, ',');
6815 pm_buffer_append_string(buffer, "\"depth\":", 8);
6816 pm_buffer_append_format(buffer, "%" PRIu32, cast->depth);
6817
6818 pm_buffer_append_byte(buffer, '}');
6819 break;
6820 }
6821 case PM_LOCAL_VARIABLE_READ_NODE: {
6822 pm_buffer_append_string(buffer, "{\"type\":\"LocalVariableReadNode\",\"location\":", 43);
6823
6825 pm_dump_json_location(buffer, &cast->base.location);
6826
6827 // Dump the name field
6828 pm_buffer_append_byte(buffer, ',');
6829 pm_buffer_append_string(buffer, "\"name\":", 7);
6830 pm_dump_json_constant(buffer, parser, cast->name);
6831
6832 // Dump the depth field
6833 pm_buffer_append_byte(buffer, ',');
6834 pm_buffer_append_string(buffer, "\"depth\":", 8);
6835 pm_buffer_append_format(buffer, "%" PRIu32, cast->depth);
6836
6837 pm_buffer_append_byte(buffer, '}');
6838 break;
6839 }
6840 case PM_LOCAL_VARIABLE_TARGET_NODE: {
6841 pm_buffer_append_string(buffer, "{\"type\":\"LocalVariableTargetNode\",\"location\":", 45);
6842
6844 pm_dump_json_location(buffer, &cast->base.location);
6845
6846 // Dump the name field
6847 pm_buffer_append_byte(buffer, ',');
6848 pm_buffer_append_string(buffer, "\"name\":", 7);
6849 pm_dump_json_constant(buffer, parser, cast->name);
6850
6851 // Dump the depth field
6852 pm_buffer_append_byte(buffer, ',');
6853 pm_buffer_append_string(buffer, "\"depth\":", 8);
6854 pm_buffer_append_format(buffer, "%" PRIu32, cast->depth);
6855
6856 pm_buffer_append_byte(buffer, '}');
6857 break;
6858 }
6859 case PM_LOCAL_VARIABLE_WRITE_NODE: {
6860 pm_buffer_append_string(buffer, "{\"type\":\"LocalVariableWriteNode\",\"location\":", 44);
6861
6863 pm_dump_json_location(buffer, &cast->base.location);
6864
6865 // Dump the name field
6866 pm_buffer_append_byte(buffer, ',');
6867 pm_buffer_append_string(buffer, "\"name\":", 7);
6868 pm_dump_json_constant(buffer, parser, cast->name);
6869
6870 // Dump the depth field
6871 pm_buffer_append_byte(buffer, ',');
6872 pm_buffer_append_string(buffer, "\"depth\":", 8);
6873 pm_buffer_append_format(buffer, "%" PRIu32, cast->depth);
6874
6875 // Dump the name_loc field
6876 pm_buffer_append_byte(buffer, ',');
6877 pm_buffer_append_string(buffer, "\"name_loc\":", 11);
6878 pm_dump_json_location(buffer, &cast->name_loc);
6879
6880 // Dump the value field
6881 pm_buffer_append_byte(buffer, ',');
6882 pm_buffer_append_string(buffer, "\"value\":", 8);
6883 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
6884
6885 // Dump the operator_loc field
6886 pm_buffer_append_byte(buffer, ',');
6887 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
6888 pm_dump_json_location(buffer, &cast->operator_loc);
6889
6890 pm_buffer_append_byte(buffer, '}');
6891 break;
6892 }
6893 case PM_MATCH_LAST_LINE_NODE: {
6894 pm_buffer_append_string(buffer, "{\"type\":\"MatchLastLineNode\",\"location\":", 39);
6895
6896 const pm_match_last_line_node_t *cast = (const pm_match_last_line_node_t *) node;
6897 pm_dump_json_location(buffer, &cast->base.location);
6898
6899 // Dump the RegularExpressionFlags field
6900 pm_buffer_append_byte(buffer, ',');
6901 pm_buffer_append_string(buffer, "\"RegularExpressionFlags\":", 25);
6902 size_t flags = 0;
6903 pm_buffer_append_byte(buffer, '[');
6904 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_IGNORE_CASE)) {
6905 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6906 pm_buffer_append_string(buffer, "\"IGNORE_CASE\"", 13);
6907 flags++;
6908 }
6909 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_EXTENDED)) {
6910 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6911 pm_buffer_append_string(buffer, "\"EXTENDED\"", 10);
6912 flags++;
6913 }
6914 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_MULTI_LINE)) {
6915 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6916 pm_buffer_append_string(buffer, "\"MULTI_LINE\"", 12);
6917 flags++;
6918 }
6919 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_ONCE)) {
6920 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6921 pm_buffer_append_string(buffer, "\"ONCE\"", 6);
6922 flags++;
6923 }
6924 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_EUC_JP)) {
6925 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6926 pm_buffer_append_string(buffer, "\"EUC_JP\"", 8);
6927 flags++;
6928 }
6929 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_ASCII_8BIT)) {
6930 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6931 pm_buffer_append_string(buffer, "\"ASCII_8BIT\"", 12);
6932 flags++;
6933 }
6934 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_WINDOWS_31J)) {
6935 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6936 pm_buffer_append_string(buffer, "\"WINDOWS_31J\"", 13);
6937 flags++;
6938 }
6939 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_UTF_8)) {
6940 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6941 pm_buffer_append_string(buffer, "\"UTF_8\"", 7);
6942 flags++;
6943 }
6944 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_FORCED_UTF8_ENCODING)) {
6945 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6946 pm_buffer_append_string(buffer, "\"FORCED_UTF8_ENCODING\"", 22);
6947 flags++;
6948 }
6949 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_FORCED_BINARY_ENCODING)) {
6950 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6951 pm_buffer_append_string(buffer, "\"FORCED_BINARY_ENCODING\"", 24);
6952 flags++;
6953 }
6954 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_FORCED_US_ASCII_ENCODING)) {
6955 if (flags != 0) pm_buffer_append_byte(buffer, ',');
6956 pm_buffer_append_string(buffer, "\"FORCED_US_ASCII_ENCODING\"", 26);
6957 flags++;
6958 }
6959 pm_buffer_append_byte(buffer, ']');
6960
6961 // Dump the opening_loc field
6962 pm_buffer_append_byte(buffer, ',');
6963 pm_buffer_append_string(buffer, "\"opening_loc\":", 14);
6964 pm_dump_json_location(buffer, &cast->opening_loc);
6965
6966 // Dump the content_loc field
6967 pm_buffer_append_byte(buffer, ',');
6968 pm_buffer_append_string(buffer, "\"content_loc\":", 14);
6969 pm_dump_json_location(buffer, &cast->content_loc);
6970
6971 // Dump the closing_loc field
6972 pm_buffer_append_byte(buffer, ',');
6973 pm_buffer_append_string(buffer, "\"closing_loc\":", 14);
6974 pm_dump_json_location(buffer, &cast->closing_loc);
6975
6976 // Dump the unescaped field
6977 pm_buffer_append_byte(buffer, ',');
6978 pm_buffer_append_string(buffer, "\"unescaped\":", 12);
6979 const pm_string_t *unescaped = &cast->unescaped;
6980 pm_buffer_append_byte(buffer, '"');
6981 pm_buffer_append_source(buffer, pm_string_source(unescaped), pm_string_length(unescaped), PM_BUFFER_ESCAPING_JSON);
6982 pm_buffer_append_byte(buffer, '"');
6983
6984 pm_buffer_append_byte(buffer, '}');
6985 break;
6986 }
6987 case PM_MATCH_PREDICATE_NODE: {
6988 pm_buffer_append_string(buffer, "{\"type\":\"MatchPredicateNode\",\"location\":", 40);
6989
6990 const pm_match_predicate_node_t *cast = (const pm_match_predicate_node_t *) node;
6991 pm_dump_json_location(buffer, &cast->base.location);
6992
6993 // Dump the value field
6994 pm_buffer_append_byte(buffer, ',');
6995 pm_buffer_append_string(buffer, "\"value\":", 8);
6996 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
6997
6998 // Dump the pattern field
6999 pm_buffer_append_byte(buffer, ',');
7000 pm_buffer_append_string(buffer, "\"pattern\":", 10);
7001 pm_dump_json(buffer, parser, (const pm_node_t *) cast->pattern);
7002
7003 // Dump the operator_loc field
7004 pm_buffer_append_byte(buffer, ',');
7005 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
7006 pm_dump_json_location(buffer, &cast->operator_loc);
7007
7008 pm_buffer_append_byte(buffer, '}');
7009 break;
7010 }
7011 case PM_MATCH_REQUIRED_NODE: {
7012 pm_buffer_append_string(buffer, "{\"type\":\"MatchRequiredNode\",\"location\":", 39);
7013
7014 const pm_match_required_node_t *cast = (const pm_match_required_node_t *) node;
7015 pm_dump_json_location(buffer, &cast->base.location);
7016
7017 // Dump the value field
7018 pm_buffer_append_byte(buffer, ',');
7019 pm_buffer_append_string(buffer, "\"value\":", 8);
7020 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
7021
7022 // Dump the pattern field
7023 pm_buffer_append_byte(buffer, ',');
7024 pm_buffer_append_string(buffer, "\"pattern\":", 10);
7025 pm_dump_json(buffer, parser, (const pm_node_t *) cast->pattern);
7026
7027 // Dump the operator_loc field
7028 pm_buffer_append_byte(buffer, ',');
7029 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
7030 pm_dump_json_location(buffer, &cast->operator_loc);
7031
7032 pm_buffer_append_byte(buffer, '}');
7033 break;
7034 }
7035 case PM_MATCH_WRITE_NODE: {
7036 pm_buffer_append_string(buffer, "{\"type\":\"MatchWriteNode\",\"location\":", 36);
7037
7038 const pm_match_write_node_t *cast = (const pm_match_write_node_t *) node;
7039 pm_dump_json_location(buffer, &cast->base.location);
7040
7041 // Dump the call field
7042 pm_buffer_append_byte(buffer, ',');
7043 pm_buffer_append_string(buffer, "\"call\":", 7);
7044 pm_dump_json(buffer, parser, (const pm_node_t *) cast->call);
7045
7046 // Dump the targets field
7047 pm_buffer_append_byte(buffer, ',');
7048 pm_buffer_append_string(buffer, "\"targets\":", 10);
7049 const pm_node_list_t *targets = &cast->targets;
7050 pm_buffer_append_byte(buffer, '[');
7051
7052 for (size_t index = 0; index < targets->size; index++) {
7053 if (index != 0) pm_buffer_append_byte(buffer, ',');
7054 pm_dump_json(buffer, parser, targets->nodes[index]);
7055 }
7056 pm_buffer_append_byte(buffer, ']');
7057
7058 pm_buffer_append_byte(buffer, '}');
7059 break;
7060 }
7061 case PM_MISSING_NODE: {
7062 pm_buffer_append_string(buffer, "{\"type\":\"MissingNode\",\"location\":", 33);
7063
7064 const pm_missing_node_t *cast = (const pm_missing_node_t *) node;
7065 pm_dump_json_location(buffer, &cast->base.location);
7066
7067 pm_buffer_append_byte(buffer, '}');
7068 break;
7069 }
7070 case PM_MODULE_NODE: {
7071 pm_buffer_append_string(buffer, "{\"type\":\"ModuleNode\",\"location\":", 32);
7072
7073 const pm_module_node_t *cast = (const pm_module_node_t *) node;
7074 pm_dump_json_location(buffer, &cast->base.location);
7075
7076 // Dump the locals field
7077 pm_buffer_append_byte(buffer, ',');
7078 pm_buffer_append_string(buffer, "\"locals\":", 9);
7079 const pm_constant_id_list_t *locals = &cast->locals;
7080 pm_buffer_append_byte(buffer, '[');
7081
7082 for (size_t index = 0; index < locals->size; index++) {
7083 if (index != 0) pm_buffer_append_byte(buffer, ',');
7084 pm_dump_json_constant(buffer, parser, locals->ids[index]);
7085 }
7086 pm_buffer_append_byte(buffer, ']');
7087
7088 // Dump the module_keyword_loc field
7089 pm_buffer_append_byte(buffer, ',');
7090 pm_buffer_append_string(buffer, "\"module_keyword_loc\":", 21);
7091 pm_dump_json_location(buffer, &cast->module_keyword_loc);
7092
7093 // Dump the constant_path field
7094 pm_buffer_append_byte(buffer, ',');
7095 pm_buffer_append_string(buffer, "\"constant_path\":", 16);
7096 pm_dump_json(buffer, parser, (const pm_node_t *) cast->constant_path);
7097
7098 // Dump the body field
7099 pm_buffer_append_byte(buffer, ',');
7100 pm_buffer_append_string(buffer, "\"body\":", 7);
7101 if (cast->body != NULL) {
7102 pm_dump_json(buffer, parser, (const pm_node_t *) cast->body);
7103 } else {
7104 pm_buffer_append_string(buffer, "null", 4);
7105 }
7106
7107 // Dump the end_keyword_loc field
7108 pm_buffer_append_byte(buffer, ',');
7109 pm_buffer_append_string(buffer, "\"end_keyword_loc\":", 18);
7110 pm_dump_json_location(buffer, &cast->end_keyword_loc);
7111
7112 // Dump the name field
7113 pm_buffer_append_byte(buffer, ',');
7114 pm_buffer_append_string(buffer, "\"name\":", 7);
7115 pm_dump_json_constant(buffer, parser, cast->name);
7116
7117 pm_buffer_append_byte(buffer, '}');
7118 break;
7119 }
7120 case PM_MULTI_TARGET_NODE: {
7121 pm_buffer_append_string(buffer, "{\"type\":\"MultiTargetNode\",\"location\":", 37);
7122
7123 const pm_multi_target_node_t *cast = (const pm_multi_target_node_t *) node;
7124 pm_dump_json_location(buffer, &cast->base.location);
7125
7126 // Dump the lefts field
7127 pm_buffer_append_byte(buffer, ',');
7128 pm_buffer_append_string(buffer, "\"lefts\":", 8);
7129 const pm_node_list_t *lefts = &cast->lefts;
7130 pm_buffer_append_byte(buffer, '[');
7131
7132 for (size_t index = 0; index < lefts->size; index++) {
7133 if (index != 0) pm_buffer_append_byte(buffer, ',');
7134 pm_dump_json(buffer, parser, lefts->nodes[index]);
7135 }
7136 pm_buffer_append_byte(buffer, ']');
7137
7138 // Dump the rest field
7139 pm_buffer_append_byte(buffer, ',');
7140 pm_buffer_append_string(buffer, "\"rest\":", 7);
7141 if (cast->rest != NULL) {
7142 pm_dump_json(buffer, parser, (const pm_node_t *) cast->rest);
7143 } else {
7144 pm_buffer_append_string(buffer, "null", 4);
7145 }
7146
7147 // Dump the rights field
7148 pm_buffer_append_byte(buffer, ',');
7149 pm_buffer_append_string(buffer, "\"rights\":", 9);
7150 const pm_node_list_t *rights = &cast->rights;
7151 pm_buffer_append_byte(buffer, '[');
7152
7153 for (size_t index = 0; index < rights->size; index++) {
7154 if (index != 0) pm_buffer_append_byte(buffer, ',');
7155 pm_dump_json(buffer, parser, rights->nodes[index]);
7156 }
7157 pm_buffer_append_byte(buffer, ']');
7158
7159 // Dump the lparen_loc field
7160 pm_buffer_append_byte(buffer, ',');
7161 pm_buffer_append_string(buffer, "\"lparen_loc\":", 13);
7162 if (cast->lparen_loc.length != 0) {
7163 pm_dump_json_location(buffer, &cast->lparen_loc);
7164 } else {
7165 pm_buffer_append_string(buffer, "null", 4);
7166 }
7167
7168 // Dump the rparen_loc field
7169 pm_buffer_append_byte(buffer, ',');
7170 pm_buffer_append_string(buffer, "\"rparen_loc\":", 13);
7171 if (cast->rparen_loc.length != 0) {
7172 pm_dump_json_location(buffer, &cast->rparen_loc);
7173 } else {
7174 pm_buffer_append_string(buffer, "null", 4);
7175 }
7176
7177 pm_buffer_append_byte(buffer, '}');
7178 break;
7179 }
7180 case PM_MULTI_WRITE_NODE: {
7181 pm_buffer_append_string(buffer, "{\"type\":\"MultiWriteNode\",\"location\":", 36);
7182
7183 const pm_multi_write_node_t *cast = (const pm_multi_write_node_t *) node;
7184 pm_dump_json_location(buffer, &cast->base.location);
7185
7186 // Dump the lefts field
7187 pm_buffer_append_byte(buffer, ',');
7188 pm_buffer_append_string(buffer, "\"lefts\":", 8);
7189 const pm_node_list_t *lefts = &cast->lefts;
7190 pm_buffer_append_byte(buffer, '[');
7191
7192 for (size_t index = 0; index < lefts->size; index++) {
7193 if (index != 0) pm_buffer_append_byte(buffer, ',');
7194 pm_dump_json(buffer, parser, lefts->nodes[index]);
7195 }
7196 pm_buffer_append_byte(buffer, ']');
7197
7198 // Dump the rest field
7199 pm_buffer_append_byte(buffer, ',');
7200 pm_buffer_append_string(buffer, "\"rest\":", 7);
7201 if (cast->rest != NULL) {
7202 pm_dump_json(buffer, parser, (const pm_node_t *) cast->rest);
7203 } else {
7204 pm_buffer_append_string(buffer, "null", 4);
7205 }
7206
7207 // Dump the rights field
7208 pm_buffer_append_byte(buffer, ',');
7209 pm_buffer_append_string(buffer, "\"rights\":", 9);
7210 const pm_node_list_t *rights = &cast->rights;
7211 pm_buffer_append_byte(buffer, '[');
7212
7213 for (size_t index = 0; index < rights->size; index++) {
7214 if (index != 0) pm_buffer_append_byte(buffer, ',');
7215 pm_dump_json(buffer, parser, rights->nodes[index]);
7216 }
7217 pm_buffer_append_byte(buffer, ']');
7218
7219 // Dump the lparen_loc field
7220 pm_buffer_append_byte(buffer, ',');
7221 pm_buffer_append_string(buffer, "\"lparen_loc\":", 13);
7222 if (cast->lparen_loc.length != 0) {
7223 pm_dump_json_location(buffer, &cast->lparen_loc);
7224 } else {
7225 pm_buffer_append_string(buffer, "null", 4);
7226 }
7227
7228 // Dump the rparen_loc field
7229 pm_buffer_append_byte(buffer, ',');
7230 pm_buffer_append_string(buffer, "\"rparen_loc\":", 13);
7231 if (cast->rparen_loc.length != 0) {
7232 pm_dump_json_location(buffer, &cast->rparen_loc);
7233 } else {
7234 pm_buffer_append_string(buffer, "null", 4);
7235 }
7236
7237 // Dump the operator_loc field
7238 pm_buffer_append_byte(buffer, ',');
7239 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
7240 pm_dump_json_location(buffer, &cast->operator_loc);
7241
7242 // Dump the value field
7243 pm_buffer_append_byte(buffer, ',');
7244 pm_buffer_append_string(buffer, "\"value\":", 8);
7245 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
7246
7247 pm_buffer_append_byte(buffer, '}');
7248 break;
7249 }
7250 case PM_NEXT_NODE: {
7251 pm_buffer_append_string(buffer, "{\"type\":\"NextNode\",\"location\":", 30);
7252
7253 const pm_next_node_t *cast = (const pm_next_node_t *) node;
7254 pm_dump_json_location(buffer, &cast->base.location);
7255
7256 // Dump the arguments field
7257 pm_buffer_append_byte(buffer, ',');
7258 pm_buffer_append_string(buffer, "\"arguments\":", 12);
7259 if (cast->arguments != NULL) {
7260 pm_dump_json(buffer, parser, (const pm_node_t *) cast->arguments);
7261 } else {
7262 pm_buffer_append_string(buffer, "null", 4);
7263 }
7264
7265 // Dump the keyword_loc field
7266 pm_buffer_append_byte(buffer, ',');
7267 pm_buffer_append_string(buffer, "\"keyword_loc\":", 14);
7268 pm_dump_json_location(buffer, &cast->keyword_loc);
7269
7270 pm_buffer_append_byte(buffer, '}');
7271 break;
7272 }
7273 case PM_NIL_NODE: {
7274 pm_buffer_append_string(buffer, "{\"type\":\"NilNode\",\"location\":", 29);
7275
7276 const pm_nil_node_t *cast = (const pm_nil_node_t *) node;
7277 pm_dump_json_location(buffer, &cast->base.location);
7278
7279 pm_buffer_append_byte(buffer, '}');
7280 break;
7281 }
7282 case PM_NO_BLOCK_PARAMETER_NODE: {
7283 pm_buffer_append_string(buffer, "{\"type\":\"NoBlockParameterNode\",\"location\":", 42);
7284
7286 pm_dump_json_location(buffer, &cast->base.location);
7287
7288 // Dump the operator_loc field
7289 pm_buffer_append_byte(buffer, ',');
7290 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
7291 pm_dump_json_location(buffer, &cast->operator_loc);
7292
7293 // Dump the keyword_loc field
7294 pm_buffer_append_byte(buffer, ',');
7295 pm_buffer_append_string(buffer, "\"keyword_loc\":", 14);
7296 pm_dump_json_location(buffer, &cast->keyword_loc);
7297
7298 pm_buffer_append_byte(buffer, '}');
7299 break;
7300 }
7301 case PM_NO_KEYWORDS_PARAMETER_NODE: {
7302 pm_buffer_append_string(buffer, "{\"type\":\"NoKeywordsParameterNode\",\"location\":", 45);
7303
7305 pm_dump_json_location(buffer, &cast->base.location);
7306
7307 // Dump the operator_loc field
7308 pm_buffer_append_byte(buffer, ',');
7309 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
7310 pm_dump_json_location(buffer, &cast->operator_loc);
7311
7312 // Dump the keyword_loc field
7313 pm_buffer_append_byte(buffer, ',');
7314 pm_buffer_append_string(buffer, "\"keyword_loc\":", 14);
7315 pm_dump_json_location(buffer, &cast->keyword_loc);
7316
7317 pm_buffer_append_byte(buffer, '}');
7318 break;
7319 }
7320 case PM_NUMBERED_PARAMETERS_NODE: {
7321 pm_buffer_append_string(buffer, "{\"type\":\"NumberedParametersNode\",\"location\":", 44);
7322
7324 pm_dump_json_location(buffer, &cast->base.location);
7325
7326 // Dump the maximum field
7327 pm_buffer_append_byte(buffer, ',');
7328 pm_buffer_append_string(buffer, "\"maximum\":", 10);
7329 pm_buffer_append_format(buffer, "%" PRIu8, cast->maximum);
7330
7331 pm_buffer_append_byte(buffer, '}');
7332 break;
7333 }
7334 case PM_NUMBERED_REFERENCE_READ_NODE: {
7335 pm_buffer_append_string(buffer, "{\"type\":\"NumberedReferenceReadNode\",\"location\":", 47);
7336
7338 pm_dump_json_location(buffer, &cast->base.location);
7339
7340 // Dump the number field
7341 pm_buffer_append_byte(buffer, ',');
7342 pm_buffer_append_string(buffer, "\"number\":", 9);
7343 pm_buffer_append_format(buffer, "%" PRIu32, cast->number);
7344
7345 pm_buffer_append_byte(buffer, '}');
7346 break;
7347 }
7348 case PM_OPTIONAL_KEYWORD_PARAMETER_NODE: {
7349 pm_buffer_append_string(buffer, "{\"type\":\"OptionalKeywordParameterNode\",\"location\":", 50);
7350
7352 pm_dump_json_location(buffer, &cast->base.location);
7353
7354 // Dump the ParameterFlags field
7355 pm_buffer_append_byte(buffer, ',');
7356 pm_buffer_append_string(buffer, "\"ParameterFlags\":", 17);
7357 size_t flags = 0;
7358 pm_buffer_append_byte(buffer, '[');
7359 if (PM_NODE_FLAG_P(cast, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) {
7360 if (flags != 0) pm_buffer_append_byte(buffer, ',');
7361 pm_buffer_append_string(buffer, "\"REPEATED_PARAMETER\"", 20);
7362 flags++;
7363 }
7364 pm_buffer_append_byte(buffer, ']');
7365
7366 // Dump the name field
7367 pm_buffer_append_byte(buffer, ',');
7368 pm_buffer_append_string(buffer, "\"name\":", 7);
7369 pm_dump_json_constant(buffer, parser, cast->name);
7370
7371 // Dump the name_loc field
7372 pm_buffer_append_byte(buffer, ',');
7373 pm_buffer_append_string(buffer, "\"name_loc\":", 11);
7374 pm_dump_json_location(buffer, &cast->name_loc);
7375
7376 // Dump the value field
7377 pm_buffer_append_byte(buffer, ',');
7378 pm_buffer_append_string(buffer, "\"value\":", 8);
7379 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
7380
7381 pm_buffer_append_byte(buffer, '}');
7382 break;
7383 }
7384 case PM_OPTIONAL_PARAMETER_NODE: {
7385 pm_buffer_append_string(buffer, "{\"type\":\"OptionalParameterNode\",\"location\":", 43);
7386
7388 pm_dump_json_location(buffer, &cast->base.location);
7389
7390 // Dump the ParameterFlags field
7391 pm_buffer_append_byte(buffer, ',');
7392 pm_buffer_append_string(buffer, "\"ParameterFlags\":", 17);
7393 size_t flags = 0;
7394 pm_buffer_append_byte(buffer, '[');
7395 if (PM_NODE_FLAG_P(cast, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) {
7396 if (flags != 0) pm_buffer_append_byte(buffer, ',');
7397 pm_buffer_append_string(buffer, "\"REPEATED_PARAMETER\"", 20);
7398 flags++;
7399 }
7400 pm_buffer_append_byte(buffer, ']');
7401
7402 // Dump the name field
7403 pm_buffer_append_byte(buffer, ',');
7404 pm_buffer_append_string(buffer, "\"name\":", 7);
7405 pm_dump_json_constant(buffer, parser, cast->name);
7406
7407 // Dump the name_loc field
7408 pm_buffer_append_byte(buffer, ',');
7409 pm_buffer_append_string(buffer, "\"name_loc\":", 11);
7410 pm_dump_json_location(buffer, &cast->name_loc);
7411
7412 // Dump the operator_loc field
7413 pm_buffer_append_byte(buffer, ',');
7414 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
7415 pm_dump_json_location(buffer, &cast->operator_loc);
7416
7417 // Dump the value field
7418 pm_buffer_append_byte(buffer, ',');
7419 pm_buffer_append_string(buffer, "\"value\":", 8);
7420 pm_dump_json(buffer, parser, (const pm_node_t *) cast->value);
7421
7422 pm_buffer_append_byte(buffer, '}');
7423 break;
7424 }
7425 case PM_OR_NODE: {
7426 pm_buffer_append_string(buffer, "{\"type\":\"OrNode\",\"location\":", 28);
7427
7428 const pm_or_node_t *cast = (const pm_or_node_t *) node;
7429 pm_dump_json_location(buffer, &cast->base.location);
7430
7431 // Dump the left field
7432 pm_buffer_append_byte(buffer, ',');
7433 pm_buffer_append_string(buffer, "\"left\":", 7);
7434 pm_dump_json(buffer, parser, (const pm_node_t *) cast->left);
7435
7436 // Dump the right field
7437 pm_buffer_append_byte(buffer, ',');
7438 pm_buffer_append_string(buffer, "\"right\":", 8);
7439 pm_dump_json(buffer, parser, (const pm_node_t *) cast->right);
7440
7441 // Dump the operator_loc field
7442 pm_buffer_append_byte(buffer, ',');
7443 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
7444 pm_dump_json_location(buffer, &cast->operator_loc);
7445
7446 pm_buffer_append_byte(buffer, '}');
7447 break;
7448 }
7449 case PM_PARAMETERS_NODE: {
7450 pm_buffer_append_string(buffer, "{\"type\":\"ParametersNode\",\"location\":", 36);
7451
7452 const pm_parameters_node_t *cast = (const pm_parameters_node_t *) node;
7453 pm_dump_json_location(buffer, &cast->base.location);
7454
7455 // Dump the requireds field
7456 pm_buffer_append_byte(buffer, ',');
7457 pm_buffer_append_string(buffer, "\"requireds\":", 12);
7458 const pm_node_list_t *requireds = &cast->requireds;
7459 pm_buffer_append_byte(buffer, '[');
7460
7461 for (size_t index = 0; index < requireds->size; index++) {
7462 if (index != 0) pm_buffer_append_byte(buffer, ',');
7463 pm_dump_json(buffer, parser, requireds->nodes[index]);
7464 }
7465 pm_buffer_append_byte(buffer, ']');
7466
7467 // Dump the optionals field
7468 pm_buffer_append_byte(buffer, ',');
7469 pm_buffer_append_string(buffer, "\"optionals\":", 12);
7470 const pm_node_list_t *optionals = &cast->optionals;
7471 pm_buffer_append_byte(buffer, '[');
7472
7473 for (size_t index = 0; index < optionals->size; index++) {
7474 if (index != 0) pm_buffer_append_byte(buffer, ',');
7475 pm_dump_json(buffer, parser, optionals->nodes[index]);
7476 }
7477 pm_buffer_append_byte(buffer, ']');
7478
7479 // Dump the rest field
7480 pm_buffer_append_byte(buffer, ',');
7481 pm_buffer_append_string(buffer, "\"rest\":", 7);
7482 if (cast->rest != NULL) {
7483 pm_dump_json(buffer, parser, (const pm_node_t *) cast->rest);
7484 } else {
7485 pm_buffer_append_string(buffer, "null", 4);
7486 }
7487
7488 // Dump the posts field
7489 pm_buffer_append_byte(buffer, ',');
7490 pm_buffer_append_string(buffer, "\"posts\":", 8);
7491 const pm_node_list_t *posts = &cast->posts;
7492 pm_buffer_append_byte(buffer, '[');
7493
7494 for (size_t index = 0; index < posts->size; index++) {
7495 if (index != 0) pm_buffer_append_byte(buffer, ',');
7496 pm_dump_json(buffer, parser, posts->nodes[index]);
7497 }
7498 pm_buffer_append_byte(buffer, ']');
7499
7500 // Dump the keywords field
7501 pm_buffer_append_byte(buffer, ',');
7502 pm_buffer_append_string(buffer, "\"keywords\":", 11);
7503 const pm_node_list_t *keywords = &cast->keywords;
7504 pm_buffer_append_byte(buffer, '[');
7505
7506 for (size_t index = 0; index < keywords->size; index++) {
7507 if (index != 0) pm_buffer_append_byte(buffer, ',');
7508 pm_dump_json(buffer, parser, keywords->nodes[index]);
7509 }
7510 pm_buffer_append_byte(buffer, ']');
7511
7512 // Dump the keyword_rest field
7513 pm_buffer_append_byte(buffer, ',');
7514 pm_buffer_append_string(buffer, "\"keyword_rest\":", 15);
7515 if (cast->keyword_rest != NULL) {
7516 pm_dump_json(buffer, parser, (const pm_node_t *) cast->keyword_rest);
7517 } else {
7518 pm_buffer_append_string(buffer, "null", 4);
7519 }
7520
7521 // Dump the block field
7522 pm_buffer_append_byte(buffer, ',');
7523 pm_buffer_append_string(buffer, "\"block\":", 8);
7524 if (cast->block != NULL) {
7525 pm_dump_json(buffer, parser, (const pm_node_t *) cast->block);
7526 } else {
7527 pm_buffer_append_string(buffer, "null", 4);
7528 }
7529
7530 pm_buffer_append_byte(buffer, '}');
7531 break;
7532 }
7533 case PM_PARENTHESES_NODE: {
7534 pm_buffer_append_string(buffer, "{\"type\":\"ParenthesesNode\",\"location\":", 37);
7535
7536 const pm_parentheses_node_t *cast = (const pm_parentheses_node_t *) node;
7537 pm_dump_json_location(buffer, &cast->base.location);
7538
7539 // Dump the ParenthesesNodeFlags field
7540 pm_buffer_append_byte(buffer, ',');
7541 pm_buffer_append_string(buffer, "\"ParenthesesNodeFlags\":", 23);
7542 size_t flags = 0;
7543 pm_buffer_append_byte(buffer, '[');
7544 if (PM_NODE_FLAG_P(cast, PM_PARENTHESES_NODE_FLAGS_MULTIPLE_STATEMENTS)) {
7545 if (flags != 0) pm_buffer_append_byte(buffer, ',');
7546 pm_buffer_append_string(buffer, "\"MULTIPLE_STATEMENTS\"", 21);
7547 flags++;
7548 }
7549 pm_buffer_append_byte(buffer, ']');
7550
7551 // Dump the body field
7552 pm_buffer_append_byte(buffer, ',');
7553 pm_buffer_append_string(buffer, "\"body\":", 7);
7554 if (cast->body != NULL) {
7555 pm_dump_json(buffer, parser, (const pm_node_t *) cast->body);
7556 } else {
7557 pm_buffer_append_string(buffer, "null", 4);
7558 }
7559
7560 // Dump the opening_loc field
7561 pm_buffer_append_byte(buffer, ',');
7562 pm_buffer_append_string(buffer, "\"opening_loc\":", 14);
7563 pm_dump_json_location(buffer, &cast->opening_loc);
7564
7565 // Dump the closing_loc field
7566 pm_buffer_append_byte(buffer, ',');
7567 pm_buffer_append_string(buffer, "\"closing_loc\":", 14);
7568 pm_dump_json_location(buffer, &cast->closing_loc);
7569
7570 pm_buffer_append_byte(buffer, '}');
7571 break;
7572 }
7573 case PM_PINNED_EXPRESSION_NODE: {
7574 pm_buffer_append_string(buffer, "{\"type\":\"PinnedExpressionNode\",\"location\":", 42);
7575
7576 const pm_pinned_expression_node_t *cast = (const pm_pinned_expression_node_t *) node;
7577 pm_dump_json_location(buffer, &cast->base.location);
7578
7579 // Dump the expression field
7580 pm_buffer_append_byte(buffer, ',');
7581 pm_buffer_append_string(buffer, "\"expression\":", 13);
7582 pm_dump_json(buffer, parser, (const pm_node_t *) cast->expression);
7583
7584 // Dump the operator_loc field
7585 pm_buffer_append_byte(buffer, ',');
7586 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
7587 pm_dump_json_location(buffer, &cast->operator_loc);
7588
7589 // Dump the lparen_loc field
7590 pm_buffer_append_byte(buffer, ',');
7591 pm_buffer_append_string(buffer, "\"lparen_loc\":", 13);
7592 pm_dump_json_location(buffer, &cast->lparen_loc);
7593
7594 // Dump the rparen_loc field
7595 pm_buffer_append_byte(buffer, ',');
7596 pm_buffer_append_string(buffer, "\"rparen_loc\":", 13);
7597 pm_dump_json_location(buffer, &cast->rparen_loc);
7598
7599 pm_buffer_append_byte(buffer, '}');
7600 break;
7601 }
7602 case PM_PINNED_VARIABLE_NODE: {
7603 pm_buffer_append_string(buffer, "{\"type\":\"PinnedVariableNode\",\"location\":", 40);
7604
7605 const pm_pinned_variable_node_t *cast = (const pm_pinned_variable_node_t *) node;
7606 pm_dump_json_location(buffer, &cast->base.location);
7607
7608 // Dump the variable field
7609 pm_buffer_append_byte(buffer, ',');
7610 pm_buffer_append_string(buffer, "\"variable\":", 11);
7611 pm_dump_json(buffer, parser, (const pm_node_t *) cast->variable);
7612
7613 // Dump the operator_loc field
7614 pm_buffer_append_byte(buffer, ',');
7615 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
7616 pm_dump_json_location(buffer, &cast->operator_loc);
7617
7618 pm_buffer_append_byte(buffer, '}');
7619 break;
7620 }
7621 case PM_POST_EXECUTION_NODE: {
7622 pm_buffer_append_string(buffer, "{\"type\":\"PostExecutionNode\",\"location\":", 39);
7623
7624 const pm_post_execution_node_t *cast = (const pm_post_execution_node_t *) node;
7625 pm_dump_json_location(buffer, &cast->base.location);
7626
7627 // Dump the statements field
7628 pm_buffer_append_byte(buffer, ',');
7629 pm_buffer_append_string(buffer, "\"statements\":", 13);
7630 if (cast->statements != NULL) {
7631 pm_dump_json(buffer, parser, (const pm_node_t *) cast->statements);
7632 } else {
7633 pm_buffer_append_string(buffer, "null", 4);
7634 }
7635
7636 // Dump the keyword_loc field
7637 pm_buffer_append_byte(buffer, ',');
7638 pm_buffer_append_string(buffer, "\"keyword_loc\":", 14);
7639 pm_dump_json_location(buffer, &cast->keyword_loc);
7640
7641 // Dump the opening_loc field
7642 pm_buffer_append_byte(buffer, ',');
7643 pm_buffer_append_string(buffer, "\"opening_loc\":", 14);
7644 pm_dump_json_location(buffer, &cast->opening_loc);
7645
7646 // Dump the closing_loc field
7647 pm_buffer_append_byte(buffer, ',');
7648 pm_buffer_append_string(buffer, "\"closing_loc\":", 14);
7649 pm_dump_json_location(buffer, &cast->closing_loc);
7650
7651 pm_buffer_append_byte(buffer, '}');
7652 break;
7653 }
7654 case PM_PRE_EXECUTION_NODE: {
7655 pm_buffer_append_string(buffer, "{\"type\":\"PreExecutionNode\",\"location\":", 38);
7656
7657 const pm_pre_execution_node_t *cast = (const pm_pre_execution_node_t *) node;
7658 pm_dump_json_location(buffer, &cast->base.location);
7659
7660 // Dump the statements field
7661 pm_buffer_append_byte(buffer, ',');
7662 pm_buffer_append_string(buffer, "\"statements\":", 13);
7663 if (cast->statements != NULL) {
7664 pm_dump_json(buffer, parser, (const pm_node_t *) cast->statements);
7665 } else {
7666 pm_buffer_append_string(buffer, "null", 4);
7667 }
7668
7669 // Dump the keyword_loc field
7670 pm_buffer_append_byte(buffer, ',');
7671 pm_buffer_append_string(buffer, "\"keyword_loc\":", 14);
7672 pm_dump_json_location(buffer, &cast->keyword_loc);
7673
7674 // Dump the opening_loc field
7675 pm_buffer_append_byte(buffer, ',');
7676 pm_buffer_append_string(buffer, "\"opening_loc\":", 14);
7677 pm_dump_json_location(buffer, &cast->opening_loc);
7678
7679 // Dump the closing_loc field
7680 pm_buffer_append_byte(buffer, ',');
7681 pm_buffer_append_string(buffer, "\"closing_loc\":", 14);
7682 pm_dump_json_location(buffer, &cast->closing_loc);
7683
7684 pm_buffer_append_byte(buffer, '}');
7685 break;
7686 }
7687 case PM_PROGRAM_NODE: {
7688 pm_buffer_append_string(buffer, "{\"type\":\"ProgramNode\",\"location\":", 33);
7689
7690 const pm_program_node_t *cast = (const pm_program_node_t *) node;
7691 pm_dump_json_location(buffer, &cast->base.location);
7692
7693 // Dump the locals field
7694 pm_buffer_append_byte(buffer, ',');
7695 pm_buffer_append_string(buffer, "\"locals\":", 9);
7696 const pm_constant_id_list_t *locals = &cast->locals;
7697 pm_buffer_append_byte(buffer, '[');
7698
7699 for (size_t index = 0; index < locals->size; index++) {
7700 if (index != 0) pm_buffer_append_byte(buffer, ',');
7701 pm_dump_json_constant(buffer, parser, locals->ids[index]);
7702 }
7703 pm_buffer_append_byte(buffer, ']');
7704
7705 // Dump the statements field
7706 pm_buffer_append_byte(buffer, ',');
7707 pm_buffer_append_string(buffer, "\"statements\":", 13);
7708 pm_dump_json(buffer, parser, (const pm_node_t *) cast->statements);
7709
7710 pm_buffer_append_byte(buffer, '}');
7711 break;
7712 }
7713 case PM_RANGE_NODE: {
7714 pm_buffer_append_string(buffer, "{\"type\":\"RangeNode\",\"location\":", 31);
7715
7716 const pm_range_node_t *cast = (const pm_range_node_t *) node;
7717 pm_dump_json_location(buffer, &cast->base.location);
7718
7719 // Dump the RangeFlags field
7720 pm_buffer_append_byte(buffer, ',');
7721 pm_buffer_append_string(buffer, "\"RangeFlags\":", 13);
7722 size_t flags = 0;
7723 pm_buffer_append_byte(buffer, '[');
7724 if (PM_NODE_FLAG_P(cast, PM_RANGE_FLAGS_EXCLUDE_END)) {
7725 if (flags != 0) pm_buffer_append_byte(buffer, ',');
7726 pm_buffer_append_string(buffer, "\"EXCLUDE_END\"", 13);
7727 flags++;
7728 }
7729 pm_buffer_append_byte(buffer, ']');
7730
7731 // Dump the left field
7732 pm_buffer_append_byte(buffer, ',');
7733 pm_buffer_append_string(buffer, "\"left\":", 7);
7734 if (cast->left != NULL) {
7735 pm_dump_json(buffer, parser, (const pm_node_t *) cast->left);
7736 } else {
7737 pm_buffer_append_string(buffer, "null", 4);
7738 }
7739
7740 // Dump the right field
7741 pm_buffer_append_byte(buffer, ',');
7742 pm_buffer_append_string(buffer, "\"right\":", 8);
7743 if (cast->right != NULL) {
7744 pm_dump_json(buffer, parser, (const pm_node_t *) cast->right);
7745 } else {
7746 pm_buffer_append_string(buffer, "null", 4);
7747 }
7748
7749 // Dump the operator_loc field
7750 pm_buffer_append_byte(buffer, ',');
7751 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
7752 pm_dump_json_location(buffer, &cast->operator_loc);
7753
7754 pm_buffer_append_byte(buffer, '}');
7755 break;
7756 }
7757 case PM_RATIONAL_NODE: {
7758 pm_buffer_append_string(buffer, "{\"type\":\"RationalNode\",\"location\":", 34);
7759
7760 const pm_rational_node_t *cast = (const pm_rational_node_t *) node;
7761 pm_dump_json_location(buffer, &cast->base.location);
7762
7763 // Dump the IntegerBaseFlags field
7764 pm_buffer_append_byte(buffer, ',');
7765 pm_buffer_append_string(buffer, "\"IntegerBaseFlags\":", 19);
7766 size_t flags = 0;
7767 pm_buffer_append_byte(buffer, '[');
7768 if (PM_NODE_FLAG_P(cast, PM_INTEGER_BASE_FLAGS_BINARY)) {
7769 if (flags != 0) pm_buffer_append_byte(buffer, ',');
7770 pm_buffer_append_string(buffer, "\"BINARY\"", 8);
7771 flags++;
7772 }
7773 if (PM_NODE_FLAG_P(cast, PM_INTEGER_BASE_FLAGS_DECIMAL)) {
7774 if (flags != 0) pm_buffer_append_byte(buffer, ',');
7775 pm_buffer_append_string(buffer, "\"DECIMAL\"", 9);
7776 flags++;
7777 }
7778 if (PM_NODE_FLAG_P(cast, PM_INTEGER_BASE_FLAGS_OCTAL)) {
7779 if (flags != 0) pm_buffer_append_byte(buffer, ',');
7780 pm_buffer_append_string(buffer, "\"OCTAL\"", 7);
7781 flags++;
7782 }
7783 if (PM_NODE_FLAG_P(cast, PM_INTEGER_BASE_FLAGS_HEXADECIMAL)) {
7784 if (flags != 0) pm_buffer_append_byte(buffer, ',');
7785 pm_buffer_append_string(buffer, "\"HEXADECIMAL\"", 13);
7786 flags++;
7787 }
7788 pm_buffer_append_byte(buffer, ']');
7789
7790 // Dump the numerator field
7791 pm_buffer_append_byte(buffer, ',');
7792 pm_buffer_append_string(buffer, "\"numerator\":", 12);
7793 pm_integer_string(buffer, &cast->numerator);
7794
7795 // Dump the denominator field
7796 pm_buffer_append_byte(buffer, ',');
7797 pm_buffer_append_string(buffer, "\"denominator\":", 14);
7798 pm_integer_string(buffer, &cast->denominator);
7799
7800 pm_buffer_append_byte(buffer, '}');
7801 break;
7802 }
7803 case PM_REDO_NODE: {
7804 pm_buffer_append_string(buffer, "{\"type\":\"RedoNode\",\"location\":", 30);
7805
7806 const pm_redo_node_t *cast = (const pm_redo_node_t *) node;
7807 pm_dump_json_location(buffer, &cast->base.location);
7808
7809 pm_buffer_append_byte(buffer, '}');
7810 break;
7811 }
7812 case PM_REGULAR_EXPRESSION_NODE: {
7813 pm_buffer_append_string(buffer, "{\"type\":\"RegularExpressionNode\",\"location\":", 43);
7814
7816 pm_dump_json_location(buffer, &cast->base.location);
7817
7818 // Dump the RegularExpressionFlags field
7819 pm_buffer_append_byte(buffer, ',');
7820 pm_buffer_append_string(buffer, "\"RegularExpressionFlags\":", 25);
7821 size_t flags = 0;
7822 pm_buffer_append_byte(buffer, '[');
7823 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_IGNORE_CASE)) {
7824 if (flags != 0) pm_buffer_append_byte(buffer, ',');
7825 pm_buffer_append_string(buffer, "\"IGNORE_CASE\"", 13);
7826 flags++;
7827 }
7828 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_EXTENDED)) {
7829 if (flags != 0) pm_buffer_append_byte(buffer, ',');
7830 pm_buffer_append_string(buffer, "\"EXTENDED\"", 10);
7831 flags++;
7832 }
7833 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_MULTI_LINE)) {
7834 if (flags != 0) pm_buffer_append_byte(buffer, ',');
7835 pm_buffer_append_string(buffer, "\"MULTI_LINE\"", 12);
7836 flags++;
7837 }
7838 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_ONCE)) {
7839 if (flags != 0) pm_buffer_append_byte(buffer, ',');
7840 pm_buffer_append_string(buffer, "\"ONCE\"", 6);
7841 flags++;
7842 }
7843 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_EUC_JP)) {
7844 if (flags != 0) pm_buffer_append_byte(buffer, ',');
7845 pm_buffer_append_string(buffer, "\"EUC_JP\"", 8);
7846 flags++;
7847 }
7848 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_ASCII_8BIT)) {
7849 if (flags != 0) pm_buffer_append_byte(buffer, ',');
7850 pm_buffer_append_string(buffer, "\"ASCII_8BIT\"", 12);
7851 flags++;
7852 }
7853 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_WINDOWS_31J)) {
7854 if (flags != 0) pm_buffer_append_byte(buffer, ',');
7855 pm_buffer_append_string(buffer, "\"WINDOWS_31J\"", 13);
7856 flags++;
7857 }
7858 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_UTF_8)) {
7859 if (flags != 0) pm_buffer_append_byte(buffer, ',');
7860 pm_buffer_append_string(buffer, "\"UTF_8\"", 7);
7861 flags++;
7862 }
7863 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_FORCED_UTF8_ENCODING)) {
7864 if (flags != 0) pm_buffer_append_byte(buffer, ',');
7865 pm_buffer_append_string(buffer, "\"FORCED_UTF8_ENCODING\"", 22);
7866 flags++;
7867 }
7868 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_FORCED_BINARY_ENCODING)) {
7869 if (flags != 0) pm_buffer_append_byte(buffer, ',');
7870 pm_buffer_append_string(buffer, "\"FORCED_BINARY_ENCODING\"", 24);
7871 flags++;
7872 }
7873 if (PM_NODE_FLAG_P(cast, PM_REGULAR_EXPRESSION_FLAGS_FORCED_US_ASCII_ENCODING)) {
7874 if (flags != 0) pm_buffer_append_byte(buffer, ',');
7875 pm_buffer_append_string(buffer, "\"FORCED_US_ASCII_ENCODING\"", 26);
7876 flags++;
7877 }
7878 pm_buffer_append_byte(buffer, ']');
7879
7880 // Dump the opening_loc field
7881 pm_buffer_append_byte(buffer, ',');
7882 pm_buffer_append_string(buffer, "\"opening_loc\":", 14);
7883 pm_dump_json_location(buffer, &cast->opening_loc);
7884
7885 // Dump the content_loc field
7886 pm_buffer_append_byte(buffer, ',');
7887 pm_buffer_append_string(buffer, "\"content_loc\":", 14);
7888 pm_dump_json_location(buffer, &cast->content_loc);
7889
7890 // Dump the closing_loc field
7891 pm_buffer_append_byte(buffer, ',');
7892 pm_buffer_append_string(buffer, "\"closing_loc\":", 14);
7893 pm_dump_json_location(buffer, &cast->closing_loc);
7894
7895 // Dump the unescaped field
7896 pm_buffer_append_byte(buffer, ',');
7897 pm_buffer_append_string(buffer, "\"unescaped\":", 12);
7898 const pm_string_t *unescaped = &cast->unescaped;
7899 pm_buffer_append_byte(buffer, '"');
7900 pm_buffer_append_source(buffer, pm_string_source(unescaped), pm_string_length(unescaped), PM_BUFFER_ESCAPING_JSON);
7901 pm_buffer_append_byte(buffer, '"');
7902
7903 pm_buffer_append_byte(buffer, '}');
7904 break;
7905 }
7906 case PM_REQUIRED_KEYWORD_PARAMETER_NODE: {
7907 pm_buffer_append_string(buffer, "{\"type\":\"RequiredKeywordParameterNode\",\"location\":", 50);
7908
7910 pm_dump_json_location(buffer, &cast->base.location);
7911
7912 // Dump the ParameterFlags field
7913 pm_buffer_append_byte(buffer, ',');
7914 pm_buffer_append_string(buffer, "\"ParameterFlags\":", 17);
7915 size_t flags = 0;
7916 pm_buffer_append_byte(buffer, '[');
7917 if (PM_NODE_FLAG_P(cast, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) {
7918 if (flags != 0) pm_buffer_append_byte(buffer, ',');
7919 pm_buffer_append_string(buffer, "\"REPEATED_PARAMETER\"", 20);
7920 flags++;
7921 }
7922 pm_buffer_append_byte(buffer, ']');
7923
7924 // Dump the name field
7925 pm_buffer_append_byte(buffer, ',');
7926 pm_buffer_append_string(buffer, "\"name\":", 7);
7927 pm_dump_json_constant(buffer, parser, cast->name);
7928
7929 // Dump the name_loc field
7930 pm_buffer_append_byte(buffer, ',');
7931 pm_buffer_append_string(buffer, "\"name_loc\":", 11);
7932 pm_dump_json_location(buffer, &cast->name_loc);
7933
7934 pm_buffer_append_byte(buffer, '}');
7935 break;
7936 }
7937 case PM_REQUIRED_PARAMETER_NODE: {
7938 pm_buffer_append_string(buffer, "{\"type\":\"RequiredParameterNode\",\"location\":", 43);
7939
7941 pm_dump_json_location(buffer, &cast->base.location);
7942
7943 // Dump the ParameterFlags field
7944 pm_buffer_append_byte(buffer, ',');
7945 pm_buffer_append_string(buffer, "\"ParameterFlags\":", 17);
7946 size_t flags = 0;
7947 pm_buffer_append_byte(buffer, '[');
7948 if (PM_NODE_FLAG_P(cast, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) {
7949 if (flags != 0) pm_buffer_append_byte(buffer, ',');
7950 pm_buffer_append_string(buffer, "\"REPEATED_PARAMETER\"", 20);
7951 flags++;
7952 }
7953 pm_buffer_append_byte(buffer, ']');
7954
7955 // Dump the name field
7956 pm_buffer_append_byte(buffer, ',');
7957 pm_buffer_append_string(buffer, "\"name\":", 7);
7958 pm_dump_json_constant(buffer, parser, cast->name);
7959
7960 pm_buffer_append_byte(buffer, '}');
7961 break;
7962 }
7963 case PM_RESCUE_MODIFIER_NODE: {
7964 pm_buffer_append_string(buffer, "{\"type\":\"RescueModifierNode\",\"location\":", 40);
7965
7966 const pm_rescue_modifier_node_t *cast = (const pm_rescue_modifier_node_t *) node;
7967 pm_dump_json_location(buffer, &cast->base.location);
7968
7969 // Dump the expression field
7970 pm_buffer_append_byte(buffer, ',');
7971 pm_buffer_append_string(buffer, "\"expression\":", 13);
7972 pm_dump_json(buffer, parser, (const pm_node_t *) cast->expression);
7973
7974 // Dump the keyword_loc field
7975 pm_buffer_append_byte(buffer, ',');
7976 pm_buffer_append_string(buffer, "\"keyword_loc\":", 14);
7977 pm_dump_json_location(buffer, &cast->keyword_loc);
7978
7979 // Dump the rescue_expression field
7980 pm_buffer_append_byte(buffer, ',');
7981 pm_buffer_append_string(buffer, "\"rescue_expression\":", 20);
7982 pm_dump_json(buffer, parser, (const pm_node_t *) cast->rescue_expression);
7983
7984 pm_buffer_append_byte(buffer, '}');
7985 break;
7986 }
7987 case PM_RESCUE_NODE: {
7988 pm_buffer_append_string(buffer, "{\"type\":\"RescueNode\",\"location\":", 32);
7989
7990 const pm_rescue_node_t *cast = (const pm_rescue_node_t *) node;
7991 pm_dump_json_location(buffer, &cast->base.location);
7992
7993 // Dump the keyword_loc field
7994 pm_buffer_append_byte(buffer, ',');
7995 pm_buffer_append_string(buffer, "\"keyword_loc\":", 14);
7996 pm_dump_json_location(buffer, &cast->keyword_loc);
7997
7998 // Dump the exceptions field
7999 pm_buffer_append_byte(buffer, ',');
8000 pm_buffer_append_string(buffer, "\"exceptions\":", 13);
8001 const pm_node_list_t *exceptions = &cast->exceptions;
8002 pm_buffer_append_byte(buffer, '[');
8003
8004 for (size_t index = 0; index < exceptions->size; index++) {
8005 if (index != 0) pm_buffer_append_byte(buffer, ',');
8006 pm_dump_json(buffer, parser, exceptions->nodes[index]);
8007 }
8008 pm_buffer_append_byte(buffer, ']');
8009
8010 // Dump the operator_loc field
8011 pm_buffer_append_byte(buffer, ',');
8012 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
8013 if (cast->operator_loc.length != 0) {
8014 pm_dump_json_location(buffer, &cast->operator_loc);
8015 } else {
8016 pm_buffer_append_string(buffer, "null", 4);
8017 }
8018
8019 // Dump the reference field
8020 pm_buffer_append_byte(buffer, ',');
8021 pm_buffer_append_string(buffer, "\"reference\":", 12);
8022 if (cast->reference != NULL) {
8023 pm_dump_json(buffer, parser, (const pm_node_t *) cast->reference);
8024 } else {
8025 pm_buffer_append_string(buffer, "null", 4);
8026 }
8027
8028 // Dump the then_keyword_loc field
8029 pm_buffer_append_byte(buffer, ',');
8030 pm_buffer_append_string(buffer, "\"then_keyword_loc\":", 19);
8031 if (cast->then_keyword_loc.length != 0) {
8032 pm_dump_json_location(buffer, &cast->then_keyword_loc);
8033 } else {
8034 pm_buffer_append_string(buffer, "null", 4);
8035 }
8036
8037 // Dump the statements field
8038 pm_buffer_append_byte(buffer, ',');
8039 pm_buffer_append_string(buffer, "\"statements\":", 13);
8040 if (cast->statements != NULL) {
8041 pm_dump_json(buffer, parser, (const pm_node_t *) cast->statements);
8042 } else {
8043 pm_buffer_append_string(buffer, "null", 4);
8044 }
8045
8046 // Dump the subsequent field
8047 pm_buffer_append_byte(buffer, ',');
8048 pm_buffer_append_string(buffer, "\"subsequent\":", 13);
8049 if (cast->subsequent != NULL) {
8050 pm_dump_json(buffer, parser, (const pm_node_t *) cast->subsequent);
8051 } else {
8052 pm_buffer_append_string(buffer, "null", 4);
8053 }
8054
8055 pm_buffer_append_byte(buffer, '}');
8056 break;
8057 }
8058 case PM_REST_PARAMETER_NODE: {
8059 pm_buffer_append_string(buffer, "{\"type\":\"RestParameterNode\",\"location\":", 39);
8060
8061 const pm_rest_parameter_node_t *cast = (const pm_rest_parameter_node_t *) node;
8062 pm_dump_json_location(buffer, &cast->base.location);
8063
8064 // Dump the ParameterFlags field
8065 pm_buffer_append_byte(buffer, ',');
8066 pm_buffer_append_string(buffer, "\"ParameterFlags\":", 17);
8067 size_t flags = 0;
8068 pm_buffer_append_byte(buffer, '[');
8069 if (PM_NODE_FLAG_P(cast, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) {
8070 if (flags != 0) pm_buffer_append_byte(buffer, ',');
8071 pm_buffer_append_string(buffer, "\"REPEATED_PARAMETER\"", 20);
8072 flags++;
8073 }
8074 pm_buffer_append_byte(buffer, ']');
8075
8076 // Dump the name field
8077 pm_buffer_append_byte(buffer, ',');
8078 pm_buffer_append_string(buffer, "\"name\":", 7);
8079 if (cast->name != PM_CONSTANT_ID_UNSET) {
8080 pm_dump_json_constant(buffer, parser, cast->name);
8081 } else {
8082 pm_buffer_append_string(buffer, "null", 4);
8083 }
8084
8085 // Dump the name_loc field
8086 pm_buffer_append_byte(buffer, ',');
8087 pm_buffer_append_string(buffer, "\"name_loc\":", 11);
8088 if (cast->name_loc.length != 0) {
8089 pm_dump_json_location(buffer, &cast->name_loc);
8090 } else {
8091 pm_buffer_append_string(buffer, "null", 4);
8092 }
8093
8094 // Dump the operator_loc field
8095 pm_buffer_append_byte(buffer, ',');
8096 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
8097 pm_dump_json_location(buffer, &cast->operator_loc);
8098
8099 pm_buffer_append_byte(buffer, '}');
8100 break;
8101 }
8102 case PM_RETRY_NODE: {
8103 pm_buffer_append_string(buffer, "{\"type\":\"RetryNode\",\"location\":", 31);
8104
8105 const pm_retry_node_t *cast = (const pm_retry_node_t *) node;
8106 pm_dump_json_location(buffer, &cast->base.location);
8107
8108 pm_buffer_append_byte(buffer, '}');
8109 break;
8110 }
8111 case PM_RETURN_NODE: {
8112 pm_buffer_append_string(buffer, "{\"type\":\"ReturnNode\",\"location\":", 32);
8113
8114 const pm_return_node_t *cast = (const pm_return_node_t *) node;
8115 pm_dump_json_location(buffer, &cast->base.location);
8116
8117 // Dump the keyword_loc field
8118 pm_buffer_append_byte(buffer, ',');
8119 pm_buffer_append_string(buffer, "\"keyword_loc\":", 14);
8120 pm_dump_json_location(buffer, &cast->keyword_loc);
8121
8122 // Dump the arguments field
8123 pm_buffer_append_byte(buffer, ',');
8124 pm_buffer_append_string(buffer, "\"arguments\":", 12);
8125 if (cast->arguments != NULL) {
8126 pm_dump_json(buffer, parser, (const pm_node_t *) cast->arguments);
8127 } else {
8128 pm_buffer_append_string(buffer, "null", 4);
8129 }
8130
8131 pm_buffer_append_byte(buffer, '}');
8132 break;
8133 }
8134 case PM_SELF_NODE: {
8135 pm_buffer_append_string(buffer, "{\"type\":\"SelfNode\",\"location\":", 30);
8136
8137 const pm_self_node_t *cast = (const pm_self_node_t *) node;
8138 pm_dump_json_location(buffer, &cast->base.location);
8139
8140 pm_buffer_append_byte(buffer, '}');
8141 break;
8142 }
8143 case PM_SHAREABLE_CONSTANT_NODE: {
8144 pm_buffer_append_string(buffer, "{\"type\":\"ShareableConstantNode\",\"location\":", 43);
8145
8147 pm_dump_json_location(buffer, &cast->base.location);
8148
8149 // Dump the ShareableConstantNodeFlags field
8150 pm_buffer_append_byte(buffer, ',');
8151 pm_buffer_append_string(buffer, "\"ShareableConstantNodeFlags\":", 29);
8152 size_t flags = 0;
8153 pm_buffer_append_byte(buffer, '[');
8154 if (PM_NODE_FLAG_P(cast, PM_SHAREABLE_CONSTANT_NODE_FLAGS_LITERAL)) {
8155 if (flags != 0) pm_buffer_append_byte(buffer, ',');
8156 pm_buffer_append_string(buffer, "\"LITERAL\"", 9);
8157 flags++;
8158 }
8159 if (PM_NODE_FLAG_P(cast, PM_SHAREABLE_CONSTANT_NODE_FLAGS_EXPERIMENTAL_EVERYTHING)) {
8160 if (flags != 0) pm_buffer_append_byte(buffer, ',');
8161 pm_buffer_append_string(buffer, "\"EXPERIMENTAL_EVERYTHING\"", 25);
8162 flags++;
8163 }
8164 if (PM_NODE_FLAG_P(cast, PM_SHAREABLE_CONSTANT_NODE_FLAGS_EXPERIMENTAL_COPY)) {
8165 if (flags != 0) pm_buffer_append_byte(buffer, ',');
8166 pm_buffer_append_string(buffer, "\"EXPERIMENTAL_COPY\"", 19);
8167 flags++;
8168 }
8169 pm_buffer_append_byte(buffer, ']');
8170
8171 // Dump the write field
8172 pm_buffer_append_byte(buffer, ',');
8173 pm_buffer_append_string(buffer, "\"write\":", 8);
8174 pm_dump_json(buffer, parser, (const pm_node_t *) cast->write);
8175
8176 pm_buffer_append_byte(buffer, '}');
8177 break;
8178 }
8179 case PM_SINGLETON_CLASS_NODE: {
8180 pm_buffer_append_string(buffer, "{\"type\":\"SingletonClassNode\",\"location\":", 40);
8181
8182 const pm_singleton_class_node_t *cast = (const pm_singleton_class_node_t *) node;
8183 pm_dump_json_location(buffer, &cast->base.location);
8184
8185 // Dump the locals field
8186 pm_buffer_append_byte(buffer, ',');
8187 pm_buffer_append_string(buffer, "\"locals\":", 9);
8188 const pm_constant_id_list_t *locals = &cast->locals;
8189 pm_buffer_append_byte(buffer, '[');
8190
8191 for (size_t index = 0; index < locals->size; index++) {
8192 if (index != 0) pm_buffer_append_byte(buffer, ',');
8193 pm_dump_json_constant(buffer, parser, locals->ids[index]);
8194 }
8195 pm_buffer_append_byte(buffer, ']');
8196
8197 // Dump the class_keyword_loc field
8198 pm_buffer_append_byte(buffer, ',');
8199 pm_buffer_append_string(buffer, "\"class_keyword_loc\":", 20);
8200 pm_dump_json_location(buffer, &cast->class_keyword_loc);
8201
8202 // Dump the operator_loc field
8203 pm_buffer_append_byte(buffer, ',');
8204 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
8205 pm_dump_json_location(buffer, &cast->operator_loc);
8206
8207 // Dump the expression field
8208 pm_buffer_append_byte(buffer, ',');
8209 pm_buffer_append_string(buffer, "\"expression\":", 13);
8210 pm_dump_json(buffer, parser, (const pm_node_t *) cast->expression);
8211
8212 // Dump the body field
8213 pm_buffer_append_byte(buffer, ',');
8214 pm_buffer_append_string(buffer, "\"body\":", 7);
8215 if (cast->body != NULL) {
8216 pm_dump_json(buffer, parser, (const pm_node_t *) cast->body);
8217 } else {
8218 pm_buffer_append_string(buffer, "null", 4);
8219 }
8220
8221 // Dump the end_keyword_loc field
8222 pm_buffer_append_byte(buffer, ',');
8223 pm_buffer_append_string(buffer, "\"end_keyword_loc\":", 18);
8224 pm_dump_json_location(buffer, &cast->end_keyword_loc);
8225
8226 pm_buffer_append_byte(buffer, '}');
8227 break;
8228 }
8229 case PM_SOURCE_ENCODING_NODE: {
8230 pm_buffer_append_string(buffer, "{\"type\":\"SourceEncodingNode\",\"location\":", 40);
8231
8232 const pm_source_encoding_node_t *cast = (const pm_source_encoding_node_t *) node;
8233 pm_dump_json_location(buffer, &cast->base.location);
8234
8235 pm_buffer_append_byte(buffer, '}');
8236 break;
8237 }
8238 case PM_SOURCE_FILE_NODE: {
8239 pm_buffer_append_string(buffer, "{\"type\":\"SourceFileNode\",\"location\":", 36);
8240
8241 const pm_source_file_node_t *cast = (const pm_source_file_node_t *) node;
8242 pm_dump_json_location(buffer, &cast->base.location);
8243
8244 // Dump the StringFlags field
8245 pm_buffer_append_byte(buffer, ',');
8246 pm_buffer_append_string(buffer, "\"StringFlags\":", 14);
8247 size_t flags = 0;
8248 pm_buffer_append_byte(buffer, '[');
8249 if (PM_NODE_FLAG_P(cast, PM_STRING_FLAGS_FORCED_UTF8_ENCODING)) {
8250 if (flags != 0) pm_buffer_append_byte(buffer, ',');
8251 pm_buffer_append_string(buffer, "\"FORCED_UTF8_ENCODING\"", 22);
8252 flags++;
8253 }
8254 if (PM_NODE_FLAG_P(cast, PM_STRING_FLAGS_FORCED_BINARY_ENCODING)) {
8255 if (flags != 0) pm_buffer_append_byte(buffer, ',');
8256 pm_buffer_append_string(buffer, "\"FORCED_BINARY_ENCODING\"", 24);
8257 flags++;
8258 }
8259 if (PM_NODE_FLAG_P(cast, PM_STRING_FLAGS_FROZEN)) {
8260 if (flags != 0) pm_buffer_append_byte(buffer, ',');
8261 pm_buffer_append_string(buffer, "\"FROZEN\"", 8);
8262 flags++;
8263 }
8264 if (PM_NODE_FLAG_P(cast, PM_STRING_FLAGS_MUTABLE)) {
8265 if (flags != 0) pm_buffer_append_byte(buffer, ',');
8266 pm_buffer_append_string(buffer, "\"MUTABLE\"", 9);
8267 flags++;
8268 }
8269 pm_buffer_append_byte(buffer, ']');
8270
8271 // Dump the filepath field
8272 pm_buffer_append_byte(buffer, ',');
8273 pm_buffer_append_string(buffer, "\"filepath\":", 11);
8274 const pm_string_t *filepath = &cast->filepath;
8275 pm_buffer_append_byte(buffer, '"');
8276 pm_buffer_append_source(buffer, pm_string_source(filepath), pm_string_length(filepath), PM_BUFFER_ESCAPING_JSON);
8277 pm_buffer_append_byte(buffer, '"');
8278
8279 pm_buffer_append_byte(buffer, '}');
8280 break;
8281 }
8282 case PM_SOURCE_LINE_NODE: {
8283 pm_buffer_append_string(buffer, "{\"type\":\"SourceLineNode\",\"location\":", 36);
8284
8285 const pm_source_line_node_t *cast = (const pm_source_line_node_t *) node;
8286 pm_dump_json_location(buffer, &cast->base.location);
8287
8288 pm_buffer_append_byte(buffer, '}');
8289 break;
8290 }
8291 case PM_SPLAT_NODE: {
8292 pm_buffer_append_string(buffer, "{\"type\":\"SplatNode\",\"location\":", 31);
8293
8294 const pm_splat_node_t *cast = (const pm_splat_node_t *) node;
8295 pm_dump_json_location(buffer, &cast->base.location);
8296
8297 // Dump the operator_loc field
8298 pm_buffer_append_byte(buffer, ',');
8299 pm_buffer_append_string(buffer, "\"operator_loc\":", 15);
8300 pm_dump_json_location(buffer, &cast->operator_loc);
8301
8302 // Dump the expression field
8303 pm_buffer_append_byte(buffer, ',');
8304 pm_buffer_append_string(buffer, "\"expression\":", 13);
8305 if (cast->expression != NULL) {
8306 pm_dump_json(buffer, parser, (const pm_node_t *) cast->expression);
8307 } else {
8308 pm_buffer_append_string(buffer, "null", 4);
8309 }
8310
8311 pm_buffer_append_byte(buffer, '}');
8312 break;
8313 }
8314 case PM_STATEMENTS_NODE: {
8315 pm_buffer_append_string(buffer, "{\"type\":\"StatementsNode\",\"location\":", 36);
8316
8317 const pm_statements_node_t *cast = (const pm_statements_node_t *) node;
8318 pm_dump_json_location(buffer, &cast->base.location);
8319
8320 // Dump the body field
8321 pm_buffer_append_byte(buffer, ',');
8322 pm_buffer_append_string(buffer, "\"body\":", 7);
8323 const pm_node_list_t *body = &cast->body;
8324 pm_buffer_append_byte(buffer, '[');
8325
8326 for (size_t index = 0; index < body->size; index++) {
8327 if (index != 0) pm_buffer_append_byte(buffer, ',');
8328 pm_dump_json(buffer, parser, body->nodes[index]);
8329 }
8330 pm_buffer_append_byte(buffer, ']');
8331
8332 pm_buffer_append_byte(buffer, '}');
8333 break;
8334 }
8335 case PM_STRING_NODE: {
8336 pm_buffer_append_string(buffer, "{\"type\":\"StringNode\",\"location\":", 32);
8337
8338 const pm_string_node_t *cast = (const pm_string_node_t *) node;
8339 pm_dump_json_location(buffer, &cast->base.location);
8340
8341 // Dump the StringFlags field
8342 pm_buffer_append_byte(buffer, ',');
8343 pm_buffer_append_string(buffer, "\"StringFlags\":", 14);
8344 size_t flags = 0;
8345 pm_buffer_append_byte(buffer, '[');
8346 if (PM_NODE_FLAG_P(cast, PM_STRING_FLAGS_FORCED_UTF8_ENCODING)) {
8347 if (flags != 0) pm_buffer_append_byte(buffer, ',');
8348 pm_buffer_append_string(buffer, "\"FORCED_UTF8_ENCODING\"", 22);
8349 flags++;
8350 }
8351 if (PM_NODE_FLAG_P(cast, PM_STRING_FLAGS_FORCED_BINARY_ENCODING)) {
8352 if (flags != 0) pm_buffer_append_byte(buffer, ',');
8353 pm_buffer_append_string(buffer, "\"FORCED_BINARY_ENCODING\"", 24);
8354 flags++;
8355 }
8356 if (PM_NODE_FLAG_P(cast, PM_STRING_FLAGS_FROZEN)) {
8357 if (flags != 0) pm_buffer_append_byte(buffer, ',');
8358 pm_buffer_append_string(buffer, "\"FROZEN\"", 8);
8359 flags++;
8360 }
8361 if (PM_NODE_FLAG_P(cast, PM_STRING_FLAGS_MUTABLE)) {
8362 if (flags != 0) pm_buffer_append_byte(buffer, ',');
8363 pm_buffer_append_string(buffer, "\"MUTABLE\"", 9);
8364 flags++;
8365 }
8366 pm_buffer_append_byte(buffer, ']');
8367
8368 // Dump the opening_loc field
8369 pm_buffer_append_byte(buffer, ',');
8370 pm_buffer_append_string(buffer, "\"opening_loc\":", 14);
8371 if (cast->opening_loc.length != 0) {
8372 pm_dump_json_location(buffer, &cast->opening_loc);
8373 } else {
8374 pm_buffer_append_string(buffer, "null", 4);
8375 }
8376
8377 // Dump the content_loc field
8378 pm_buffer_append_byte(buffer, ',');
8379 pm_buffer_append_string(buffer, "\"content_loc\":", 14);
8380 pm_dump_json_location(buffer, &cast->content_loc);
8381
8382 // Dump the closing_loc field
8383 pm_buffer_append_byte(buffer, ',');
8384 pm_buffer_append_string(buffer, "\"closing_loc\":", 14);
8385 if (cast->closing_loc.length != 0) {
8386 pm_dump_json_location(buffer, &cast->closing_loc);
8387 } else {
8388 pm_buffer_append_string(buffer, "null", 4);
8389 }
8390
8391 // Dump the unescaped field
8392 pm_buffer_append_byte(buffer, ',');
8393 pm_buffer_append_string(buffer, "\"unescaped\":", 12);
8394 const pm_string_t *unescaped = &cast->unescaped;
8395 pm_buffer_append_byte(buffer, '"');
8396 pm_buffer_append_source(buffer, pm_string_source(unescaped), pm_string_length(unescaped), PM_BUFFER_ESCAPING_JSON);
8397 pm_buffer_append_byte(buffer, '"');
8398
8399 pm_buffer_append_byte(buffer, '}');
8400 break;
8401 }
8402 case PM_SUPER_NODE: {
8403 pm_buffer_append_string(buffer, "{\"type\":\"SuperNode\",\"location\":", 31);
8404
8405 const pm_super_node_t *cast = (const pm_super_node_t *) node;
8406 pm_dump_json_location(buffer, &cast->base.location);
8407
8408 // Dump the keyword_loc field
8409 pm_buffer_append_byte(buffer, ',');
8410 pm_buffer_append_string(buffer, "\"keyword_loc\":", 14);
8411 pm_dump_json_location(buffer, &cast->keyword_loc);
8412
8413 // Dump the lparen_loc field
8414 pm_buffer_append_byte(buffer, ',');
8415 pm_buffer_append_string(buffer, "\"lparen_loc\":", 13);
8416 if (cast->lparen_loc.length != 0) {
8417 pm_dump_json_location(buffer, &cast->lparen_loc);
8418 } else {
8419 pm_buffer_append_string(buffer, "null", 4);
8420 }
8421
8422 // Dump the arguments field
8423 pm_buffer_append_byte(buffer, ',');
8424 pm_buffer_append_string(buffer, "\"arguments\":", 12);
8425 if (cast->arguments != NULL) {
8426 pm_dump_json(buffer, parser, (const pm_node_t *) cast->arguments);
8427 } else {
8428 pm_buffer_append_string(buffer, "null", 4);
8429 }
8430
8431 // Dump the rparen_loc field
8432 pm_buffer_append_byte(buffer, ',');
8433 pm_buffer_append_string(buffer, "\"rparen_loc\":", 13);
8434 if (cast->rparen_loc.length != 0) {
8435 pm_dump_json_location(buffer, &cast->rparen_loc);
8436 } else {
8437 pm_buffer_append_string(buffer, "null", 4);
8438 }
8439
8440 // Dump the block field
8441 pm_buffer_append_byte(buffer, ',');
8442 pm_buffer_append_string(buffer, "\"block\":", 8);
8443 if (cast->block != NULL) {
8444 pm_dump_json(buffer, parser, (const pm_node_t *) cast->block);
8445 } else {
8446 pm_buffer_append_string(buffer, "null", 4);
8447 }
8448
8449 pm_buffer_append_byte(buffer, '}');
8450 break;
8451 }
8452 case PM_SYMBOL_NODE: {
8453 pm_buffer_append_string(buffer, "{\"type\":\"SymbolNode\",\"location\":", 32);
8454
8455 const pm_symbol_node_t *cast = (const pm_symbol_node_t *) node;
8456 pm_dump_json_location(buffer, &cast->base.location);
8457
8458 // Dump the SymbolFlags field
8459 pm_buffer_append_byte(buffer, ',');
8460 pm_buffer_append_string(buffer, "\"SymbolFlags\":", 14);
8461 size_t flags = 0;
8462 pm_buffer_append_byte(buffer, '[');
8463 if (PM_NODE_FLAG_P(cast, PM_SYMBOL_FLAGS_FORCED_UTF8_ENCODING)) {
8464 if (flags != 0) pm_buffer_append_byte(buffer, ',');
8465 pm_buffer_append_string(buffer, "\"FORCED_UTF8_ENCODING\"", 22);
8466 flags++;
8467 }
8468 if (PM_NODE_FLAG_P(cast, PM_SYMBOL_FLAGS_FORCED_BINARY_ENCODING)) {
8469 if (flags != 0) pm_buffer_append_byte(buffer, ',');
8470 pm_buffer_append_string(buffer, "\"FORCED_BINARY_ENCODING\"", 24);
8471 flags++;
8472 }
8473 if (PM_NODE_FLAG_P(cast, PM_SYMBOL_FLAGS_FORCED_US_ASCII_ENCODING)) {
8474 if (flags != 0) pm_buffer_append_byte(buffer, ',');
8475 pm_buffer_append_string(buffer, "\"FORCED_US_ASCII_ENCODING\"", 26);
8476 flags++;
8477 }
8478 pm_buffer_append_byte(buffer, ']');
8479
8480 // Dump the opening_loc field
8481 pm_buffer_append_byte(buffer, ',');
8482 pm_buffer_append_string(buffer, "\"opening_loc\":", 14);
8483 if (cast->opening_loc.length != 0) {
8484 pm_dump_json_location(buffer, &cast->opening_loc);
8485 } else {
8486 pm_buffer_append_string(buffer, "null", 4);
8487 }
8488
8489 // Dump the value_loc field
8490 pm_buffer_append_byte(buffer, ',');
8491 pm_buffer_append_string(buffer, "\"value_loc\":", 12);
8492 if (cast->value_loc.length != 0) {
8493 pm_dump_json_location(buffer, &cast->value_loc);
8494 } else {
8495 pm_buffer_append_string(buffer, "null", 4);
8496 }
8497
8498 // Dump the closing_loc field
8499 pm_buffer_append_byte(buffer, ',');
8500 pm_buffer_append_string(buffer, "\"closing_loc\":", 14);
8501 if (cast->closing_loc.length != 0) {
8502 pm_dump_json_location(buffer, &cast->closing_loc);
8503 } else {
8504 pm_buffer_append_string(buffer, "null", 4);
8505 }
8506
8507 // Dump the unescaped field
8508 pm_buffer_append_byte(buffer, ',');
8509 pm_buffer_append_string(buffer, "\"unescaped\":", 12);
8510 const pm_string_t *unescaped = &cast->unescaped;
8511 pm_buffer_append_byte(buffer, '"');
8512 pm_buffer_append_source(buffer, pm_string_source(unescaped), pm_string_length(unescaped), PM_BUFFER_ESCAPING_JSON);
8513 pm_buffer_append_byte(buffer, '"');
8514
8515 pm_buffer_append_byte(buffer, '}');
8516 break;
8517 }
8518 case PM_TRUE_NODE: {
8519 pm_buffer_append_string(buffer, "{\"type\":\"TrueNode\",\"location\":", 30);
8520
8521 const pm_true_node_t *cast = (const pm_true_node_t *) node;
8522 pm_dump_json_location(buffer, &cast->base.location);
8523
8524 pm_buffer_append_byte(buffer, '}');
8525 break;
8526 }
8527 case PM_UNDEF_NODE: {
8528 pm_buffer_append_string(buffer, "{\"type\":\"UndefNode\",\"location\":", 31);
8529
8530 const pm_undef_node_t *cast = (const pm_undef_node_t *) node;
8531 pm_dump_json_location(buffer, &cast->base.location);
8532
8533 // Dump the names field
8534 pm_buffer_append_byte(buffer, ',');
8535 pm_buffer_append_string(buffer, "\"names\":", 8);
8536 const pm_node_list_t *names = &cast->names;
8537 pm_buffer_append_byte(buffer, '[');
8538
8539 for (size_t index = 0; index < names->size; index++) {
8540 if (index != 0) pm_buffer_append_byte(buffer, ',');
8541 pm_dump_json(buffer, parser, names->nodes[index]);
8542 }
8543 pm_buffer_append_byte(buffer, ']');
8544
8545 // Dump the keyword_loc field
8546 pm_buffer_append_byte(buffer, ',');
8547 pm_buffer_append_string(buffer, "\"keyword_loc\":", 14);
8548 pm_dump_json_location(buffer, &cast->keyword_loc);
8549
8550 pm_buffer_append_byte(buffer, '}');
8551 break;
8552 }
8553 case PM_UNLESS_NODE: {
8554 pm_buffer_append_string(buffer, "{\"type\":\"UnlessNode\",\"location\":", 32);
8555
8556 const pm_unless_node_t *cast = (const pm_unless_node_t *) node;
8557 pm_dump_json_location(buffer, &cast->base.location);
8558
8559 // Dump the keyword_loc field
8560 pm_buffer_append_byte(buffer, ',');
8561 pm_buffer_append_string(buffer, "\"keyword_loc\":", 14);
8562 pm_dump_json_location(buffer, &cast->keyword_loc);
8563
8564 // Dump the predicate field
8565 pm_buffer_append_byte(buffer, ',');
8566 pm_buffer_append_string(buffer, "\"predicate\":", 12);
8567 pm_dump_json(buffer, parser, (const pm_node_t *) cast->predicate);
8568
8569 // Dump the then_keyword_loc field
8570 pm_buffer_append_byte(buffer, ',');
8571 pm_buffer_append_string(buffer, "\"then_keyword_loc\":", 19);
8572 if (cast->then_keyword_loc.length != 0) {
8573 pm_dump_json_location(buffer, &cast->then_keyword_loc);
8574 } else {
8575 pm_buffer_append_string(buffer, "null", 4);
8576 }
8577
8578 // Dump the statements field
8579 pm_buffer_append_byte(buffer, ',');
8580 pm_buffer_append_string(buffer, "\"statements\":", 13);
8581 if (cast->statements != NULL) {
8582 pm_dump_json(buffer, parser, (const pm_node_t *) cast->statements);
8583 } else {
8584 pm_buffer_append_string(buffer, "null", 4);
8585 }
8586
8587 // Dump the else_clause field
8588 pm_buffer_append_byte(buffer, ',');
8589 pm_buffer_append_string(buffer, "\"else_clause\":", 14);
8590 if (cast->else_clause != NULL) {
8591 pm_dump_json(buffer, parser, (const pm_node_t *) cast->else_clause);
8592 } else {
8593 pm_buffer_append_string(buffer, "null", 4);
8594 }
8595
8596 // Dump the end_keyword_loc field
8597 pm_buffer_append_byte(buffer, ',');
8598 pm_buffer_append_string(buffer, "\"end_keyword_loc\":", 18);
8599 if (cast->end_keyword_loc.length != 0) {
8600 pm_dump_json_location(buffer, &cast->end_keyword_loc);
8601 } else {
8602 pm_buffer_append_string(buffer, "null", 4);
8603 }
8604
8605 pm_buffer_append_byte(buffer, '}');
8606 break;
8607 }
8608 case PM_UNTIL_NODE: {
8609 pm_buffer_append_string(buffer, "{\"type\":\"UntilNode\",\"location\":", 31);
8610
8611 const pm_until_node_t *cast = (const pm_until_node_t *) node;
8612 pm_dump_json_location(buffer, &cast->base.location);
8613
8614 // Dump the LoopFlags field
8615 pm_buffer_append_byte(buffer, ',');
8616 pm_buffer_append_string(buffer, "\"LoopFlags\":", 12);
8617 size_t flags = 0;
8618 pm_buffer_append_byte(buffer, '[');
8619 if (PM_NODE_FLAG_P(cast, PM_LOOP_FLAGS_BEGIN_MODIFIER)) {
8620 if (flags != 0) pm_buffer_append_byte(buffer, ',');
8621 pm_buffer_append_string(buffer, "\"BEGIN_MODIFIER\"", 16);
8622 flags++;
8623 }
8624 pm_buffer_append_byte(buffer, ']');
8625
8626 // Dump the keyword_loc field
8627 pm_buffer_append_byte(buffer, ',');
8628 pm_buffer_append_string(buffer, "\"keyword_loc\":", 14);
8629 pm_dump_json_location(buffer, &cast->keyword_loc);
8630
8631 // Dump the do_keyword_loc field
8632 pm_buffer_append_byte(buffer, ',');
8633 pm_buffer_append_string(buffer, "\"do_keyword_loc\":", 17);
8634 if (cast->do_keyword_loc.length != 0) {
8635 pm_dump_json_location(buffer, &cast->do_keyword_loc);
8636 } else {
8637 pm_buffer_append_string(buffer, "null", 4);
8638 }
8639
8640 // Dump the closing_loc field
8641 pm_buffer_append_byte(buffer, ',');
8642 pm_buffer_append_string(buffer, "\"closing_loc\":", 14);
8643 if (cast->closing_loc.length != 0) {
8644 pm_dump_json_location(buffer, &cast->closing_loc);
8645 } else {
8646 pm_buffer_append_string(buffer, "null", 4);
8647 }
8648
8649 // Dump the predicate field
8650 pm_buffer_append_byte(buffer, ',');
8651 pm_buffer_append_string(buffer, "\"predicate\":", 12);
8652 pm_dump_json(buffer, parser, (const pm_node_t *) cast->predicate);
8653
8654 // Dump the statements field
8655 pm_buffer_append_byte(buffer, ',');
8656 pm_buffer_append_string(buffer, "\"statements\":", 13);
8657 if (cast->statements != NULL) {
8658 pm_dump_json(buffer, parser, (const pm_node_t *) cast->statements);
8659 } else {
8660 pm_buffer_append_string(buffer, "null", 4);
8661 }
8662
8663 pm_buffer_append_byte(buffer, '}');
8664 break;
8665 }
8666 case PM_WHEN_NODE: {
8667 pm_buffer_append_string(buffer, "{\"type\":\"WhenNode\",\"location\":", 30);
8668
8669 const pm_when_node_t *cast = (const pm_when_node_t *) node;
8670 pm_dump_json_location(buffer, &cast->base.location);
8671
8672 // Dump the keyword_loc field
8673 pm_buffer_append_byte(buffer, ',');
8674 pm_buffer_append_string(buffer, "\"keyword_loc\":", 14);
8675 pm_dump_json_location(buffer, &cast->keyword_loc);
8676
8677 // Dump the conditions field
8678 pm_buffer_append_byte(buffer, ',');
8679 pm_buffer_append_string(buffer, "\"conditions\":", 13);
8680 const pm_node_list_t *conditions = &cast->conditions;
8681 pm_buffer_append_byte(buffer, '[');
8682
8683 for (size_t index = 0; index < conditions->size; index++) {
8684 if (index != 0) pm_buffer_append_byte(buffer, ',');
8685 pm_dump_json(buffer, parser, conditions->nodes[index]);
8686 }
8687 pm_buffer_append_byte(buffer, ']');
8688
8689 // Dump the then_keyword_loc field
8690 pm_buffer_append_byte(buffer, ',');
8691 pm_buffer_append_string(buffer, "\"then_keyword_loc\":", 19);
8692 if (cast->then_keyword_loc.length != 0) {
8693 pm_dump_json_location(buffer, &cast->then_keyword_loc);
8694 } else {
8695 pm_buffer_append_string(buffer, "null", 4);
8696 }
8697
8698 // Dump the statements field
8699 pm_buffer_append_byte(buffer, ',');
8700 pm_buffer_append_string(buffer, "\"statements\":", 13);
8701 if (cast->statements != NULL) {
8702 pm_dump_json(buffer, parser, (const pm_node_t *) cast->statements);
8703 } else {
8704 pm_buffer_append_string(buffer, "null", 4);
8705 }
8706
8707 pm_buffer_append_byte(buffer, '}');
8708 break;
8709 }
8710 case PM_WHILE_NODE: {
8711 pm_buffer_append_string(buffer, "{\"type\":\"WhileNode\",\"location\":", 31);
8712
8713 const pm_while_node_t *cast = (const pm_while_node_t *) node;
8714 pm_dump_json_location(buffer, &cast->base.location);
8715
8716 // Dump the LoopFlags field
8717 pm_buffer_append_byte(buffer, ',');
8718 pm_buffer_append_string(buffer, "\"LoopFlags\":", 12);
8719 size_t flags = 0;
8720 pm_buffer_append_byte(buffer, '[');
8721 if (PM_NODE_FLAG_P(cast, PM_LOOP_FLAGS_BEGIN_MODIFIER)) {
8722 if (flags != 0) pm_buffer_append_byte(buffer, ',');
8723 pm_buffer_append_string(buffer, "\"BEGIN_MODIFIER\"", 16);
8724 flags++;
8725 }
8726 pm_buffer_append_byte(buffer, ']');
8727
8728 // Dump the keyword_loc field
8729 pm_buffer_append_byte(buffer, ',');
8730 pm_buffer_append_string(buffer, "\"keyword_loc\":", 14);
8731 pm_dump_json_location(buffer, &cast->keyword_loc);
8732
8733 // Dump the do_keyword_loc field
8734 pm_buffer_append_byte(buffer, ',');
8735 pm_buffer_append_string(buffer, "\"do_keyword_loc\":", 17);
8736 if (cast->do_keyword_loc.length != 0) {
8737 pm_dump_json_location(buffer, &cast->do_keyword_loc);
8738 } else {
8739 pm_buffer_append_string(buffer, "null", 4);
8740 }
8741
8742 // Dump the closing_loc field
8743 pm_buffer_append_byte(buffer, ',');
8744 pm_buffer_append_string(buffer, "\"closing_loc\":", 14);
8745 if (cast->closing_loc.length != 0) {
8746 pm_dump_json_location(buffer, &cast->closing_loc);
8747 } else {
8748 pm_buffer_append_string(buffer, "null", 4);
8749 }
8750
8751 // Dump the predicate field
8752 pm_buffer_append_byte(buffer, ',');
8753 pm_buffer_append_string(buffer, "\"predicate\":", 12);
8754 pm_dump_json(buffer, parser, (const pm_node_t *) cast->predicate);
8755
8756 // Dump the statements field
8757 pm_buffer_append_byte(buffer, ',');
8758 pm_buffer_append_string(buffer, "\"statements\":", 13);
8759 if (cast->statements != NULL) {
8760 pm_dump_json(buffer, parser, (const pm_node_t *) cast->statements);
8761 } else {
8762 pm_buffer_append_string(buffer, "null", 4);
8763 }
8764
8765 pm_buffer_append_byte(buffer, '}');
8766 break;
8767 }
8768 case PM_X_STRING_NODE: {
8769 pm_buffer_append_string(buffer, "{\"type\":\"XStringNode\",\"location\":", 33);
8770
8771 const pm_x_string_node_t *cast = (const pm_x_string_node_t *) node;
8772 pm_dump_json_location(buffer, &cast->base.location);
8773
8774 // Dump the EncodingFlags field
8775 pm_buffer_append_byte(buffer, ',');
8776 pm_buffer_append_string(buffer, "\"EncodingFlags\":", 16);
8777 size_t flags = 0;
8778 pm_buffer_append_byte(buffer, '[');
8779 if (PM_NODE_FLAG_P(cast, PM_ENCODING_FLAGS_FORCED_UTF8_ENCODING)) {
8780 if (flags != 0) pm_buffer_append_byte(buffer, ',');
8781 pm_buffer_append_string(buffer, "\"FORCED_UTF8_ENCODING\"", 22);
8782 flags++;
8783 }
8784 if (PM_NODE_FLAG_P(cast, PM_ENCODING_FLAGS_FORCED_BINARY_ENCODING)) {
8785 if (flags != 0) pm_buffer_append_byte(buffer, ',');
8786 pm_buffer_append_string(buffer, "\"FORCED_BINARY_ENCODING\"", 24);
8787 flags++;
8788 }
8789 pm_buffer_append_byte(buffer, ']');
8790
8791 // Dump the opening_loc field
8792 pm_buffer_append_byte(buffer, ',');
8793 pm_buffer_append_string(buffer, "\"opening_loc\":", 14);
8794 pm_dump_json_location(buffer, &cast->opening_loc);
8795
8796 // Dump the content_loc field
8797 pm_buffer_append_byte(buffer, ',');
8798 pm_buffer_append_string(buffer, "\"content_loc\":", 14);
8799 pm_dump_json_location(buffer, &cast->content_loc);
8800
8801 // Dump the closing_loc field
8802 pm_buffer_append_byte(buffer, ',');
8803 pm_buffer_append_string(buffer, "\"closing_loc\":", 14);
8804 pm_dump_json_location(buffer, &cast->closing_loc);
8805
8806 // Dump the unescaped field
8807 pm_buffer_append_byte(buffer, ',');
8808 pm_buffer_append_string(buffer, "\"unescaped\":", 12);
8809 const pm_string_t *unescaped = &cast->unescaped;
8810 pm_buffer_append_byte(buffer, '"');
8811 pm_buffer_append_source(buffer, pm_string_source(unescaped), pm_string_length(unescaped), PM_BUFFER_ESCAPING_JSON);
8812 pm_buffer_append_byte(buffer, '"');
8813
8814 pm_buffer_append_byte(buffer, '}');
8815 break;
8816 }
8817 case PM_YIELD_NODE: {
8818 pm_buffer_append_string(buffer, "{\"type\":\"YieldNode\",\"location\":", 31);
8819
8820 const pm_yield_node_t *cast = (const pm_yield_node_t *) node;
8821 pm_dump_json_location(buffer, &cast->base.location);
8822
8823 // Dump the keyword_loc field
8824 pm_buffer_append_byte(buffer, ',');
8825 pm_buffer_append_string(buffer, "\"keyword_loc\":", 14);
8826 pm_dump_json_location(buffer, &cast->keyword_loc);
8827
8828 // Dump the lparen_loc field
8829 pm_buffer_append_byte(buffer, ',');
8830 pm_buffer_append_string(buffer, "\"lparen_loc\":", 13);
8831 if (cast->lparen_loc.length != 0) {
8832 pm_dump_json_location(buffer, &cast->lparen_loc);
8833 } else {
8834 pm_buffer_append_string(buffer, "null", 4);
8835 }
8836
8837 // Dump the arguments field
8838 pm_buffer_append_byte(buffer, ',');
8839 pm_buffer_append_string(buffer, "\"arguments\":", 12);
8840 if (cast->arguments != NULL) {
8841 pm_dump_json(buffer, parser, (const pm_node_t *) cast->arguments);
8842 } else {
8843 pm_buffer_append_string(buffer, "null", 4);
8844 }
8845
8846 // Dump the rparen_loc field
8847 pm_buffer_append_byte(buffer, ',');
8848 pm_buffer_append_string(buffer, "\"rparen_loc\":", 13);
8849 if (cast->rparen_loc.length != 0) {
8850 pm_dump_json_location(buffer, &cast->rparen_loc);
8851 } else {
8852 pm_buffer_append_string(buffer, "null", 4);
8853 }
8854
8855 pm_buffer_append_byte(buffer, '}');
8856 break;
8857 }
8858 case PM_SCOPE_NODE:
8859 break;
8860 }
8861}
8862
8863#endif
#define PM_CONSTANT_ID_UNSET
When we allocate constants into the pool, we reserve 0 to mean that the slot is not yet filled.
uint32_t pm_constant_id_t
A constant id is a unique identifier for a constant in the constant pool.
PRISM_EXPORTED_FUNCTION void pm_integer_free(pm_integer_t *integer)
Free the internal memory of an integer.
Definition pm_integer.c:667
PRISM_EXPORTED_FUNCTION void pm_integer_string(pm_buffer_t *buffer, const pm_integer_t *integer)
Convert an integer to a decimal string.
Definition pm_integer.c:608
PRISM_EXPORTED_FUNCTION size_t pm_string_length(const pm_string_t *string)
Returns the length associated with the string.
Definition pm_string.c:352
PRISM_EXPORTED_FUNCTION const uint8_t * pm_string_source(const pm_string_t *string)
Returns the start pointer associated with the string.
Definition pm_string.c:360
PRISM_EXPORTED_FUNCTION void pm_string_free(pm_string_t *string)
Free the associated memory of the given string.
Definition pm_string.c:368
#define PRISM_EXPORTED_FUNCTION
By default, we compile with -fvisibility=hidden.
Definition defines.h:53
Functions related to nodes in the AST.
#define PM_NODE_LIST_FOREACH(list, index, node)
Loop through each node in the node list, writing each node to the given pm_node_t pointer.
Definition node.h:17
AliasGlobalVariableNode.
Definition ast.h:1124
PM_NODE_ALIGNAS struct pm_node * new_name
AliasGlobalVariableNode::new_name.
Definition ast.h:1136
pm_node_t base
The embedded base node.
Definition ast.h:1126
pm_location_t keyword_loc
AliasGlobalVariableNode::keyword_loc.
Definition ast.h:1156
PM_NODE_ALIGNAS struct pm_node * old_name
AliasGlobalVariableNode::old_name.
Definition ast.h:1146
AliasMethodNode.
Definition ast.h:1171
PM_NODE_ALIGNAS struct pm_node * old_name
AliasMethodNode::old_name.
Definition ast.h:1205
pm_node_t base
The embedded base node.
Definition ast.h:1173
pm_location_t keyword_loc
AliasMethodNode::keyword_loc.
Definition ast.h:1215
PM_NODE_ALIGNAS struct pm_node * new_name
AliasMethodNode::new_name.
Definition ast.h:1189
AlternationPatternNode.
Definition ast.h:1230
pm_location_t operator_loc
AlternationPatternNode::operator_loc.
Definition ast.h:1262
PM_NODE_ALIGNAS struct pm_node * left
AlternationPatternNode::left.
Definition ast.h:1242
pm_node_t base
The embedded base node.
Definition ast.h:1232
PM_NODE_ALIGNAS struct pm_node * right
AlternationPatternNode::right.
Definition ast.h:1252
AndNode.
Definition ast.h:1277
PM_NODE_ALIGNAS struct pm_node * left
AndNode::left.
Definition ast.h:1292
PM_NODE_ALIGNAS struct pm_node * right
AndNode::right.
Definition ast.h:1305
pm_location_t operator_loc
AndNode::operator_loc.
Definition ast.h:1315
pm_node_t base
The embedded base node.
Definition ast.h:1279
ArgumentsNode.
Definition ast.h:1337
pm_node_t base
The embedded base node.
Definition ast.h:1339
struct pm_node_list arguments
ArgumentsNode::arguments.
Definition ast.h:1349
ArrayNode.
Definition ast.h:1367
pm_node_t base
The embedded base node.
Definition ast.h:1369
pm_location_t closing_loc
ArrayNode::closing_loc.
Definition ast.h:1400
struct pm_node_list elements
ArrayNode::elements.
Definition ast.h:1376
pm_location_t opening_loc
ArrayNode::opening_loc.
Definition ast.h:1388
ArrayPatternNode.
Definition ast.h:1427
struct pm_node_list requireds
ArrayPatternNode::requireds.
Definition ast.h:1455
PM_NODE_ALIGNAS struct pm_node * rest
ArrayPatternNode::rest.
Definition ast.h:1465
PM_NODE_ALIGNAS struct pm_node * constant
ArrayPatternNode::constant.
Definition ast.h:1445
pm_location_t opening_loc
ArrayPatternNode::opening_loc.
Definition ast.h:1485
pm_node_t base
The embedded base node.
Definition ast.h:1429
pm_location_t closing_loc
ArrayPatternNode::closing_loc.
Definition ast.h:1495
struct pm_node_list posts
ArrayPatternNode::posts.
Definition ast.h:1475
AssocNode.
Definition ast.h:1510
pm_node_t base
The embedded base node.
Definition ast.h:1512
PM_NODE_ALIGNAS struct pm_node * value
AssocNode::value.
Definition ast.h:1541
PM_NODE_ALIGNAS struct pm_node * key
AssocNode::key.
Definition ast.h:1528
pm_location_t operator_loc
AssocNode::operator_loc.
Definition ast.h:1551
AssocSplatNode.
Definition ast.h:1566
pm_node_t base
The embedded base node.
Definition ast.h:1568
pm_location_t operator_loc
AssocSplatNode::operator_loc.
Definition ast.h:1588
PM_NODE_ALIGNAS struct pm_node * value
AssocSplatNode::value.
Definition ast.h:1578
BackReferenceReadNode.
Definition ast.h:1603
pm_constant_id_t name
BackReferenceReadNode::name.
Definition ast.h:1616
pm_node_t base
The embedded base node.
Definition ast.h:1605
BeginNode.
Definition ast.h:1633
PM_NODE_ALIGNAS struct pm_else_node * else_clause
BeginNode::else_clause.
Definition ast.h:1675
PM_NODE_ALIGNAS struct pm_ensure_node * ensure_clause
BeginNode::ensure_clause.
Definition ast.h:1685
PM_NODE_ALIGNAS struct pm_statements_node * statements
BeginNode::statements.
Definition ast.h:1655
PM_NODE_ALIGNAS struct pm_rescue_node * rescue_clause
BeginNode::rescue_clause.
Definition ast.h:1665
pm_node_t base
The embedded base node.
Definition ast.h:1635
pm_location_t end_keyword_loc
BeginNode::end_keyword_loc.
Definition ast.h:1695
pm_location_t begin_keyword_loc
BeginNode::begin_keyword_loc.
Definition ast.h:1645
BlockArgumentNode.
Definition ast.h:1710
PM_NODE_ALIGNAS struct pm_node * expression
BlockArgumentNode::expression.
Definition ast.h:1722
pm_node_t base
The embedded base node.
Definition ast.h:1712
pm_location_t operator_loc
BlockArgumentNode::operator_loc.
Definition ast.h:1732
BlockLocalVariableNode.
Definition ast.h:1750
pm_node_t base
The embedded base node.
Definition ast.h:1752
pm_constant_id_t name
BlockLocalVariableNode::name.
Definition ast.h:1762
BlockNode.
Definition ast.h:1777
pm_node_t base
The embedded base node.
Definition ast.h:1779
pm_location_t closing_loc
BlockNode::closing_loc.
Definition ast.h:1833
PM_NODE_ALIGNAS struct pm_node * parameters
BlockNode::parameters.
Definition ast.h:1803
pm_location_t opening_loc
BlockNode::opening_loc.
Definition ast.h:1823
pm_constant_id_list_t locals
BlockNode::locals.
Definition ast.h:1789
PM_NODE_ALIGNAS struct pm_node * body
BlockNode::body.
Definition ast.h:1813
BlockParameterNode.
Definition ast.h:1852
pm_location_t operator_loc
BlockParameterNode::operator_loc.
Definition ast.h:1886
pm_location_t name_loc
BlockParameterNode::name_loc.
Definition ast.h:1875
pm_constant_id_t name
BlockParameterNode::name.
Definition ast.h:1865
pm_node_t base
The embedded base node.
Definition ast.h:1854
BlockParametersNode.
Definition ast.h:1905
pm_node_t base
The embedded base node.
Definition ast.h:1907
struct pm_node_list locals
BlockParametersNode::locals.
Definition ast.h:1935
PM_NODE_ALIGNAS struct pm_parameters_node * parameters
BlockParametersNode::parameters.
Definition ast.h:1921
pm_location_t closing_loc
BlockParametersNode::closing_loc.
Definition ast.h:1963
pm_location_t opening_loc
BlockParametersNode::opening_loc.
Definition ast.h:1949
BreakNode.
Definition ast.h:1978
pm_location_t keyword_loc
BreakNode::keyword_loc.
Definition ast.h:2000
pm_node_t base
The embedded base node.
Definition ast.h:1980
PM_NODE_ALIGNAS struct pm_arguments_node * arguments
BreakNode::arguments.
Definition ast.h:1990
A pm_buffer_t is a simple memory buffer that stores data in a contiguous block of memory.
Definition pm_buffer.h:22
CallAndWriteNode.
Definition ast.h:2021
pm_location_t operator_loc
CallAndWriteNode::operator_loc.
Definition ast.h:2083
PM_NODE_ALIGNAS struct pm_node * receiver
CallAndWriteNode::receiver.
Definition ast.h:2033
pm_node_t base
The embedded base node.
Definition ast.h:2023
PM_NODE_ALIGNAS struct pm_node * value
CallAndWriteNode::value.
Definition ast.h:2093
pm_location_t call_operator_loc
CallAndWriteNode::call_operator_loc.
Definition ast.h:2043
pm_location_t message_loc
CallAndWriteNode::message_loc.
Definition ast.h:2053
pm_constant_id_t read_name
CallAndWriteNode::read_name.
Definition ast.h:2063
pm_constant_id_t write_name
CallAndWriteNode::write_name.
Definition ast.h:2073
CallNode.
Definition ast.h:2129
pm_location_t opening_loc
CallNode::opening_loc.
Definition ast.h:2190
pm_location_t closing_loc
CallNode::closing_loc.
Definition ast.h:2210
pm_constant_id_t name
CallNode::name.
Definition ast.h:2170
pm_node_t base
The embedded base node.
Definition ast.h:2131
PM_NODE_ALIGNAS struct pm_arguments_node * arguments
CallNode::arguments.
Definition ast.h:2200
pm_location_t equal_loc
CallNode::equal_loc.
Definition ast.h:2223
pm_location_t call_operator_loc
CallNode::call_operator_loc.
Definition ast.h:2160
pm_location_t message_loc
CallNode::message_loc.
Definition ast.h:2180
PM_NODE_ALIGNAS struct pm_node * block
CallNode::block.
Definition ast.h:2233
PM_NODE_ALIGNAS struct pm_node * receiver
CallNode::receiver.
Definition ast.h:2147
CallOperatorWriteNode.
Definition ast.h:2254
pm_constant_id_t read_name
CallOperatorWriteNode::read_name.
Definition ast.h:2296
pm_constant_id_t binary_operator
CallOperatorWriteNode::binary_operator.
Definition ast.h:2316
pm_location_t binary_operator_loc
CallOperatorWriteNode::binary_operator_loc.
Definition ast.h:2326
pm_node_t base
The embedded base node.
Definition ast.h:2256
pm_constant_id_t write_name
CallOperatorWriteNode::write_name.
Definition ast.h:2306
pm_location_t message_loc
CallOperatorWriteNode::message_loc.
Definition ast.h:2286
PM_NODE_ALIGNAS struct pm_node * receiver
CallOperatorWriteNode::receiver.
Definition ast.h:2266
PM_NODE_ALIGNAS struct pm_node * value
CallOperatorWriteNode::value.
Definition ast.h:2336
pm_location_t call_operator_loc
CallOperatorWriteNode::call_operator_loc.
Definition ast.h:2276
CallOrWriteNode.
Definition ast.h:2357
pm_location_t operator_loc
CallOrWriteNode::operator_loc.
Definition ast.h:2419
pm_location_t call_operator_loc
CallOrWriteNode::call_operator_loc.
Definition ast.h:2379
PM_NODE_ALIGNAS struct pm_node * receiver
CallOrWriteNode::receiver.
Definition ast.h:2369
pm_node_t base
The embedded base node.
Definition ast.h:2359
PM_NODE_ALIGNAS struct pm_node * value
CallOrWriteNode::value.
Definition ast.h:2429
pm_constant_id_t write_name
CallOrWriteNode::write_name.
Definition ast.h:2409
pm_constant_id_t read_name
CallOrWriteNode::read_name.
Definition ast.h:2399
pm_location_t message_loc
CallOrWriteNode::message_loc.
Definition ast.h:2389
CallTargetNode.
Definition ast.h:2458
pm_node_t base
The embedded base node.
Definition ast.h:2460
pm_constant_id_t name
CallTargetNode::name.
Definition ast.h:2490
PM_NODE_ALIGNAS struct pm_node * receiver
CallTargetNode::receiver.
Definition ast.h:2470
pm_location_t call_operator_loc
CallTargetNode::call_operator_loc.
Definition ast.h:2480
pm_location_t message_loc
CallTargetNode::message_loc.
Definition ast.h:2500
CapturePatternNode.
Definition ast.h:2515
pm_location_t operator_loc
CapturePatternNode::operator_loc.
Definition ast.h:2547
pm_node_t base
The embedded base node.
Definition ast.h:2517
PM_NODE_ALIGNAS struct pm_node * value
CapturePatternNode::value.
Definition ast.h:2527
PM_NODE_ALIGNAS struct pm_local_variable_target_node * target
CapturePatternNode::target.
Definition ast.h:2537
CaseMatchNode.
Definition ast.h:2564
pm_location_t end_keyword_loc
CaseMatchNode::end_keyword_loc.
Definition ast.h:2616
struct pm_node_list conditions
CaseMatchNode::conditions.
Definition ast.h:2586
pm_node_t base
The embedded base node.
Definition ast.h:2566
pm_location_t case_keyword_loc
CaseMatchNode::case_keyword_loc.
Definition ast.h:2606
PM_NODE_ALIGNAS struct pm_node * predicate
CaseMatchNode::predicate.
Definition ast.h:2576
PM_NODE_ALIGNAS struct pm_else_node * else_clause
CaseMatchNode::else_clause.
Definition ast.h:2596
CaseNode.
Definition ast.h:2633
PM_NODE_ALIGNAS struct pm_else_node * else_clause
CaseNode::else_clause.
Definition ast.h:2665
struct pm_node_list conditions
CaseNode::conditions.
Definition ast.h:2655
PM_NODE_ALIGNAS struct pm_node * predicate
CaseNode::predicate.
Definition ast.h:2645
pm_node_t base
The embedded base node.
Definition ast.h:2635
pm_location_t case_keyword_loc
CaseNode::case_keyword_loc.
Definition ast.h:2675
pm_location_t end_keyword_loc
CaseNode::end_keyword_loc.
Definition ast.h:2685
ClassNode.
Definition ast.h:2700
pm_location_t class_keyword_loc
ClassNode::class_keyword_loc.
Definition ast.h:2717
pm_location_t end_keyword_loc
ClassNode::end_keyword_loc.
Definition ast.h:2762
pm_constant_id_list_t locals
ClassNode::locals.
Definition ast.h:2707
PM_NODE_ALIGNAS struct pm_node * superclass
ClassNode::superclass.
Definition ast.h:2742
pm_location_t inheritance_operator_loc
ClassNode::inheritance_operator_loc.
Definition ast.h:2732
pm_constant_id_t name
ClassNode::name.
Definition ast.h:2771
pm_node_t base
The embedded base node.
Definition ast.h:2702
PM_NODE_ALIGNAS struct pm_node * constant_path
ClassNode::constant_path.
Definition ast.h:2722
PM_NODE_ALIGNAS struct pm_node * body
ClassNode::body.
Definition ast.h:2752
ClassVariableAndWriteNode.
Definition ast.h:2786
PM_NODE_ALIGNAS struct pm_node * value
ClassVariableAndWriteNode::value.
Definition ast.h:2828
pm_constant_id_t name
ClassVariableAndWriteNode::name.
Definition ast.h:2798
pm_location_t operator_loc
ClassVariableAndWriteNode::operator_loc.
Definition ast.h:2818
pm_node_t base
The embedded base node.
Definition ast.h:2788
pm_location_t name_loc
ClassVariableAndWriteNode::name_loc.
Definition ast.h:2808
ClassVariableOperatorWriteNode.
Definition ast.h:2843
pm_node_t base
The embedded base node.
Definition ast.h:2845
pm_constant_id_t name
ClassVariableOperatorWriteNode::name.
Definition ast.h:2850
PM_NODE_ALIGNAS struct pm_node * value
ClassVariableOperatorWriteNode::value.
Definition ast.h:2865
pm_location_t name_loc
ClassVariableOperatorWriteNode::name_loc.
Definition ast.h:2855
pm_constant_id_t binary_operator
ClassVariableOperatorWriteNode::binary_operator.
Definition ast.h:2870
pm_location_t binary_operator_loc
ClassVariableOperatorWriteNode::binary_operator_loc.
Definition ast.h:2860
ClassVariableOrWriteNode.
Definition ast.h:2885
pm_node_t base
The embedded base node.
Definition ast.h:2887
PM_NODE_ALIGNAS struct pm_node * value
ClassVariableOrWriteNode::value.
Definition ast.h:2907
pm_location_t name_loc
ClassVariableOrWriteNode::name_loc.
Definition ast.h:2897
pm_location_t operator_loc
ClassVariableOrWriteNode::operator_loc.
Definition ast.h:2902
pm_constant_id_t name
ClassVariableOrWriteNode::name.
Definition ast.h:2892
ClassVariableReadNode.
Definition ast.h:2922
pm_node_t base
The embedded base node.
Definition ast.h:2924
pm_constant_id_t name
ClassVariableReadNode::name.
Definition ast.h:2935
ClassVariableTargetNode.
Definition ast.h:2950
pm_node_t base
The embedded base node.
Definition ast.h:2952
pm_constant_id_t name
ClassVariableTargetNode::name.
Definition ast.h:2957
ClassVariableWriteNode.
Definition ast.h:2972
pm_location_t name_loc
ClassVariableWriteNode::name_loc.
Definition ast.h:2995
PM_NODE_ALIGNAS struct pm_node * value
ClassVariableWriteNode::value.
Definition ast.h:3008
pm_node_t base
The embedded base node.
Definition ast.h:2974
pm_location_t operator_loc
ClassVariableWriteNode::operator_loc.
Definition ast.h:3018
pm_constant_id_t name
ClassVariableWriteNode::name.
Definition ast.h:2985
ConstantAndWriteNode.
Definition ast.h:3033
pm_location_t operator_loc
ConstantAndWriteNode::operator_loc.
Definition ast.h:3050
PM_NODE_ALIGNAS struct pm_node * value
ConstantAndWriteNode::value.
Definition ast.h:3055
pm_location_t name_loc
ConstantAndWriteNode::name_loc.
Definition ast.h:3045
pm_constant_id_t name
ConstantAndWriteNode::name.
Definition ast.h:3040
pm_node_t base
The embedded base node.
Definition ast.h:3035
A list of constant IDs.
size_t size
The number of constant ids in the list.
pm_constant_id_t * ids
The constant ids in the list.
ConstantOperatorWriteNode.
Definition ast.h:3070
pm_constant_id_t name
ConstantOperatorWriteNode::name.
Definition ast.h:3077
pm_location_t name_loc
ConstantOperatorWriteNode::name_loc.
Definition ast.h:3082
pm_constant_id_t binary_operator
ConstantOperatorWriteNode::binary_operator.
Definition ast.h:3097
pm_location_t binary_operator_loc
ConstantOperatorWriteNode::binary_operator_loc.
Definition ast.h:3087
PM_NODE_ALIGNAS struct pm_node * value
ConstantOperatorWriteNode::value.
Definition ast.h:3092
pm_node_t base
The embedded base node.
Definition ast.h:3072
ConstantOrWriteNode.
Definition ast.h:3112
pm_location_t operator_loc
ConstantOrWriteNode::operator_loc.
Definition ast.h:3129
PM_NODE_ALIGNAS struct pm_node * value
ConstantOrWriteNode::value.
Definition ast.h:3134
pm_location_t name_loc
ConstantOrWriteNode::name_loc.
Definition ast.h:3124
pm_constant_id_t name
ConstantOrWriteNode::name.
Definition ast.h:3119
pm_node_t base
The embedded base node.
Definition ast.h:3114
ConstantPathAndWriteNode.
Definition ast.h:3149
PM_NODE_ALIGNAS struct pm_constant_path_node * target
ConstantPathAndWriteNode::target.
Definition ast.h:3156
pm_node_t base
The embedded base node.
Definition ast.h:3151
PM_NODE_ALIGNAS struct pm_node * value
ConstantPathAndWriteNode::value.
Definition ast.h:3166
pm_location_t operator_loc
ConstantPathAndWriteNode::operator_loc.
Definition ast.h:3161
ConstantPathNode.
Definition ast.h:3181
pm_location_t delimiter_loc
ConstantPathNode::delimiter_loc.
Definition ast.h:3219
pm_node_t base
The embedded base node.
Definition ast.h:3183
PM_NODE_ALIGNAS struct pm_node * parent
ConstantPathNode::parent.
Definition ast.h:3199
pm_location_t name_loc
ConstantPathNode::name_loc.
Definition ast.h:3232
pm_constant_id_t name
ConstantPathNode::name.
Definition ast.h:3206
ConstantPathOperatorWriteNode.
Definition ast.h:3247
PM_NODE_ALIGNAS struct pm_constant_path_node * target
ConstantPathOperatorWriteNode::target.
Definition ast.h:3254
pm_constant_id_t binary_operator
ConstantPathOperatorWriteNode::binary_operator.
Definition ast.h:3269
pm_node_t base
The embedded base node.
Definition ast.h:3249
pm_location_t binary_operator_loc
ConstantPathOperatorWriteNode::binary_operator_loc.
Definition ast.h:3259
PM_NODE_ALIGNAS struct pm_node * value
ConstantPathOperatorWriteNode::value.
Definition ast.h:3264
ConstantPathOrWriteNode.
Definition ast.h:3284
pm_location_t operator_loc
ConstantPathOrWriteNode::operator_loc.
Definition ast.h:3296
pm_node_t base
The embedded base node.
Definition ast.h:3286
PM_NODE_ALIGNAS struct pm_node * value
ConstantPathOrWriteNode::value.
Definition ast.h:3301
PM_NODE_ALIGNAS struct pm_constant_path_node * target
ConstantPathOrWriteNode::target.
Definition ast.h:3291
ConstantPathTargetNode.
Definition ast.h:3316
pm_node_t base
The embedded base node.
Definition ast.h:3318
pm_location_t delimiter_loc
ConstantPathTargetNode::delimiter_loc.
Definition ast.h:3333
pm_constant_id_t name
ConstantPathTargetNode::name.
Definition ast.h:3328
PM_NODE_ALIGNAS struct pm_node * parent
ConstantPathTargetNode::parent.
Definition ast.h:3323
pm_location_t name_loc
ConstantPathTargetNode::name_loc.
Definition ast.h:3338
ConstantPathWriteNode.
Definition ast.h:3359
PM_NODE_ALIGNAS struct pm_node * value
ConstantPathWriteNode::value.
Definition ast.h:3394
pm_location_t operator_loc
ConstantPathWriteNode::operator_loc.
Definition ast.h:3384
pm_node_t base
The embedded base node.
Definition ast.h:3361
PM_NODE_ALIGNAS struct pm_constant_path_node * target
ConstantPathWriteNode::target.
Definition ast.h:3374
ConstantReadNode.
Definition ast.h:3409
pm_node_t base
The embedded base node.
Definition ast.h:3411
pm_constant_id_t name
ConstantReadNode::name.
Definition ast.h:3422
A constant in the pool which effectively stores a string.
size_t length
The length of the string.
const uint8_t * start
A pointer to the start of the string.
ConstantTargetNode.
Definition ast.h:3437
pm_node_t base
The embedded base node.
Definition ast.h:3439
pm_constant_id_t name
ConstantTargetNode::name.
Definition ast.h:3444
ConstantWriteNode.
Definition ast.h:3459
pm_node_t base
The embedded base node.
Definition ast.h:3461
PM_NODE_ALIGNAS struct pm_node * value
ConstantWriteNode::value.
Definition ast.h:3495
pm_constant_id_t name
ConstantWriteNode::name.
Definition ast.h:3472
pm_location_t name_loc
ConstantWriteNode::name_loc.
Definition ast.h:3482
pm_location_t operator_loc
ConstantWriteNode::operator_loc.
Definition ast.h:3505
DefNode.
Definition ast.h:3521
pm_location_t end_keyword_loc
DefNode::end_keyword_loc.
Definition ast.h:3583
pm_constant_id_t name
DefNode::name.
Definition ast.h:3528
pm_location_t name_loc
DefNode::name_loc.
Definition ast.h:3533
pm_location_t rparen_loc
DefNode::rparen_loc.
Definition ast.h:3573
PM_NODE_ALIGNAS struct pm_parameters_node * parameters
DefNode::parameters.
Definition ast.h:3543
pm_location_t equal_loc
DefNode::equal_loc.
Definition ast.h:3578
pm_location_t def_keyword_loc
DefNode::def_keyword_loc.
Definition ast.h:3558
pm_node_t base
The embedded base node.
Definition ast.h:3523
pm_location_t lparen_loc
DefNode::lparen_loc.
Definition ast.h:3568
PM_NODE_ALIGNAS struct pm_node * receiver
DefNode::receiver.
Definition ast.h:3538
PM_NODE_ALIGNAS struct pm_node * body
DefNode::body.
Definition ast.h:3548
pm_location_t operator_loc
DefNode::operator_loc.
Definition ast.h:3563
pm_constant_id_list_t locals
DefNode::locals.
Definition ast.h:3553
DefinedNode.
Definition ast.h:3598
PM_NODE_ALIGNAS struct pm_node * value
DefinedNode::value.
Definition ast.h:3610
pm_location_t lparen_loc
DefinedNode::lparen_loc.
Definition ast.h:3605
pm_node_t base
The embedded base node.
Definition ast.h:3600
pm_location_t rparen_loc
DefinedNode::rparen_loc.
Definition ast.h:3615
pm_location_t keyword_loc
DefinedNode::keyword_loc.
Definition ast.h:3620
ElseNode.
Definition ast.h:3635
pm_location_t else_keyword_loc
ElseNode::else_keyword_loc.
Definition ast.h:3642
pm_node_t base
The embedded base node.
Definition ast.h:3637
PM_NODE_ALIGNAS struct pm_statements_node * statements
ElseNode::statements.
Definition ast.h:3647
pm_location_t end_keyword_loc
ElseNode::end_keyword_loc.
Definition ast.h:3652
EmbeddedStatementsNode.
Definition ast.h:3667
PM_NODE_ALIGNAS struct pm_statements_node * statements
EmbeddedStatementsNode::statements.
Definition ast.h:3679
pm_location_t closing_loc
EmbeddedStatementsNode::closing_loc.
Definition ast.h:3684
pm_node_t base
The embedded base node.
Definition ast.h:3669
pm_location_t opening_loc
EmbeddedStatementsNode::opening_loc.
Definition ast.h:3674
EmbeddedVariableNode.
Definition ast.h:3699
PM_NODE_ALIGNAS struct pm_node * variable
EmbeddedVariableNode::variable.
Definition ast.h:3711
pm_location_t operator_loc
EmbeddedVariableNode::operator_loc.
Definition ast.h:3706
pm_node_t base
The embedded base node.
Definition ast.h:3701
EnsureNode.
Definition ast.h:3730
PM_NODE_ALIGNAS struct pm_statements_node * statements
EnsureNode::statements.
Definition ast.h:3742
pm_node_t base
The embedded base node.
Definition ast.h:3732
pm_location_t ensure_keyword_loc
EnsureNode::ensure_keyword_loc.
Definition ast.h:3737
pm_location_t end_keyword_loc
EnsureNode::end_keyword_loc.
Definition ast.h:3747
FalseNode.
Definition ast.h:3762
pm_node_t base
The embedded base node.
Definition ast.h:3764
FindPatternNode.
Definition ast.h:3788
PM_NODE_ALIGNAS struct pm_splat_node * left
FindPatternNode::left.
Definition ast.h:3813
pm_location_t opening_loc
FindPatternNode::opening_loc.
Definition ast.h:3852
pm_node_t base
The embedded base node.
Definition ast.h:3790
PM_NODE_ALIGNAS struct pm_node * constant
FindPatternNode::constant.
Definition ast.h:3800
struct pm_node_list requireds
FindPatternNode::requireds.
Definition ast.h:3826
pm_location_t closing_loc
FindPatternNode::closing_loc.
Definition ast.h:3865
PM_NODE_ALIGNAS struct pm_node * right
FindPatternNode::right.
Definition ast.h:3839
FlipFlopNode.
Definition ast.h:3883
PM_NODE_ALIGNAS struct pm_node * left
FlipFlopNode::left.
Definition ast.h:3890
pm_node_t base
The embedded base node.
Definition ast.h:3885
pm_location_t operator_loc
FlipFlopNode::operator_loc.
Definition ast.h:3900
PM_NODE_ALIGNAS struct pm_node * right
FlipFlopNode::right.
Definition ast.h:3895
FloatNode.
Definition ast.h:3915
double value
FloatNode::value.
Definition ast.h:3924
pm_node_t base
The embedded base node.
Definition ast.h:3917
ForNode.
Definition ast.h:3939
PM_NODE_ALIGNAS struct pm_node * index
ForNode::index.
Definition ast.h:3951
PM_NODE_ALIGNAS struct pm_node * collection
ForNode::collection.
Definition ast.h:3961
pm_node_t base
The embedded base node.
Definition ast.h:3941
PM_NODE_ALIGNAS struct pm_statements_node * statements
ForNode::statements.
Definition ast.h:3973
pm_location_t end_keyword_loc
ForNode::end_keyword_loc.
Definition ast.h:4013
pm_location_t for_keyword_loc
ForNode::for_keyword_loc.
Definition ast.h:3983
pm_location_t do_keyword_loc
ForNode::do_keyword_loc.
Definition ast.h:4003
pm_location_t in_keyword_loc
ForNode::in_keyword_loc.
Definition ast.h:3993
ForwardingArgumentsNode.
Definition ast.h:4030
pm_node_t base
The embedded base node.
Definition ast.h:4032
ForwardingParameterNode.
Definition ast.h:4048
pm_node_t base
The embedded base node.
Definition ast.h:4050
ForwardingSuperNode.
Definition ast.h:4070
pm_node_t base
The embedded base node.
Definition ast.h:4072
PM_NODE_ALIGNAS struct pm_block_node * block
ForwardingSuperNode::block.
Definition ast.h:4079
GlobalVariableAndWriteNode.
Definition ast.h:4094
pm_location_t operator_loc
GlobalVariableAndWriteNode::operator_loc.
Definition ast.h:4111
pm_node_t base
The embedded base node.
Definition ast.h:4096
PM_NODE_ALIGNAS struct pm_node * value
GlobalVariableAndWriteNode::value.
Definition ast.h:4116
pm_location_t name_loc
GlobalVariableAndWriteNode::name_loc.
Definition ast.h:4106
pm_constant_id_t name
GlobalVariableAndWriteNode::name.
Definition ast.h:4101
GlobalVariableOperatorWriteNode.
Definition ast.h:4131
PM_NODE_ALIGNAS struct pm_node * value
GlobalVariableOperatorWriteNode::value.
Definition ast.h:4153
pm_constant_id_t name
GlobalVariableOperatorWriteNode::name.
Definition ast.h:4138
pm_constant_id_t binary_operator
GlobalVariableOperatorWriteNode::binary_operator.
Definition ast.h:4158
pm_location_t name_loc
GlobalVariableOperatorWriteNode::name_loc.
Definition ast.h:4143
pm_node_t base
The embedded base node.
Definition ast.h:4133
pm_location_t binary_operator_loc
GlobalVariableOperatorWriteNode::binary_operator_loc.
Definition ast.h:4148
GlobalVariableOrWriteNode.
Definition ast.h:4173
pm_constant_id_t name
GlobalVariableOrWriteNode::name.
Definition ast.h:4180
pm_location_t name_loc
GlobalVariableOrWriteNode::name_loc.
Definition ast.h:4185
pm_node_t base
The embedded base node.
Definition ast.h:4175
pm_location_t operator_loc
GlobalVariableOrWriteNode::operator_loc.
Definition ast.h:4190
PM_NODE_ALIGNAS struct pm_node * value
GlobalVariableOrWriteNode::value.
Definition ast.h:4195
GlobalVariableReadNode.
Definition ast.h:4210
pm_node_t base
The embedded base node.
Definition ast.h:4212
pm_constant_id_t name
GlobalVariableReadNode::name.
Definition ast.h:4223
GlobalVariableTargetNode.
Definition ast.h:4238
pm_constant_id_t name
GlobalVariableTargetNode::name.
Definition ast.h:4245
pm_node_t base
The embedded base node.
Definition ast.h:4240
GlobalVariableWriteNode.
Definition ast.h:4260
pm_location_t name_loc
GlobalVariableWriteNode::name_loc.
Definition ast.h:4283
pm_location_t operator_loc
GlobalVariableWriteNode::operator_loc.
Definition ast.h:4306
pm_constant_id_t name
GlobalVariableWriteNode::name.
Definition ast.h:4273
pm_node_t base
The embedded base node.
Definition ast.h:4262
PM_NODE_ALIGNAS struct pm_node * value
GlobalVariableWriteNode::value.
Definition ast.h:4296
HashNode.
Definition ast.h:4321
struct pm_node_list elements
HashNode::elements.
Definition ast.h:4346
pm_node_t base
The embedded base node.
Definition ast.h:4323
pm_location_t closing_loc
HashNode::closing_loc.
Definition ast.h:4356
pm_location_t opening_loc
HashNode::opening_loc.
Definition ast.h:4333
HashPatternNode.
Definition ast.h:4380
PM_NODE_ALIGNAS struct pm_node * constant
HashPatternNode::constant.
Definition ast.h:4395
struct pm_node_list elements
HashPatternNode::elements.
Definition ast.h:4405
pm_location_t opening_loc
HashPatternNode::opening_loc.
Definition ast.h:4434
pm_node_t base
The embedded base node.
Definition ast.h:4382
pm_location_t closing_loc
HashPatternNode::closing_loc.
Definition ast.h:4447
PM_NODE_ALIGNAS struct pm_node * rest
HashPatternNode::rest.
Definition ast.h:4421
IfNode.
Definition ast.h:4468
PM_NODE_ALIGNAS struct pm_node * predicate
IfNode::predicate.
Definition ast.h:4500
pm_location_t end_keyword_loc
IfNode::end_keyword_loc.
Definition ast.h:4558
pm_location_t if_keyword_loc
IfNode::if_keyword_loc.
Definition ast.h:4482
PM_NODE_ALIGNAS struct pm_statements_node * statements
IfNode::statements.
Definition ast.h:4527
pm_node_t base
The embedded base node.
Definition ast.h:4470
pm_location_t then_keyword_loc
IfNode::then_keyword_loc.
Definition ast.h:4513
PM_NODE_ALIGNAS struct pm_node * subsequent
IfNode::subsequent.
Definition ast.h:4546
ImaginaryNode.
Definition ast.h:4573
pm_node_t base
The embedded base node.
Definition ast.h:4575
PM_NODE_ALIGNAS struct pm_node * numeric
ImaginaryNode::numeric.
Definition ast.h:4580
ImplicitNode.
Definition ast.h:4601
pm_node_t base
The embedded base node.
Definition ast.h:4603
PM_NODE_ALIGNAS struct pm_node * value
ImplicitNode::value.
Definition ast.h:4608
ImplicitRestNode.
Definition ast.h:4632
pm_node_t base
The embedded base node.
Definition ast.h:4634
InNode.
Definition ast.h:4649
PM_NODE_ALIGNAS struct pm_node * pattern
InNode::pattern.
Definition ast.h:4656
PM_NODE_ALIGNAS struct pm_statements_node * statements
InNode::statements.
Definition ast.h:4661
pm_node_t base
The embedded base node.
Definition ast.h:4651
pm_location_t then_loc
InNode::then_loc.
Definition ast.h:4671
pm_location_t in_loc
InNode::in_loc.
Definition ast.h:4666
IndexAndWriteNode.
Definition ast.h:4692
PM_NODE_ALIGNAS struct pm_arguments_node * arguments
IndexAndWriteNode::arguments.
Definition ast.h:4714
pm_node_t base
The embedded base node.
Definition ast.h:4694
pm_location_t operator_loc
IndexAndWriteNode::operator_loc.
Definition ast.h:4729
pm_location_t closing_loc
IndexAndWriteNode::closing_loc.
Definition ast.h:4719
pm_location_t opening_loc
IndexAndWriteNode::opening_loc.
Definition ast.h:4709
pm_location_t call_operator_loc
IndexAndWriteNode::call_operator_loc.
Definition ast.h:4704
PM_NODE_ALIGNAS struct pm_block_argument_node * block
IndexAndWriteNode::block.
Definition ast.h:4724
PM_NODE_ALIGNAS struct pm_node * receiver
IndexAndWriteNode::receiver.
Definition ast.h:4699
PM_NODE_ALIGNAS struct pm_node * value
IndexAndWriteNode::value.
Definition ast.h:4734
IndexOperatorWriteNode.
Definition ast.h:4755
PM_NODE_ALIGNAS struct pm_block_argument_node * block
IndexOperatorWriteNode::block.
Definition ast.h:4787
pm_node_t base
The embedded base node.
Definition ast.h:4757
PM_NODE_ALIGNAS struct pm_node * receiver
IndexOperatorWriteNode::receiver.
Definition ast.h:4762
pm_location_t binary_operator_loc
IndexOperatorWriteNode::binary_operator_loc.
Definition ast.h:4797
PM_NODE_ALIGNAS struct pm_node * value
IndexOperatorWriteNode::value.
Definition ast.h:4802
pm_location_t opening_loc
IndexOperatorWriteNode::opening_loc.
Definition ast.h:4772
PM_NODE_ALIGNAS struct pm_arguments_node * arguments
IndexOperatorWriteNode::arguments.
Definition ast.h:4777
pm_location_t call_operator_loc
IndexOperatorWriteNode::call_operator_loc.
Definition ast.h:4767
pm_location_t closing_loc
IndexOperatorWriteNode::closing_loc.
Definition ast.h:4782
pm_constant_id_t binary_operator
IndexOperatorWriteNode::binary_operator.
Definition ast.h:4792
IndexOrWriteNode.
Definition ast.h:4823
pm_location_t closing_loc
IndexOrWriteNode::closing_loc.
Definition ast.h:4850
pm_location_t call_operator_loc
IndexOrWriteNode::call_operator_loc.
Definition ast.h:4835
pm_node_t base
The embedded base node.
Definition ast.h:4825
pm_location_t operator_loc
IndexOrWriteNode::operator_loc.
Definition ast.h:4860
pm_location_t opening_loc
IndexOrWriteNode::opening_loc.
Definition ast.h:4840
PM_NODE_ALIGNAS struct pm_arguments_node * arguments
IndexOrWriteNode::arguments.
Definition ast.h:4845
PM_NODE_ALIGNAS struct pm_node * value
IndexOrWriteNode::value.
Definition ast.h:4865
PM_NODE_ALIGNAS struct pm_node * receiver
IndexOrWriteNode::receiver.
Definition ast.h:4830
PM_NODE_ALIGNAS struct pm_block_argument_node * block
IndexOrWriteNode::block.
Definition ast.h:4855
IndexTargetNode.
Definition ast.h:4894
pm_node_t base
The embedded base node.
Definition ast.h:4896
PM_NODE_ALIGNAS struct pm_arguments_node * arguments
IndexTargetNode::arguments.
Definition ast.h:4911
pm_location_t closing_loc
IndexTargetNode::closing_loc.
Definition ast.h:4916
PM_NODE_ALIGNAS struct pm_block_argument_node * block
IndexTargetNode::block.
Definition ast.h:4921
pm_location_t opening_loc
IndexTargetNode::opening_loc.
Definition ast.h:4906
PM_NODE_ALIGNAS struct pm_node * receiver
IndexTargetNode::receiver.
Definition ast.h:4901
InstanceVariableAndWriteNode.
Definition ast.h:4936
PM_NODE_ALIGNAS struct pm_node * value
InstanceVariableAndWriteNode::value.
Definition ast.h:4958
pm_location_t operator_loc
InstanceVariableAndWriteNode::operator_loc.
Definition ast.h:4953
pm_location_t name_loc
InstanceVariableAndWriteNode::name_loc.
Definition ast.h:4948
pm_node_t base
The embedded base node.
Definition ast.h:4938
pm_constant_id_t name
InstanceVariableAndWriteNode::name.
Definition ast.h:4943
InstanceVariableOperatorWriteNode.
Definition ast.h:4973
pm_constant_id_t binary_operator
InstanceVariableOperatorWriteNode::binary_operator.
Definition ast.h:5000
PM_NODE_ALIGNAS struct pm_node * value
InstanceVariableOperatorWriteNode::value.
Definition ast.h:4995
pm_location_t binary_operator_loc
InstanceVariableOperatorWriteNode::binary_operator_loc.
Definition ast.h:4990
pm_constant_id_t name
InstanceVariableOperatorWriteNode::name.
Definition ast.h:4980
pm_node_t base
The embedded base node.
Definition ast.h:4975
pm_location_t name_loc
InstanceVariableOperatorWriteNode::name_loc.
Definition ast.h:4985
InstanceVariableOrWriteNode.
Definition ast.h:5015
pm_location_t operator_loc
InstanceVariableOrWriteNode::operator_loc.
Definition ast.h:5032
pm_node_t base
The embedded base node.
Definition ast.h:5017
pm_location_t name_loc
InstanceVariableOrWriteNode::name_loc.
Definition ast.h:5027
pm_constant_id_t name
InstanceVariableOrWriteNode::name.
Definition ast.h:5022
PM_NODE_ALIGNAS struct pm_node * value
InstanceVariableOrWriteNode::value.
Definition ast.h:5037
InstanceVariableReadNode.
Definition ast.h:5052
pm_constant_id_t name
InstanceVariableReadNode::name.
Definition ast.h:5065
pm_node_t base
The embedded base node.
Definition ast.h:5054
InstanceVariableTargetNode.
Definition ast.h:5080
pm_constant_id_t name
InstanceVariableTargetNode::name.
Definition ast.h:5087
pm_node_t base
The embedded base node.
Definition ast.h:5082
InstanceVariableWriteNode.
Definition ast.h:5102
pm_location_t operator_loc
InstanceVariableWriteNode::operator_loc.
Definition ast.h:5148
PM_NODE_ALIGNAS struct pm_node * value
InstanceVariableWriteNode::value.
Definition ast.h:5138
pm_constant_id_t name
InstanceVariableWriteNode::name.
Definition ast.h:5115
pm_node_t base
The embedded base node.
Definition ast.h:5104
pm_location_t name_loc
InstanceVariableWriteNode::name_loc.
Definition ast.h:5125
IntegerNode.
Definition ast.h:5169
pm_integer_t value
IntegerNode::value.
Definition ast.h:5178
pm_node_t base
The embedded base node.
Definition ast.h:5171
InterpolatedMatchLastLineNode.
Definition ast.h:5206
pm_node_t base
The embedded base node.
Definition ast.h:5208
pm_location_t closing_loc
InterpolatedMatchLastLineNode::closing_loc.
Definition ast.h:5223
struct pm_node_list parts
InterpolatedMatchLastLineNode::parts.
Definition ast.h:5218
pm_location_t opening_loc
InterpolatedMatchLastLineNode::opening_loc.
Definition ast.h:5213
InterpolatedRegularExpressionNode.
Definition ast.h:5251
pm_location_t opening_loc
InterpolatedRegularExpressionNode::opening_loc.
Definition ast.h:5258
struct pm_node_list parts
InterpolatedRegularExpressionNode::parts.
Definition ast.h:5263
pm_node_t base
The embedded base node.
Definition ast.h:5253
pm_location_t closing_loc
InterpolatedRegularExpressionNode::closing_loc.
Definition ast.h:5268
InterpolatedStringNode.
Definition ast.h:5287
pm_node_t base
The embedded base node.
Definition ast.h:5289
pm_location_t closing_loc
InterpolatedStringNode::closing_loc.
Definition ast.h:5304
pm_location_t opening_loc
InterpolatedStringNode::opening_loc.
Definition ast.h:5294
struct pm_node_list parts
InterpolatedStringNode::parts.
Definition ast.h:5299
InterpolatedSymbolNode.
Definition ast.h:5319
struct pm_node_list parts
InterpolatedSymbolNode::parts.
Definition ast.h:5331
pm_location_t closing_loc
InterpolatedSymbolNode::closing_loc.
Definition ast.h:5336
pm_location_t opening_loc
InterpolatedSymbolNode::opening_loc.
Definition ast.h:5326
pm_node_t base
The embedded base node.
Definition ast.h:5321
InterpolatedXStringNode.
Definition ast.h:5351
pm_location_t opening_loc
InterpolatedXStringNode::opening_loc.
Definition ast.h:5358
pm_location_t closing_loc
InterpolatedXStringNode::closing_loc.
Definition ast.h:5368
pm_node_t base
The embedded base node.
Definition ast.h:5353
struct pm_node_list parts
InterpolatedXStringNode::parts.
Definition ast.h:5363
ItLocalVariableReadNode.
Definition ast.h:5383
pm_node_t base
The embedded base node.
Definition ast.h:5385
ItParametersNode.
Definition ast.h:5400
pm_node_t base
The embedded base node.
Definition ast.h:5402
KeywordHashNode.
Definition ast.h:5420
pm_node_t base
The embedded base node.
Definition ast.h:5422
struct pm_node_list elements
KeywordHashNode::elements.
Definition ast.h:5427
KeywordRestParameterNode.
Definition ast.h:5446
pm_node_t base
The embedded base node.
Definition ast.h:5448
pm_constant_id_t name
KeywordRestParameterNode::name.
Definition ast.h:5453
pm_location_t operator_loc
KeywordRestParameterNode::operator_loc.
Definition ast.h:5463
pm_location_t name_loc
KeywordRestParameterNode::name_loc.
Definition ast.h:5458
LambdaNode.
Definition ast.h:5478
pm_location_t closing_loc
LambdaNode::closing_loc.
Definition ast.h:5500
pm_node_t base
The embedded base node.
Definition ast.h:5480
pm_location_t opening_loc
LambdaNode::opening_loc.
Definition ast.h:5495
pm_location_t operator_loc
LambdaNode::operator_loc.
Definition ast.h:5490
pm_constant_id_list_t locals
LambdaNode::locals.
Definition ast.h:5485
PM_NODE_ALIGNAS struct pm_node * body
LambdaNode::body.
Definition ast.h:5510
PM_NODE_ALIGNAS struct pm_node * parameters
LambdaNode::parameters.
Definition ast.h:5505
LocalVariableAndWriteNode.
Definition ast.h:5525
pm_constant_id_t name
LocalVariableAndWriteNode::name.
Definition ast.h:5547
pm_node_t base
The embedded base node.
Definition ast.h:5527
uint32_t depth
LocalVariableAndWriteNode::depth.
Definition ast.h:5552
pm_location_t operator_loc
LocalVariableAndWriteNode::operator_loc.
Definition ast.h:5537
PM_NODE_ALIGNAS struct pm_node * value
LocalVariableAndWriteNode::value.
Definition ast.h:5542
pm_location_t name_loc
LocalVariableAndWriteNode::name_loc.
Definition ast.h:5532
LocalVariableOperatorWriteNode.
Definition ast.h:5567
uint32_t depth
LocalVariableOperatorWriteNode::depth.
Definition ast.h:5599
pm_constant_id_t binary_operator
LocalVariableOperatorWriteNode::binary_operator.
Definition ast.h:5594
pm_node_t base
The embedded base node.
Definition ast.h:5569
pm_location_t name_loc
LocalVariableOperatorWriteNode::name_loc.
Definition ast.h:5574
pm_location_t binary_operator_loc
LocalVariableOperatorWriteNode::binary_operator_loc.
Definition ast.h:5579
PM_NODE_ALIGNAS struct pm_node * value
LocalVariableOperatorWriteNode::value.
Definition ast.h:5584
pm_constant_id_t name
LocalVariableOperatorWriteNode::name.
Definition ast.h:5589
LocalVariableOrWriteNode.
Definition ast.h:5614
PM_NODE_ALIGNAS struct pm_node * value
LocalVariableOrWriteNode::value.
Definition ast.h:5631
uint32_t depth
LocalVariableOrWriteNode::depth.
Definition ast.h:5641
pm_location_t operator_loc
LocalVariableOrWriteNode::operator_loc.
Definition ast.h:5626
pm_node_t base
The embedded base node.
Definition ast.h:5616
pm_constant_id_t name
LocalVariableOrWriteNode::name.
Definition ast.h:5636
pm_location_t name_loc
LocalVariableOrWriteNode::name_loc.
Definition ast.h:5621
LocalVariableReadNode.
Definition ast.h:5656
uint32_t depth
LocalVariableReadNode::depth.
Definition ast.h:5686
pm_constant_id_t name
LocalVariableReadNode::name.
Definition ast.h:5673
pm_node_t base
The embedded base node.
Definition ast.h:5658
LocalVariableTargetNode.
Definition ast.h:5704
uint32_t depth
LocalVariableTargetNode::depth.
Definition ast.h:5716
pm_constant_id_t name
LocalVariableTargetNode::name.
Definition ast.h:5711
pm_node_t base
The embedded base node.
Definition ast.h:5706
LocalVariableWriteNode.
Definition ast.h:5731
PM_NODE_ALIGNAS struct pm_node * value
LocalVariableWriteNode::value.
Definition ast.h:5784
pm_location_t operator_loc
LocalVariableWriteNode::operator_loc.
Definition ast.h:5794
pm_location_t name_loc
LocalVariableWriteNode::name_loc.
Definition ast.h:5767
pm_node_t base
The embedded base node.
Definition ast.h:5733
uint32_t depth
LocalVariableWriteNode::depth.
Definition ast.h:5757
pm_constant_id_t name
LocalVariableWriteNode::name.
Definition ast.h:5744
This struct represents a slice in the source code, defined by an offset and a length.
Definition ast.h:540
uint32_t start
The offset of the location from the start of the source.
Definition ast.h:542
uint32_t length
The length of the location.
Definition ast.h:545
MatchLastLineNode.
Definition ast.h:5822
pm_location_t content_loc
MatchLastLineNode::content_loc.
Definition ast.h:5834
pm_location_t opening_loc
MatchLastLineNode::opening_loc.
Definition ast.h:5829
pm_location_t closing_loc
MatchLastLineNode::closing_loc.
Definition ast.h:5839
pm_string_t unescaped
MatchLastLineNode::unescaped.
Definition ast.h:5844
pm_node_t base
The embedded base node.
Definition ast.h:5824
MatchPredicateNode.
Definition ast.h:5859
pm_location_t operator_loc
MatchPredicateNode::operator_loc.
Definition ast.h:5876
PM_NODE_ALIGNAS struct pm_node * pattern
MatchPredicateNode::pattern.
Definition ast.h:5871
PM_NODE_ALIGNAS struct pm_node * value
MatchPredicateNode::value.
Definition ast.h:5866
pm_node_t base
The embedded base node.
Definition ast.h:5861
MatchRequiredNode.
Definition ast.h:5891
pm_node_t base
The embedded base node.
Definition ast.h:5893
pm_location_t operator_loc
MatchRequiredNode::operator_loc.
Definition ast.h:5962
PM_NODE_ALIGNAS struct pm_node * pattern
MatchRequiredNode::pattern.
Definition ast.h:5952
PM_NODE_ALIGNAS struct pm_node * value
MatchRequiredNode::value.
Definition ast.h:5903
MatchWriteNode.
Definition ast.h:5977
pm_node_t base
The embedded base node.
Definition ast.h:5979
PM_NODE_ALIGNAS struct pm_call_node * call
MatchWriteNode::call.
Definition ast.h:5984
struct pm_node_list targets
MatchWriteNode::targets.
Definition ast.h:5989
MissingNode.
Definition ast.h:6001
pm_node_t base
The embedded base node.
Definition ast.h:6003
ModuleNode.
Definition ast.h:6018
pm_location_t end_keyword_loc
ModuleNode::end_keyword_loc.
Definition ast.h:6045
PM_NODE_ALIGNAS struct pm_node * constant_path
ModuleNode::constant_path.
Definition ast.h:6035
PM_NODE_ALIGNAS struct pm_node * body
ModuleNode::body.
Definition ast.h:6040
pm_constant_id_list_t locals
ModuleNode::locals.
Definition ast.h:6025
pm_node_t base
The embedded base node.
Definition ast.h:6020
pm_location_t module_keyword_loc
ModuleNode::module_keyword_loc.
Definition ast.h:6030
pm_constant_id_t name
ModuleNode::name.
Definition ast.h:6050
MultiTargetNode.
Definition ast.h:6070
PM_NODE_ALIGNAS struct pm_node * rest
MultiTargetNode::rest.
Definition ast.h:6107
pm_node_t base
The embedded base node.
Definition ast.h:6072
pm_location_t lparen_loc
MultiTargetNode::lparen_loc.
Definition ast.h:6127
struct pm_node_list lefts
MultiTargetNode::lefts.
Definition ast.h:6087
pm_location_t rparen_loc
MultiTargetNode::rparen_loc.
Definition ast.h:6137
struct pm_node_list rights
MultiTargetNode::rights.
Definition ast.h:6117
MultiWriteNode.
Definition ast.h:6152
pm_location_t rparen_loc
MultiWriteNode::rparen_loc.
Definition ast.h:6219
PM_NODE_ALIGNAS struct pm_node * rest
MultiWriteNode::rest.
Definition ast.h:6189
struct pm_node_list rights
MultiWriteNode::rights.
Definition ast.h:6199
pm_location_t operator_loc
MultiWriteNode::operator_loc.
Definition ast.h:6229
PM_NODE_ALIGNAS struct pm_node * value
MultiWriteNode::value.
Definition ast.h:6239
pm_location_t lparen_loc
MultiWriteNode::lparen_loc.
Definition ast.h:6209
struct pm_node_list lefts
MultiWriteNode::lefts.
Definition ast.h:6169
pm_node_t base
The embedded base node.
Definition ast.h:6154
NextNode.
Definition ast.h:6254
PM_NODE_ALIGNAS struct pm_arguments_node * arguments
NextNode::arguments.
Definition ast.h:6261
pm_node_t base
The embedded base node.
Definition ast.h:6256
pm_location_t keyword_loc
NextNode::keyword_loc.
Definition ast.h:6266
NilNode.
Definition ast.h:6281
pm_node_t base
The embedded base node.
Definition ast.h:6283
NoBlockParameterNode.
Definition ast.h:6299
pm_location_t keyword_loc
NoBlockParameterNode::keyword_loc.
Definition ast.h:6311
pm_node_t base
The embedded base node.
Definition ast.h:6301
pm_location_t operator_loc
NoBlockParameterNode::operator_loc.
Definition ast.h:6306
NoKeywordsParameterNode.
Definition ast.h:6327
pm_location_t keyword_loc
NoKeywordsParameterNode::keyword_loc.
Definition ast.h:6339
pm_location_t operator_loc
NoKeywordsParameterNode::operator_loc.
Definition ast.h:6334
pm_node_t base
The embedded base node.
Definition ast.h:6329
A list of nodes in the source, most often used for lists of children.
Definition ast.h:553
size_t size
The number of nodes in the list.
Definition ast.h:555
struct pm_node ** nodes
The nodes in the list.
Definition ast.h:561
size_t capacity
The capacity of the list that has been allocated.
Definition ast.h:558
This is the base structure that represents a node in the syntax tree.
Definition ast.h:1051
pm_location_t location
This is the location of the node in the source.
Definition ast.h:1074
NumberedParametersNode.
Definition ast.h:6354
pm_node_t base
The embedded base node.
Definition ast.h:6356
uint8_t maximum
NumberedParametersNode::maximum.
Definition ast.h:6361
NumberedReferenceReadNode.
Definition ast.h:6376
pm_node_t base
The embedded base node.
Definition ast.h:6378
uint32_t number
NumberedReferenceReadNode::number.
Definition ast.h:6391
OptionalKeywordParameterNode.
Definition ast.h:6410
pm_node_t base
The embedded base node.
Definition ast.h:6412
pm_constant_id_t name
OptionalKeywordParameterNode::name.
Definition ast.h:6417
PM_NODE_ALIGNAS struct pm_node * value
OptionalKeywordParameterNode::value.
Definition ast.h:6427
pm_location_t name_loc
OptionalKeywordParameterNode::name_loc.
Definition ast.h:6422
OptionalParameterNode.
Definition ast.h:6446
pm_location_t name_loc
OptionalParameterNode::name_loc.
Definition ast.h:6458
pm_constant_id_t name
OptionalParameterNode::name.
Definition ast.h:6453
pm_node_t base
The embedded base node.
Definition ast.h:6448
pm_location_t operator_loc
OptionalParameterNode::operator_loc.
Definition ast.h:6463
PM_NODE_ALIGNAS struct pm_node * value
OptionalParameterNode::value.
Definition ast.h:6468
OrNode.
Definition ast.h:6483
PM_NODE_ALIGNAS struct pm_node * right
OrNode::right.
Definition ast.h:6511
pm_node_t base
The embedded base node.
Definition ast.h:6485
PM_NODE_ALIGNAS struct pm_node * left
OrNode::left.
Definition ast.h:6498
pm_location_t operator_loc
OrNode::operator_loc.
Definition ast.h:6521
ParametersNode.
Definition ast.h:6537
PM_NODE_ALIGNAS struct pm_node * block
ParametersNode::block.
Definition ast.h:6574
struct pm_node_list requireds
ParametersNode::requireds.
Definition ast.h:6544
struct pm_node_list optionals
ParametersNode::optionals.
Definition ast.h:6549
struct pm_node_list posts
ParametersNode::posts.
Definition ast.h:6559
pm_node_t base
The embedded base node.
Definition ast.h:6539
PM_NODE_ALIGNAS struct pm_node * rest
ParametersNode::rest.
Definition ast.h:6554
struct pm_node_list keywords
ParametersNode::keywords.
Definition ast.h:6564
PM_NODE_ALIGNAS struct pm_node * keyword_rest
ParametersNode::keyword_rest.
Definition ast.h:6569
ParenthesesNode.
Definition ast.h:6592
pm_location_t closing_loc
ParenthesesNode::closing_loc.
Definition ast.h:6609
pm_node_t base
The embedded base node.
Definition ast.h:6594
pm_location_t opening_loc
ParenthesesNode::opening_loc.
Definition ast.h:6604
PM_NODE_ALIGNAS struct pm_node * body
ParenthesesNode::body.
Definition ast.h:6599
This struct represents the overall parser.
Definition parser.h:637
pm_constant_pool_t constant_pool
This constant pool keeps all of the constants defined throughout the file so that we can reference th...
Definition parser.h:783
PinnedExpressionNode.
Definition ast.h:6624
pm_node_t base
The embedded base node.
Definition ast.h:6626
pm_location_t rparen_loc
PinnedExpressionNode::rparen_loc.
Definition ast.h:6666
pm_location_t lparen_loc
PinnedExpressionNode::lparen_loc.
Definition ast.h:6656
PM_NODE_ALIGNAS struct pm_node * expression
PinnedExpressionNode::expression.
Definition ast.h:6636
pm_location_t operator_loc
PinnedExpressionNode::operator_loc.
Definition ast.h:6646
PinnedVariableNode.
Definition ast.h:6681
pm_node_t base
The embedded base node.
Definition ast.h:6683
PM_NODE_ALIGNAS struct pm_node * variable
PinnedVariableNode::variable.
Definition ast.h:6693
pm_location_t operator_loc
PinnedVariableNode::operator_loc.
Definition ast.h:6703
PostExecutionNode.
Definition ast.h:6718
pm_location_t closing_loc
PostExecutionNode::closing_loc.
Definition ast.h:6740
pm_node_t base
The embedded base node.
Definition ast.h:6720
pm_location_t opening_loc
PostExecutionNode::opening_loc.
Definition ast.h:6735
pm_location_t keyword_loc
PostExecutionNode::keyword_loc.
Definition ast.h:6730
PM_NODE_ALIGNAS struct pm_statements_node * statements
PostExecutionNode::statements.
Definition ast.h:6725
PreExecutionNode.
Definition ast.h:6755
pm_location_t closing_loc
PreExecutionNode::closing_loc.
Definition ast.h:6777
pm_location_t opening_loc
PreExecutionNode::opening_loc.
Definition ast.h:6772
PM_NODE_ALIGNAS struct pm_statements_node * statements
PreExecutionNode::statements.
Definition ast.h:6762
pm_node_t base
The embedded base node.
Definition ast.h:6757
pm_location_t keyword_loc
PreExecutionNode::keyword_loc.
Definition ast.h:6767
ProgramNode.
Definition ast.h:6789
pm_node_t base
The embedded base node.
Definition ast.h:6791
PM_NODE_ALIGNAS struct pm_statements_node * statements
ProgramNode::statements.
Definition ast.h:6801
pm_constant_id_list_t locals
ProgramNode::locals.
Definition ast.h:6796
RangeNode.
Definition ast.h:6822
pm_location_t operator_loc
RangeNode::operator_loc.
Definition ast.h:6858
pm_node_t base
The embedded base node.
Definition ast.h:6824
PM_NODE_ALIGNAS struct pm_node * right
RangeNode::right.
Definition ast.h:6851
PM_NODE_ALIGNAS struct pm_node * left
RangeNode::left.
Definition ast.h:6837
RationalNode.
Definition ast.h:6879
pm_node_t base
The embedded base node.
Definition ast.h:6881
pm_integer_t denominator
RationalNode::denominator.
Definition ast.h:6899
pm_integer_t numerator
RationalNode::numerator.
Definition ast.h:6890
RedoNode.
Definition ast.h:6914
pm_node_t base
The embedded base node.
Definition ast.h:6916
RegularExpressionNode.
Definition ast.h:6944
pm_location_t closing_loc
RegularExpressionNode::closing_loc.
Definition ast.h:6961
pm_node_t base
The embedded base node.
Definition ast.h:6946
pm_string_t unescaped
RegularExpressionNode::unescaped.
Definition ast.h:6966
pm_location_t opening_loc
RegularExpressionNode::opening_loc.
Definition ast.h:6951
pm_location_t content_loc
RegularExpressionNode::content_loc.
Definition ast.h:6956
RequiredKeywordParameterNode.
Definition ast.h:6985
pm_location_t name_loc
RequiredKeywordParameterNode::name_loc.
Definition ast.h:6997
pm_node_t base
The embedded base node.
Definition ast.h:6987
pm_constant_id_t name
RequiredKeywordParameterNode::name.
Definition ast.h:6992
RequiredParameterNode.
Definition ast.h:7016
pm_constant_id_t name
RequiredParameterNode::name.
Definition ast.h:7023
pm_node_t base
The embedded base node.
Definition ast.h:7018
RescueModifierNode.
Definition ast.h:7038
PM_NODE_ALIGNAS struct pm_node * expression
RescueModifierNode::expression.
Definition ast.h:7045
pm_node_t base
The embedded base node.
Definition ast.h:7040
pm_location_t keyword_loc
RescueModifierNode::keyword_loc.
Definition ast.h:7050
PM_NODE_ALIGNAS struct pm_node * rescue_expression
RescueModifierNode::rescue_expression.
Definition ast.h:7055
RescueNode.
Definition ast.h:7075
PM_NODE_ALIGNAS struct pm_statements_node * statements
RescueNode::statements.
Definition ast.h:7107
PM_NODE_ALIGNAS struct pm_rescue_node * subsequent
RescueNode::subsequent.
Definition ast.h:7112
pm_location_t keyword_loc
RescueNode::keyword_loc.
Definition ast.h:7082
PM_NODE_ALIGNAS struct pm_node * reference
RescueNode::reference.
Definition ast.h:7097
pm_location_t then_keyword_loc
RescueNode::then_keyword_loc.
Definition ast.h:7102
pm_location_t operator_loc
RescueNode::operator_loc.
Definition ast.h:7092
struct pm_node_list exceptions
RescueNode::exceptions.
Definition ast.h:7087
pm_node_t base
The embedded base node.
Definition ast.h:7077
RestParameterNode.
Definition ast.h:7131
pm_constant_id_t name
RestParameterNode::name.
Definition ast.h:7138
pm_location_t name_loc
RestParameterNode::name_loc.
Definition ast.h:7143
pm_node_t base
The embedded base node.
Definition ast.h:7133
pm_location_t operator_loc
RestParameterNode::operator_loc.
Definition ast.h:7148
RetryNode.
Definition ast.h:7163
pm_node_t base
The embedded base node.
Definition ast.h:7165
ReturnNode.
Definition ast.h:7180
PM_NODE_ALIGNAS struct pm_arguments_node * arguments
ReturnNode::arguments.
Definition ast.h:7192
pm_location_t keyword_loc
ReturnNode::keyword_loc.
Definition ast.h:7187
pm_node_t base
The embedded base node.
Definition ast.h:7182
SelfNode.
Definition ast.h:7207
pm_node_t base
The embedded base node.
Definition ast.h:7209
ShareableConstantNode.
Definition ast.h:7230
PM_NODE_ALIGNAS struct pm_node * write
ShareableConstantNode::write.
Definition ast.h:7239
pm_node_t base
The embedded base node.
Definition ast.h:7232
SingletonClassNode.
Definition ast.h:7254
PM_NODE_ALIGNAS struct pm_node * body
SingletonClassNode::body.
Definition ast.h:7281
pm_node_t base
The embedded base node.
Definition ast.h:7256
pm_constant_id_list_t locals
SingletonClassNode::locals.
Definition ast.h:7261
pm_location_t operator_loc
SingletonClassNode::operator_loc.
Definition ast.h:7271
PM_NODE_ALIGNAS struct pm_node * expression
SingletonClassNode::expression.
Definition ast.h:7276
pm_location_t end_keyword_loc
SingletonClassNode::end_keyword_loc.
Definition ast.h:7286
pm_location_t class_keyword_loc
SingletonClassNode::class_keyword_loc.
Definition ast.h:7266
SourceEncodingNode.
Definition ast.h:7301
pm_node_t base
The embedded base node.
Definition ast.h:7303
SourceFileNode.
Definition ast.h:7324
pm_string_t filepath
SourceFileNode::filepath.
Definition ast.h:7333
pm_node_t base
The embedded base node.
Definition ast.h:7326
SourceLineNode.
Definition ast.h:7348
pm_node_t base
The embedded base node.
Definition ast.h:7350
SplatNode.
Definition ast.h:7365
pm_node_t base
The embedded base node.
Definition ast.h:7367
PM_NODE_ALIGNAS struct pm_node * expression
SplatNode::expression.
Definition ast.h:7377
pm_location_t operator_loc
SplatNode::operator_loc.
Definition ast.h:7372
StatementsNode.
Definition ast.h:7392
struct pm_node_list body
StatementsNode::body.
Definition ast.h:7399
pm_node_t base
The embedded base node.
Definition ast.h:7394
StringNode.
Definition ast.h:7426
pm_node_t base
The embedded base node.
Definition ast.h:7428
pm_string_t unescaped
StringNode::unescaped.
Definition ast.h:7448
pm_location_t content_loc
StringNode::content_loc.
Definition ast.h:7438
pm_location_t closing_loc
StringNode::closing_loc.
Definition ast.h:7443
pm_location_t opening_loc
StringNode::opening_loc.
Definition ast.h:7433
A generic string type that can have various ownership semantics.
Definition pm_string.h:33
SuperNode.
Definition ast.h:7468
PM_NODE_ALIGNAS struct pm_arguments_node * arguments
SuperNode::arguments.
Definition ast.h:7487
pm_location_t lparen_loc
SuperNode::lparen_loc.
Definition ast.h:7480
pm_node_t base
The embedded base node.
Definition ast.h:7470
pm_location_t keyword_loc
SuperNode::keyword_loc.
Definition ast.h:7475
pm_location_t rparen_loc
SuperNode::rparen_loc.
Definition ast.h:7492
PM_NODE_ALIGNAS struct pm_node * block
SuperNode::block.
Definition ast.h:7497
SymbolNode.
Definition ast.h:7520
pm_location_t opening_loc
SymbolNode::opening_loc.
Definition ast.h:7527
pm_location_t value_loc
SymbolNode::value_loc.
Definition ast.h:7532
pm_location_t closing_loc
SymbolNode::closing_loc.
Definition ast.h:7537
pm_string_t unescaped
SymbolNode::unescaped.
Definition ast.h:7542
pm_node_t base
The embedded base node.
Definition ast.h:7522
TrueNode.
Definition ast.h:7557
pm_node_t base
The embedded base node.
Definition ast.h:7559
UndefNode.
Definition ast.h:7574
pm_node_t base
The embedded base node.
Definition ast.h:7576
pm_location_t keyword_loc
UndefNode::keyword_loc.
Definition ast.h:7586
struct pm_node_list names
UndefNode::names.
Definition ast.h:7581
UnlessNode.
Definition ast.h:7604
pm_location_t keyword_loc
UnlessNode::keyword_loc.
Definition ast.h:7619
pm_location_t then_keyword_loc
UnlessNode::then_keyword_loc.
Definition ast.h:7642
PM_NODE_ALIGNAS struct pm_node * predicate
UnlessNode::predicate.
Definition ast.h:7632
PM_NODE_ALIGNAS struct pm_statements_node * statements
UnlessNode::statements.
Definition ast.h:7653
pm_location_t end_keyword_loc
UnlessNode::end_keyword_loc.
Definition ast.h:7673
PM_NODE_ALIGNAS struct pm_else_node * else_clause
UnlessNode::else_clause.
Definition ast.h:7663
pm_node_t base
The embedded base node.
Definition ast.h:7606
UntilNode.
Definition ast.h:7694
pm_location_t closing_loc
UntilNode::closing_loc.
Definition ast.h:7711
pm_location_t keyword_loc
UntilNode::keyword_loc.
Definition ast.h:7701
pm_node_t base
The embedded base node.
Definition ast.h:7696
PM_NODE_ALIGNAS struct pm_statements_node * statements
UntilNode::statements.
Definition ast.h:7721
pm_location_t do_keyword_loc
UntilNode::do_keyword_loc.
Definition ast.h:7706
PM_NODE_ALIGNAS struct pm_node * predicate
UntilNode::predicate.
Definition ast.h:7716
WhenNode.
Definition ast.h:7738
pm_node_t base
The embedded base node.
Definition ast.h:7740
pm_location_t then_keyword_loc
WhenNode::then_keyword_loc.
Definition ast.h:7755
pm_location_t keyword_loc
WhenNode::keyword_loc.
Definition ast.h:7745
PM_NODE_ALIGNAS struct pm_statements_node * statements
WhenNode::statements.
Definition ast.h:7760
struct pm_node_list conditions
WhenNode::conditions.
Definition ast.h:7750
WhileNode.
Definition ast.h:7781
PM_NODE_ALIGNAS struct pm_statements_node * statements
WhileNode::statements.
Definition ast.h:7808
pm_location_t closing_loc
WhileNode::closing_loc.
Definition ast.h:7798
pm_location_t keyword_loc
WhileNode::keyword_loc.
Definition ast.h:7788
pm_node_t base
The embedded base node.
Definition ast.h:7783
pm_location_t do_keyword_loc
WhileNode::do_keyword_loc.
Definition ast.h:7793
PM_NODE_ALIGNAS struct pm_node * predicate
WhileNode::predicate.
Definition ast.h:7803
XStringNode.
Definition ast.h:7827
pm_location_t closing_loc
XStringNode::closing_loc.
Definition ast.h:7844
pm_location_t opening_loc
XStringNode::opening_loc.
Definition ast.h:7834
pm_location_t content_loc
XStringNode::content_loc.
Definition ast.h:7839
pm_string_t unescaped
XStringNode::unescaped.
Definition ast.h:7849
pm_node_t base
The embedded base node.
Definition ast.h:7829
YieldNode.
Definition ast.h:7864
pm_location_t keyword_loc
YieldNode::keyword_loc.
Definition ast.h:7871
pm_location_t lparen_loc
YieldNode::lparen_loc.
Definition ast.h:7876
pm_node_t base
The embedded base node.
Definition ast.h:7866
pm_location_t rparen_loc
YieldNode::rparen_loc.
Definition ast.h:7886
PM_NODE_ALIGNAS struct pm_arguments_node * arguments
YieldNode::arguments.
Definition ast.h:7881