prism 1.9.0 → 2.0.0.rc2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +88 -0
  3. data/CODE_OF_CONDUCT.md +1 -1
  4. data/LICENSE.md +1 -1
  5. data/Makefile +41 -12
  6. data/README.md +35 -97
  7. data/config.yml +174 -161
  8. data/docs/build_system.md +2 -2
  9. data/docs/configuration.md +5 -4
  10. data/docs/encoding.md +2 -2
  11. data/docs/fuzzing.md +4 -11
  12. data/docs/javascript.md +19 -4
  13. data/docs/mapping.md +1 -1
  14. data/docs/releasing.md +77 -5
  15. data/docs/relocation.md +2 -4
  16. data/docs/serialization.md +22 -24
  17. data/docs/testing.md +46 -29
  18. data/ext/prism/api_node.c +1461 -1401
  19. data/ext/prism/extconf.rb +3 -4
  20. data/ext/prism/extension.c +796 -422
  21. data/ext/prism/extension.h +3 -3
  22. data/include/prism/arena.h +37 -0
  23. data/include/prism/ast.h +2727 -610
  24. data/include/prism/buffer.h +52 -0
  25. data/include/prism/comments.h +55 -0
  26. data/include/prism/compiler/accel.h +26 -0
  27. data/include/prism/compiler/align.h +36 -0
  28. data/include/prism/compiler/assume.h +25 -0
  29. data/include/prism/compiler/bswap.h +46 -0
  30. data/include/prism/compiler/endianness.h +34 -0
  31. data/include/prism/compiler/exported.h +24 -0
  32. data/include/prism/compiler/fallthrough.h +22 -0
  33. data/include/prism/compiler/filesystem.h +32 -0
  34. data/include/prism/compiler/flex_array.h +19 -0
  35. data/include/prism/compiler/force_inline.h +21 -0
  36. data/include/prism/compiler/format.h +25 -0
  37. data/include/prism/compiler/inline.h +17 -0
  38. data/include/prism/compiler/nodiscard.h +22 -0
  39. data/include/prism/compiler/nonnull.h +18 -0
  40. data/include/prism/compiler/unused.h +18 -0
  41. data/include/prism/constant_pool.h +81 -0
  42. data/include/prism/diagnostic.h +38 -403
  43. data/include/prism/errors_format.h +53 -0
  44. data/include/prism/excludes.h +29 -0
  45. data/include/prism/integer.h +41 -0
  46. data/include/prism/internal/allocator.h +68 -0
  47. data/include/prism/internal/allocator_debug.h +88 -0
  48. data/include/prism/internal/arena.h +108 -0
  49. data/include/prism/internal/bit.h +42 -0
  50. data/include/prism/internal/buffer.h +94 -0
  51. data/include/prism/internal/char.h +145 -0
  52. data/include/prism/internal/comments.h +53 -0
  53. data/include/prism/internal/constant_pool.h +152 -0
  54. data/include/prism/internal/diagnostic.h +389 -0
  55. data/include/prism/{encoding.h → internal/encoding.h} +27 -68
  56. data/include/prism/internal/integer.h +68 -0
  57. data/include/prism/internal/isinf.h +16 -0
  58. data/include/prism/internal/line_offset_list.h +34 -0
  59. data/include/prism/{util/pm_list.h → internal/list.h} +11 -52
  60. data/include/prism/internal/magic_comments.h +23 -0
  61. data/include/prism/internal/memchr.h +15 -0
  62. data/include/prism/internal/node.h +38 -0
  63. data/include/prism/internal/options.h +232 -0
  64. data/include/prism/internal/parser.h +1004 -0
  65. data/include/prism/internal/regexp.h +26 -0
  66. data/include/prism/internal/serialize.h +39 -0
  67. data/include/prism/internal/source.h +72 -0
  68. data/include/prism/{static_literals.h → internal/static_literals.h} +26 -47
  69. data/include/prism/internal/stringy.h +35 -0
  70. data/include/prism/{util/pm_strncasecmp.h → internal/strncasecmp.h} +3 -17
  71. data/include/prism/{util/pm_strpbrk.h → internal/strpbrk.h} +7 -20
  72. data/include/prism/internal/tokens.h +11 -0
  73. data/include/prism/internal/xxh3.h +16 -0
  74. data/include/prism/json.h +32 -0
  75. data/include/prism/line_offset_list.h +61 -0
  76. data/include/prism/magic_comments.h +35 -0
  77. data/include/prism/node.h +18 -53
  78. data/include/prism/options.h +146 -280
  79. data/include/prism/parser.h +356 -867
  80. data/include/prism/prettyprint.h +6 -9
  81. data/include/prism/serialize.h +115 -0
  82. data/include/prism/source.h +155 -0
  83. data/include/prism/stream.h +28 -0
  84. data/include/prism/string_query.h +74 -0
  85. data/include/prism/stringy.h +72 -0
  86. data/include/prism/version.h +12 -3
  87. data/include/prism.h +43 -320
  88. data/lib/prism/compiler.rb +319 -305
  89. data/lib/prism/desugar_compiler.rb +105 -34
  90. data/lib/prism/dispatcher.rb +646 -473
  91. data/lib/prism/dot_visitor.rb +592 -511
  92. data/lib/prism/dsl.rb +391 -25
  93. data/lib/prism/ffi.rb +258 -90
  94. data/lib/prism/inspect_visitor.rb +357 -325
  95. data/lib/prism/lex_compat.rb +254 -212
  96. data/lib/prism/mutation_compiler.rb +313 -305
  97. data/lib/prism/node.rb +20966 -6992
  98. data/lib/prism/node_ext.rb +180 -187
  99. data/lib/prism/node_find.rb +215 -0
  100. data/lib/prism/parse_result/errors.rb +7 -1
  101. data/lib/prism/parse_result/newlines.rb +276 -8
  102. data/lib/prism/parse_result.rb +468 -139
  103. data/lib/prism/pattern.rb +65 -20
  104. data/lib/prism/reflection.rb +23 -12
  105. data/lib/prism/relocation.rb +149 -87
  106. data/lib/prism/serialize.rb +3460 -539
  107. data/lib/prism/string_query.rb +24 -1
  108. data/lib/prism/translation/parser/builder.rb +10 -2
  109. data/lib/prism/translation/parser/compiler.rb +44 -52
  110. data/lib/prism/translation/parser/lexer.rb +41 -92
  111. data/lib/prism/translation/parser.rb +1 -1
  112. data/lib/prism/translation/parser_current.rb +1 -1
  113. data/lib/prism/translation/ripper/lexer.rb +8 -10
  114. data/lib/prism/translation/ripper/sexp.rb +2 -10
  115. data/lib/prism/translation/ripper/shim.rb +2 -0
  116. data/lib/prism/translation/ripper.rb +967 -209
  117. data/lib/prism/translation/ruby_parser.rb +73 -316
  118. data/lib/prism/translation.rb +2 -0
  119. data/lib/prism/visitor.rb +632 -5
  120. data/lib/prism.rb +79 -9
  121. data/prism.gemspec +128 -62
  122. data/rbi/generated/prism/compiler.rbi +489 -0
  123. data/rbi/generated/prism/desugar_compiler.rbi +306 -0
  124. data/rbi/generated/prism/dispatcher.rbi +1138 -0
  125. data/rbi/generated/prism/dot_visitor.rbi +618 -0
  126. data/rbi/generated/prism/dsl.rbi +751 -0
  127. data/rbi/generated/prism/inspect_visitor.rbi +503 -0
  128. data/rbi/generated/prism/lex_compat.rbi +162 -0
  129. data/rbi/generated/prism/mutation_compiler.rbi +464 -0
  130. data/rbi/generated/prism/node.rbi +14407 -0
  131. data/rbi/generated/prism/node_ext.rbi +259 -0
  132. data/rbi/generated/prism/node_find.rbi +79 -0
  133. data/rbi/generated/prism/parse_result/errors.rbi +21 -0
  134. data/rbi/generated/prism/parse_result/newlines.rbi +208 -0
  135. data/rbi/generated/prism/parse_result.rbi +776 -0
  136. data/rbi/generated/prism/pattern.rbi +134 -0
  137. data/rbi/generated/prism/reflection.rbi +89 -0
  138. data/rbi/generated/prism/relocation.rbi +329 -0
  139. data/rbi/generated/prism/serialize.rbi +184 -0
  140. data/rbi/generated/prism/string_query.rbi +43 -0
  141. data/rbi/generated/prism/translation.rbi +7 -0
  142. data/rbi/generated/prism/visitor.rbi +650 -0
  143. data/rbi/generated/prism.rbi +86 -0
  144. data/rbi/prism/translation/parser_versions.rbi +5 -0
  145. data/rbi/rubyvm/node_find.rbi +14 -0
  146. data/sig/generated/prism/compiler.rbs +492 -0
  147. data/sig/generated/prism/desugar_compiler.rbs +305 -0
  148. data/sig/generated/prism/dispatcher.rbs +1292 -0
  149. data/sig/generated/prism/dot_visitor.rbs +635 -0
  150. data/sig/generated/prism/dsl.rbs +928 -0
  151. data/sig/generated/prism/inspect_visitor.rbs +509 -0
  152. data/sig/generated/prism/lex_compat.rbs +166 -0
  153. data/sig/{prism → generated/prism}/mutation_compiler.rbs +309 -4
  154. data/sig/generated/prism/node.rbs +20896 -0
  155. data/sig/generated/prism/node_ext.rbs +290 -0
  156. data/sig/generated/prism/node_find.rbs +90 -0
  157. data/sig/generated/prism/parse_result/errors.rbs +22 -0
  158. data/sig/generated/prism/parse_result/newlines.rbs +223 -0
  159. data/sig/generated/prism/parse_result.rbs +871 -0
  160. data/sig/generated/prism/pattern.rbs +156 -0
  161. data/sig/generated/prism/reflection.rbs +101 -0
  162. data/sig/generated/prism/relocation.rbs +428 -0
  163. data/sig/generated/prism/serialize.rbs +198 -0
  164. data/sig/generated/prism/string_query.rbs +43 -0
  165. data/sig/generated/prism/translation.rbs +8 -0
  166. data/sig/generated/prism/visitor.rbs +1111 -0
  167. data/sig/generated/prism.rbs +84 -0
  168. data/sig/manifest.yaml +2 -0
  169. data/src/arena.c +117 -0
  170. data/src/{util/pm_buffer.c → buffer.c} +53 -21
  171. data/src/{util/pm_char.c → char.c} +28 -57
  172. data/src/comments.c +454 -0
  173. data/src/constant_pool.c +406 -0
  174. data/src/diagnostic.c +97 -65
  175. data/src/encoding.c +8 -3
  176. data/src/errors_format.c +519 -0
  177. data/src/{util/pm_integer.c → integer.c} +33 -22
  178. data/src/json.c +5733 -0
  179. data/src/line_offset_list.c +100 -0
  180. data/src/list.c +24 -0
  181. data/src/{util/pm_memchr.c → memchr.c} +8 -6
  182. data/src/node.c +3504 -7674
  183. data/src/options.c +162 -49
  184. data/src/parser.c +367 -0
  185. data/src/prettyprint.c +421 -354
  186. data/src/prism.c +8402 -7161
  187. data/src/regexp.c +961 -45
  188. data/src/serialize.c +460 -424
  189. data/src/source.c +518 -0
  190. data/src/static_literals.c +111 -43
  191. data/src/string_query.c +180 -0
  192. data/src/stringy.c +91 -0
  193. data/src/{util/pm_strncasecmp.c → strncasecmp.c} +5 -4
  194. data/src/strpbrk.c +447 -0
  195. data/src/{token_type.c → tokens.c} +39 -18
  196. data/src/xxh3.c +292 -0
  197. metadata +128 -63
  198. data/ext/prism/api_pack.c +0 -276
  199. data/include/prism/defines.h +0 -260
  200. data/include/prism/pack.h +0 -163
  201. data/include/prism/regexp.h +0 -43
  202. data/include/prism/util/pm_buffer.h +0 -236
  203. data/include/prism/util/pm_char.h +0 -204
  204. data/include/prism/util/pm_constant_pool.h +0 -218
  205. data/include/prism/util/pm_integer.h +0 -130
  206. data/include/prism/util/pm_memchr.h +0 -29
  207. data/include/prism/util/pm_newline_list.h +0 -113
  208. data/include/prism/util/pm_string.h +0 -200
  209. data/lib/prism/pack.rb +0 -230
  210. data/lib/prism/parse_result/comments.rb +0 -188
  211. data/rbi/prism/compiler.rbi +0 -12
  212. data/rbi/prism/dsl.rbi +0 -524
  213. data/rbi/prism/inspect_visitor.rbi +0 -12
  214. data/rbi/prism/node.rbi +0 -8750
  215. data/rbi/prism/node_ext.rbi +0 -107
  216. data/rbi/prism/parse_result.rbi +0 -404
  217. data/rbi/prism/reflection.rbi +0 -58
  218. data/rbi/prism/string_query.rbi +0 -12
  219. data/rbi/prism/visitor.rbi +0 -473
  220. data/rbi/prism.rbi +0 -63
  221. data/sig/prism/compiler.rbs +0 -9
  222. data/sig/prism/dispatcher.rbs +0 -19
  223. data/sig/prism/dot_visitor.rbs +0 -6
  224. data/sig/prism/dsl.rbs +0 -351
  225. data/sig/prism/inspect_visitor.rbs +0 -22
  226. data/sig/prism/lex_compat.rbs +0 -10
  227. data/sig/prism/node.rbs +0 -4042
  228. data/sig/prism/node_ext.rbs +0 -149
  229. data/sig/prism/pack.rbs +0 -43
  230. data/sig/prism/parse_result/comments.rbs +0 -38
  231. data/sig/prism/parse_result.rbs +0 -197
  232. data/sig/prism/pattern.rbs +0 -13
  233. data/sig/prism/reflection.rbs +0 -50
  234. data/sig/prism/relocation.rbs +0 -185
  235. data/sig/prism/serialize.rbs +0 -8
  236. data/sig/prism/string_query.rbs +0 -11
  237. data/sig/prism/visitor.rbs +0 -169
  238. data/sig/prism.rbs +0 -272
  239. data/src/pack.c +0 -509
  240. data/src/util/pm_constant_pool.c +0 -342
  241. data/src/util/pm_list.c +0 -49
  242. data/src/util/pm_newline_list.c +0 -125
  243. data/src/util/pm_string.c +0 -381
  244. data/src/util/pm_strpbrk.c +0 -206
data/src/prettyprint.c CHANGED
@@ -1,5 +1,3 @@
1
- /* :markup: markdown */
2
-
3
1
  /*----------------------------------------------------------------------------*/
4
2
  /* This file is generated by the templates/template.rb script and should not */
5
3
  /* be modified manually. See */
@@ -10,23 +8,34 @@
10
8
 
11
9
  #include "prism/prettyprint.h"
12
10
 
13
- // We optionally support pretty printing nodes. For systems that don't want or
14
- // need this functionality, it can be turned off with the
15
- // PRISM_EXCLUDE_PRETTYPRINT define.
11
+ /* We optionally support pretty printing nodes. For systems that don't want or
12
+ * need this functionality, it can be turned off with the
13
+ * PRISM_EXCLUDE_PRETTYPRINT define. */
16
14
  #ifdef PRISM_EXCLUDE_PRETTYPRINT
17
15
 
18
- void pm_prettyprint(void) {}
16
+ /* Ensure this translation unit is never empty, even when prettyprint is
17
+ * excluded. */
18
+ typedef int pm_prettyprint_unused_t;
19
19
 
20
20
  #else
21
21
 
22
- static inline void
22
+ #include "prism/compiler/inline.h"
23
+ #include "prism/internal/buffer.h"
24
+ #include "prism/internal/constant_pool.h"
25
+ #include "prism/internal/integer.h"
26
+ #include "prism/internal/parser.h"
27
+ #include "prism/line_offset_list.h"
28
+
29
+ #include <inttypes.h>
30
+
31
+ static PRISM_INLINE void
23
32
  prettyprint_location(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm_location_t *location) {
24
- pm_line_column_t start = pm_newline_list_line_column(&parser->newline_list, location->start, parser->start_line);
25
- pm_line_column_t end = pm_newline_list_line_column(&parser->newline_list, location->end, parser->start_line);
33
+ pm_line_column_t start = pm_line_offset_list_line_column(&parser->line_offsets, location->start, parser->start_line);
34
+ pm_line_column_t end = pm_line_offset_list_line_column(&parser->line_offsets, location->start + location->length, parser->start_line);
26
35
  pm_buffer_append_format(output_buffer, "(%" PRIi32 ",%" PRIu32 ")-(%" PRIi32 ",%" PRIu32 ")", start.line, start.column, end.line, end.column);
27
36
  }
28
37
 
29
- static inline void
38
+ static PRISM_INLINE void
30
39
  prettyprint_constant(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm_constant_id_t constant_id) {
31
40
  pm_constant_t *constant = pm_constant_pool_id_to_constant(&parser->constant_pool, constant_id);
32
41
  pm_buffer_append_format(output_buffer, ":%.*s", (int) constant->length, constant->start);
@@ -78,7 +87,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
78
87
  pm_buffer_append_byte(output_buffer, ' ');
79
88
  prettyprint_location(output_buffer, parser, location);
80
89
  pm_buffer_append_string(output_buffer, " = \"", 4);
81
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
90
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
82
91
  pm_buffer_append_string(output_buffer, "\"\n", 2);
83
92
  }
84
93
 
@@ -124,7 +133,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
124
133
  pm_buffer_append_byte(output_buffer, ' ');
125
134
  prettyprint_location(output_buffer, parser, location);
126
135
  pm_buffer_append_string(output_buffer, " = \"", 4);
127
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
136
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
128
137
  pm_buffer_append_string(output_buffer, "\"\n", 2);
129
138
  }
130
139
 
@@ -170,7 +179,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
170
179
  pm_buffer_append_byte(output_buffer, ' ');
171
180
  prettyprint_location(output_buffer, parser, location);
172
181
  pm_buffer_append_string(output_buffer, " = \"", 4);
173
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
182
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
174
183
  pm_buffer_append_string(output_buffer, "\"\n", 2);
175
184
  }
176
185
 
@@ -216,7 +225,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
216
225
  pm_buffer_append_byte(output_buffer, ' ');
217
226
  prettyprint_location(output_buffer, parser, location);
218
227
  pm_buffer_append_string(output_buffer, " = \"", 4);
219
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
228
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
220
229
  pm_buffer_append_string(output_buffer, "\"\n", 2);
221
230
  }
222
231
 
@@ -325,13 +334,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
325
334
  pm_buffer_concat(output_buffer, prefix_buffer);
326
335
  pm_buffer_append_string(output_buffer, "+-- opening_loc:", 16);
327
336
  pm_location_t *location = &cast->opening_loc;
328
- if (location->start == NULL) {
337
+ if (location->length == 0) {
329
338
  pm_buffer_append_string(output_buffer, " nil\n", 5);
330
339
  } else {
331
340
  pm_buffer_append_byte(output_buffer, ' ');
332
341
  prettyprint_location(output_buffer, parser, location);
333
342
  pm_buffer_append_string(output_buffer, " = \"", 4);
334
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
343
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
335
344
  pm_buffer_append_string(output_buffer, "\"\n", 2);
336
345
  }
337
346
  }
@@ -341,13 +350,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
341
350
  pm_buffer_concat(output_buffer, prefix_buffer);
342
351
  pm_buffer_append_string(output_buffer, "+-- closing_loc:", 16);
343
352
  pm_location_t *location = &cast->closing_loc;
344
- if (location->start == NULL) {
353
+ if (location->length == 0) {
345
354
  pm_buffer_append_string(output_buffer, " nil\n", 5);
346
355
  } else {
347
356
  pm_buffer_append_byte(output_buffer, ' ');
348
357
  prettyprint_location(output_buffer, parser, location);
349
358
  pm_buffer_append_string(output_buffer, " = \"", 4);
350
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
359
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
351
360
  pm_buffer_append_string(output_buffer, "\"\n", 2);
352
361
  }
353
362
  }
@@ -435,13 +444,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
435
444
  pm_buffer_concat(output_buffer, prefix_buffer);
436
445
  pm_buffer_append_string(output_buffer, "+-- opening_loc:", 16);
437
446
  pm_location_t *location = &cast->opening_loc;
438
- if (location->start == NULL) {
447
+ if (location->length == 0) {
439
448
  pm_buffer_append_string(output_buffer, " nil\n", 5);
440
449
  } else {
441
450
  pm_buffer_append_byte(output_buffer, ' ');
442
451
  prettyprint_location(output_buffer, parser, location);
443
452
  pm_buffer_append_string(output_buffer, " = \"", 4);
444
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
453
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
445
454
  pm_buffer_append_string(output_buffer, "\"\n", 2);
446
455
  }
447
456
  }
@@ -451,13 +460,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
451
460
  pm_buffer_concat(output_buffer, prefix_buffer);
452
461
  pm_buffer_append_string(output_buffer, "+-- closing_loc:", 16);
453
462
  pm_location_t *location = &cast->closing_loc;
454
- if (location->start == NULL) {
463
+ if (location->length == 0) {
455
464
  pm_buffer_append_string(output_buffer, " nil\n", 5);
456
465
  } else {
457
466
  pm_buffer_append_byte(output_buffer, ' ');
458
467
  prettyprint_location(output_buffer, parser, location);
459
468
  pm_buffer_append_string(output_buffer, " = \"", 4);
460
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
469
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
461
470
  pm_buffer_append_string(output_buffer, "\"\n", 2);
462
471
  }
463
472
  }
@@ -501,13 +510,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
501
510
  pm_buffer_concat(output_buffer, prefix_buffer);
502
511
  pm_buffer_append_string(output_buffer, "+-- operator_loc:", 17);
503
512
  pm_location_t *location = &cast->operator_loc;
504
- if (location->start == NULL) {
513
+ if (location->length == 0) {
505
514
  pm_buffer_append_string(output_buffer, " nil\n", 5);
506
515
  } else {
507
516
  pm_buffer_append_byte(output_buffer, ' ');
508
517
  prettyprint_location(output_buffer, parser, location);
509
518
  pm_buffer_append_string(output_buffer, " = \"", 4);
510
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
519
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
511
520
  pm_buffer_append_string(output_buffer, "\"\n", 2);
512
521
  }
513
522
  }
@@ -545,7 +554,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
545
554
  pm_buffer_append_byte(output_buffer, ' ');
546
555
  prettyprint_location(output_buffer, parser, location);
547
556
  pm_buffer_append_string(output_buffer, " = \"", 4);
548
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
557
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
549
558
  pm_buffer_append_string(output_buffer, "\"\n", 2);
550
559
  }
551
560
 
@@ -579,13 +588,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
579
588
  pm_buffer_concat(output_buffer, prefix_buffer);
580
589
  pm_buffer_append_string(output_buffer, "+-- begin_keyword_loc:", 22);
581
590
  pm_location_t *location = &cast->begin_keyword_loc;
582
- if (location->start == NULL) {
591
+ if (location->length == 0) {
583
592
  pm_buffer_append_string(output_buffer, " nil\n", 5);
584
593
  } else {
585
594
  pm_buffer_append_byte(output_buffer, ' ');
586
595
  prettyprint_location(output_buffer, parser, location);
587
596
  pm_buffer_append_string(output_buffer, " = \"", 4);
588
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
597
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
589
598
  pm_buffer_append_string(output_buffer, "\"\n", 2);
590
599
  }
591
600
  }
@@ -663,13 +672,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
663
672
  pm_buffer_concat(output_buffer, prefix_buffer);
664
673
  pm_buffer_append_string(output_buffer, "+-- end_keyword_loc:", 20);
665
674
  pm_location_t *location = &cast->end_keyword_loc;
666
- if (location->start == NULL) {
675
+ if (location->length == 0) {
667
676
  pm_buffer_append_string(output_buffer, " nil\n", 5);
668
677
  } else {
669
678
  pm_buffer_append_byte(output_buffer, ' ');
670
679
  prettyprint_location(output_buffer, parser, location);
671
680
  pm_buffer_append_string(output_buffer, " = \"", 4);
672
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
681
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
673
682
  pm_buffer_append_string(output_buffer, "\"\n", 2);
674
683
  }
675
684
  }
@@ -707,7 +716,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
707
716
  pm_buffer_append_byte(output_buffer, ' ');
708
717
  prettyprint_location(output_buffer, parser, location);
709
718
  pm_buffer_append_string(output_buffer, " = \"", 4);
710
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
719
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
711
720
  pm_buffer_append_string(output_buffer, "\"\n", 2);
712
721
  }
713
722
 
@@ -804,7 +813,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
804
813
  pm_buffer_append_byte(output_buffer, ' ');
805
814
  prettyprint_location(output_buffer, parser, location);
806
815
  pm_buffer_append_string(output_buffer, " = \"", 4);
807
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
816
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
808
817
  pm_buffer_append_string(output_buffer, "\"\n", 2);
809
818
  }
810
819
 
@@ -816,7 +825,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
816
825
  pm_buffer_append_byte(output_buffer, ' ');
817
826
  prettyprint_location(output_buffer, parser, location);
818
827
  pm_buffer_append_string(output_buffer, " = \"", 4);
819
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
828
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
820
829
  pm_buffer_append_string(output_buffer, "\"\n", 2);
821
830
  }
822
831
 
@@ -860,13 +869,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
860
869
  pm_buffer_concat(output_buffer, prefix_buffer);
861
870
  pm_buffer_append_string(output_buffer, "+-- name_loc:", 13);
862
871
  pm_location_t *location = &cast->name_loc;
863
- if (location->start == NULL) {
872
+ if (location->length == 0) {
864
873
  pm_buffer_append_string(output_buffer, " nil\n", 5);
865
874
  } else {
866
875
  pm_buffer_append_byte(output_buffer, ' ');
867
876
  prettyprint_location(output_buffer, parser, location);
868
877
  pm_buffer_append_string(output_buffer, " = \"", 4);
869
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
878
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
870
879
  pm_buffer_append_string(output_buffer, "\"\n", 2);
871
880
  }
872
881
  }
@@ -879,7 +888,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
879
888
  pm_buffer_append_byte(output_buffer, ' ');
880
889
  prettyprint_location(output_buffer, parser, location);
881
890
  pm_buffer_append_string(output_buffer, " = \"", 4);
882
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
891
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
883
892
  pm_buffer_append_string(output_buffer, "\"\n", 2);
884
893
  }
885
894
 
@@ -931,13 +940,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
931
940
  pm_buffer_concat(output_buffer, prefix_buffer);
932
941
  pm_buffer_append_string(output_buffer, "+-- opening_loc:", 16);
933
942
  pm_location_t *location = &cast->opening_loc;
934
- if (location->start == NULL) {
943
+ if (location->length == 0) {
935
944
  pm_buffer_append_string(output_buffer, " nil\n", 5);
936
945
  } else {
937
946
  pm_buffer_append_byte(output_buffer, ' ');
938
947
  prettyprint_location(output_buffer, parser, location);
939
948
  pm_buffer_append_string(output_buffer, " = \"", 4);
940
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
949
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
941
950
  pm_buffer_append_string(output_buffer, "\"\n", 2);
942
951
  }
943
952
  }
@@ -947,13 +956,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
947
956
  pm_buffer_concat(output_buffer, prefix_buffer);
948
957
  pm_buffer_append_string(output_buffer, "+-- closing_loc:", 16);
949
958
  pm_location_t *location = &cast->closing_loc;
950
- if (location->start == NULL) {
959
+ if (location->length == 0) {
951
960
  pm_buffer_append_string(output_buffer, " nil\n", 5);
952
961
  } else {
953
962
  pm_buffer_append_byte(output_buffer, ' ');
954
963
  prettyprint_location(output_buffer, parser, location);
955
964
  pm_buffer_append_string(output_buffer, " = \"", 4);
956
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
965
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
957
966
  pm_buffer_append_string(output_buffer, "\"\n", 2);
958
967
  }
959
968
  }
@@ -991,7 +1000,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
991
1000
  pm_buffer_append_byte(output_buffer, ' ');
992
1001
  prettyprint_location(output_buffer, parser, location);
993
1002
  pm_buffer_append_string(output_buffer, " = \"", 4);
994
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
1003
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
995
1004
  pm_buffer_append_string(output_buffer, "\"\n", 2);
996
1005
  }
997
1006
 
@@ -1054,13 +1063,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
1054
1063
  pm_buffer_concat(output_buffer, prefix_buffer);
1055
1064
  pm_buffer_append_string(output_buffer, "+-- call_operator_loc:", 22);
1056
1065
  pm_location_t *location = &cast->call_operator_loc;
1057
- if (location->start == NULL) {
1066
+ if (location->length == 0) {
1058
1067
  pm_buffer_append_string(output_buffer, " nil\n", 5);
1059
1068
  } else {
1060
1069
  pm_buffer_append_byte(output_buffer, ' ');
1061
1070
  prettyprint_location(output_buffer, parser, location);
1062
1071
  pm_buffer_append_string(output_buffer, " = \"", 4);
1063
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
1072
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
1064
1073
  pm_buffer_append_string(output_buffer, "\"\n", 2);
1065
1074
  }
1066
1075
  }
@@ -1070,13 +1079,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
1070
1079
  pm_buffer_concat(output_buffer, prefix_buffer);
1071
1080
  pm_buffer_append_string(output_buffer, "+-- message_loc:", 16);
1072
1081
  pm_location_t *location = &cast->message_loc;
1073
- if (location->start == NULL) {
1082
+ if (location->length == 0) {
1074
1083
  pm_buffer_append_string(output_buffer, " nil\n", 5);
1075
1084
  } else {
1076
1085
  pm_buffer_append_byte(output_buffer, ' ');
1077
1086
  prettyprint_location(output_buffer, parser, location);
1078
1087
  pm_buffer_append_string(output_buffer, " = \"", 4);
1079
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
1088
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
1080
1089
  pm_buffer_append_string(output_buffer, "\"\n", 2);
1081
1090
  }
1082
1091
  }
@@ -1107,7 +1116,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
1107
1116
  pm_buffer_append_byte(output_buffer, ' ');
1108
1117
  prettyprint_location(output_buffer, parser, location);
1109
1118
  pm_buffer_append_string(output_buffer, " = \"", 4);
1110
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
1119
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
1111
1120
  pm_buffer_append_string(output_buffer, "\"\n", 2);
1112
1121
  }
1113
1122
 
@@ -1183,13 +1192,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
1183
1192
  pm_buffer_concat(output_buffer, prefix_buffer);
1184
1193
  pm_buffer_append_string(output_buffer, "+-- call_operator_loc:", 22);
1185
1194
  pm_location_t *location = &cast->call_operator_loc;
1186
- if (location->start == NULL) {
1195
+ if (location->length == 0) {
1187
1196
  pm_buffer_append_string(output_buffer, " nil\n", 5);
1188
1197
  } else {
1189
1198
  pm_buffer_append_byte(output_buffer, ' ');
1190
1199
  prettyprint_location(output_buffer, parser, location);
1191
1200
  pm_buffer_append_string(output_buffer, " = \"", 4);
1192
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
1201
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
1193
1202
  pm_buffer_append_string(output_buffer, "\"\n", 2);
1194
1203
  }
1195
1204
  }
@@ -1208,13 +1217,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
1208
1217
  pm_buffer_concat(output_buffer, prefix_buffer);
1209
1218
  pm_buffer_append_string(output_buffer, "+-- message_loc:", 16);
1210
1219
  pm_location_t *location = &cast->message_loc;
1211
- if (location->start == NULL) {
1220
+ if (location->length == 0) {
1212
1221
  pm_buffer_append_string(output_buffer, " nil\n", 5);
1213
1222
  } else {
1214
1223
  pm_buffer_append_byte(output_buffer, ' ');
1215
1224
  prettyprint_location(output_buffer, parser, location);
1216
1225
  pm_buffer_append_string(output_buffer, " = \"", 4);
1217
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
1226
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
1218
1227
  pm_buffer_append_string(output_buffer, "\"\n", 2);
1219
1228
  }
1220
1229
  }
@@ -1224,13 +1233,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
1224
1233
  pm_buffer_concat(output_buffer, prefix_buffer);
1225
1234
  pm_buffer_append_string(output_buffer, "+-- opening_loc:", 16);
1226
1235
  pm_location_t *location = &cast->opening_loc;
1227
- if (location->start == NULL) {
1236
+ if (location->length == 0) {
1228
1237
  pm_buffer_append_string(output_buffer, " nil\n", 5);
1229
1238
  } else {
1230
1239
  pm_buffer_append_byte(output_buffer, ' ');
1231
1240
  prettyprint_location(output_buffer, parser, location);
1232
1241
  pm_buffer_append_string(output_buffer, " = \"", 4);
1233
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
1242
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
1234
1243
  pm_buffer_append_string(output_buffer, "\"\n", 2);
1235
1244
  }
1236
1245
  }
@@ -1257,13 +1266,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
1257
1266
  pm_buffer_concat(output_buffer, prefix_buffer);
1258
1267
  pm_buffer_append_string(output_buffer, "+-- closing_loc:", 16);
1259
1268
  pm_location_t *location = &cast->closing_loc;
1260
- if (location->start == NULL) {
1269
+ if (location->length == 0) {
1261
1270
  pm_buffer_append_string(output_buffer, " nil\n", 5);
1262
1271
  } else {
1263
1272
  pm_buffer_append_byte(output_buffer, ' ');
1264
1273
  prettyprint_location(output_buffer, parser, location);
1265
1274
  pm_buffer_append_string(output_buffer, " = \"", 4);
1266
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
1275
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
1267
1276
  pm_buffer_append_string(output_buffer, "\"\n", 2);
1268
1277
  }
1269
1278
  }
@@ -1273,13 +1282,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
1273
1282
  pm_buffer_concat(output_buffer, prefix_buffer);
1274
1283
  pm_buffer_append_string(output_buffer, "+-- equal_loc:", 14);
1275
1284
  pm_location_t *location = &cast->equal_loc;
1276
- if (location->start == NULL) {
1285
+ if (location->length == 0) {
1277
1286
  pm_buffer_append_string(output_buffer, " nil\n", 5);
1278
1287
  } else {
1279
1288
  pm_buffer_append_byte(output_buffer, ' ');
1280
1289
  prettyprint_location(output_buffer, parser, location);
1281
1290
  pm_buffer_append_string(output_buffer, " = \"", 4);
1282
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
1291
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
1283
1292
  pm_buffer_append_string(output_buffer, "\"\n", 2);
1284
1293
  }
1285
1294
  }
@@ -1360,13 +1369,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
1360
1369
  pm_buffer_concat(output_buffer, prefix_buffer);
1361
1370
  pm_buffer_append_string(output_buffer, "+-- call_operator_loc:", 22);
1362
1371
  pm_location_t *location = &cast->call_operator_loc;
1363
- if (location->start == NULL) {
1372
+ if (location->length == 0) {
1364
1373
  pm_buffer_append_string(output_buffer, " nil\n", 5);
1365
1374
  } else {
1366
1375
  pm_buffer_append_byte(output_buffer, ' ');
1367
1376
  prettyprint_location(output_buffer, parser, location);
1368
1377
  pm_buffer_append_string(output_buffer, " = \"", 4);
1369
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
1378
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
1370
1379
  pm_buffer_append_string(output_buffer, "\"\n", 2);
1371
1380
  }
1372
1381
  }
@@ -1376,13 +1385,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
1376
1385
  pm_buffer_concat(output_buffer, prefix_buffer);
1377
1386
  pm_buffer_append_string(output_buffer, "+-- message_loc:", 16);
1378
1387
  pm_location_t *location = &cast->message_loc;
1379
- if (location->start == NULL) {
1388
+ if (location->length == 0) {
1380
1389
  pm_buffer_append_string(output_buffer, " nil\n", 5);
1381
1390
  } else {
1382
1391
  pm_buffer_append_byte(output_buffer, ' ');
1383
1392
  prettyprint_location(output_buffer, parser, location);
1384
1393
  pm_buffer_append_string(output_buffer, " = \"", 4);
1385
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
1394
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
1386
1395
  pm_buffer_append_string(output_buffer, "\"\n", 2);
1387
1396
  }
1388
1397
  }
@@ -1422,7 +1431,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
1422
1431
  pm_buffer_append_byte(output_buffer, ' ');
1423
1432
  prettyprint_location(output_buffer, parser, location);
1424
1433
  pm_buffer_append_string(output_buffer, " = \"", 4);
1425
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
1434
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
1426
1435
  pm_buffer_append_string(output_buffer, "\"\n", 2);
1427
1436
  }
1428
1437
 
@@ -1498,13 +1507,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
1498
1507
  pm_buffer_concat(output_buffer, prefix_buffer);
1499
1508
  pm_buffer_append_string(output_buffer, "+-- call_operator_loc:", 22);
1500
1509
  pm_location_t *location = &cast->call_operator_loc;
1501
- if (location->start == NULL) {
1510
+ if (location->length == 0) {
1502
1511
  pm_buffer_append_string(output_buffer, " nil\n", 5);
1503
1512
  } else {
1504
1513
  pm_buffer_append_byte(output_buffer, ' ');
1505
1514
  prettyprint_location(output_buffer, parser, location);
1506
1515
  pm_buffer_append_string(output_buffer, " = \"", 4);
1507
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
1516
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
1508
1517
  pm_buffer_append_string(output_buffer, "\"\n", 2);
1509
1518
  }
1510
1519
  }
@@ -1514,13 +1523,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
1514
1523
  pm_buffer_concat(output_buffer, prefix_buffer);
1515
1524
  pm_buffer_append_string(output_buffer, "+-- message_loc:", 16);
1516
1525
  pm_location_t *location = &cast->message_loc;
1517
- if (location->start == NULL) {
1526
+ if (location->length == 0) {
1518
1527
  pm_buffer_append_string(output_buffer, " nil\n", 5);
1519
1528
  } else {
1520
1529
  pm_buffer_append_byte(output_buffer, ' ');
1521
1530
  prettyprint_location(output_buffer, parser, location);
1522
1531
  pm_buffer_append_string(output_buffer, " = \"", 4);
1523
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
1532
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
1524
1533
  pm_buffer_append_string(output_buffer, "\"\n", 2);
1525
1534
  }
1526
1535
  }
@@ -1551,7 +1560,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
1551
1560
  pm_buffer_append_byte(output_buffer, ' ');
1552
1561
  prettyprint_location(output_buffer, parser, location);
1553
1562
  pm_buffer_append_string(output_buffer, " = \"", 4);
1554
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
1563
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
1555
1564
  pm_buffer_append_string(output_buffer, "\"\n", 2);
1556
1565
  }
1557
1566
 
@@ -1626,7 +1635,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
1626
1635
  pm_buffer_append_byte(output_buffer, ' ');
1627
1636
  prettyprint_location(output_buffer, parser, location);
1628
1637
  pm_buffer_append_string(output_buffer, " = \"", 4);
1629
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
1638
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
1630
1639
  pm_buffer_append_string(output_buffer, "\"\n", 2);
1631
1640
  }
1632
1641
 
@@ -1647,7 +1656,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
1647
1656
  pm_buffer_append_byte(output_buffer, ' ');
1648
1657
  prettyprint_location(output_buffer, parser, location);
1649
1658
  pm_buffer_append_string(output_buffer, " = \"", 4);
1650
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
1659
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
1651
1660
  pm_buffer_append_string(output_buffer, "\"\n", 2);
1652
1661
  }
1653
1662
 
@@ -1693,7 +1702,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
1693
1702
  pm_buffer_append_byte(output_buffer, ' ');
1694
1703
  prettyprint_location(output_buffer, parser, location);
1695
1704
  pm_buffer_append_string(output_buffer, " = \"", 4);
1696
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
1705
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
1697
1706
  pm_buffer_append_string(output_buffer, "\"\n", 2);
1698
1707
  }
1699
1708
 
@@ -1765,7 +1774,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
1765
1774
  pm_buffer_append_byte(output_buffer, ' ');
1766
1775
  prettyprint_location(output_buffer, parser, location);
1767
1776
  pm_buffer_append_string(output_buffer, " = \"", 4);
1768
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
1777
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
1769
1778
  pm_buffer_append_string(output_buffer, "\"\n", 2);
1770
1779
  }
1771
1780
 
@@ -1777,7 +1786,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
1777
1786
  pm_buffer_append_byte(output_buffer, ' ');
1778
1787
  prettyprint_location(output_buffer, parser, location);
1779
1788
  pm_buffer_append_string(output_buffer, " = \"", 4);
1780
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
1789
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
1781
1790
  pm_buffer_append_string(output_buffer, "\"\n", 2);
1782
1791
  }
1783
1792
 
@@ -1849,7 +1858,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
1849
1858
  pm_buffer_append_byte(output_buffer, ' ');
1850
1859
  prettyprint_location(output_buffer, parser, location);
1851
1860
  pm_buffer_append_string(output_buffer, " = \"", 4);
1852
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
1861
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
1853
1862
  pm_buffer_append_string(output_buffer, "\"\n", 2);
1854
1863
  }
1855
1864
 
@@ -1861,7 +1870,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
1861
1870
  pm_buffer_append_byte(output_buffer, ' ');
1862
1871
  prettyprint_location(output_buffer, parser, location);
1863
1872
  pm_buffer_append_string(output_buffer, " = \"", 4);
1864
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
1873
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
1865
1874
  pm_buffer_append_string(output_buffer, "\"\n", 2);
1866
1875
  }
1867
1876
 
@@ -1893,7 +1902,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
1893
1902
  pm_buffer_append_byte(output_buffer, ' ');
1894
1903
  prettyprint_location(output_buffer, parser, location);
1895
1904
  pm_buffer_append_string(output_buffer, " = \"", 4);
1896
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
1905
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
1897
1906
  pm_buffer_append_string(output_buffer, "\"\n", 2);
1898
1907
  }
1899
1908
 
@@ -1915,13 +1924,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
1915
1924
  pm_buffer_concat(output_buffer, prefix_buffer);
1916
1925
  pm_buffer_append_string(output_buffer, "+-- inheritance_operator_loc:", 29);
1917
1926
  pm_location_t *location = &cast->inheritance_operator_loc;
1918
- if (location->start == NULL) {
1927
+ if (location->length == 0) {
1919
1928
  pm_buffer_append_string(output_buffer, " nil\n", 5);
1920
1929
  } else {
1921
1930
  pm_buffer_append_byte(output_buffer, ' ');
1922
1931
  prettyprint_location(output_buffer, parser, location);
1923
1932
  pm_buffer_append_string(output_buffer, " = \"", 4);
1924
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
1933
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
1925
1934
  pm_buffer_append_string(output_buffer, "\"\n", 2);
1926
1935
  }
1927
1936
  }
@@ -1968,7 +1977,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
1968
1977
  pm_buffer_append_byte(output_buffer, ' ');
1969
1978
  prettyprint_location(output_buffer, parser, location);
1970
1979
  pm_buffer_append_string(output_buffer, " = \"", 4);
1971
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
1980
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
1972
1981
  pm_buffer_append_string(output_buffer, "\"\n", 2);
1973
1982
  }
1974
1983
 
@@ -2006,7 +2015,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
2006
2015
  pm_buffer_append_byte(output_buffer, ' ');
2007
2016
  prettyprint_location(output_buffer, parser, location);
2008
2017
  pm_buffer_append_string(output_buffer, " = \"", 4);
2009
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
2018
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
2010
2019
  pm_buffer_append_string(output_buffer, "\"\n", 2);
2011
2020
  }
2012
2021
 
@@ -2018,7 +2027,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
2018
2027
  pm_buffer_append_byte(output_buffer, ' ');
2019
2028
  prettyprint_location(output_buffer, parser, location);
2020
2029
  pm_buffer_append_string(output_buffer, " = \"", 4);
2021
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
2030
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
2022
2031
  pm_buffer_append_string(output_buffer, "\"\n", 2);
2023
2032
  }
2024
2033
 
@@ -2060,7 +2069,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
2060
2069
  pm_buffer_append_byte(output_buffer, ' ');
2061
2070
  prettyprint_location(output_buffer, parser, location);
2062
2071
  pm_buffer_append_string(output_buffer, " = \"", 4);
2063
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
2072
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
2064
2073
  pm_buffer_append_string(output_buffer, "\"\n", 2);
2065
2074
  }
2066
2075
 
@@ -2072,7 +2081,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
2072
2081
  pm_buffer_append_byte(output_buffer, ' ');
2073
2082
  prettyprint_location(output_buffer, parser, location);
2074
2083
  pm_buffer_append_string(output_buffer, " = \"", 4);
2075
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
2084
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
2076
2085
  pm_buffer_append_string(output_buffer, "\"\n", 2);
2077
2086
  }
2078
2087
 
@@ -2123,7 +2132,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
2123
2132
  pm_buffer_append_byte(output_buffer, ' ');
2124
2133
  prettyprint_location(output_buffer, parser, location);
2125
2134
  pm_buffer_append_string(output_buffer, " = \"", 4);
2126
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
2135
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
2127
2136
  pm_buffer_append_string(output_buffer, "\"\n", 2);
2128
2137
  }
2129
2138
 
@@ -2135,7 +2144,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
2135
2144
  pm_buffer_append_byte(output_buffer, ' ');
2136
2145
  prettyprint_location(output_buffer, parser, location);
2137
2146
  pm_buffer_append_string(output_buffer, " = \"", 4);
2138
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
2147
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
2139
2148
  pm_buffer_append_string(output_buffer, "\"\n", 2);
2140
2149
  }
2141
2150
 
@@ -2211,7 +2220,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
2211
2220
  pm_buffer_append_byte(output_buffer, ' ');
2212
2221
  prettyprint_location(output_buffer, parser, location);
2213
2222
  pm_buffer_append_string(output_buffer, " = \"", 4);
2214
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
2223
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
2215
2224
  pm_buffer_append_string(output_buffer, "\"\n", 2);
2216
2225
  }
2217
2226
 
@@ -2236,7 +2245,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
2236
2245
  pm_buffer_append_byte(output_buffer, ' ');
2237
2246
  prettyprint_location(output_buffer, parser, location);
2238
2247
  pm_buffer_append_string(output_buffer, " = \"", 4);
2239
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
2248
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
2240
2249
  pm_buffer_append_string(output_buffer, "\"\n", 2);
2241
2250
  }
2242
2251
 
@@ -2265,7 +2274,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
2265
2274
  pm_buffer_append_byte(output_buffer, ' ');
2266
2275
  prettyprint_location(output_buffer, parser, location);
2267
2276
  pm_buffer_append_string(output_buffer, " = \"", 4);
2268
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
2277
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
2269
2278
  pm_buffer_append_string(output_buffer, "\"\n", 2);
2270
2279
  }
2271
2280
 
@@ -2277,7 +2286,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
2277
2286
  pm_buffer_append_byte(output_buffer, ' ');
2278
2287
  prettyprint_location(output_buffer, parser, location);
2279
2288
  pm_buffer_append_string(output_buffer, " = \"", 4);
2280
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
2289
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
2281
2290
  pm_buffer_append_string(output_buffer, "\"\n", 2);
2282
2291
  }
2283
2292
 
@@ -2319,7 +2328,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
2319
2328
  pm_buffer_append_byte(output_buffer, ' ');
2320
2329
  prettyprint_location(output_buffer, parser, location);
2321
2330
  pm_buffer_append_string(output_buffer, " = \"", 4);
2322
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
2331
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
2323
2332
  pm_buffer_append_string(output_buffer, "\"\n", 2);
2324
2333
  }
2325
2334
 
@@ -2331,7 +2340,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
2331
2340
  pm_buffer_append_byte(output_buffer, ' ');
2332
2341
  prettyprint_location(output_buffer, parser, location);
2333
2342
  pm_buffer_append_string(output_buffer, " = \"", 4);
2334
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
2343
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
2335
2344
  pm_buffer_append_string(output_buffer, "\"\n", 2);
2336
2345
  }
2337
2346
 
@@ -2382,7 +2391,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
2382
2391
  pm_buffer_append_byte(output_buffer, ' ');
2383
2392
  prettyprint_location(output_buffer, parser, location);
2384
2393
  pm_buffer_append_string(output_buffer, " = \"", 4);
2385
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
2394
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
2386
2395
  pm_buffer_append_string(output_buffer, "\"\n", 2);
2387
2396
  }
2388
2397
 
@@ -2394,7 +2403,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
2394
2403
  pm_buffer_append_byte(output_buffer, ' ');
2395
2404
  prettyprint_location(output_buffer, parser, location);
2396
2405
  pm_buffer_append_string(output_buffer, " = \"", 4);
2397
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
2406
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
2398
2407
  pm_buffer_append_string(output_buffer, "\"\n", 2);
2399
2408
  }
2400
2409
 
@@ -2440,7 +2449,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
2440
2449
  pm_buffer_append_byte(output_buffer, ' ');
2441
2450
  prettyprint_location(output_buffer, parser, location);
2442
2451
  pm_buffer_append_string(output_buffer, " = \"", 4);
2443
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
2452
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
2444
2453
  pm_buffer_append_string(output_buffer, "\"\n", 2);
2445
2454
  }
2446
2455
 
@@ -2503,7 +2512,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
2503
2512
  pm_buffer_append_byte(output_buffer, ' ');
2504
2513
  prettyprint_location(output_buffer, parser, location);
2505
2514
  pm_buffer_append_string(output_buffer, " = \"", 4);
2506
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
2515
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
2507
2516
  pm_buffer_append_string(output_buffer, "\"\n", 2);
2508
2517
  }
2509
2518
 
@@ -2515,7 +2524,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
2515
2524
  pm_buffer_append_byte(output_buffer, ' ');
2516
2525
  prettyprint_location(output_buffer, parser, location);
2517
2526
  pm_buffer_append_string(output_buffer, " = \"", 4);
2518
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
2527
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
2519
2528
  pm_buffer_append_string(output_buffer, "\"\n", 2);
2520
2529
  }
2521
2530
 
@@ -2548,7 +2557,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
2548
2557
  pm_buffer_append_byte(output_buffer, ' ');
2549
2558
  prettyprint_location(output_buffer, parser, location);
2550
2559
  pm_buffer_append_string(output_buffer, " = \"", 4);
2551
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
2560
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
2552
2561
  pm_buffer_append_string(output_buffer, "\"\n", 2);
2553
2562
  }
2554
2563
 
@@ -2603,7 +2612,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
2603
2612
  pm_buffer_append_byte(output_buffer, ' ');
2604
2613
  prettyprint_location(output_buffer, parser, location);
2605
2614
  pm_buffer_append_string(output_buffer, " = \"", 4);
2606
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
2615
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
2607
2616
  pm_buffer_append_string(output_buffer, "\"\n", 2);
2608
2617
  }
2609
2618
 
@@ -2666,7 +2675,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
2666
2675
  pm_buffer_append_byte(output_buffer, ' ');
2667
2676
  prettyprint_location(output_buffer, parser, location);
2668
2677
  pm_buffer_append_string(output_buffer, " = \"", 4);
2669
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
2678
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
2670
2679
  pm_buffer_append_string(output_buffer, "\"\n", 2);
2671
2680
  }
2672
2681
 
@@ -2678,7 +2687,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
2678
2687
  pm_buffer_append_byte(output_buffer, ' ');
2679
2688
  prettyprint_location(output_buffer, parser, location);
2680
2689
  pm_buffer_append_string(output_buffer, " = \"", 4);
2681
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
2690
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
2682
2691
  pm_buffer_append_string(output_buffer, "\"\n", 2);
2683
2692
  }
2684
2693
 
@@ -2711,7 +2720,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
2711
2720
  pm_buffer_append_byte(output_buffer, ' ');
2712
2721
  prettyprint_location(output_buffer, parser, location);
2713
2722
  pm_buffer_append_string(output_buffer, " = \"", 4);
2714
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
2723
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
2715
2724
  pm_buffer_append_string(output_buffer, "\"\n", 2);
2716
2725
  }
2717
2726
 
@@ -2787,7 +2796,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
2787
2796
  pm_buffer_append_byte(output_buffer, ' ');
2788
2797
  prettyprint_location(output_buffer, parser, location);
2789
2798
  pm_buffer_append_string(output_buffer, " = \"", 4);
2790
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
2799
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
2791
2800
  pm_buffer_append_string(output_buffer, "\"\n", 2);
2792
2801
  }
2793
2802
 
@@ -2812,7 +2821,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
2812
2821
  pm_buffer_append_byte(output_buffer, ' ');
2813
2822
  prettyprint_location(output_buffer, parser, location);
2814
2823
  pm_buffer_append_string(output_buffer, " = \"", 4);
2815
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
2824
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
2816
2825
  pm_buffer_append_string(output_buffer, "\"\n", 2);
2817
2826
  }
2818
2827
 
@@ -2841,7 +2850,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
2841
2850
  pm_buffer_append_byte(output_buffer, ' ');
2842
2851
  prettyprint_location(output_buffer, parser, location);
2843
2852
  pm_buffer_append_string(output_buffer, " = \"", 4);
2844
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
2853
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
2845
2854
  pm_buffer_append_string(output_buffer, "\"\n", 2);
2846
2855
  }
2847
2856
 
@@ -2916,7 +2925,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
2916
2925
  pm_buffer_append_byte(output_buffer, ' ');
2917
2926
  prettyprint_location(output_buffer, parser, location);
2918
2927
  pm_buffer_append_string(output_buffer, " = \"", 4);
2919
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
2928
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
2920
2929
  pm_buffer_append_string(output_buffer, "\"\n", 2);
2921
2930
  }
2922
2931
 
@@ -2925,13 +2934,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
2925
2934
  pm_buffer_concat(output_buffer, prefix_buffer);
2926
2935
  pm_buffer_append_string(output_buffer, "+-- operator_loc:", 17);
2927
2936
  pm_location_t *location = &cast->operator_loc;
2928
- if (location->start == NULL) {
2937
+ if (location->length == 0) {
2929
2938
  pm_buffer_append_string(output_buffer, " nil\n", 5);
2930
2939
  } else {
2931
2940
  pm_buffer_append_byte(output_buffer, ' ');
2932
2941
  prettyprint_location(output_buffer, parser, location);
2933
2942
  pm_buffer_append_string(output_buffer, " = \"", 4);
2934
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
2943
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
2935
2944
  pm_buffer_append_string(output_buffer, "\"\n", 2);
2936
2945
  }
2937
2946
  }
@@ -2941,13 +2950,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
2941
2950
  pm_buffer_concat(output_buffer, prefix_buffer);
2942
2951
  pm_buffer_append_string(output_buffer, "+-- lparen_loc:", 15);
2943
2952
  pm_location_t *location = &cast->lparen_loc;
2944
- if (location->start == NULL) {
2953
+ if (location->length == 0) {
2945
2954
  pm_buffer_append_string(output_buffer, " nil\n", 5);
2946
2955
  } else {
2947
2956
  pm_buffer_append_byte(output_buffer, ' ');
2948
2957
  prettyprint_location(output_buffer, parser, location);
2949
2958
  pm_buffer_append_string(output_buffer, " = \"", 4);
2950
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
2959
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
2951
2960
  pm_buffer_append_string(output_buffer, "\"\n", 2);
2952
2961
  }
2953
2962
  }
@@ -2957,13 +2966,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
2957
2966
  pm_buffer_concat(output_buffer, prefix_buffer);
2958
2967
  pm_buffer_append_string(output_buffer, "+-- rparen_loc:", 15);
2959
2968
  pm_location_t *location = &cast->rparen_loc;
2960
- if (location->start == NULL) {
2969
+ if (location->length == 0) {
2961
2970
  pm_buffer_append_string(output_buffer, " nil\n", 5);
2962
2971
  } else {
2963
2972
  pm_buffer_append_byte(output_buffer, ' ');
2964
2973
  prettyprint_location(output_buffer, parser, location);
2965
2974
  pm_buffer_append_string(output_buffer, " = \"", 4);
2966
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
2975
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
2967
2976
  pm_buffer_append_string(output_buffer, "\"\n", 2);
2968
2977
  }
2969
2978
  }
@@ -2973,13 +2982,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
2973
2982
  pm_buffer_concat(output_buffer, prefix_buffer);
2974
2983
  pm_buffer_append_string(output_buffer, "+-- equal_loc:", 14);
2975
2984
  pm_location_t *location = &cast->equal_loc;
2976
- if (location->start == NULL) {
2985
+ if (location->length == 0) {
2977
2986
  pm_buffer_append_string(output_buffer, " nil\n", 5);
2978
2987
  } else {
2979
2988
  pm_buffer_append_byte(output_buffer, ' ');
2980
2989
  prettyprint_location(output_buffer, parser, location);
2981
2990
  pm_buffer_append_string(output_buffer, " = \"", 4);
2982
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
2991
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
2983
2992
  pm_buffer_append_string(output_buffer, "\"\n", 2);
2984
2993
  }
2985
2994
  }
@@ -2989,13 +2998,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
2989
2998
  pm_buffer_concat(output_buffer, prefix_buffer);
2990
2999
  pm_buffer_append_string(output_buffer, "+-- end_keyword_loc:", 20);
2991
3000
  pm_location_t *location = &cast->end_keyword_loc;
2992
- if (location->start == NULL) {
3001
+ if (location->length == 0) {
2993
3002
  pm_buffer_append_string(output_buffer, " nil\n", 5);
2994
3003
  } else {
2995
3004
  pm_buffer_append_byte(output_buffer, ' ');
2996
3005
  prettyprint_location(output_buffer, parser, location);
2997
3006
  pm_buffer_append_string(output_buffer, " = \"", 4);
2998
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
3007
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
2999
3008
  pm_buffer_append_string(output_buffer, "\"\n", 2);
3000
3009
  }
3001
3010
  }
@@ -3013,13 +3022,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
3013
3022
  pm_buffer_concat(output_buffer, prefix_buffer);
3014
3023
  pm_buffer_append_string(output_buffer, "+-- lparen_loc:", 15);
3015
3024
  pm_location_t *location = &cast->lparen_loc;
3016
- if (location->start == NULL) {
3025
+ if (location->length == 0) {
3017
3026
  pm_buffer_append_string(output_buffer, " nil\n", 5);
3018
3027
  } else {
3019
3028
  pm_buffer_append_byte(output_buffer, ' ');
3020
3029
  prettyprint_location(output_buffer, parser, location);
3021
3030
  pm_buffer_append_string(output_buffer, " = \"", 4);
3022
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
3031
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
3023
3032
  pm_buffer_append_string(output_buffer, "\"\n", 2);
3024
3033
  }
3025
3034
  }
@@ -3042,13 +3051,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
3042
3051
  pm_buffer_concat(output_buffer, prefix_buffer);
3043
3052
  pm_buffer_append_string(output_buffer, "+-- rparen_loc:", 15);
3044
3053
  pm_location_t *location = &cast->rparen_loc;
3045
- if (location->start == NULL) {
3054
+ if (location->length == 0) {
3046
3055
  pm_buffer_append_string(output_buffer, " nil\n", 5);
3047
3056
  } else {
3048
3057
  pm_buffer_append_byte(output_buffer, ' ');
3049
3058
  prettyprint_location(output_buffer, parser, location);
3050
3059
  pm_buffer_append_string(output_buffer, " = \"", 4);
3051
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
3060
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
3052
3061
  pm_buffer_append_string(output_buffer, "\"\n", 2);
3053
3062
  }
3054
3063
  }
@@ -3061,7 +3070,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
3061
3070
  pm_buffer_append_byte(output_buffer, ' ');
3062
3071
  prettyprint_location(output_buffer, parser, location);
3063
3072
  pm_buffer_append_string(output_buffer, " = \"", 4);
3064
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
3073
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
3065
3074
  pm_buffer_append_string(output_buffer, "\"\n", 2);
3066
3075
  }
3067
3076
 
@@ -3081,7 +3090,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
3081
3090
  pm_buffer_append_byte(output_buffer, ' ');
3082
3091
  prettyprint_location(output_buffer, parser, location);
3083
3092
  pm_buffer_append_string(output_buffer, " = \"", 4);
3084
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
3093
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
3085
3094
  pm_buffer_append_string(output_buffer, "\"\n", 2);
3086
3095
  }
3087
3096
 
@@ -3107,13 +3116,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
3107
3116
  pm_buffer_concat(output_buffer, prefix_buffer);
3108
3117
  pm_buffer_append_string(output_buffer, "+-- end_keyword_loc:", 20);
3109
3118
  pm_location_t *location = &cast->end_keyword_loc;
3110
- if (location->start == NULL) {
3119
+ if (location->length == 0) {
3111
3120
  pm_buffer_append_string(output_buffer, " nil\n", 5);
3112
3121
  } else {
3113
3122
  pm_buffer_append_byte(output_buffer, ' ');
3114
3123
  prettyprint_location(output_buffer, parser, location);
3115
3124
  pm_buffer_append_string(output_buffer, " = \"", 4);
3116
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
3125
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
3117
3126
  pm_buffer_append_string(output_buffer, "\"\n", 2);
3118
3127
  }
3119
3128
  }
@@ -3134,7 +3143,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
3134
3143
  pm_buffer_append_byte(output_buffer, ' ');
3135
3144
  prettyprint_location(output_buffer, parser, location);
3136
3145
  pm_buffer_append_string(output_buffer, " = \"", 4);
3137
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
3146
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
3138
3147
  pm_buffer_append_string(output_buffer, "\"\n", 2);
3139
3148
  }
3140
3149
 
@@ -3163,7 +3172,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
3163
3172
  pm_buffer_append_byte(output_buffer, ' ');
3164
3173
  prettyprint_location(output_buffer, parser, location);
3165
3174
  pm_buffer_append_string(output_buffer, " = \"", 4);
3166
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
3175
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
3167
3176
  pm_buffer_append_string(output_buffer, "\"\n", 2);
3168
3177
  }
3169
3178
 
@@ -3183,7 +3192,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
3183
3192
  pm_buffer_append_byte(output_buffer, ' ');
3184
3193
  prettyprint_location(output_buffer, parser, location);
3185
3194
  pm_buffer_append_string(output_buffer, " = \"", 4);
3186
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
3195
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
3187
3196
  pm_buffer_append_string(output_buffer, "\"\n", 2);
3188
3197
  }
3189
3198
 
@@ -3216,7 +3225,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
3216
3225
  pm_buffer_append_byte(output_buffer, ' ');
3217
3226
  prettyprint_location(output_buffer, parser, location);
3218
3227
  pm_buffer_append_string(output_buffer, " = \"", 4);
3219
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
3228
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
3220
3229
  pm_buffer_append_string(output_buffer, "\"\n", 2);
3221
3230
  }
3222
3231
 
@@ -3245,12 +3254,37 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
3245
3254
  pm_buffer_append_byte(output_buffer, ' ');
3246
3255
  prettyprint_location(output_buffer, parser, location);
3247
3256
  pm_buffer_append_string(output_buffer, " = \"", 4);
3248
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
3257
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
3249
3258
  pm_buffer_append_string(output_buffer, "\"\n", 2);
3250
3259
  }
3251
3260
 
3252
3261
  break;
3253
3262
  }
3263
+ case PM_ERROR_RECOVERY_NODE: {
3264
+ pm_error_recovery_node_t *cast = (pm_error_recovery_node_t *) node;
3265
+ pm_buffer_append_string(output_buffer, "@ ErrorRecoveryNode (location: ", 31);
3266
+ prettyprint_location(output_buffer, parser, &node->location);
3267
+ pm_buffer_append_string(output_buffer, ")\n", 2);
3268
+
3269
+ // unexpected
3270
+ {
3271
+ pm_buffer_concat(output_buffer, prefix_buffer);
3272
+ pm_buffer_append_string(output_buffer, "+-- unexpected:", 15);
3273
+ if (cast->unexpected == NULL) {
3274
+ pm_buffer_append_string(output_buffer, " nil\n", 5);
3275
+ } else {
3276
+ pm_buffer_append_byte(output_buffer, '\n');
3277
+
3278
+ size_t prefix_length = prefix_buffer->length;
3279
+ pm_buffer_append_string(prefix_buffer, " ", 4);
3280
+ pm_buffer_concat(output_buffer, prefix_buffer);
3281
+ prettyprint_node(output_buffer, parser, (pm_node_t *) cast->unexpected, prefix_buffer);
3282
+ prefix_buffer->length = prefix_length;
3283
+ }
3284
+ }
3285
+
3286
+ break;
3287
+ }
3254
3288
  case PM_FALSE_NODE: {
3255
3289
  pm_buffer_append_string(output_buffer, "@ FalseNode (location: ", 23);
3256
3290
  prettyprint_location(output_buffer, parser, &node->location);
@@ -3330,13 +3364,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
3330
3364
  pm_buffer_concat(output_buffer, prefix_buffer);
3331
3365
  pm_buffer_append_string(output_buffer, "+-- opening_loc:", 16);
3332
3366
  pm_location_t *location = &cast->opening_loc;
3333
- if (location->start == NULL) {
3367
+ if (location->length == 0) {
3334
3368
  pm_buffer_append_string(output_buffer, " nil\n", 5);
3335
3369
  } else {
3336
3370
  pm_buffer_append_byte(output_buffer, ' ');
3337
3371
  prettyprint_location(output_buffer, parser, location);
3338
3372
  pm_buffer_append_string(output_buffer, " = \"", 4);
3339
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
3373
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
3340
3374
  pm_buffer_append_string(output_buffer, "\"\n", 2);
3341
3375
  }
3342
3376
  }
@@ -3346,13 +3380,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
3346
3380
  pm_buffer_concat(output_buffer, prefix_buffer);
3347
3381
  pm_buffer_append_string(output_buffer, "+-- closing_loc:", 16);
3348
3382
  pm_location_t *location = &cast->closing_loc;
3349
- if (location->start == NULL) {
3383
+ if (location->length == 0) {
3350
3384
  pm_buffer_append_string(output_buffer, " nil\n", 5);
3351
3385
  } else {
3352
3386
  pm_buffer_append_byte(output_buffer, ' ');
3353
3387
  prettyprint_location(output_buffer, parser, location);
3354
3388
  pm_buffer_append_string(output_buffer, " = \"", 4);
3355
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
3389
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
3356
3390
  pm_buffer_append_string(output_buffer, "\"\n", 2);
3357
3391
  }
3358
3392
  }
@@ -3421,7 +3455,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
3421
3455
  pm_buffer_append_byte(output_buffer, ' ');
3422
3456
  prettyprint_location(output_buffer, parser, location);
3423
3457
  pm_buffer_append_string(output_buffer, " = \"", 4);
3424
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
3458
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
3425
3459
  pm_buffer_append_string(output_buffer, "\"\n", 2);
3426
3460
  }
3427
3461
 
@@ -3499,7 +3533,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
3499
3533
  pm_buffer_append_byte(output_buffer, ' ');
3500
3534
  prettyprint_location(output_buffer, parser, location);
3501
3535
  pm_buffer_append_string(output_buffer, " = \"", 4);
3502
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
3536
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
3503
3537
  pm_buffer_append_string(output_buffer, "\"\n", 2);
3504
3538
  }
3505
3539
 
@@ -3511,7 +3545,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
3511
3545
  pm_buffer_append_byte(output_buffer, ' ');
3512
3546
  prettyprint_location(output_buffer, parser, location);
3513
3547
  pm_buffer_append_string(output_buffer, " = \"", 4);
3514
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
3548
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
3515
3549
  pm_buffer_append_string(output_buffer, "\"\n", 2);
3516
3550
  }
3517
3551
 
@@ -3520,13 +3554,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
3520
3554
  pm_buffer_concat(output_buffer, prefix_buffer);
3521
3555
  pm_buffer_append_string(output_buffer, "+-- do_keyword_loc:", 19);
3522
3556
  pm_location_t *location = &cast->do_keyword_loc;
3523
- if (location->start == NULL) {
3557
+ if (location->length == 0) {
3524
3558
  pm_buffer_append_string(output_buffer, " nil\n", 5);
3525
3559
  } else {
3526
3560
  pm_buffer_append_byte(output_buffer, ' ');
3527
3561
  prettyprint_location(output_buffer, parser, location);
3528
3562
  pm_buffer_append_string(output_buffer, " = \"", 4);
3529
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
3563
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
3530
3564
  pm_buffer_append_string(output_buffer, "\"\n", 2);
3531
3565
  }
3532
3566
  }
@@ -3539,7 +3573,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
3539
3573
  pm_buffer_append_byte(output_buffer, ' ');
3540
3574
  prettyprint_location(output_buffer, parser, location);
3541
3575
  pm_buffer_append_string(output_buffer, " = \"", 4);
3542
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
3576
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
3543
3577
  pm_buffer_append_string(output_buffer, "\"\n", 2);
3544
3578
  }
3545
3579
 
@@ -3565,6 +3599,18 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
3565
3599
  prettyprint_location(output_buffer, parser, &node->location);
3566
3600
  pm_buffer_append_string(output_buffer, ")\n", 2);
3567
3601
 
3602
+ // keyword_loc
3603
+ {
3604
+ pm_buffer_concat(output_buffer, prefix_buffer);
3605
+ pm_buffer_append_string(output_buffer, "+-- keyword_loc:", 16);
3606
+ pm_location_t *location = &cast->keyword_loc;
3607
+ pm_buffer_append_byte(output_buffer, ' ');
3608
+ prettyprint_location(output_buffer, parser, location);
3609
+ pm_buffer_append_string(output_buffer, " = \"", 4);
3610
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
3611
+ pm_buffer_append_string(output_buffer, "\"\n", 2);
3612
+ }
3613
+
3568
3614
  // block
3569
3615
  {
3570
3616
  pm_buffer_concat(output_buffer, prefix_buffer);
@@ -3607,7 +3653,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
3607
3653
  pm_buffer_append_byte(output_buffer, ' ');
3608
3654
  prettyprint_location(output_buffer, parser, location);
3609
3655
  pm_buffer_append_string(output_buffer, " = \"", 4);
3610
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
3656
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
3611
3657
  pm_buffer_append_string(output_buffer, "\"\n", 2);
3612
3658
  }
3613
3659
 
@@ -3619,7 +3665,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
3619
3665
  pm_buffer_append_byte(output_buffer, ' ');
3620
3666
  prettyprint_location(output_buffer, parser, location);
3621
3667
  pm_buffer_append_string(output_buffer, " = \"", 4);
3622
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
3668
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
3623
3669
  pm_buffer_append_string(output_buffer, "\"\n", 2);
3624
3670
  }
3625
3671
 
@@ -3661,7 +3707,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
3661
3707
  pm_buffer_append_byte(output_buffer, ' ');
3662
3708
  prettyprint_location(output_buffer, parser, location);
3663
3709
  pm_buffer_append_string(output_buffer, " = \"", 4);
3664
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
3710
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
3665
3711
  pm_buffer_append_string(output_buffer, "\"\n", 2);
3666
3712
  }
3667
3713
 
@@ -3673,7 +3719,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
3673
3719
  pm_buffer_append_byte(output_buffer, ' ');
3674
3720
  prettyprint_location(output_buffer, parser, location);
3675
3721
  pm_buffer_append_string(output_buffer, " = \"", 4);
3676
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
3722
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
3677
3723
  pm_buffer_append_string(output_buffer, "\"\n", 2);
3678
3724
  }
3679
3725
 
@@ -3724,7 +3770,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
3724
3770
  pm_buffer_append_byte(output_buffer, ' ');
3725
3771
  prettyprint_location(output_buffer, parser, location);
3726
3772
  pm_buffer_append_string(output_buffer, " = \"", 4);
3727
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
3773
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
3728
3774
  pm_buffer_append_string(output_buffer, "\"\n", 2);
3729
3775
  }
3730
3776
 
@@ -3736,7 +3782,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
3736
3782
  pm_buffer_append_byte(output_buffer, ' ');
3737
3783
  prettyprint_location(output_buffer, parser, location);
3738
3784
  pm_buffer_append_string(output_buffer, " = \"", 4);
3739
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
3785
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
3740
3786
  pm_buffer_append_string(output_buffer, "\"\n", 2);
3741
3787
  }
3742
3788
 
@@ -3812,7 +3858,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
3812
3858
  pm_buffer_append_byte(output_buffer, ' ');
3813
3859
  prettyprint_location(output_buffer, parser, location);
3814
3860
  pm_buffer_append_string(output_buffer, " = \"", 4);
3815
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
3861
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
3816
3862
  pm_buffer_append_string(output_buffer, "\"\n", 2);
3817
3863
  }
3818
3864
 
@@ -3837,7 +3883,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
3837
3883
  pm_buffer_append_byte(output_buffer, ' ');
3838
3884
  prettyprint_location(output_buffer, parser, location);
3839
3885
  pm_buffer_append_string(output_buffer, " = \"", 4);
3840
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
3886
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
3841
3887
  pm_buffer_append_string(output_buffer, "\"\n", 2);
3842
3888
  }
3843
3889
 
@@ -3857,7 +3903,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
3857
3903
  pm_buffer_append_byte(output_buffer, ' ');
3858
3904
  prettyprint_location(output_buffer, parser, location);
3859
3905
  pm_buffer_append_string(output_buffer, " = \"", 4);
3860
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
3906
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
3861
3907
  pm_buffer_append_string(output_buffer, "\"\n", 2);
3862
3908
  }
3863
3909
 
@@ -3887,7 +3933,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
3887
3933
  pm_buffer_append_byte(output_buffer, ' ');
3888
3934
  prettyprint_location(output_buffer, parser, location);
3889
3935
  pm_buffer_append_string(output_buffer, " = \"", 4);
3890
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
3936
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
3891
3937
  pm_buffer_append_string(output_buffer, "\"\n", 2);
3892
3938
  }
3893
3939
 
@@ -3956,13 +4002,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
3956
4002
  pm_buffer_concat(output_buffer, prefix_buffer);
3957
4003
  pm_buffer_append_string(output_buffer, "+-- opening_loc:", 16);
3958
4004
  pm_location_t *location = &cast->opening_loc;
3959
- if (location->start == NULL) {
4005
+ if (location->length == 0) {
3960
4006
  pm_buffer_append_string(output_buffer, " nil\n", 5);
3961
4007
  } else {
3962
4008
  pm_buffer_append_byte(output_buffer, ' ');
3963
4009
  prettyprint_location(output_buffer, parser, location);
3964
4010
  pm_buffer_append_string(output_buffer, " = \"", 4);
3965
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
4011
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
3966
4012
  pm_buffer_append_string(output_buffer, "\"\n", 2);
3967
4013
  }
3968
4014
  }
@@ -3972,13 +4018,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
3972
4018
  pm_buffer_concat(output_buffer, prefix_buffer);
3973
4019
  pm_buffer_append_string(output_buffer, "+-- closing_loc:", 16);
3974
4020
  pm_location_t *location = &cast->closing_loc;
3975
- if (location->start == NULL) {
4021
+ if (location->length == 0) {
3976
4022
  pm_buffer_append_string(output_buffer, " nil\n", 5);
3977
4023
  } else {
3978
4024
  pm_buffer_append_byte(output_buffer, ' ');
3979
4025
  prettyprint_location(output_buffer, parser, location);
3980
4026
  pm_buffer_append_string(output_buffer, " = \"", 4);
3981
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
4027
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
3982
4028
  pm_buffer_append_string(output_buffer, "\"\n", 2);
3983
4029
  }
3984
4030
  }
@@ -3996,13 +4042,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
3996
4042
  pm_buffer_concat(output_buffer, prefix_buffer);
3997
4043
  pm_buffer_append_string(output_buffer, "+-- if_keyword_loc:", 19);
3998
4044
  pm_location_t *location = &cast->if_keyword_loc;
3999
- if (location->start == NULL) {
4045
+ if (location->length == 0) {
4000
4046
  pm_buffer_append_string(output_buffer, " nil\n", 5);
4001
4047
  } else {
4002
4048
  pm_buffer_append_byte(output_buffer, ' ');
4003
4049
  prettyprint_location(output_buffer, parser, location);
4004
4050
  pm_buffer_append_string(output_buffer, " = \"", 4);
4005
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
4051
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
4006
4052
  pm_buffer_append_string(output_buffer, "\"\n", 2);
4007
4053
  }
4008
4054
  }
@@ -4025,13 +4071,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
4025
4071
  pm_buffer_concat(output_buffer, prefix_buffer);
4026
4072
  pm_buffer_append_string(output_buffer, "+-- then_keyword_loc:", 21);
4027
4073
  pm_location_t *location = &cast->then_keyword_loc;
4028
- if (location->start == NULL) {
4074
+ if (location->length == 0) {
4029
4075
  pm_buffer_append_string(output_buffer, " nil\n", 5);
4030
4076
  } else {
4031
4077
  pm_buffer_append_byte(output_buffer, ' ');
4032
4078
  prettyprint_location(output_buffer, parser, location);
4033
4079
  pm_buffer_append_string(output_buffer, " = \"", 4);
4034
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
4080
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
4035
4081
  pm_buffer_append_string(output_buffer, "\"\n", 2);
4036
4082
  }
4037
4083
  }
@@ -4075,13 +4121,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
4075
4121
  pm_buffer_concat(output_buffer, prefix_buffer);
4076
4122
  pm_buffer_append_string(output_buffer, "+-- end_keyword_loc:", 20);
4077
4123
  pm_location_t *location = &cast->end_keyword_loc;
4078
- if (location->start == NULL) {
4124
+ if (location->length == 0) {
4079
4125
  pm_buffer_append_string(output_buffer, " nil\n", 5);
4080
4126
  } else {
4081
4127
  pm_buffer_append_byte(output_buffer, ' ');
4082
4128
  prettyprint_location(output_buffer, parser, location);
4083
4129
  pm_buffer_append_string(output_buffer, " = \"", 4);
4084
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
4130
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
4085
4131
  pm_buffer_append_string(output_buffer, "\"\n", 2);
4086
4132
  }
4087
4133
  }
@@ -4173,30 +4219,30 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
4173
4219
  }
4174
4220
  }
4175
4221
 
4176
- // in_loc
4222
+ // in_keyword_loc
4177
4223
  {
4178
4224
  pm_buffer_concat(output_buffer, prefix_buffer);
4179
- pm_buffer_append_string(output_buffer, "+-- in_loc:", 11);
4180
- pm_location_t *location = &cast->in_loc;
4225
+ pm_buffer_append_string(output_buffer, "+-- in_keyword_loc:", 19);
4226
+ pm_location_t *location = &cast->in_keyword_loc;
4181
4227
  pm_buffer_append_byte(output_buffer, ' ');
4182
4228
  prettyprint_location(output_buffer, parser, location);
4183
4229
  pm_buffer_append_string(output_buffer, " = \"", 4);
4184
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
4230
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
4185
4231
  pm_buffer_append_string(output_buffer, "\"\n", 2);
4186
4232
  }
4187
4233
 
4188
- // then_loc
4234
+ // then_keyword_loc
4189
4235
  {
4190
4236
  pm_buffer_concat(output_buffer, prefix_buffer);
4191
- pm_buffer_append_string(output_buffer, "+-- then_loc:", 13);
4192
- pm_location_t *location = &cast->then_loc;
4193
- if (location->start == NULL) {
4237
+ pm_buffer_append_string(output_buffer, "+-- then_keyword_loc:", 21);
4238
+ pm_location_t *location = &cast->then_keyword_loc;
4239
+ if (location->length == 0) {
4194
4240
  pm_buffer_append_string(output_buffer, " nil\n", 5);
4195
4241
  } else {
4196
4242
  pm_buffer_append_byte(output_buffer, ' ');
4197
4243
  prettyprint_location(output_buffer, parser, location);
4198
4244
  pm_buffer_append_string(output_buffer, " = \"", 4);
4199
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
4245
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
4200
4246
  pm_buffer_append_string(output_buffer, "\"\n", 2);
4201
4247
  }
4202
4248
  }
@@ -4260,13 +4306,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
4260
4306
  pm_buffer_concat(output_buffer, prefix_buffer);
4261
4307
  pm_buffer_append_string(output_buffer, "+-- call_operator_loc:", 22);
4262
4308
  pm_location_t *location = &cast->call_operator_loc;
4263
- if (location->start == NULL) {
4309
+ if (location->length == 0) {
4264
4310
  pm_buffer_append_string(output_buffer, " nil\n", 5);
4265
4311
  } else {
4266
4312
  pm_buffer_append_byte(output_buffer, ' ');
4267
4313
  prettyprint_location(output_buffer, parser, location);
4268
4314
  pm_buffer_append_string(output_buffer, " = \"", 4);
4269
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
4315
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
4270
4316
  pm_buffer_append_string(output_buffer, "\"\n", 2);
4271
4317
  }
4272
4318
  }
@@ -4279,7 +4325,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
4279
4325
  pm_buffer_append_byte(output_buffer, ' ');
4280
4326
  prettyprint_location(output_buffer, parser, location);
4281
4327
  pm_buffer_append_string(output_buffer, " = \"", 4);
4282
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
4328
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
4283
4329
  pm_buffer_append_string(output_buffer, "\"\n", 2);
4284
4330
  }
4285
4331
 
@@ -4308,7 +4354,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
4308
4354
  pm_buffer_append_byte(output_buffer, ' ');
4309
4355
  prettyprint_location(output_buffer, parser, location);
4310
4356
  pm_buffer_append_string(output_buffer, " = \"", 4);
4311
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
4357
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
4312
4358
  pm_buffer_append_string(output_buffer, "\"\n", 2);
4313
4359
  }
4314
4360
 
@@ -4337,7 +4383,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
4337
4383
  pm_buffer_append_byte(output_buffer, ' ');
4338
4384
  prettyprint_location(output_buffer, parser, location);
4339
4385
  pm_buffer_append_string(output_buffer, " = \"", 4);
4340
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
4386
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
4341
4387
  pm_buffer_append_string(output_buffer, "\"\n", 2);
4342
4388
  }
4343
4389
 
@@ -4413,13 +4459,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
4413
4459
  pm_buffer_concat(output_buffer, prefix_buffer);
4414
4460
  pm_buffer_append_string(output_buffer, "+-- call_operator_loc:", 22);
4415
4461
  pm_location_t *location = &cast->call_operator_loc;
4416
- if (location->start == NULL) {
4462
+ if (location->length == 0) {
4417
4463
  pm_buffer_append_string(output_buffer, " nil\n", 5);
4418
4464
  } else {
4419
4465
  pm_buffer_append_byte(output_buffer, ' ');
4420
4466
  prettyprint_location(output_buffer, parser, location);
4421
4467
  pm_buffer_append_string(output_buffer, " = \"", 4);
4422
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
4468
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
4423
4469
  pm_buffer_append_string(output_buffer, "\"\n", 2);
4424
4470
  }
4425
4471
  }
@@ -4432,7 +4478,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
4432
4478
  pm_buffer_append_byte(output_buffer, ' ');
4433
4479
  prettyprint_location(output_buffer, parser, location);
4434
4480
  pm_buffer_append_string(output_buffer, " = \"", 4);
4435
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
4481
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
4436
4482
  pm_buffer_append_string(output_buffer, "\"\n", 2);
4437
4483
  }
4438
4484
 
@@ -4461,7 +4507,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
4461
4507
  pm_buffer_append_byte(output_buffer, ' ');
4462
4508
  prettyprint_location(output_buffer, parser, location);
4463
4509
  pm_buffer_append_string(output_buffer, " = \"", 4);
4464
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
4510
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
4465
4511
  pm_buffer_append_string(output_buffer, "\"\n", 2);
4466
4512
  }
4467
4513
 
@@ -4499,7 +4545,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
4499
4545
  pm_buffer_append_byte(output_buffer, ' ');
4500
4546
  prettyprint_location(output_buffer, parser, location);
4501
4547
  pm_buffer_append_string(output_buffer, " = \"", 4);
4502
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
4548
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
4503
4549
  pm_buffer_append_string(output_buffer, "\"\n", 2);
4504
4550
  }
4505
4551
 
@@ -4575,13 +4621,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
4575
4621
  pm_buffer_concat(output_buffer, prefix_buffer);
4576
4622
  pm_buffer_append_string(output_buffer, "+-- call_operator_loc:", 22);
4577
4623
  pm_location_t *location = &cast->call_operator_loc;
4578
- if (location->start == NULL) {
4624
+ if (location->length == 0) {
4579
4625
  pm_buffer_append_string(output_buffer, " nil\n", 5);
4580
4626
  } else {
4581
4627
  pm_buffer_append_byte(output_buffer, ' ');
4582
4628
  prettyprint_location(output_buffer, parser, location);
4583
4629
  pm_buffer_append_string(output_buffer, " = \"", 4);
4584
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
4630
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
4585
4631
  pm_buffer_append_string(output_buffer, "\"\n", 2);
4586
4632
  }
4587
4633
  }
@@ -4594,7 +4640,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
4594
4640
  pm_buffer_append_byte(output_buffer, ' ');
4595
4641
  prettyprint_location(output_buffer, parser, location);
4596
4642
  pm_buffer_append_string(output_buffer, " = \"", 4);
4597
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
4643
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
4598
4644
  pm_buffer_append_string(output_buffer, "\"\n", 2);
4599
4645
  }
4600
4646
 
@@ -4623,7 +4669,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
4623
4669
  pm_buffer_append_byte(output_buffer, ' ');
4624
4670
  prettyprint_location(output_buffer, parser, location);
4625
4671
  pm_buffer_append_string(output_buffer, " = \"", 4);
4626
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
4672
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
4627
4673
  pm_buffer_append_string(output_buffer, "\"\n", 2);
4628
4674
  }
4629
4675
 
@@ -4652,7 +4698,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
4652
4698
  pm_buffer_append_byte(output_buffer, ' ');
4653
4699
  prettyprint_location(output_buffer, parser, location);
4654
4700
  pm_buffer_append_string(output_buffer, " = \"", 4);
4655
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
4701
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
4656
4702
  pm_buffer_append_string(output_buffer, "\"\n", 2);
4657
4703
  }
4658
4704
 
@@ -4727,7 +4773,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
4727
4773
  pm_buffer_append_byte(output_buffer, ' ');
4728
4774
  prettyprint_location(output_buffer, parser, location);
4729
4775
  pm_buffer_append_string(output_buffer, " = \"", 4);
4730
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
4776
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
4731
4777
  pm_buffer_append_string(output_buffer, "\"\n", 2);
4732
4778
  }
4733
4779
 
@@ -4756,7 +4802,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
4756
4802
  pm_buffer_append_byte(output_buffer, ' ');
4757
4803
  prettyprint_location(output_buffer, parser, location);
4758
4804
  pm_buffer_append_string(output_buffer, " = \"", 4);
4759
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
4805
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
4760
4806
  pm_buffer_append_string(output_buffer, "\"\n", 2);
4761
4807
  }
4762
4808
 
@@ -4802,7 +4848,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
4802
4848
  pm_buffer_append_byte(output_buffer, ' ');
4803
4849
  prettyprint_location(output_buffer, parser, location);
4804
4850
  pm_buffer_append_string(output_buffer, " = \"", 4);
4805
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
4851
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
4806
4852
  pm_buffer_append_string(output_buffer, "\"\n", 2);
4807
4853
  }
4808
4854
 
@@ -4814,7 +4860,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
4814
4860
  pm_buffer_append_byte(output_buffer, ' ');
4815
4861
  prettyprint_location(output_buffer, parser, location);
4816
4862
  pm_buffer_append_string(output_buffer, " = \"", 4);
4817
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
4863
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
4818
4864
  pm_buffer_append_string(output_buffer, "\"\n", 2);
4819
4865
  }
4820
4866
 
@@ -4856,7 +4902,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
4856
4902
  pm_buffer_append_byte(output_buffer, ' ');
4857
4903
  prettyprint_location(output_buffer, parser, location);
4858
4904
  pm_buffer_append_string(output_buffer, " = \"", 4);
4859
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
4905
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
4860
4906
  pm_buffer_append_string(output_buffer, "\"\n", 2);
4861
4907
  }
4862
4908
 
@@ -4868,7 +4914,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
4868
4914
  pm_buffer_append_byte(output_buffer, ' ');
4869
4915
  prettyprint_location(output_buffer, parser, location);
4870
4916
  pm_buffer_append_string(output_buffer, " = \"", 4);
4871
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
4917
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
4872
4918
  pm_buffer_append_string(output_buffer, "\"\n", 2);
4873
4919
  }
4874
4920
 
@@ -4919,7 +4965,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
4919
4965
  pm_buffer_append_byte(output_buffer, ' ');
4920
4966
  prettyprint_location(output_buffer, parser, location);
4921
4967
  pm_buffer_append_string(output_buffer, " = \"", 4);
4922
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
4968
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
4923
4969
  pm_buffer_append_string(output_buffer, "\"\n", 2);
4924
4970
  }
4925
4971
 
@@ -4931,7 +4977,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
4931
4977
  pm_buffer_append_byte(output_buffer, ' ');
4932
4978
  prettyprint_location(output_buffer, parser, location);
4933
4979
  pm_buffer_append_string(output_buffer, " = \"", 4);
4934
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
4980
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
4935
4981
  pm_buffer_append_string(output_buffer, "\"\n", 2);
4936
4982
  }
4937
4983
 
@@ -5007,7 +5053,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
5007
5053
  pm_buffer_append_byte(output_buffer, ' ');
5008
5054
  prettyprint_location(output_buffer, parser, location);
5009
5055
  pm_buffer_append_string(output_buffer, " = \"", 4);
5010
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
5056
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
5011
5057
  pm_buffer_append_string(output_buffer, "\"\n", 2);
5012
5058
  }
5013
5059
 
@@ -5032,7 +5078,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
5032
5078
  pm_buffer_append_byte(output_buffer, ' ');
5033
5079
  prettyprint_location(output_buffer, parser, location);
5034
5080
  pm_buffer_append_string(output_buffer, " = \"", 4);
5035
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
5081
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
5036
5082
  pm_buffer_append_string(output_buffer, "\"\n", 2);
5037
5083
  }
5038
5084
 
@@ -5163,7 +5209,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
5163
5209
  pm_buffer_append_byte(output_buffer, ' ');
5164
5210
  prettyprint_location(output_buffer, parser, location);
5165
5211
  pm_buffer_append_string(output_buffer, " = \"", 4);
5166
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
5212
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
5167
5213
  pm_buffer_append_string(output_buffer, "\"\n", 2);
5168
5214
  }
5169
5215
 
@@ -5193,7 +5239,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
5193
5239
  pm_buffer_append_byte(output_buffer, ' ');
5194
5240
  prettyprint_location(output_buffer, parser, location);
5195
5241
  pm_buffer_append_string(output_buffer, " = \"", 4);
5196
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
5242
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
5197
5243
  pm_buffer_append_string(output_buffer, "\"\n", 2);
5198
5244
  }
5199
5245
 
@@ -5277,7 +5323,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
5277
5323
  pm_buffer_append_byte(output_buffer, ' ');
5278
5324
  prettyprint_location(output_buffer, parser, location);
5279
5325
  pm_buffer_append_string(output_buffer, " = \"", 4);
5280
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
5326
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
5281
5327
  pm_buffer_append_string(output_buffer, "\"\n", 2);
5282
5328
  }
5283
5329
 
@@ -5307,7 +5353,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
5307
5353
  pm_buffer_append_byte(output_buffer, ' ');
5308
5354
  prettyprint_location(output_buffer, parser, location);
5309
5355
  pm_buffer_append_string(output_buffer, " = \"", 4);
5310
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
5356
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
5311
5357
  pm_buffer_append_string(output_buffer, "\"\n", 2);
5312
5358
  }
5313
5359
 
@@ -5343,13 +5389,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
5343
5389
  pm_buffer_concat(output_buffer, prefix_buffer);
5344
5390
  pm_buffer_append_string(output_buffer, "+-- opening_loc:", 16);
5345
5391
  pm_location_t *location = &cast->opening_loc;
5346
- if (location->start == NULL) {
5392
+ if (location->length == 0) {
5347
5393
  pm_buffer_append_string(output_buffer, " nil\n", 5);
5348
5394
  } else {
5349
5395
  pm_buffer_append_byte(output_buffer, ' ');
5350
5396
  prettyprint_location(output_buffer, parser, location);
5351
5397
  pm_buffer_append_string(output_buffer, " = \"", 4);
5352
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
5398
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
5353
5399
  pm_buffer_append_string(output_buffer, "\"\n", 2);
5354
5400
  }
5355
5401
  }
@@ -5377,13 +5423,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
5377
5423
  pm_buffer_concat(output_buffer, prefix_buffer);
5378
5424
  pm_buffer_append_string(output_buffer, "+-- closing_loc:", 16);
5379
5425
  pm_location_t *location = &cast->closing_loc;
5380
- if (location->start == NULL) {
5426
+ if (location->length == 0) {
5381
5427
  pm_buffer_append_string(output_buffer, " nil\n", 5);
5382
5428
  } else {
5383
5429
  pm_buffer_append_byte(output_buffer, ' ');
5384
5430
  prettyprint_location(output_buffer, parser, location);
5385
5431
  pm_buffer_append_string(output_buffer, " = \"", 4);
5386
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
5432
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
5387
5433
  pm_buffer_append_string(output_buffer, "\"\n", 2);
5388
5434
  }
5389
5435
  }
@@ -5401,13 +5447,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
5401
5447
  pm_buffer_concat(output_buffer, prefix_buffer);
5402
5448
  pm_buffer_append_string(output_buffer, "+-- opening_loc:", 16);
5403
5449
  pm_location_t *location = &cast->opening_loc;
5404
- if (location->start == NULL) {
5450
+ if (location->length == 0) {
5405
5451
  pm_buffer_append_string(output_buffer, " nil\n", 5);
5406
5452
  } else {
5407
5453
  pm_buffer_append_byte(output_buffer, ' ');
5408
5454
  prettyprint_location(output_buffer, parser, location);
5409
5455
  pm_buffer_append_string(output_buffer, " = \"", 4);
5410
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
5456
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
5411
5457
  pm_buffer_append_string(output_buffer, "\"\n", 2);
5412
5458
  }
5413
5459
  }
@@ -5435,13 +5481,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
5435
5481
  pm_buffer_concat(output_buffer, prefix_buffer);
5436
5482
  pm_buffer_append_string(output_buffer, "+-- closing_loc:", 16);
5437
5483
  pm_location_t *location = &cast->closing_loc;
5438
- if (location->start == NULL) {
5484
+ if (location->length == 0) {
5439
5485
  pm_buffer_append_string(output_buffer, " nil\n", 5);
5440
5486
  } else {
5441
5487
  pm_buffer_append_byte(output_buffer, ' ');
5442
5488
  prettyprint_location(output_buffer, parser, location);
5443
5489
  pm_buffer_append_string(output_buffer, " = \"", 4);
5444
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
5490
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
5445
5491
  pm_buffer_append_string(output_buffer, "\"\n", 2);
5446
5492
  }
5447
5493
  }
@@ -5462,7 +5508,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
5462
5508
  pm_buffer_append_byte(output_buffer, ' ');
5463
5509
  prettyprint_location(output_buffer, parser, location);
5464
5510
  pm_buffer_append_string(output_buffer, " = \"", 4);
5465
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
5511
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
5466
5512
  pm_buffer_append_string(output_buffer, "\"\n", 2);
5467
5513
  }
5468
5514
 
@@ -5492,7 +5538,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
5492
5538
  pm_buffer_append_byte(output_buffer, ' ');
5493
5539
  prettyprint_location(output_buffer, parser, location);
5494
5540
  pm_buffer_append_string(output_buffer, " = \"", 4);
5495
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
5541
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
5496
5542
  pm_buffer_append_string(output_buffer, "\"\n", 2);
5497
5543
  }
5498
5544
 
@@ -5590,13 +5636,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
5590
5636
  pm_buffer_concat(output_buffer, prefix_buffer);
5591
5637
  pm_buffer_append_string(output_buffer, "+-- name_loc:", 13);
5592
5638
  pm_location_t *location = &cast->name_loc;
5593
- if (location->start == NULL) {
5639
+ if (location->length == 0) {
5594
5640
  pm_buffer_append_string(output_buffer, " nil\n", 5);
5595
5641
  } else {
5596
5642
  pm_buffer_append_byte(output_buffer, ' ');
5597
5643
  prettyprint_location(output_buffer, parser, location);
5598
5644
  pm_buffer_append_string(output_buffer, " = \"", 4);
5599
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
5645
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
5600
5646
  pm_buffer_append_string(output_buffer, "\"\n", 2);
5601
5647
  }
5602
5648
  }
@@ -5609,7 +5655,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
5609
5655
  pm_buffer_append_byte(output_buffer, ' ');
5610
5656
  prettyprint_location(output_buffer, parser, location);
5611
5657
  pm_buffer_append_string(output_buffer, " = \"", 4);
5612
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
5658
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
5613
5659
  pm_buffer_append_string(output_buffer, "\"\n", 2);
5614
5660
  }
5615
5661
 
@@ -5641,7 +5687,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
5641
5687
  pm_buffer_append_byte(output_buffer, ' ');
5642
5688
  prettyprint_location(output_buffer, parser, location);
5643
5689
  pm_buffer_append_string(output_buffer, " = \"", 4);
5644
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
5690
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
5645
5691
  pm_buffer_append_string(output_buffer, "\"\n", 2);
5646
5692
  }
5647
5693
 
@@ -5653,7 +5699,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
5653
5699
  pm_buffer_append_byte(output_buffer, ' ');
5654
5700
  prettyprint_location(output_buffer, parser, location);
5655
5701
  pm_buffer_append_string(output_buffer, " = \"", 4);
5656
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
5702
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
5657
5703
  pm_buffer_append_string(output_buffer, "\"\n", 2);
5658
5704
  }
5659
5705
 
@@ -5665,7 +5711,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
5665
5711
  pm_buffer_append_byte(output_buffer, ' ');
5666
5712
  prettyprint_location(output_buffer, parser, location);
5667
5713
  pm_buffer_append_string(output_buffer, " = \"", 4);
5668
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
5714
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
5669
5715
  pm_buffer_append_string(output_buffer, "\"\n", 2);
5670
5716
  }
5671
5717
 
@@ -5719,7 +5765,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
5719
5765
  pm_buffer_append_byte(output_buffer, ' ');
5720
5766
  prettyprint_location(output_buffer, parser, location);
5721
5767
  pm_buffer_append_string(output_buffer, " = \"", 4);
5722
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
5768
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
5723
5769
  pm_buffer_append_string(output_buffer, "\"\n", 2);
5724
5770
  }
5725
5771
 
@@ -5731,7 +5777,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
5731
5777
  pm_buffer_append_byte(output_buffer, ' ');
5732
5778
  prettyprint_location(output_buffer, parser, location);
5733
5779
  pm_buffer_append_string(output_buffer, " = \"", 4);
5734
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
5780
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
5735
5781
  pm_buffer_append_string(output_buffer, "\"\n", 2);
5736
5782
  }
5737
5783
 
@@ -5780,7 +5826,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
5780
5826
  pm_buffer_append_byte(output_buffer, ' ');
5781
5827
  prettyprint_location(output_buffer, parser, location);
5782
5828
  pm_buffer_append_string(output_buffer, " = \"", 4);
5783
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
5829
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
5784
5830
  pm_buffer_append_string(output_buffer, "\"\n", 2);
5785
5831
  }
5786
5832
 
@@ -5792,7 +5838,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
5792
5838
  pm_buffer_append_byte(output_buffer, ' ');
5793
5839
  prettyprint_location(output_buffer, parser, location);
5794
5840
  pm_buffer_append_string(output_buffer, " = \"", 4);
5795
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
5841
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
5796
5842
  pm_buffer_append_string(output_buffer, "\"\n", 2);
5797
5843
  }
5798
5844
 
@@ -5850,7 +5896,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
5850
5896
  pm_buffer_append_byte(output_buffer, ' ');
5851
5897
  prettyprint_location(output_buffer, parser, location);
5852
5898
  pm_buffer_append_string(output_buffer, " = \"", 4);
5853
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
5899
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
5854
5900
  pm_buffer_append_string(output_buffer, "\"\n", 2);
5855
5901
  }
5856
5902
 
@@ -5862,7 +5908,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
5862
5908
  pm_buffer_append_byte(output_buffer, ' ');
5863
5909
  prettyprint_location(output_buffer, parser, location);
5864
5910
  pm_buffer_append_string(output_buffer, " = \"", 4);
5865
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
5911
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
5866
5912
  pm_buffer_append_string(output_buffer, "\"\n", 2);
5867
5913
  }
5868
5914
 
@@ -5975,7 +6021,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
5975
6021
  pm_buffer_append_byte(output_buffer, ' ');
5976
6022
  prettyprint_location(output_buffer, parser, location);
5977
6023
  pm_buffer_append_string(output_buffer, " = \"", 4);
5978
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
6024
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
5979
6025
  pm_buffer_append_string(output_buffer, "\"\n", 2);
5980
6026
  }
5981
6027
 
@@ -6000,7 +6046,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
6000
6046
  pm_buffer_append_byte(output_buffer, ' ');
6001
6047
  prettyprint_location(output_buffer, parser, location);
6002
6048
  pm_buffer_append_string(output_buffer, " = \"", 4);
6003
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
6049
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
6004
6050
  pm_buffer_append_string(output_buffer, "\"\n", 2);
6005
6051
  }
6006
6052
 
@@ -6084,7 +6130,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
6084
6130
  pm_buffer_append_byte(output_buffer, ' ');
6085
6131
  prettyprint_location(output_buffer, parser, location);
6086
6132
  pm_buffer_append_string(output_buffer, " = \"", 4);
6087
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
6133
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
6088
6134
  pm_buffer_append_string(output_buffer, "\"\n", 2);
6089
6135
  }
6090
6136
 
@@ -6096,7 +6142,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
6096
6142
  pm_buffer_append_byte(output_buffer, ' ');
6097
6143
  prettyprint_location(output_buffer, parser, location);
6098
6144
  pm_buffer_append_string(output_buffer, " = \"", 4);
6099
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
6145
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
6100
6146
  pm_buffer_append_string(output_buffer, "\"\n", 2);
6101
6147
  }
6102
6148
 
@@ -6108,7 +6154,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
6108
6154
  pm_buffer_append_byte(output_buffer, ' ');
6109
6155
  prettyprint_location(output_buffer, parser, location);
6110
6156
  pm_buffer_append_string(output_buffer, " = \"", 4);
6111
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
6157
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
6112
6158
  pm_buffer_append_string(output_buffer, "\"\n", 2);
6113
6159
  }
6114
6160
 
@@ -6155,15 +6201,15 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
6155
6201
  prefix_buffer->length = prefix_length;
6156
6202
  }
6157
6203
 
6158
- // operator_loc
6204
+ // keyword_loc
6159
6205
  {
6160
6206
  pm_buffer_concat(output_buffer, prefix_buffer);
6161
- pm_buffer_append_string(output_buffer, "+-- operator_loc:", 17);
6162
- pm_location_t *location = &cast->operator_loc;
6207
+ pm_buffer_append_string(output_buffer, "+-- keyword_loc:", 16);
6208
+ pm_location_t *location = &cast->keyword_loc;
6163
6209
  pm_buffer_append_byte(output_buffer, ' ');
6164
6210
  prettyprint_location(output_buffer, parser, location);
6165
6211
  pm_buffer_append_string(output_buffer, " = \"", 4);
6166
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
6212
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
6167
6213
  pm_buffer_append_string(output_buffer, "\"\n", 2);
6168
6214
  }
6169
6215
 
@@ -6209,7 +6255,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
6209
6255
  pm_buffer_append_byte(output_buffer, ' ');
6210
6256
  prettyprint_location(output_buffer, parser, location);
6211
6257
  pm_buffer_append_string(output_buffer, " = \"", 4);
6212
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
6258
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
6213
6259
  pm_buffer_append_string(output_buffer, "\"\n", 2);
6214
6260
  }
6215
6261
 
@@ -6254,13 +6300,6 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
6254
6300
 
6255
6301
  break;
6256
6302
  }
6257
- case PM_MISSING_NODE: {
6258
- pm_buffer_append_string(output_buffer, "@ MissingNode (location: ", 25);
6259
- prettyprint_location(output_buffer, parser, &node->location);
6260
- pm_buffer_append_string(output_buffer, ")\n", 2);
6261
-
6262
- break;
6263
- }
6264
6303
  case PM_MODULE_NODE: {
6265
6304
  pm_module_node_t *cast = (pm_module_node_t *) node;
6266
6305
  pm_buffer_append_string(output_buffer, "@ ModuleNode (location: ", 24);
@@ -6287,7 +6326,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
6287
6326
  pm_buffer_append_byte(output_buffer, ' ');
6288
6327
  prettyprint_location(output_buffer, parser, location);
6289
6328
  pm_buffer_append_string(output_buffer, " = \"", 4);
6290
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
6329
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
6291
6330
  pm_buffer_append_string(output_buffer, "\"\n", 2);
6292
6331
  }
6293
6332
 
@@ -6329,7 +6368,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
6329
6368
  pm_buffer_append_byte(output_buffer, ' ');
6330
6369
  prettyprint_location(output_buffer, parser, location);
6331
6370
  pm_buffer_append_string(output_buffer, " = \"", 4);
6332
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
6371
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
6333
6372
  pm_buffer_append_string(output_buffer, "\"\n", 2);
6334
6373
  }
6335
6374
 
@@ -6408,13 +6447,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
6408
6447
  pm_buffer_concat(output_buffer, prefix_buffer);
6409
6448
  pm_buffer_append_string(output_buffer, "+-- lparen_loc:", 15);
6410
6449
  pm_location_t *location = &cast->lparen_loc;
6411
- if (location->start == NULL) {
6450
+ if (location->length == 0) {
6412
6451
  pm_buffer_append_string(output_buffer, " nil\n", 5);
6413
6452
  } else {
6414
6453
  pm_buffer_append_byte(output_buffer, ' ');
6415
6454
  prettyprint_location(output_buffer, parser, location);
6416
6455
  pm_buffer_append_string(output_buffer, " = \"", 4);
6417
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
6456
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
6418
6457
  pm_buffer_append_string(output_buffer, "\"\n", 2);
6419
6458
  }
6420
6459
  }
@@ -6424,13 +6463,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
6424
6463
  pm_buffer_concat(output_buffer, prefix_buffer);
6425
6464
  pm_buffer_append_string(output_buffer, "+-- rparen_loc:", 15);
6426
6465
  pm_location_t *location = &cast->rparen_loc;
6427
- if (location->start == NULL) {
6466
+ if (location->length == 0) {
6428
6467
  pm_buffer_append_string(output_buffer, " nil\n", 5);
6429
6468
  } else {
6430
6469
  pm_buffer_append_byte(output_buffer, ' ');
6431
6470
  prettyprint_location(output_buffer, parser, location);
6432
6471
  pm_buffer_append_string(output_buffer, " = \"", 4);
6433
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
6472
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
6434
6473
  pm_buffer_append_string(output_buffer, "\"\n", 2);
6435
6474
  }
6436
6475
  }
@@ -6501,13 +6540,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
6501
6540
  pm_buffer_concat(output_buffer, prefix_buffer);
6502
6541
  pm_buffer_append_string(output_buffer, "+-- lparen_loc:", 15);
6503
6542
  pm_location_t *location = &cast->lparen_loc;
6504
- if (location->start == NULL) {
6543
+ if (location->length == 0) {
6505
6544
  pm_buffer_append_string(output_buffer, " nil\n", 5);
6506
6545
  } else {
6507
6546
  pm_buffer_append_byte(output_buffer, ' ');
6508
6547
  prettyprint_location(output_buffer, parser, location);
6509
6548
  pm_buffer_append_string(output_buffer, " = \"", 4);
6510
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
6549
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
6511
6550
  pm_buffer_append_string(output_buffer, "\"\n", 2);
6512
6551
  }
6513
6552
  }
@@ -6517,13 +6556,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
6517
6556
  pm_buffer_concat(output_buffer, prefix_buffer);
6518
6557
  pm_buffer_append_string(output_buffer, "+-- rparen_loc:", 15);
6519
6558
  pm_location_t *location = &cast->rparen_loc;
6520
- if (location->start == NULL) {
6559
+ if (location->length == 0) {
6521
6560
  pm_buffer_append_string(output_buffer, " nil\n", 5);
6522
6561
  } else {
6523
6562
  pm_buffer_append_byte(output_buffer, ' ');
6524
6563
  prettyprint_location(output_buffer, parser, location);
6525
6564
  pm_buffer_append_string(output_buffer, " = \"", 4);
6526
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
6565
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
6527
6566
  pm_buffer_append_string(output_buffer, "\"\n", 2);
6528
6567
  }
6529
6568
  }
@@ -6536,7 +6575,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
6536
6575
  pm_buffer_append_byte(output_buffer, ' ');
6537
6576
  prettyprint_location(output_buffer, parser, location);
6538
6577
  pm_buffer_append_string(output_buffer, " = \"", 4);
6539
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
6578
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
6540
6579
  pm_buffer_append_string(output_buffer, "\"\n", 2);
6541
6580
  }
6542
6581
 
@@ -6586,7 +6625,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
6586
6625
  pm_buffer_append_byte(output_buffer, ' ');
6587
6626
  prettyprint_location(output_buffer, parser, location);
6588
6627
  pm_buffer_append_string(output_buffer, " = \"", 4);
6589
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
6628
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
6590
6629
  pm_buffer_append_string(output_buffer, "\"\n", 2);
6591
6630
  }
6592
6631
 
@@ -6599,6 +6638,38 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
6599
6638
 
6600
6639
  break;
6601
6640
  }
6641
+ case PM_NO_BLOCK_PARAMETER_NODE: {
6642
+ pm_no_block_parameter_node_t *cast = (pm_no_block_parameter_node_t *) node;
6643
+ pm_buffer_append_string(output_buffer, "@ NoBlockParameterNode (location: ", 34);
6644
+ prettyprint_location(output_buffer, parser, &node->location);
6645
+ pm_buffer_append_string(output_buffer, ")\n", 2);
6646
+
6647
+ // operator_loc
6648
+ {
6649
+ pm_buffer_concat(output_buffer, prefix_buffer);
6650
+ pm_buffer_append_string(output_buffer, "+-- operator_loc:", 17);
6651
+ pm_location_t *location = &cast->operator_loc;
6652
+ pm_buffer_append_byte(output_buffer, ' ');
6653
+ prettyprint_location(output_buffer, parser, location);
6654
+ pm_buffer_append_string(output_buffer, " = \"", 4);
6655
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
6656
+ pm_buffer_append_string(output_buffer, "\"\n", 2);
6657
+ }
6658
+
6659
+ // keyword_loc
6660
+ {
6661
+ pm_buffer_concat(output_buffer, prefix_buffer);
6662
+ pm_buffer_append_string(output_buffer, "+-- keyword_loc:", 16);
6663
+ pm_location_t *location = &cast->keyword_loc;
6664
+ pm_buffer_append_byte(output_buffer, ' ');
6665
+ prettyprint_location(output_buffer, parser, location);
6666
+ pm_buffer_append_string(output_buffer, " = \"", 4);
6667
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
6668
+ pm_buffer_append_string(output_buffer, "\"\n", 2);
6669
+ }
6670
+
6671
+ break;
6672
+ }
6602
6673
  case PM_NO_KEYWORDS_PARAMETER_NODE: {
6603
6674
  pm_no_keywords_parameter_node_t *cast = (pm_no_keywords_parameter_node_t *) node;
6604
6675
  pm_buffer_append_string(output_buffer, "@ NoKeywordsParameterNode (location: ", 37);
@@ -6613,7 +6684,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
6613
6684
  pm_buffer_append_byte(output_buffer, ' ');
6614
6685
  prettyprint_location(output_buffer, parser, location);
6615
6686
  pm_buffer_append_string(output_buffer, " = \"", 4);
6616
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
6687
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
6617
6688
  pm_buffer_append_string(output_buffer, "\"\n", 2);
6618
6689
  }
6619
6690
 
@@ -6625,7 +6696,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
6625
6696
  pm_buffer_append_byte(output_buffer, ' ');
6626
6697
  prettyprint_location(output_buffer, parser, location);
6627
6698
  pm_buffer_append_string(output_buffer, " = \"", 4);
6628
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
6699
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
6629
6700
  pm_buffer_append_string(output_buffer, "\"\n", 2);
6630
6701
  }
6631
6702
 
@@ -6698,7 +6769,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
6698
6769
  pm_buffer_append_byte(output_buffer, ' ');
6699
6770
  prettyprint_location(output_buffer, parser, location);
6700
6771
  pm_buffer_append_string(output_buffer, " = \"", 4);
6701
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
6772
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
6702
6773
  pm_buffer_append_string(output_buffer, "\"\n", 2);
6703
6774
  }
6704
6775
 
@@ -6754,7 +6825,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
6754
6825
  pm_buffer_append_byte(output_buffer, ' ');
6755
6826
  prettyprint_location(output_buffer, parser, location);
6756
6827
  pm_buffer_append_string(output_buffer, " = \"", 4);
6757
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
6828
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
6758
6829
  pm_buffer_append_string(output_buffer, "\"\n", 2);
6759
6830
  }
6760
6831
 
@@ -6766,7 +6837,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
6766
6837
  pm_buffer_append_byte(output_buffer, ' ');
6767
6838
  prettyprint_location(output_buffer, parser, location);
6768
6839
  pm_buffer_append_string(output_buffer, " = \"", 4);
6769
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
6840
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
6770
6841
  pm_buffer_append_string(output_buffer, "\"\n", 2);
6771
6842
  }
6772
6843
 
@@ -6825,7 +6896,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
6825
6896
  pm_buffer_append_byte(output_buffer, ' ');
6826
6897
  prettyprint_location(output_buffer, parser, location);
6827
6898
  pm_buffer_append_string(output_buffer, " = \"", 4);
6828
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
6899
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
6829
6900
  pm_buffer_append_string(output_buffer, "\"\n", 2);
6830
6901
  }
6831
6902
 
@@ -7007,7 +7078,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
7007
7078
  pm_buffer_append_byte(output_buffer, ' ');
7008
7079
  prettyprint_location(output_buffer, parser, location);
7009
7080
  pm_buffer_append_string(output_buffer, " = \"", 4);
7010
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
7081
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
7011
7082
  pm_buffer_append_string(output_buffer, "\"\n", 2);
7012
7083
  }
7013
7084
 
@@ -7019,7 +7090,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
7019
7090
  pm_buffer_append_byte(output_buffer, ' ');
7020
7091
  prettyprint_location(output_buffer, parser, location);
7021
7092
  pm_buffer_append_string(output_buffer, " = \"", 4);
7022
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
7093
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
7023
7094
  pm_buffer_append_string(output_buffer, "\"\n", 2);
7024
7095
  }
7025
7096
 
@@ -7052,7 +7123,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
7052
7123
  pm_buffer_append_byte(output_buffer, ' ');
7053
7124
  prettyprint_location(output_buffer, parser, location);
7054
7125
  pm_buffer_append_string(output_buffer, " = \"", 4);
7055
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
7126
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
7056
7127
  pm_buffer_append_string(output_buffer, "\"\n", 2);
7057
7128
  }
7058
7129
 
@@ -7064,7 +7135,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
7064
7135
  pm_buffer_append_byte(output_buffer, ' ');
7065
7136
  prettyprint_location(output_buffer, parser, location);
7066
7137
  pm_buffer_append_string(output_buffer, " = \"", 4);
7067
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
7138
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
7068
7139
  pm_buffer_append_string(output_buffer, "\"\n", 2);
7069
7140
  }
7070
7141
 
@@ -7076,7 +7147,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
7076
7147
  pm_buffer_append_byte(output_buffer, ' ');
7077
7148
  prettyprint_location(output_buffer, parser, location);
7078
7149
  pm_buffer_append_string(output_buffer, " = \"", 4);
7079
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
7150
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
7080
7151
  pm_buffer_append_string(output_buffer, "\"\n", 2);
7081
7152
  }
7082
7153
 
@@ -7109,7 +7180,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
7109
7180
  pm_buffer_append_byte(output_buffer, ' ');
7110
7181
  prettyprint_location(output_buffer, parser, location);
7111
7182
  pm_buffer_append_string(output_buffer, " = \"", 4);
7112
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
7183
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
7113
7184
  pm_buffer_append_string(output_buffer, "\"\n", 2);
7114
7185
  }
7115
7186
 
@@ -7146,7 +7217,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
7146
7217
  pm_buffer_append_byte(output_buffer, ' ');
7147
7218
  prettyprint_location(output_buffer, parser, location);
7148
7219
  pm_buffer_append_string(output_buffer, " = \"", 4);
7149
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
7220
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
7150
7221
  pm_buffer_append_string(output_buffer, "\"\n", 2);
7151
7222
  }
7152
7223
 
@@ -7158,7 +7229,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
7158
7229
  pm_buffer_append_byte(output_buffer, ' ');
7159
7230
  prettyprint_location(output_buffer, parser, location);
7160
7231
  pm_buffer_append_string(output_buffer, " = \"", 4);
7161
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
7232
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
7162
7233
  pm_buffer_append_string(output_buffer, "\"\n", 2);
7163
7234
  }
7164
7235
 
@@ -7170,7 +7241,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
7170
7241
  pm_buffer_append_byte(output_buffer, ' ');
7171
7242
  prettyprint_location(output_buffer, parser, location);
7172
7243
  pm_buffer_append_string(output_buffer, " = \"", 4);
7173
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
7244
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
7174
7245
  pm_buffer_append_string(output_buffer, "\"\n", 2);
7175
7246
  }
7176
7247
 
@@ -7207,7 +7278,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
7207
7278
  pm_buffer_append_byte(output_buffer, ' ');
7208
7279
  prettyprint_location(output_buffer, parser, location);
7209
7280
  pm_buffer_append_string(output_buffer, " = \"", 4);
7210
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
7281
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
7211
7282
  pm_buffer_append_string(output_buffer, "\"\n", 2);
7212
7283
  }
7213
7284
 
@@ -7219,7 +7290,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
7219
7290
  pm_buffer_append_byte(output_buffer, ' ');
7220
7291
  prettyprint_location(output_buffer, parser, location);
7221
7292
  pm_buffer_append_string(output_buffer, " = \"", 4);
7222
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
7293
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
7223
7294
  pm_buffer_append_string(output_buffer, "\"\n", 2);
7224
7295
  }
7225
7296
 
@@ -7231,7 +7302,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
7231
7302
  pm_buffer_append_byte(output_buffer, ' ');
7232
7303
  prettyprint_location(output_buffer, parser, location);
7233
7304
  pm_buffer_append_string(output_buffer, " = \"", 4);
7234
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
7305
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
7235
7306
  pm_buffer_append_string(output_buffer, "\"\n", 2);
7236
7307
  }
7237
7308
 
@@ -7332,7 +7403,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
7332
7403
  pm_buffer_append_byte(output_buffer, ' ');
7333
7404
  prettyprint_location(output_buffer, parser, location);
7334
7405
  pm_buffer_append_string(output_buffer, " = \"", 4);
7335
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
7406
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
7336
7407
  pm_buffer_append_string(output_buffer, "\"\n", 2);
7337
7408
  }
7338
7409
 
@@ -7480,7 +7551,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
7480
7551
  pm_buffer_append_byte(output_buffer, ' ');
7481
7552
  prettyprint_location(output_buffer, parser, location);
7482
7553
  pm_buffer_append_string(output_buffer, " = \"", 4);
7483
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
7554
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
7484
7555
  pm_buffer_append_string(output_buffer, "\"\n", 2);
7485
7556
  }
7486
7557
 
@@ -7492,7 +7563,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
7492
7563
  pm_buffer_append_byte(output_buffer, ' ');
7493
7564
  prettyprint_location(output_buffer, parser, location);
7494
7565
  pm_buffer_append_string(output_buffer, " = \"", 4);
7495
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
7566
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
7496
7567
  pm_buffer_append_string(output_buffer, "\"\n", 2);
7497
7568
  }
7498
7569
 
@@ -7504,7 +7575,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
7504
7575
  pm_buffer_append_byte(output_buffer, ' ');
7505
7576
  prettyprint_location(output_buffer, parser, location);
7506
7577
  pm_buffer_append_string(output_buffer, " = \"", 4);
7507
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
7578
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
7508
7579
  pm_buffer_append_string(output_buffer, "\"\n", 2);
7509
7580
  }
7510
7581
 
@@ -7556,7 +7627,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
7556
7627
  pm_buffer_append_byte(output_buffer, ' ');
7557
7628
  prettyprint_location(output_buffer, parser, location);
7558
7629
  pm_buffer_append_string(output_buffer, " = \"", 4);
7559
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
7630
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
7560
7631
  pm_buffer_append_string(output_buffer, "\"\n", 2);
7561
7632
  }
7562
7633
 
@@ -7620,7 +7691,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
7620
7691
  pm_buffer_append_byte(output_buffer, ' ');
7621
7692
  prettyprint_location(output_buffer, parser, location);
7622
7693
  pm_buffer_append_string(output_buffer, " = \"", 4);
7623
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
7694
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
7624
7695
  pm_buffer_append_string(output_buffer, "\"\n", 2);
7625
7696
  }
7626
7697
 
@@ -7653,7 +7724,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
7653
7724
  pm_buffer_append_byte(output_buffer, ' ');
7654
7725
  prettyprint_location(output_buffer, parser, location);
7655
7726
  pm_buffer_append_string(output_buffer, " = \"", 4);
7656
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
7727
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
7657
7728
  pm_buffer_append_string(output_buffer, "\"\n", 2);
7658
7729
  }
7659
7730
 
@@ -7680,13 +7751,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
7680
7751
  pm_buffer_concat(output_buffer, prefix_buffer);
7681
7752
  pm_buffer_append_string(output_buffer, "+-- operator_loc:", 17);
7682
7753
  pm_location_t *location = &cast->operator_loc;
7683
- if (location->start == NULL) {
7754
+ if (location->length == 0) {
7684
7755
  pm_buffer_append_string(output_buffer, " nil\n", 5);
7685
7756
  } else {
7686
7757
  pm_buffer_append_byte(output_buffer, ' ');
7687
7758
  prettyprint_location(output_buffer, parser, location);
7688
7759
  pm_buffer_append_string(output_buffer, " = \"", 4);
7689
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
7760
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
7690
7761
  pm_buffer_append_string(output_buffer, "\"\n", 2);
7691
7762
  }
7692
7763
  }
@@ -7713,13 +7784,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
7713
7784
  pm_buffer_concat(output_buffer, prefix_buffer);
7714
7785
  pm_buffer_append_string(output_buffer, "+-- then_keyword_loc:", 21);
7715
7786
  pm_location_t *location = &cast->then_keyword_loc;
7716
- if (location->start == NULL) {
7787
+ if (location->length == 0) {
7717
7788
  pm_buffer_append_string(output_buffer, " nil\n", 5);
7718
7789
  } else {
7719
7790
  pm_buffer_append_byte(output_buffer, ' ');
7720
7791
  prettyprint_location(output_buffer, parser, location);
7721
7792
  pm_buffer_append_string(output_buffer, " = \"", 4);
7722
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
7793
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
7723
7794
  pm_buffer_append_string(output_buffer, "\"\n", 2);
7724
7795
  }
7725
7796
  }
@@ -7798,13 +7869,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
7798
7869
  pm_buffer_concat(output_buffer, prefix_buffer);
7799
7870
  pm_buffer_append_string(output_buffer, "+-- name_loc:", 13);
7800
7871
  pm_location_t *location = &cast->name_loc;
7801
- if (location->start == NULL) {
7872
+ if (location->length == 0) {
7802
7873
  pm_buffer_append_string(output_buffer, " nil\n", 5);
7803
7874
  } else {
7804
7875
  pm_buffer_append_byte(output_buffer, ' ');
7805
7876
  prettyprint_location(output_buffer, parser, location);
7806
7877
  pm_buffer_append_string(output_buffer, " = \"", 4);
7807
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
7878
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
7808
7879
  pm_buffer_append_string(output_buffer, "\"\n", 2);
7809
7880
  }
7810
7881
  }
@@ -7817,7 +7888,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
7817
7888
  pm_buffer_append_byte(output_buffer, ' ');
7818
7889
  prettyprint_location(output_buffer, parser, location);
7819
7890
  pm_buffer_append_string(output_buffer, " = \"", 4);
7820
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
7891
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
7821
7892
  pm_buffer_append_string(output_buffer, "\"\n", 2);
7822
7893
  }
7823
7894
 
@@ -7844,7 +7915,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
7844
7915
  pm_buffer_append_byte(output_buffer, ' ');
7845
7916
  prettyprint_location(output_buffer, parser, location);
7846
7917
  pm_buffer_append_string(output_buffer, " = \"", 4);
7847
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
7918
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
7848
7919
  pm_buffer_append_string(output_buffer, "\"\n", 2);
7849
7920
  }
7850
7921
 
@@ -7945,7 +8016,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
7945
8016
  pm_buffer_append_byte(output_buffer, ' ');
7946
8017
  prettyprint_location(output_buffer, parser, location);
7947
8018
  pm_buffer_append_string(output_buffer, " = \"", 4);
7948
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
8019
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
7949
8020
  pm_buffer_append_string(output_buffer, "\"\n", 2);
7950
8021
  }
7951
8022
 
@@ -7957,7 +8028,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
7957
8028
  pm_buffer_append_byte(output_buffer, ' ');
7958
8029
  prettyprint_location(output_buffer, parser, location);
7959
8030
  pm_buffer_append_string(output_buffer, " = \"", 4);
7960
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
8031
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
7961
8032
  pm_buffer_append_string(output_buffer, "\"\n", 2);
7962
8033
  }
7963
8034
 
@@ -7999,7 +8070,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
7999
8070
  pm_buffer_append_byte(output_buffer, ' ');
8000
8071
  prettyprint_location(output_buffer, parser, location);
8001
8072
  pm_buffer_append_string(output_buffer, " = \"", 4);
8002
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
8073
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
8003
8074
  pm_buffer_append_string(output_buffer, "\"\n", 2);
8004
8075
  }
8005
8076
 
@@ -8079,7 +8150,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
8079
8150
  pm_buffer_append_byte(output_buffer, ' ');
8080
8151
  prettyprint_location(output_buffer, parser, location);
8081
8152
  pm_buffer_append_string(output_buffer, " = \"", 4);
8082
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
8153
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
8083
8154
  pm_buffer_append_string(output_buffer, "\"\n", 2);
8084
8155
  }
8085
8156
 
@@ -8168,13 +8239,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
8168
8239
  pm_buffer_concat(output_buffer, prefix_buffer);
8169
8240
  pm_buffer_append_string(output_buffer, "+-- opening_loc:", 16);
8170
8241
  pm_location_t *location = &cast->opening_loc;
8171
- if (location->start == NULL) {
8242
+ if (location->length == 0) {
8172
8243
  pm_buffer_append_string(output_buffer, " nil\n", 5);
8173
8244
  } else {
8174
8245
  pm_buffer_append_byte(output_buffer, ' ');
8175
8246
  prettyprint_location(output_buffer, parser, location);
8176
8247
  pm_buffer_append_string(output_buffer, " = \"", 4);
8177
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
8248
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
8178
8249
  pm_buffer_append_string(output_buffer, "\"\n", 2);
8179
8250
  }
8180
8251
  }
@@ -8187,7 +8258,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
8187
8258
  pm_buffer_append_byte(output_buffer, ' ');
8188
8259
  prettyprint_location(output_buffer, parser, location);
8189
8260
  pm_buffer_append_string(output_buffer, " = \"", 4);
8190
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
8261
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
8191
8262
  pm_buffer_append_string(output_buffer, "\"\n", 2);
8192
8263
  }
8193
8264
 
@@ -8196,13 +8267,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
8196
8267
  pm_buffer_concat(output_buffer, prefix_buffer);
8197
8268
  pm_buffer_append_string(output_buffer, "+-- closing_loc:", 16);
8198
8269
  pm_location_t *location = &cast->closing_loc;
8199
- if (location->start == NULL) {
8270
+ if (location->length == 0) {
8200
8271
  pm_buffer_append_string(output_buffer, " nil\n", 5);
8201
8272
  } else {
8202
8273
  pm_buffer_append_byte(output_buffer, ' ');
8203
8274
  prettyprint_location(output_buffer, parser, location);
8204
8275
  pm_buffer_append_string(output_buffer, " = \"", 4);
8205
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
8276
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
8206
8277
  pm_buffer_append_string(output_buffer, "\"\n", 2);
8207
8278
  }
8208
8279
  }
@@ -8232,7 +8303,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
8232
8303
  pm_buffer_append_byte(output_buffer, ' ');
8233
8304
  prettyprint_location(output_buffer, parser, location);
8234
8305
  pm_buffer_append_string(output_buffer, " = \"", 4);
8235
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
8306
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
8236
8307
  pm_buffer_append_string(output_buffer, "\"\n", 2);
8237
8308
  }
8238
8309
 
@@ -8241,13 +8312,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
8241
8312
  pm_buffer_concat(output_buffer, prefix_buffer);
8242
8313
  pm_buffer_append_string(output_buffer, "+-- lparen_loc:", 15);
8243
8314
  pm_location_t *location = &cast->lparen_loc;
8244
- if (location->start == NULL) {
8315
+ if (location->length == 0) {
8245
8316
  pm_buffer_append_string(output_buffer, " nil\n", 5);
8246
8317
  } else {
8247
8318
  pm_buffer_append_byte(output_buffer, ' ');
8248
8319
  prettyprint_location(output_buffer, parser, location);
8249
8320
  pm_buffer_append_string(output_buffer, " = \"", 4);
8250
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
8321
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
8251
8322
  pm_buffer_append_string(output_buffer, "\"\n", 2);
8252
8323
  }
8253
8324
  }
@@ -8274,13 +8345,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
8274
8345
  pm_buffer_concat(output_buffer, prefix_buffer);
8275
8346
  pm_buffer_append_string(output_buffer, "+-- rparen_loc:", 15);
8276
8347
  pm_location_t *location = &cast->rparen_loc;
8277
- if (location->start == NULL) {
8348
+ if (location->length == 0) {
8278
8349
  pm_buffer_append_string(output_buffer, " nil\n", 5);
8279
8350
  } else {
8280
8351
  pm_buffer_append_byte(output_buffer, ' ');
8281
8352
  prettyprint_location(output_buffer, parser, location);
8282
8353
  pm_buffer_append_string(output_buffer, " = \"", 4);
8283
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
8354
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
8284
8355
  pm_buffer_append_string(output_buffer, "\"\n", 2);
8285
8356
  }
8286
8357
  }
@@ -8339,31 +8410,27 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
8339
8410
  pm_buffer_concat(output_buffer, prefix_buffer);
8340
8411
  pm_buffer_append_string(output_buffer, "+-- opening_loc:", 16);
8341
8412
  pm_location_t *location = &cast->opening_loc;
8342
- if (location->start == NULL) {
8413
+ if (location->length == 0) {
8343
8414
  pm_buffer_append_string(output_buffer, " nil\n", 5);
8344
8415
  } else {
8345
8416
  pm_buffer_append_byte(output_buffer, ' ');
8346
8417
  prettyprint_location(output_buffer, parser, location);
8347
8418
  pm_buffer_append_string(output_buffer, " = \"", 4);
8348
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
8419
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
8349
8420
  pm_buffer_append_string(output_buffer, "\"\n", 2);
8350
8421
  }
8351
8422
  }
8352
8423
 
8353
- // value_loc
8424
+ // content_loc
8354
8425
  {
8355
8426
  pm_buffer_concat(output_buffer, prefix_buffer);
8356
- pm_buffer_append_string(output_buffer, "+-- value_loc:", 14);
8357
- pm_location_t *location = &cast->value_loc;
8358
- if (location->start == NULL) {
8359
- pm_buffer_append_string(output_buffer, " nil\n", 5);
8360
- } else {
8361
- pm_buffer_append_byte(output_buffer, ' ');
8362
- prettyprint_location(output_buffer, parser, location);
8363
- pm_buffer_append_string(output_buffer, " = \"", 4);
8364
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
8365
- pm_buffer_append_string(output_buffer, "\"\n", 2);
8366
- }
8427
+ pm_buffer_append_string(output_buffer, "+-- content_loc:", 16);
8428
+ pm_location_t *location = &cast->content_loc;
8429
+ pm_buffer_append_byte(output_buffer, ' ');
8430
+ prettyprint_location(output_buffer, parser, location);
8431
+ pm_buffer_append_string(output_buffer, " = \"", 4);
8432
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
8433
+ pm_buffer_append_string(output_buffer, "\"\n", 2);
8367
8434
  }
8368
8435
 
8369
8436
  // closing_loc
@@ -8371,13 +8438,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
8371
8438
  pm_buffer_concat(output_buffer, prefix_buffer);
8372
8439
  pm_buffer_append_string(output_buffer, "+-- closing_loc:", 16);
8373
8440
  pm_location_t *location = &cast->closing_loc;
8374
- if (location->start == NULL) {
8441
+ if (location->length == 0) {
8375
8442
  pm_buffer_append_string(output_buffer, " nil\n", 5);
8376
8443
  } else {
8377
8444
  pm_buffer_append_byte(output_buffer, ' ');
8378
8445
  prettyprint_location(output_buffer, parser, location);
8379
8446
  pm_buffer_append_string(output_buffer, " = \"", 4);
8380
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
8447
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
8381
8448
  pm_buffer_append_string(output_buffer, "\"\n", 2);
8382
8449
  }
8383
8450
  }
@@ -8432,7 +8499,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
8432
8499
  pm_buffer_append_byte(output_buffer, ' ');
8433
8500
  prettyprint_location(output_buffer, parser, location);
8434
8501
  pm_buffer_append_string(output_buffer, " = \"", 4);
8435
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
8502
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
8436
8503
  pm_buffer_append_string(output_buffer, "\"\n", 2);
8437
8504
  }
8438
8505
 
@@ -8444,15 +8511,15 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
8444
8511
  prettyprint_location(output_buffer, parser, &node->location);
8445
8512
  pm_buffer_append_string(output_buffer, ")\n", 2);
8446
8513
 
8447
- // keyword_loc
8514
+ // unless_keyword_loc
8448
8515
  {
8449
8516
  pm_buffer_concat(output_buffer, prefix_buffer);
8450
- pm_buffer_append_string(output_buffer, "+-- keyword_loc:", 16);
8451
- pm_location_t *location = &cast->keyword_loc;
8517
+ pm_buffer_append_string(output_buffer, "+-- unless_keyword_loc:", 23);
8518
+ pm_location_t *location = &cast->unless_keyword_loc;
8452
8519
  pm_buffer_append_byte(output_buffer, ' ');
8453
8520
  prettyprint_location(output_buffer, parser, location);
8454
8521
  pm_buffer_append_string(output_buffer, " = \"", 4);
8455
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
8522
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
8456
8523
  pm_buffer_append_string(output_buffer, "\"\n", 2);
8457
8524
  }
8458
8525
 
@@ -8474,13 +8541,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
8474
8541
  pm_buffer_concat(output_buffer, prefix_buffer);
8475
8542
  pm_buffer_append_string(output_buffer, "+-- then_keyword_loc:", 21);
8476
8543
  pm_location_t *location = &cast->then_keyword_loc;
8477
- if (location->start == NULL) {
8544
+ if (location->length == 0) {
8478
8545
  pm_buffer_append_string(output_buffer, " nil\n", 5);
8479
8546
  } else {
8480
8547
  pm_buffer_append_byte(output_buffer, ' ');
8481
8548
  prettyprint_location(output_buffer, parser, location);
8482
8549
  pm_buffer_append_string(output_buffer, " = \"", 4);
8483
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
8550
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
8484
8551
  pm_buffer_append_string(output_buffer, "\"\n", 2);
8485
8552
  }
8486
8553
  }
@@ -8524,13 +8591,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
8524
8591
  pm_buffer_concat(output_buffer, prefix_buffer);
8525
8592
  pm_buffer_append_string(output_buffer, "+-- end_keyword_loc:", 20);
8526
8593
  pm_location_t *location = &cast->end_keyword_loc;
8527
- if (location->start == NULL) {
8594
+ if (location->length == 0) {
8528
8595
  pm_buffer_append_string(output_buffer, " nil\n", 5);
8529
8596
  } else {
8530
8597
  pm_buffer_append_byte(output_buffer, ' ');
8531
8598
  prettyprint_location(output_buffer, parser, location);
8532
8599
  pm_buffer_append_string(output_buffer, " = \"", 4);
8533
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
8600
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
8534
8601
  pm_buffer_append_string(output_buffer, "\"\n", 2);
8535
8602
  }
8536
8603
  }
@@ -8557,15 +8624,15 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
8557
8624
  pm_buffer_append_byte(output_buffer, '\n');
8558
8625
  }
8559
8626
 
8560
- // keyword_loc
8627
+ // until_keyword_loc
8561
8628
  {
8562
8629
  pm_buffer_concat(output_buffer, prefix_buffer);
8563
- pm_buffer_append_string(output_buffer, "+-- keyword_loc:", 16);
8564
- pm_location_t *location = &cast->keyword_loc;
8630
+ pm_buffer_append_string(output_buffer, "+-- until_keyword_loc:", 22);
8631
+ pm_location_t *location = &cast->until_keyword_loc;
8565
8632
  pm_buffer_append_byte(output_buffer, ' ');
8566
8633
  prettyprint_location(output_buffer, parser, location);
8567
8634
  pm_buffer_append_string(output_buffer, " = \"", 4);
8568
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
8635
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
8569
8636
  pm_buffer_append_string(output_buffer, "\"\n", 2);
8570
8637
  }
8571
8638
 
@@ -8574,29 +8641,29 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
8574
8641
  pm_buffer_concat(output_buffer, prefix_buffer);
8575
8642
  pm_buffer_append_string(output_buffer, "+-- do_keyword_loc:", 19);
8576
8643
  pm_location_t *location = &cast->do_keyword_loc;
8577
- if (location->start == NULL) {
8644
+ if (location->length == 0) {
8578
8645
  pm_buffer_append_string(output_buffer, " nil\n", 5);
8579
8646
  } else {
8580
8647
  pm_buffer_append_byte(output_buffer, ' ');
8581
8648
  prettyprint_location(output_buffer, parser, location);
8582
8649
  pm_buffer_append_string(output_buffer, " = \"", 4);
8583
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
8650
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
8584
8651
  pm_buffer_append_string(output_buffer, "\"\n", 2);
8585
8652
  }
8586
8653
  }
8587
8654
 
8588
- // closing_loc
8655
+ // end_keyword_loc
8589
8656
  {
8590
8657
  pm_buffer_concat(output_buffer, prefix_buffer);
8591
- pm_buffer_append_string(output_buffer, "+-- closing_loc:", 16);
8592
- pm_location_t *location = &cast->closing_loc;
8593
- if (location->start == NULL) {
8658
+ pm_buffer_append_string(output_buffer, "+-- end_keyword_loc:", 20);
8659
+ pm_location_t *location = &cast->end_keyword_loc;
8660
+ if (location->length == 0) {
8594
8661
  pm_buffer_append_string(output_buffer, " nil\n", 5);
8595
8662
  } else {
8596
8663
  pm_buffer_append_byte(output_buffer, ' ');
8597
8664
  prettyprint_location(output_buffer, parser, location);
8598
8665
  pm_buffer_append_string(output_buffer, " = \"", 4);
8599
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
8666
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
8600
8667
  pm_buffer_append_string(output_buffer, "\"\n", 2);
8601
8668
  }
8602
8669
  }
@@ -8639,15 +8706,15 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
8639
8706
  prettyprint_location(output_buffer, parser, &node->location);
8640
8707
  pm_buffer_append_string(output_buffer, ")\n", 2);
8641
8708
 
8642
- // keyword_loc
8709
+ // when_keyword_loc
8643
8710
  {
8644
8711
  pm_buffer_concat(output_buffer, prefix_buffer);
8645
- pm_buffer_append_string(output_buffer, "+-- keyword_loc:", 16);
8646
- pm_location_t *location = &cast->keyword_loc;
8712
+ pm_buffer_append_string(output_buffer, "+-- when_keyword_loc:", 21);
8713
+ pm_location_t *location = &cast->when_keyword_loc;
8647
8714
  pm_buffer_append_byte(output_buffer, ' ');
8648
8715
  prettyprint_location(output_buffer, parser, location);
8649
8716
  pm_buffer_append_string(output_buffer, " = \"", 4);
8650
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
8717
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
8651
8718
  pm_buffer_append_string(output_buffer, "\"\n", 2);
8652
8719
  }
8653
8720
 
@@ -8674,13 +8741,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
8674
8741
  pm_buffer_concat(output_buffer, prefix_buffer);
8675
8742
  pm_buffer_append_string(output_buffer, "+-- then_keyword_loc:", 21);
8676
8743
  pm_location_t *location = &cast->then_keyword_loc;
8677
- if (location->start == NULL) {
8744
+ if (location->length == 0) {
8678
8745
  pm_buffer_append_string(output_buffer, " nil\n", 5);
8679
8746
  } else {
8680
8747
  pm_buffer_append_byte(output_buffer, ' ');
8681
8748
  prettyprint_location(output_buffer, parser, location);
8682
8749
  pm_buffer_append_string(output_buffer, " = \"", 4);
8683
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
8750
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
8684
8751
  pm_buffer_append_string(output_buffer, "\"\n", 2);
8685
8752
  }
8686
8753
  }
@@ -8724,15 +8791,15 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
8724
8791
  pm_buffer_append_byte(output_buffer, '\n');
8725
8792
  }
8726
8793
 
8727
- // keyword_loc
8794
+ // while_keyword_loc
8728
8795
  {
8729
8796
  pm_buffer_concat(output_buffer, prefix_buffer);
8730
- pm_buffer_append_string(output_buffer, "+-- keyword_loc:", 16);
8731
- pm_location_t *location = &cast->keyword_loc;
8797
+ pm_buffer_append_string(output_buffer, "+-- while_keyword_loc:", 22);
8798
+ pm_location_t *location = &cast->while_keyword_loc;
8732
8799
  pm_buffer_append_byte(output_buffer, ' ');
8733
8800
  prettyprint_location(output_buffer, parser, location);
8734
8801
  pm_buffer_append_string(output_buffer, " = \"", 4);
8735
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
8802
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
8736
8803
  pm_buffer_append_string(output_buffer, "\"\n", 2);
8737
8804
  }
8738
8805
 
@@ -8741,29 +8808,29 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
8741
8808
  pm_buffer_concat(output_buffer, prefix_buffer);
8742
8809
  pm_buffer_append_string(output_buffer, "+-- do_keyword_loc:", 19);
8743
8810
  pm_location_t *location = &cast->do_keyword_loc;
8744
- if (location->start == NULL) {
8811
+ if (location->length == 0) {
8745
8812
  pm_buffer_append_string(output_buffer, " nil\n", 5);
8746
8813
  } else {
8747
8814
  pm_buffer_append_byte(output_buffer, ' ');
8748
8815
  prettyprint_location(output_buffer, parser, location);
8749
8816
  pm_buffer_append_string(output_buffer, " = \"", 4);
8750
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
8817
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
8751
8818
  pm_buffer_append_string(output_buffer, "\"\n", 2);
8752
8819
  }
8753
8820
  }
8754
8821
 
8755
- // closing_loc
8822
+ // end_keyword_loc
8756
8823
  {
8757
8824
  pm_buffer_concat(output_buffer, prefix_buffer);
8758
- pm_buffer_append_string(output_buffer, "+-- closing_loc:", 16);
8759
- pm_location_t *location = &cast->closing_loc;
8760
- if (location->start == NULL) {
8825
+ pm_buffer_append_string(output_buffer, "+-- end_keyword_loc:", 20);
8826
+ pm_location_t *location = &cast->end_keyword_loc;
8827
+ if (location->length == 0) {
8761
8828
  pm_buffer_append_string(output_buffer, " nil\n", 5);
8762
8829
  } else {
8763
8830
  pm_buffer_append_byte(output_buffer, ' ');
8764
8831
  prettyprint_location(output_buffer, parser, location);
8765
8832
  pm_buffer_append_string(output_buffer, " = \"", 4);
8766
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
8833
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
8767
8834
  pm_buffer_append_string(output_buffer, "\"\n", 2);
8768
8835
  }
8769
8836
  }
@@ -8833,7 +8900,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
8833
8900
  pm_buffer_append_byte(output_buffer, ' ');
8834
8901
  prettyprint_location(output_buffer, parser, location);
8835
8902
  pm_buffer_append_string(output_buffer, " = \"", 4);
8836
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
8903
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
8837
8904
  pm_buffer_append_string(output_buffer, "\"\n", 2);
8838
8905
  }
8839
8906
 
@@ -8845,7 +8912,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
8845
8912
  pm_buffer_append_byte(output_buffer, ' ');
8846
8913
  prettyprint_location(output_buffer, parser, location);
8847
8914
  pm_buffer_append_string(output_buffer, " = \"", 4);
8848
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
8915
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
8849
8916
  pm_buffer_append_string(output_buffer, "\"\n", 2);
8850
8917
  }
8851
8918
 
@@ -8857,7 +8924,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
8857
8924
  pm_buffer_append_byte(output_buffer, ' ');
8858
8925
  prettyprint_location(output_buffer, parser, location);
8859
8926
  pm_buffer_append_string(output_buffer, " = \"", 4);
8860
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
8927
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
8861
8928
  pm_buffer_append_string(output_buffer, "\"\n", 2);
8862
8929
  }
8863
8930
 
@@ -8886,7 +8953,7 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
8886
8953
  pm_buffer_append_byte(output_buffer, ' ');
8887
8954
  prettyprint_location(output_buffer, parser, location);
8888
8955
  pm_buffer_append_string(output_buffer, " = \"", 4);
8889
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
8956
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
8890
8957
  pm_buffer_append_string(output_buffer, "\"\n", 2);
8891
8958
  }
8892
8959
 
@@ -8895,13 +8962,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
8895
8962
  pm_buffer_concat(output_buffer, prefix_buffer);
8896
8963
  pm_buffer_append_string(output_buffer, "+-- lparen_loc:", 15);
8897
8964
  pm_location_t *location = &cast->lparen_loc;
8898
- if (location->start == NULL) {
8965
+ if (location->length == 0) {
8899
8966
  pm_buffer_append_string(output_buffer, " nil\n", 5);
8900
8967
  } else {
8901
8968
  pm_buffer_append_byte(output_buffer, ' ');
8902
8969
  prettyprint_location(output_buffer, parser, location);
8903
8970
  pm_buffer_append_string(output_buffer, " = \"", 4);
8904
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
8971
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
8905
8972
  pm_buffer_append_string(output_buffer, "\"\n", 2);
8906
8973
  }
8907
8974
  }
@@ -8928,13 +8995,13 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
8928
8995
  pm_buffer_concat(output_buffer, prefix_buffer);
8929
8996
  pm_buffer_append_string(output_buffer, "+-- rparen_loc:", 15);
8930
8997
  pm_location_t *location = &cast->rparen_loc;
8931
- if (location->start == NULL) {
8998
+ if (location->length == 0) {
8932
8999
  pm_buffer_append_string(output_buffer, " nil\n", 5);
8933
9000
  } else {
8934
9001
  pm_buffer_append_byte(output_buffer, ' ');
8935
9002
  prettyprint_location(output_buffer, parser, location);
8936
9003
  pm_buffer_append_string(output_buffer, " = \"", 4);
8937
- pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
9004
+ pm_buffer_append_source(output_buffer, parser->start + location->start, (size_t) location->length, PM_BUFFER_ESCAPING_RUBY);
8938
9005
  pm_buffer_append_string(output_buffer, "\"\n", 2);
8939
9006
  }
8940
9007
  }
@@ -8947,11 +9014,11 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
8947
9014
  /**
8948
9015
  * Pretty-prints the AST represented by the given node to the given buffer.
8949
9016
  */
8950
- PRISM_EXPORTED_FUNCTION void
9017
+ void
8951
9018
  pm_prettyprint(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm_node_t *node) {
8952
9019
  pm_buffer_t prefix_buffer = { 0 };
8953
9020
  prettyprint_node(output_buffer, parser, node, &prefix_buffer);
8954
- pm_buffer_free(&prefix_buffer);
9021
+ pm_buffer_cleanup(&prefix_buffer);
8955
9022
  }
8956
9023
 
8957
9024
  #endif