prism 2.0.0.rc1-x86_64-linux-gnu

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