herb 0.7.5 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +8 -5
  3. data/config.yml +26 -6
  4. data/ext/herb/error_helpers.c +57 -3
  5. data/ext/herb/error_helpers.h +1 -1
  6. data/ext/herb/extconf.rb +1 -0
  7. data/ext/herb/extension.c +10 -24
  8. data/ext/herb/extension_helpers.c +3 -3
  9. data/ext/herb/extension_helpers.h +1 -1
  10. data/ext/herb/nodes.c +72 -37
  11. data/herb.gemspec +0 -2
  12. data/lib/herb/ast/helpers.rb +11 -0
  13. data/lib/herb/ast/node.rb +15 -6
  14. data/lib/herb/ast/nodes.rb +609 -392
  15. data/lib/herb/cli.rb +31 -0
  16. data/lib/herb/colors.rb +82 -0
  17. data/lib/herb/engine/compiler.rb +140 -14
  18. data/lib/herb/engine/debug_visitor.rb +1 -5
  19. data/lib/herb/engine/parser_error_overlay.rb +1 -1
  20. data/lib/herb/engine.rb +8 -14
  21. data/lib/herb/errors.rb +166 -56
  22. data/lib/herb/location.rb +2 -2
  23. data/lib/herb/project.rb +86 -21
  24. data/lib/herb/token.rb +14 -2
  25. data/lib/herb/version.rb +1 -1
  26. data/lib/herb.rb +1 -0
  27. data/sig/herb/ast/helpers.rbs +3 -0
  28. data/sig/herb/ast/node.rbs +12 -5
  29. data/sig/herb/ast/nodes.rbs +124 -62
  30. data/sig/herb/colors.rbs +35 -0
  31. data/sig/herb/engine/compiler.rbs +23 -1
  32. data/sig/herb/errors.rbs +74 -20
  33. data/sig/herb/token.rbs +8 -0
  34. data/sig/herb_c_extension.rbs +1 -1
  35. data/sig/serialized_ast_errors.rbs +8 -0
  36. data/src/analyze.c +420 -171
  37. data/src/analyze_helpers.c +5 -0
  38. data/src/analyze_missing_end.c +147 -0
  39. data/src/analyze_transform.c +196 -0
  40. data/src/analyzed_ruby.c +23 -2
  41. data/src/ast_node.c +5 -5
  42. data/src/ast_nodes.c +179 -179
  43. data/src/ast_pretty_print.c +232 -232
  44. data/src/element_source.c +7 -6
  45. data/src/errors.c +246 -126
  46. data/src/extract.c +92 -34
  47. data/src/herb.c +37 -49
  48. data/src/html_util.c +34 -96
  49. data/src/include/analyze.h +10 -2
  50. data/src/include/analyze_helpers.h +3 -0
  51. data/src/include/analyzed_ruby.h +4 -2
  52. data/src/include/ast_node.h +2 -2
  53. data/src/include/ast_nodes.h +67 -66
  54. data/src/include/ast_pretty_print.h +2 -2
  55. data/src/include/element_source.h +3 -1
  56. data/src/include/errors.h +30 -14
  57. data/src/include/extract.h +4 -4
  58. data/src/include/herb.h +6 -7
  59. data/src/include/html_util.h +4 -5
  60. data/src/include/lexer.h +1 -3
  61. data/src/include/lexer_peek_helpers.h +14 -14
  62. data/src/include/lexer_struct.h +3 -2
  63. data/src/include/macros.h +4 -0
  64. data/src/include/parser.h +12 -6
  65. data/src/include/parser_helpers.h +25 -15
  66. data/src/include/pretty_print.h +38 -28
  67. data/src/include/token.h +5 -8
  68. data/src/include/utf8.h +3 -2
  69. data/src/include/util/hb_arena.h +31 -0
  70. data/src/include/util/hb_arena_debug.h +8 -0
  71. data/src/include/util/hb_array.h +33 -0
  72. data/src/include/util/hb_buffer.h +34 -0
  73. data/src/include/util/hb_string.h +29 -0
  74. data/src/include/util/hb_system.h +9 -0
  75. data/src/include/util.h +3 -14
  76. data/src/include/version.h +1 -1
  77. data/src/include/visitor.h +1 -1
  78. data/src/io.c +7 -4
  79. data/src/lexer.c +61 -88
  80. data/src/lexer_peek_helpers.c +35 -37
  81. data/src/main.c +19 -23
  82. data/src/parser.c +282 -201
  83. data/src/parser_helpers.c +46 -40
  84. data/src/parser_match_tags.c +316 -0
  85. data/src/pretty_print.c +82 -106
  86. data/src/token.c +18 -65
  87. data/src/utf8.c +4 -4
  88. data/src/util/hb_arena.c +179 -0
  89. data/src/util/hb_arena_debug.c +237 -0
  90. data/src/{array.c → util/hb_array.c} +26 -27
  91. data/src/util/hb_buffer.c +203 -0
  92. data/src/util/hb_string.c +85 -0
  93. data/src/util/hb_system.c +30 -0
  94. data/src/util.c +29 -99
  95. data/src/visitor.c +54 -54
  96. data/templates/ext/herb/error_helpers.c.erb +3 -3
  97. data/templates/ext/herb/error_helpers.h.erb +1 -1
  98. data/templates/ext/herb/nodes.c.erb +11 -6
  99. data/templates/java/error_helpers.c.erb +75 -0
  100. data/templates/java/error_helpers.h.erb +20 -0
  101. data/templates/java/nodes.c.erb +97 -0
  102. data/templates/java/nodes.h.erb +23 -0
  103. data/templates/java/org/herb/ast/Errors.java.erb +121 -0
  104. data/templates/java/org/herb/ast/NodeVisitor.java.erb +14 -0
  105. data/templates/java/org/herb/ast/Nodes.java.erb +220 -0
  106. data/templates/java/org/herb/ast/Visitor.java.erb +56 -0
  107. data/templates/javascript/packages/node/extension/error_helpers.cpp.erb +8 -8
  108. data/templates/javascript/packages/node/extension/error_helpers.h.erb +1 -1
  109. data/templates/javascript/packages/node/extension/nodes.cpp.erb +9 -9
  110. data/templates/javascript/packages/node/extension/nodes.h.erb +1 -1
  111. data/templates/lib/herb/ast/nodes.rb.erb +28 -16
  112. data/templates/lib/herb/errors.rb.erb +17 -12
  113. data/templates/rust/src/ast/nodes.rs.erb +220 -0
  114. data/templates/rust/src/errors.rs.erb +216 -0
  115. data/templates/rust/src/nodes.rs.erb +374 -0
  116. data/templates/src/analyze_missing_end.c.erb +36 -0
  117. data/templates/src/analyze_transform.c.erb +24 -0
  118. data/templates/src/ast_nodes.c.erb +14 -14
  119. data/templates/src/ast_pretty_print.c.erb +36 -36
  120. data/templates/src/errors.c.erb +31 -31
  121. data/templates/src/include/ast_nodes.h.erb +10 -9
  122. data/templates/src/include/ast_pretty_print.h.erb +2 -2
  123. data/templates/src/include/errors.h.erb +6 -6
  124. data/templates/src/parser_match_tags.c.erb +38 -0
  125. data/templates/src/visitor.c.erb +4 -4
  126. data/templates/template.rb +22 -3
  127. data/templates/wasm/error_helpers.cpp.erb +9 -9
  128. data/templates/wasm/error_helpers.h.erb +1 -1
  129. data/templates/wasm/nodes.cpp.erb +9 -9
  130. data/templates/wasm/nodes.h.erb +1 -1
  131. data/vendor/prism/Rakefile +4 -1
  132. data/vendor/prism/config.yml +2 -1
  133. data/vendor/prism/include/prism/ast.h +31 -1
  134. data/vendor/prism/include/prism/diagnostic.h +1 -0
  135. data/vendor/prism/include/prism/version.h +3 -3
  136. data/vendor/prism/src/diagnostic.c +3 -1
  137. data/vendor/prism/src/prism.c +130 -71
  138. data/vendor/prism/src/util/pm_string.c +6 -8
  139. data/vendor/prism/templates/include/prism/ast.h.erb +2 -0
  140. data/vendor/prism/templates/java/org/prism/Loader.java.erb +2 -2
  141. data/vendor/prism/templates/javascript/src/deserialize.js.erb +2 -2
  142. data/vendor/prism/templates/lib/prism/serialize.rb.erb +2 -2
  143. data/vendor/prism/templates/sig/prism.rbs.erb +4 -0
  144. data/vendor/prism/templates/src/diagnostic.c.erb +1 -0
  145. metadata +34 -20
  146. data/lib/herb/libherb/array.rb +0 -51
  147. data/lib/herb/libherb/ast_node.rb +0 -50
  148. data/lib/herb/libherb/buffer.rb +0 -56
  149. data/lib/herb/libherb/extract_result.rb +0 -20
  150. data/lib/herb/libherb/lex_result.rb +0 -32
  151. data/lib/herb/libherb/libherb.rb +0 -52
  152. data/lib/herb/libherb/parse_result.rb +0 -20
  153. data/lib/herb/libherb/token.rb +0 -46
  154. data/lib/herb/libherb.rb +0 -35
  155. data/src/buffer.c +0 -241
  156. data/src/include/array.h +0 -33
  157. data/src/include/buffer.h +0 -39
  158. data/src/include/json.h +0 -28
  159. data/src/include/memory.h +0 -12
  160. data/src/json.c +0 -205
  161. data/src/memory.c +0 -53
@@ -3,63 +3,63 @@
3
3
 
4
4
  #include "include/ast_node.h"
5
5
  #include "include/ast_nodes.h"
6
- #include "include/buffer.h"
7
6
  #include "include/errors.h"
8
7
  #include "include/pretty_print.h"
9
8
  #include "include/token_struct.h"
10
9
  #include "include/util.h"
10
+ #include "include/util/hb_buffer.h"
11
11
 
12
12
  #include <stdio.h>
13
13
  #include <stdlib.h>
14
14
  #include <stdbool.h>
15
15
 
16
- void ast_pretty_print_node(AST_NODE_T* node, const size_t indent, const size_t relative_indent, buffer_T* buffer) {
16
+ void ast_pretty_print_node(AST_NODE_T* node, const size_t indent, const size_t relative_indent, hb_buffer_T* buffer) {
17
17
  if (!node) { return; }
18
18
 
19
19
  bool print_location = true;
20
20
 
21
- buffer_append(buffer, "@ ");
22
- buffer_append(buffer, ast_node_human_type(node));
23
- buffer_append(buffer, " ");
21
+ hb_buffer_append(buffer, "@ ");
22
+ hb_buffer_append_string(buffer, ast_node_human_type(node));
23
+ hb_buffer_append(buffer, " ");
24
24
 
25
25
  if (print_location) { pretty_print_location(node->location, buffer); }
26
26
 
27
- buffer_append(buffer, "\n");
27
+ hb_buffer_append(buffer, "\n");
28
28
 
29
29
  switch (node->type) {
30
30
  case AST_DOCUMENT_NODE: {
31
31
  const AST_DOCUMENT_NODE_T* document_node = (AST_DOCUMENT_NODE_T*) node;
32
32
 
33
33
  pretty_print_errors(node, indent, relative_indent, false, buffer);
34
- pretty_print_array("children", document_node->children, indent, relative_indent, true, buffer);
34
+ pretty_print_array(hb_string("children"), document_node->children, indent, relative_indent, true, buffer);
35
35
  } break;
36
36
 
37
37
  case AST_LITERAL_NODE: {
38
38
  const AST_LITERAL_NODE_T* literal_node = (AST_LITERAL_NODE_T*) node;
39
39
 
40
40
  pretty_print_errors(node, indent, relative_indent, false, buffer);
41
- pretty_print_string_property(literal_node->content, "content", indent, relative_indent, true, buffer);
41
+ pretty_print_string_property(hb_string(literal_node->content), hb_string("content"), indent, relative_indent, true, buffer);
42
42
  } break;
43
43
 
44
44
  case AST_HTML_OPEN_TAG_NODE: {
45
45
  const AST_HTML_OPEN_TAG_NODE_T* html_open_tag_node = (AST_HTML_OPEN_TAG_NODE_T*) node;
46
46
 
47
47
  pretty_print_errors(node, indent, relative_indent, false, buffer);
48
- pretty_print_token_property(html_open_tag_node->tag_opening, "tag_opening", indent, relative_indent, false, buffer);
49
- pretty_print_token_property(html_open_tag_node->tag_name, "tag_name", indent, relative_indent, false, buffer);
50
- pretty_print_token_property(html_open_tag_node->tag_closing, "tag_closing", indent, relative_indent, false, buffer);
51
- pretty_print_array("children", html_open_tag_node->children, indent, relative_indent, false, buffer);
52
- pretty_print_boolean_property("is_void", html_open_tag_node->is_void, indent, relative_indent, true, buffer);
48
+ pretty_print_token_property(html_open_tag_node->tag_opening, hb_string("tag_opening"), indent, relative_indent, false, buffer);
49
+ pretty_print_token_property(html_open_tag_node->tag_name, hb_string("tag_name"), indent, relative_indent, false, buffer);
50
+ pretty_print_token_property(html_open_tag_node->tag_closing, hb_string("tag_closing"), indent, relative_indent, false, buffer);
51
+ pretty_print_array(hb_string("children"), html_open_tag_node->children, indent, relative_indent, false, buffer);
52
+ pretty_print_boolean_property(hb_string("is_void"), html_open_tag_node->is_void, indent, relative_indent, true, buffer);
53
53
  } break;
54
54
 
55
55
  case AST_HTML_CLOSE_TAG_NODE: {
56
56
  const AST_HTML_CLOSE_TAG_NODE_T* html_close_tag_node = (AST_HTML_CLOSE_TAG_NODE_T*) node;
57
57
 
58
58
  pretty_print_errors(node, indent, relative_indent, false, buffer);
59
- pretty_print_token_property(html_close_tag_node->tag_opening, "tag_opening", indent, relative_indent, false, buffer);
60
- pretty_print_token_property(html_close_tag_node->tag_name, "tag_name", indent, relative_indent, false, buffer);
61
- pretty_print_array("children", html_close_tag_node->children, indent, relative_indent, false, buffer);
62
- pretty_print_token_property(html_close_tag_node->tag_closing, "tag_closing", indent, relative_indent, true, buffer);
59
+ pretty_print_token_property(html_close_tag_node->tag_opening, hb_string("tag_opening"), indent, relative_indent, false, buffer);
60
+ pretty_print_token_property(html_close_tag_node->tag_name, hb_string("tag_name"), indent, relative_indent, false, buffer);
61
+ pretty_print_array(hb_string("children"), html_close_tag_node->children, indent, relative_indent, false, buffer);
62
+ pretty_print_token_property(html_close_tag_node->tag_closing, hb_string("tag_closing"), indent, relative_indent, true, buffer);
63
63
  } break;
64
64
 
65
65
  case AST_HTML_ELEMENT_NODE: {
@@ -67,56 +67,56 @@ void ast_pretty_print_node(AST_NODE_T* node, const size_t indent, const size_t r
67
67
 
68
68
  pretty_print_errors(node, indent, relative_indent, false, buffer);
69
69
 
70
- pretty_print_label("open_tag", indent, relative_indent, false, buffer);
70
+ pretty_print_label(hb_string("open_tag"), indent, relative_indent, false, buffer);
71
71
 
72
72
  if (html_element_node->open_tag) {
73
- buffer_append(buffer, "\n");
73
+ hb_buffer_append(buffer, "\n");
74
74
  pretty_print_indent(buffer, indent);
75
75
  pretty_print_indent(buffer, relative_indent + 1);
76
76
 
77
- buffer_append(buffer, "└── ");
77
+ hb_buffer_append(buffer, "└── ");
78
78
  ast_pretty_print_node((AST_NODE_T*) html_element_node->open_tag, indent, relative_indent + 2, buffer);
79
79
  } else {
80
- buffer_append(buffer, " ∅\n");
80
+ hb_buffer_append(buffer, " ∅\n");
81
81
  }
82
- buffer_append(buffer, "\n");
82
+ hb_buffer_append(buffer, "\n");
83
83
 
84
- pretty_print_token_property(html_element_node->tag_name, "tag_name", indent, relative_indent, false, buffer);
85
- pretty_print_array("body", html_element_node->body, indent, relative_indent, false, buffer);
84
+ pretty_print_token_property(html_element_node->tag_name, hb_string("tag_name"), indent, relative_indent, false, buffer);
85
+ pretty_print_array(hb_string("body"), html_element_node->body, indent, relative_indent, false, buffer);
86
86
 
87
- pretty_print_label("close_tag", indent, relative_indent, false, buffer);
87
+ pretty_print_label(hb_string("close_tag"), indent, relative_indent, false, buffer);
88
88
 
89
89
  if (html_element_node->close_tag) {
90
- buffer_append(buffer, "\n");
90
+ hb_buffer_append(buffer, "\n");
91
91
  pretty_print_indent(buffer, indent);
92
92
  pretty_print_indent(buffer, relative_indent + 1);
93
93
 
94
- buffer_append(buffer, "└── ");
94
+ hb_buffer_append(buffer, "└── ");
95
95
  ast_pretty_print_node((AST_NODE_T*) html_element_node->close_tag, indent, relative_indent + 2, buffer);
96
96
  } else {
97
- buffer_append(buffer, " ∅\n");
97
+ hb_buffer_append(buffer, " ∅\n");
98
98
  }
99
- buffer_append(buffer, "\n");
99
+ hb_buffer_append(buffer, "\n");
100
100
 
101
- pretty_print_boolean_property("is_void", html_element_node->is_void, indent, relative_indent, false, buffer);
102
- pretty_print_string_property(element_source_to_string(html_element_node->source), "source", indent, relative_indent, true, buffer);
101
+ pretty_print_boolean_property(hb_string("is_void"), html_element_node->is_void, indent, relative_indent, false, buffer);
102
+ pretty_print_string_property(element_source_to_string(html_element_node->source), hb_string("source"), indent, relative_indent, true, buffer);
103
103
  } break;
104
104
 
105
105
  case AST_HTML_ATTRIBUTE_VALUE_NODE: {
106
106
  const AST_HTML_ATTRIBUTE_VALUE_NODE_T* html_attribute_value_node = (AST_HTML_ATTRIBUTE_VALUE_NODE_T*) node;
107
107
 
108
108
  pretty_print_errors(node, indent, relative_indent, false, buffer);
109
- pretty_print_token_property(html_attribute_value_node->open_quote, "open_quote", indent, relative_indent, false, buffer);
110
- pretty_print_array("children", html_attribute_value_node->children, indent, relative_indent, false, buffer);
111
- pretty_print_token_property(html_attribute_value_node->close_quote, "close_quote", indent, relative_indent, false, buffer);
112
- pretty_print_boolean_property("quoted", html_attribute_value_node->quoted, indent, relative_indent, true, buffer);
109
+ pretty_print_token_property(html_attribute_value_node->open_quote, hb_string("open_quote"), indent, relative_indent, false, buffer);
110
+ pretty_print_array(hb_string("children"), html_attribute_value_node->children, indent, relative_indent, false, buffer);
111
+ pretty_print_token_property(html_attribute_value_node->close_quote, hb_string("close_quote"), indent, relative_indent, false, buffer);
112
+ pretty_print_boolean_property(hb_string("quoted"), html_attribute_value_node->quoted, indent, relative_indent, true, buffer);
113
113
  } break;
114
114
 
115
115
  case AST_HTML_ATTRIBUTE_NAME_NODE: {
116
116
  const AST_HTML_ATTRIBUTE_NAME_NODE_T* html_attribute_name_node = (AST_HTML_ATTRIBUTE_NAME_NODE_T*) node;
117
117
 
118
118
  pretty_print_errors(node, indent, relative_indent, false, buffer);
119
- pretty_print_array("children", html_attribute_name_node->children, indent, relative_indent, true, buffer);
119
+ pretty_print_array(hb_string("children"), html_attribute_name_node->children, indent, relative_indent, true, buffer);
120
120
  } break;
121
121
 
122
122
  case AST_HTML_ATTRIBUTE_NODE: {
@@ -124,35 +124,35 @@ void ast_pretty_print_node(AST_NODE_T* node, const size_t indent, const size_t r
124
124
 
125
125
  pretty_print_errors(node, indent, relative_indent, false, buffer);
126
126
 
127
- pretty_print_label("name", indent, relative_indent, false, buffer);
127
+ pretty_print_label(hb_string("name"), indent, relative_indent, false, buffer);
128
128
 
129
129
  if (html_attribute_node->name) {
130
- buffer_append(buffer, "\n");
130
+ hb_buffer_append(buffer, "\n");
131
131
  pretty_print_indent(buffer, indent);
132
132
  pretty_print_indent(buffer, relative_indent + 1);
133
133
 
134
- buffer_append(buffer, "└── ");
134
+ hb_buffer_append(buffer, "└── ");
135
135
  ast_pretty_print_node((AST_NODE_T*) html_attribute_node->name, indent, relative_indent + 2, buffer);
136
136
  } else {
137
- buffer_append(buffer, " ∅\n");
137
+ hb_buffer_append(buffer, " ∅\n");
138
138
  }
139
- buffer_append(buffer, "\n");
139
+ hb_buffer_append(buffer, "\n");
140
140
 
141
- pretty_print_token_property(html_attribute_node->equals, "equals", indent, relative_indent, false, buffer);
141
+ pretty_print_token_property(html_attribute_node->equals, hb_string("equals"), indent, relative_indent, false, buffer);
142
142
 
143
- pretty_print_label("value", indent, relative_indent, true, buffer);
143
+ pretty_print_label(hb_string("value"), indent, relative_indent, true, buffer);
144
144
 
145
145
  if (html_attribute_node->value) {
146
- buffer_append(buffer, "\n");
146
+ hb_buffer_append(buffer, "\n");
147
147
  pretty_print_indent(buffer, indent);
148
148
  pretty_print_indent(buffer, relative_indent + 1);
149
149
 
150
- buffer_append(buffer, "└── ");
150
+ hb_buffer_append(buffer, "└── ");
151
151
  ast_pretty_print_node((AST_NODE_T*) html_attribute_node->value, indent, relative_indent + 2, buffer);
152
152
  } else {
153
- buffer_append(buffer, " ∅\n");
153
+ hb_buffer_append(buffer, " ∅\n");
154
154
  }
155
- buffer_append(buffer, "\n");
155
+ hb_buffer_append(buffer, "\n");
156
156
 
157
157
  } break;
158
158
 
@@ -160,140 +160,140 @@ void ast_pretty_print_node(AST_NODE_T* node, const size_t indent, const size_t r
160
160
  const AST_HTML_TEXT_NODE_T* html_text_node = (AST_HTML_TEXT_NODE_T*) node;
161
161
 
162
162
  pretty_print_errors(node, indent, relative_indent, false, buffer);
163
- pretty_print_string_property(html_text_node->content, "content", indent, relative_indent, true, buffer);
163
+ pretty_print_string_property(hb_string(html_text_node->content), hb_string("content"), indent, relative_indent, true, buffer);
164
164
  } break;
165
165
 
166
166
  case AST_HTML_COMMENT_NODE: {
167
167
  const AST_HTML_COMMENT_NODE_T* html_comment_node = (AST_HTML_COMMENT_NODE_T*) node;
168
168
 
169
169
  pretty_print_errors(node, indent, relative_indent, false, buffer);
170
- pretty_print_token_property(html_comment_node->comment_start, "comment_start", indent, relative_indent, false, buffer);
171
- pretty_print_array("children", html_comment_node->children, indent, relative_indent, false, buffer);
172
- pretty_print_token_property(html_comment_node->comment_end, "comment_end", indent, relative_indent, true, buffer);
170
+ pretty_print_token_property(html_comment_node->comment_start, hb_string("comment_start"), indent, relative_indent, false, buffer);
171
+ pretty_print_array(hb_string("children"), html_comment_node->children, indent, relative_indent, false, buffer);
172
+ pretty_print_token_property(html_comment_node->comment_end, hb_string("comment_end"), indent, relative_indent, true, buffer);
173
173
  } break;
174
174
 
175
175
  case AST_HTML_DOCTYPE_NODE: {
176
176
  const AST_HTML_DOCTYPE_NODE_T* html_doctype_node = (AST_HTML_DOCTYPE_NODE_T*) node;
177
177
 
178
178
  pretty_print_errors(node, indent, relative_indent, false, buffer);
179
- pretty_print_token_property(html_doctype_node->tag_opening, "tag_opening", indent, relative_indent, false, buffer);
180
- pretty_print_array("children", html_doctype_node->children, indent, relative_indent, false, buffer);
181
- pretty_print_token_property(html_doctype_node->tag_closing, "tag_closing", indent, relative_indent, true, buffer);
179
+ pretty_print_token_property(html_doctype_node->tag_opening, hb_string("tag_opening"), indent, relative_indent, false, buffer);
180
+ pretty_print_array(hb_string("children"), html_doctype_node->children, indent, relative_indent, false, buffer);
181
+ pretty_print_token_property(html_doctype_node->tag_closing, hb_string("tag_closing"), indent, relative_indent, true, buffer);
182
182
  } break;
183
183
 
184
184
  case AST_XML_DECLARATION_NODE: {
185
185
  const AST_XML_DECLARATION_NODE_T* xml_declaration_node = (AST_XML_DECLARATION_NODE_T*) node;
186
186
 
187
187
  pretty_print_errors(node, indent, relative_indent, false, buffer);
188
- pretty_print_token_property(xml_declaration_node->tag_opening, "tag_opening", indent, relative_indent, false, buffer);
189
- pretty_print_array("children", xml_declaration_node->children, indent, relative_indent, false, buffer);
190
- pretty_print_token_property(xml_declaration_node->tag_closing, "tag_closing", indent, relative_indent, true, buffer);
188
+ pretty_print_token_property(xml_declaration_node->tag_opening, hb_string("tag_opening"), indent, relative_indent, false, buffer);
189
+ pretty_print_array(hb_string("children"), xml_declaration_node->children, indent, relative_indent, false, buffer);
190
+ pretty_print_token_property(xml_declaration_node->tag_closing, hb_string("tag_closing"), indent, relative_indent, true, buffer);
191
191
  } break;
192
192
 
193
193
  case AST_CDATA_NODE: {
194
194
  const AST_CDATA_NODE_T* cdata_node = (AST_CDATA_NODE_T*) node;
195
195
 
196
196
  pretty_print_errors(node, indent, relative_indent, false, buffer);
197
- pretty_print_token_property(cdata_node->tag_opening, "tag_opening", indent, relative_indent, false, buffer);
198
- pretty_print_array("children", cdata_node->children, indent, relative_indent, false, buffer);
199
- pretty_print_token_property(cdata_node->tag_closing, "tag_closing", indent, relative_indent, true, buffer);
197
+ pretty_print_token_property(cdata_node->tag_opening, hb_string("tag_opening"), indent, relative_indent, false, buffer);
198
+ pretty_print_array(hb_string("children"), cdata_node->children, indent, relative_indent, false, buffer);
199
+ pretty_print_token_property(cdata_node->tag_closing, hb_string("tag_closing"), indent, relative_indent, true, buffer);
200
200
  } break;
201
201
 
202
202
  case AST_WHITESPACE_NODE: {
203
203
  const AST_WHITESPACE_NODE_T* whitespace_node = (AST_WHITESPACE_NODE_T*) node;
204
204
 
205
205
  pretty_print_errors(node, indent, relative_indent, false, buffer);
206
- pretty_print_token_property(whitespace_node->value, "value", indent, relative_indent, true, buffer);
206
+ pretty_print_token_property(whitespace_node->value, hb_string("value"), indent, relative_indent, true, buffer);
207
207
  } break;
208
208
 
209
209
  case AST_ERB_CONTENT_NODE: {
210
210
  const AST_ERB_CONTENT_NODE_T* erb_content_node = (AST_ERB_CONTENT_NODE_T*) node;
211
211
 
212
212
  pretty_print_errors(node, indent, relative_indent, false, buffer);
213
- pretty_print_token_property(erb_content_node->tag_opening, "tag_opening", indent, relative_indent, false, buffer);
214
- pretty_print_token_property(erb_content_node->content, "content", indent, relative_indent, false, buffer);
215
- pretty_print_token_property(erb_content_node->tag_closing, "tag_closing", indent, relative_indent, false, buffer);
213
+ pretty_print_token_property(erb_content_node->tag_opening, hb_string("tag_opening"), indent, relative_indent, false, buffer);
214
+ pretty_print_token_property(erb_content_node->content, hb_string("content"), indent, relative_indent, false, buffer);
215
+ pretty_print_token_property(erb_content_node->tag_closing, hb_string("tag_closing"), indent, relative_indent, false, buffer);
216
216
  if (erb_content_node->analyzed_ruby) {
217
- pretty_print_boolean_property("if_node", erb_content_node->analyzed_ruby->has_if_node, indent, relative_indent, false, buffer);
218
- pretty_print_boolean_property("elsif_node", erb_content_node->analyzed_ruby->has_elsif_node, indent, relative_indent, false, buffer);
219
- pretty_print_boolean_property("else_node", erb_content_node->analyzed_ruby->has_else_node, indent, relative_indent, false, buffer);
220
- pretty_print_boolean_property("end", erb_content_node->analyzed_ruby->has_end, indent, relative_indent, false, buffer);
221
- pretty_print_boolean_property("block_node", erb_content_node->analyzed_ruby->has_block_node, indent, relative_indent, false, buffer);
222
- pretty_print_boolean_property("block_closing", erb_content_node->analyzed_ruby->has_block_closing, indent, relative_indent, false, buffer);
223
- pretty_print_boolean_property("case_node", erb_content_node->analyzed_ruby->has_case_node, indent, relative_indent, false, buffer);
224
- pretty_print_boolean_property("when_node", erb_content_node->analyzed_ruby->has_when_node, indent, relative_indent, false, buffer);
225
- pretty_print_boolean_property("for_node", erb_content_node->analyzed_ruby->has_for_node, indent, relative_indent, false, buffer);
226
- pretty_print_boolean_property("while_node", erb_content_node->analyzed_ruby->has_while_node, indent, relative_indent, false, buffer);
227
- pretty_print_boolean_property("until_node", erb_content_node->analyzed_ruby->has_until_node, indent, relative_indent, false, buffer);
228
- pretty_print_boolean_property("begin_node", erb_content_node->analyzed_ruby->has_begin_node, indent, relative_indent, false, buffer);
229
- pretty_print_boolean_property("rescue_node", erb_content_node->analyzed_ruby->has_rescue_node, indent, relative_indent, false, buffer);
230
- pretty_print_boolean_property("ensure_node", erb_content_node->analyzed_ruby->has_ensure_node, indent, relative_indent, false, buffer);
231
- pretty_print_boolean_property("unless_node", erb_content_node->analyzed_ruby->has_unless_node, indent, relative_indent, false, buffer);
217
+ pretty_print_boolean_property(hb_string("if_node"), erb_content_node->analyzed_ruby->has_if_node, indent, relative_indent, false, buffer);
218
+ pretty_print_boolean_property(hb_string("elsif_node"), erb_content_node->analyzed_ruby->has_elsif_node, indent, relative_indent, false, buffer);
219
+ pretty_print_boolean_property(hb_string("else_node"), erb_content_node->analyzed_ruby->has_else_node, indent, relative_indent, false, buffer);
220
+ pretty_print_boolean_property(hb_string("end"), erb_content_node->analyzed_ruby->has_end, indent, relative_indent, false, buffer);
221
+ pretty_print_boolean_property(hb_string("block_node"), erb_content_node->analyzed_ruby->has_block_node, indent, relative_indent, false, buffer);
222
+ pretty_print_boolean_property(hb_string("block_closing"), erb_content_node->analyzed_ruby->has_block_closing, indent, relative_indent, false, buffer);
223
+ pretty_print_boolean_property(hb_string("case_node"), erb_content_node->analyzed_ruby->has_case_node, indent, relative_indent, false, buffer);
224
+ pretty_print_boolean_property(hb_string("when_node"), erb_content_node->analyzed_ruby->has_when_node, indent, relative_indent, false, buffer);
225
+ pretty_print_boolean_property(hb_string("for_node"), erb_content_node->analyzed_ruby->has_for_node, indent, relative_indent, false, buffer);
226
+ pretty_print_boolean_property(hb_string("while_node"), erb_content_node->analyzed_ruby->has_while_node, indent, relative_indent, false, buffer);
227
+ pretty_print_boolean_property(hb_string("until_node"), erb_content_node->analyzed_ruby->has_until_node, indent, relative_indent, false, buffer);
228
+ pretty_print_boolean_property(hb_string("begin_node"), erb_content_node->analyzed_ruby->has_begin_node, indent, relative_indent, false, buffer);
229
+ pretty_print_boolean_property(hb_string("rescue_node"), erb_content_node->analyzed_ruby->has_rescue_node, indent, relative_indent, false, buffer);
230
+ pretty_print_boolean_property(hb_string("ensure_node"), erb_content_node->analyzed_ruby->has_ensure_node, indent, relative_indent, false, buffer);
231
+ pretty_print_boolean_property(hb_string("unless_node"), erb_content_node->analyzed_ruby->has_unless_node, indent, relative_indent, false, buffer);
232
232
  } else {
233
- pretty_print_label("analyzed_ruby", indent, relative_indent, false, buffer);
234
- buffer_append(buffer, " ∅\n");
233
+ pretty_print_label(hb_string("analyzed_ruby"), indent, relative_indent, false, buffer);
234
+ hb_buffer_append(buffer, " ∅\n");
235
235
  }
236
236
 
237
- pretty_print_boolean_property("parsed", erb_content_node->parsed, indent, relative_indent, false, buffer);
238
- pretty_print_boolean_property("valid", erb_content_node->valid, indent, relative_indent, true, buffer);
237
+ pretty_print_boolean_property(hb_string("parsed"), erb_content_node->parsed, indent, relative_indent, false, buffer);
238
+ pretty_print_boolean_property(hb_string("valid"), erb_content_node->valid, indent, relative_indent, true, buffer);
239
239
  } break;
240
240
 
241
241
  case AST_ERB_END_NODE: {
242
242
  const AST_ERB_END_NODE_T* erb_end_node = (AST_ERB_END_NODE_T*) node;
243
243
 
244
244
  pretty_print_errors(node, indent, relative_indent, false, buffer);
245
- pretty_print_token_property(erb_end_node->tag_opening, "tag_opening", indent, relative_indent, false, buffer);
246
- pretty_print_token_property(erb_end_node->content, "content", indent, relative_indent, false, buffer);
247
- pretty_print_token_property(erb_end_node->tag_closing, "tag_closing", indent, relative_indent, true, buffer);
245
+ pretty_print_token_property(erb_end_node->tag_opening, hb_string("tag_opening"), indent, relative_indent, false, buffer);
246
+ pretty_print_token_property(erb_end_node->content, hb_string("content"), indent, relative_indent, false, buffer);
247
+ pretty_print_token_property(erb_end_node->tag_closing, hb_string("tag_closing"), indent, relative_indent, true, buffer);
248
248
  } break;
249
249
 
250
250
  case AST_ERB_ELSE_NODE: {
251
251
  const AST_ERB_ELSE_NODE_T* erb_else_node = (AST_ERB_ELSE_NODE_T*) node;
252
252
 
253
253
  pretty_print_errors(node, indent, relative_indent, false, buffer);
254
- pretty_print_token_property(erb_else_node->tag_opening, "tag_opening", indent, relative_indent, false, buffer);
255
- pretty_print_token_property(erb_else_node->content, "content", indent, relative_indent, false, buffer);
256
- pretty_print_token_property(erb_else_node->tag_closing, "tag_closing", indent, relative_indent, false, buffer);
257
- pretty_print_array("statements", erb_else_node->statements, indent, relative_indent, true, buffer);
254
+ pretty_print_token_property(erb_else_node->tag_opening, hb_string("tag_opening"), indent, relative_indent, false, buffer);
255
+ pretty_print_token_property(erb_else_node->content, hb_string("content"), indent, relative_indent, false, buffer);
256
+ pretty_print_token_property(erb_else_node->tag_closing, hb_string("tag_closing"), indent, relative_indent, false, buffer);
257
+ pretty_print_array(hb_string("statements"), erb_else_node->statements, indent, relative_indent, true, buffer);
258
258
  } break;
259
259
 
260
260
  case AST_ERB_IF_NODE: {
261
261
  const AST_ERB_IF_NODE_T* erb_if_node = (AST_ERB_IF_NODE_T*) node;
262
262
 
263
263
  pretty_print_errors(node, indent, relative_indent, false, buffer);
264
- pretty_print_token_property(erb_if_node->tag_opening, "tag_opening", indent, relative_indent, false, buffer);
265
- pretty_print_token_property(erb_if_node->content, "content", indent, relative_indent, false, buffer);
266
- pretty_print_token_property(erb_if_node->tag_closing, "tag_closing", indent, relative_indent, false, buffer);
267
- pretty_print_array("statements", erb_if_node->statements, indent, relative_indent, false, buffer);
264
+ pretty_print_token_property(erb_if_node->tag_opening, hb_string("tag_opening"), indent, relative_indent, false, buffer);
265
+ pretty_print_token_property(erb_if_node->content, hb_string("content"), indent, relative_indent, false, buffer);
266
+ pretty_print_token_property(erb_if_node->tag_closing, hb_string("tag_closing"), indent, relative_indent, false, buffer);
267
+ pretty_print_array(hb_string("statements"), erb_if_node->statements, indent, relative_indent, false, buffer);
268
268
 
269
- pretty_print_label("subsequent", indent, relative_indent, false, buffer);
269
+ pretty_print_label(hb_string("subsequent"), indent, relative_indent, false, buffer);
270
270
 
271
271
  if (erb_if_node->subsequent) {
272
- buffer_append(buffer, "\n");
272
+ hb_buffer_append(buffer, "\n");
273
273
  pretty_print_indent(buffer, indent);
274
274
  pretty_print_indent(buffer, relative_indent + 1);
275
275
 
276
- buffer_append(buffer, "└── ");
276
+ hb_buffer_append(buffer, "└── ");
277
277
  ast_pretty_print_node((AST_NODE_T*) erb_if_node->subsequent, indent, relative_indent + 2, buffer);
278
278
  } else {
279
- buffer_append(buffer, " ∅\n");
279
+ hb_buffer_append(buffer, " ∅\n");
280
280
  }
281
- buffer_append(buffer, "\n");
281
+ hb_buffer_append(buffer, "\n");
282
282
 
283
283
 
284
- pretty_print_label("end_node", indent, relative_indent, true, buffer);
284
+ pretty_print_label(hb_string("end_node"), indent, relative_indent, true, buffer);
285
285
 
286
286
  if (erb_if_node->end_node) {
287
- buffer_append(buffer, "\n");
287
+ hb_buffer_append(buffer, "\n");
288
288
  pretty_print_indent(buffer, indent);
289
289
  pretty_print_indent(buffer, relative_indent + 1);
290
290
 
291
- buffer_append(buffer, "└── ");
291
+ hb_buffer_append(buffer, "└── ");
292
292
  ast_pretty_print_node((AST_NODE_T*) erb_if_node->end_node, indent, relative_indent + 2, buffer);
293
293
  } else {
294
- buffer_append(buffer, " ∅\n");
294
+ hb_buffer_append(buffer, " ∅\n");
295
295
  }
296
- buffer_append(buffer, "\n");
296
+ hb_buffer_append(buffer, "\n");
297
297
 
298
298
  } break;
299
299
 
@@ -301,24 +301,24 @@ void ast_pretty_print_node(AST_NODE_T* node, const size_t indent, const size_t r
301
301
  const AST_ERB_BLOCK_NODE_T* erb_block_node = (AST_ERB_BLOCK_NODE_T*) node;
302
302
 
303
303
  pretty_print_errors(node, indent, relative_indent, false, buffer);
304
- pretty_print_token_property(erb_block_node->tag_opening, "tag_opening", indent, relative_indent, false, buffer);
305
- pretty_print_token_property(erb_block_node->content, "content", indent, relative_indent, false, buffer);
306
- pretty_print_token_property(erb_block_node->tag_closing, "tag_closing", indent, relative_indent, false, buffer);
307
- pretty_print_array("body", erb_block_node->body, indent, relative_indent, false, buffer);
304
+ pretty_print_token_property(erb_block_node->tag_opening, hb_string("tag_opening"), indent, relative_indent, false, buffer);
305
+ pretty_print_token_property(erb_block_node->content, hb_string("content"), indent, relative_indent, false, buffer);
306
+ pretty_print_token_property(erb_block_node->tag_closing, hb_string("tag_closing"), indent, relative_indent, false, buffer);
307
+ pretty_print_array(hb_string("body"), erb_block_node->body, indent, relative_indent, false, buffer);
308
308
 
309
- pretty_print_label("end_node", indent, relative_indent, true, buffer);
309
+ pretty_print_label(hb_string("end_node"), indent, relative_indent, true, buffer);
310
310
 
311
311
  if (erb_block_node->end_node) {
312
- buffer_append(buffer, "\n");
312
+ hb_buffer_append(buffer, "\n");
313
313
  pretty_print_indent(buffer, indent);
314
314
  pretty_print_indent(buffer, relative_indent + 1);
315
315
 
316
- buffer_append(buffer, "└── ");
316
+ hb_buffer_append(buffer, "└── ");
317
317
  ast_pretty_print_node((AST_NODE_T*) erb_block_node->end_node, indent, relative_indent + 2, buffer);
318
318
  } else {
319
- buffer_append(buffer, " ∅\n");
319
+ hb_buffer_append(buffer, " ∅\n");
320
320
  }
321
- buffer_append(buffer, "\n");
321
+ hb_buffer_append(buffer, "\n");
322
322
 
323
323
  } break;
324
324
 
@@ -326,50 +326,50 @@ void ast_pretty_print_node(AST_NODE_T* node, const size_t indent, const size_t r
326
326
  const AST_ERB_WHEN_NODE_T* erb_when_node = (AST_ERB_WHEN_NODE_T*) node;
327
327
 
328
328
  pretty_print_errors(node, indent, relative_indent, false, buffer);
329
- pretty_print_token_property(erb_when_node->tag_opening, "tag_opening", indent, relative_indent, false, buffer);
330
- pretty_print_token_property(erb_when_node->content, "content", indent, relative_indent, false, buffer);
331
- pretty_print_token_property(erb_when_node->tag_closing, "tag_closing", indent, relative_indent, false, buffer);
332
- pretty_print_array("statements", erb_when_node->statements, indent, relative_indent, true, buffer);
329
+ pretty_print_token_property(erb_when_node->tag_opening, hb_string("tag_opening"), indent, relative_indent, false, buffer);
330
+ pretty_print_token_property(erb_when_node->content, hb_string("content"), indent, relative_indent, false, buffer);
331
+ pretty_print_token_property(erb_when_node->tag_closing, hb_string("tag_closing"), indent, relative_indent, false, buffer);
332
+ pretty_print_array(hb_string("statements"), erb_when_node->statements, indent, relative_indent, true, buffer);
333
333
  } break;
334
334
 
335
335
  case AST_ERB_CASE_NODE: {
336
336
  const AST_ERB_CASE_NODE_T* erb_case_node = (AST_ERB_CASE_NODE_T*) node;
337
337
 
338
338
  pretty_print_errors(node, indent, relative_indent, false, buffer);
339
- pretty_print_token_property(erb_case_node->tag_opening, "tag_opening", indent, relative_indent, false, buffer);
340
- pretty_print_token_property(erb_case_node->content, "content", indent, relative_indent, false, buffer);
341
- pretty_print_token_property(erb_case_node->tag_closing, "tag_closing", indent, relative_indent, false, buffer);
342
- pretty_print_array("children", erb_case_node->children, indent, relative_indent, false, buffer);
343
- pretty_print_array("conditions", erb_case_node->conditions, indent, relative_indent, false, buffer);
339
+ pretty_print_token_property(erb_case_node->tag_opening, hb_string("tag_opening"), indent, relative_indent, false, buffer);
340
+ pretty_print_token_property(erb_case_node->content, hb_string("content"), indent, relative_indent, false, buffer);
341
+ pretty_print_token_property(erb_case_node->tag_closing, hb_string("tag_closing"), indent, relative_indent, false, buffer);
342
+ pretty_print_array(hb_string("children"), erb_case_node->children, indent, relative_indent, false, buffer);
343
+ pretty_print_array(hb_string("conditions"), erb_case_node->conditions, indent, relative_indent, false, buffer);
344
344
 
345
- pretty_print_label("else_clause", indent, relative_indent, false, buffer);
345
+ pretty_print_label(hb_string("else_clause"), indent, relative_indent, false, buffer);
346
346
 
347
347
  if (erb_case_node->else_clause) {
348
- buffer_append(buffer, "\n");
348
+ hb_buffer_append(buffer, "\n");
349
349
  pretty_print_indent(buffer, indent);
350
350
  pretty_print_indent(buffer, relative_indent + 1);
351
351
 
352
- buffer_append(buffer, "└── ");
352
+ hb_buffer_append(buffer, "└── ");
353
353
  ast_pretty_print_node((AST_NODE_T*) erb_case_node->else_clause, indent, relative_indent + 2, buffer);
354
354
  } else {
355
- buffer_append(buffer, " ∅\n");
355
+ hb_buffer_append(buffer, " ∅\n");
356
356
  }
357
- buffer_append(buffer, "\n");
357
+ hb_buffer_append(buffer, "\n");
358
358
 
359
359
 
360
- pretty_print_label("end_node", indent, relative_indent, true, buffer);
360
+ pretty_print_label(hb_string("end_node"), indent, relative_indent, true, buffer);
361
361
 
362
362
  if (erb_case_node->end_node) {
363
- buffer_append(buffer, "\n");
363
+ hb_buffer_append(buffer, "\n");
364
364
  pretty_print_indent(buffer, indent);
365
365
  pretty_print_indent(buffer, relative_indent + 1);
366
366
 
367
- buffer_append(buffer, "└── ");
367
+ hb_buffer_append(buffer, "└── ");
368
368
  ast_pretty_print_node((AST_NODE_T*) erb_case_node->end_node, indent, relative_indent + 2, buffer);
369
369
  } else {
370
- buffer_append(buffer, " ∅\n");
370
+ hb_buffer_append(buffer, " ∅\n");
371
371
  }
372
- buffer_append(buffer, "\n");
372
+ hb_buffer_append(buffer, "\n");
373
373
 
374
374
  } break;
375
375
 
@@ -377,40 +377,40 @@ void ast_pretty_print_node(AST_NODE_T* node, const size_t indent, const size_t r
377
377
  const AST_ERB_CASE_MATCH_NODE_T* erb_case_match_node = (AST_ERB_CASE_MATCH_NODE_T*) node;
378
378
 
379
379
  pretty_print_errors(node, indent, relative_indent, false, buffer);
380
- pretty_print_token_property(erb_case_match_node->tag_opening, "tag_opening", indent, relative_indent, false, buffer);
381
- pretty_print_token_property(erb_case_match_node->content, "content", indent, relative_indent, false, buffer);
382
- pretty_print_token_property(erb_case_match_node->tag_closing, "tag_closing", indent, relative_indent, false, buffer);
383
- pretty_print_array("children", erb_case_match_node->children, indent, relative_indent, false, buffer);
384
- pretty_print_array("conditions", erb_case_match_node->conditions, indent, relative_indent, false, buffer);
380
+ pretty_print_token_property(erb_case_match_node->tag_opening, hb_string("tag_opening"), indent, relative_indent, false, buffer);
381
+ pretty_print_token_property(erb_case_match_node->content, hb_string("content"), indent, relative_indent, false, buffer);
382
+ pretty_print_token_property(erb_case_match_node->tag_closing, hb_string("tag_closing"), indent, relative_indent, false, buffer);
383
+ pretty_print_array(hb_string("children"), erb_case_match_node->children, indent, relative_indent, false, buffer);
384
+ pretty_print_array(hb_string("conditions"), erb_case_match_node->conditions, indent, relative_indent, false, buffer);
385
385
 
386
- pretty_print_label("else_clause", indent, relative_indent, false, buffer);
386
+ pretty_print_label(hb_string("else_clause"), indent, relative_indent, false, buffer);
387
387
 
388
388
  if (erb_case_match_node->else_clause) {
389
- buffer_append(buffer, "\n");
389
+ hb_buffer_append(buffer, "\n");
390
390
  pretty_print_indent(buffer, indent);
391
391
  pretty_print_indent(buffer, relative_indent + 1);
392
392
 
393
- buffer_append(buffer, "└── ");
393
+ hb_buffer_append(buffer, "└── ");
394
394
  ast_pretty_print_node((AST_NODE_T*) erb_case_match_node->else_clause, indent, relative_indent + 2, buffer);
395
395
  } else {
396
- buffer_append(buffer, " ∅\n");
396
+ hb_buffer_append(buffer, " ∅\n");
397
397
  }
398
- buffer_append(buffer, "\n");
398
+ hb_buffer_append(buffer, "\n");
399
399
 
400
400
 
401
- pretty_print_label("end_node", indent, relative_indent, true, buffer);
401
+ pretty_print_label(hb_string("end_node"), indent, relative_indent, true, buffer);
402
402
 
403
403
  if (erb_case_match_node->end_node) {
404
- buffer_append(buffer, "\n");
404
+ hb_buffer_append(buffer, "\n");
405
405
  pretty_print_indent(buffer, indent);
406
406
  pretty_print_indent(buffer, relative_indent + 1);
407
407
 
408
- buffer_append(buffer, "└── ");
408
+ hb_buffer_append(buffer, "└── ");
409
409
  ast_pretty_print_node((AST_NODE_T*) erb_case_match_node->end_node, indent, relative_indent + 2, buffer);
410
410
  } else {
411
- buffer_append(buffer, " ∅\n");
411
+ hb_buffer_append(buffer, " ∅\n");
412
412
  }
413
- buffer_append(buffer, "\n");
413
+ hb_buffer_append(buffer, "\n");
414
414
 
415
415
  } break;
416
416
 
@@ -418,24 +418,24 @@ void ast_pretty_print_node(AST_NODE_T* node, const size_t indent, const size_t r
418
418
  const AST_ERB_WHILE_NODE_T* erb_while_node = (AST_ERB_WHILE_NODE_T*) node;
419
419
 
420
420
  pretty_print_errors(node, indent, relative_indent, false, buffer);
421
- pretty_print_token_property(erb_while_node->tag_opening, "tag_opening", indent, relative_indent, false, buffer);
422
- pretty_print_token_property(erb_while_node->content, "content", indent, relative_indent, false, buffer);
423
- pretty_print_token_property(erb_while_node->tag_closing, "tag_closing", indent, relative_indent, false, buffer);
424
- pretty_print_array("statements", erb_while_node->statements, indent, relative_indent, false, buffer);
421
+ pretty_print_token_property(erb_while_node->tag_opening, hb_string("tag_opening"), indent, relative_indent, false, buffer);
422
+ pretty_print_token_property(erb_while_node->content, hb_string("content"), indent, relative_indent, false, buffer);
423
+ pretty_print_token_property(erb_while_node->tag_closing, hb_string("tag_closing"), indent, relative_indent, false, buffer);
424
+ pretty_print_array(hb_string("statements"), erb_while_node->statements, indent, relative_indent, false, buffer);
425
425
 
426
- pretty_print_label("end_node", indent, relative_indent, true, buffer);
426
+ pretty_print_label(hb_string("end_node"), indent, relative_indent, true, buffer);
427
427
 
428
428
  if (erb_while_node->end_node) {
429
- buffer_append(buffer, "\n");
429
+ hb_buffer_append(buffer, "\n");
430
430
  pretty_print_indent(buffer, indent);
431
431
  pretty_print_indent(buffer, relative_indent + 1);
432
432
 
433
- buffer_append(buffer, "└── ");
433
+ hb_buffer_append(buffer, "└── ");
434
434
  ast_pretty_print_node((AST_NODE_T*) erb_while_node->end_node, indent, relative_indent + 2, buffer);
435
435
  } else {
436
- buffer_append(buffer, " ∅\n");
436
+ hb_buffer_append(buffer, " ∅\n");
437
437
  }
438
- buffer_append(buffer, "\n");
438
+ hb_buffer_append(buffer, "\n");
439
439
 
440
440
  } break;
441
441
 
@@ -443,24 +443,24 @@ void ast_pretty_print_node(AST_NODE_T* node, const size_t indent, const size_t r
443
443
  const AST_ERB_UNTIL_NODE_T* erb_until_node = (AST_ERB_UNTIL_NODE_T*) node;
444
444
 
445
445
  pretty_print_errors(node, indent, relative_indent, false, buffer);
446
- pretty_print_token_property(erb_until_node->tag_opening, "tag_opening", indent, relative_indent, false, buffer);
447
- pretty_print_token_property(erb_until_node->content, "content", indent, relative_indent, false, buffer);
448
- pretty_print_token_property(erb_until_node->tag_closing, "tag_closing", indent, relative_indent, false, buffer);
449
- pretty_print_array("statements", erb_until_node->statements, indent, relative_indent, false, buffer);
446
+ pretty_print_token_property(erb_until_node->tag_opening, hb_string("tag_opening"), indent, relative_indent, false, buffer);
447
+ pretty_print_token_property(erb_until_node->content, hb_string("content"), indent, relative_indent, false, buffer);
448
+ pretty_print_token_property(erb_until_node->tag_closing, hb_string("tag_closing"), indent, relative_indent, false, buffer);
449
+ pretty_print_array(hb_string("statements"), erb_until_node->statements, indent, relative_indent, false, buffer);
450
450
 
451
- pretty_print_label("end_node", indent, relative_indent, true, buffer);
451
+ pretty_print_label(hb_string("end_node"), indent, relative_indent, true, buffer);
452
452
 
453
453
  if (erb_until_node->end_node) {
454
- buffer_append(buffer, "\n");
454
+ hb_buffer_append(buffer, "\n");
455
455
  pretty_print_indent(buffer, indent);
456
456
  pretty_print_indent(buffer, relative_indent + 1);
457
457
 
458
- buffer_append(buffer, "└── ");
458
+ hb_buffer_append(buffer, "└── ");
459
459
  ast_pretty_print_node((AST_NODE_T*) erb_until_node->end_node, indent, relative_indent + 2, buffer);
460
460
  } else {
461
- buffer_append(buffer, " ∅\n");
461
+ hb_buffer_append(buffer, " ∅\n");
462
462
  }
463
- buffer_append(buffer, "\n");
463
+ hb_buffer_append(buffer, "\n");
464
464
 
465
465
  } break;
466
466
 
@@ -468,24 +468,24 @@ void ast_pretty_print_node(AST_NODE_T* node, const size_t indent, const size_t r
468
468
  const AST_ERB_FOR_NODE_T* erb_for_node = (AST_ERB_FOR_NODE_T*) node;
469
469
 
470
470
  pretty_print_errors(node, indent, relative_indent, false, buffer);
471
- pretty_print_token_property(erb_for_node->tag_opening, "tag_opening", indent, relative_indent, false, buffer);
472
- pretty_print_token_property(erb_for_node->content, "content", indent, relative_indent, false, buffer);
473
- pretty_print_token_property(erb_for_node->tag_closing, "tag_closing", indent, relative_indent, false, buffer);
474
- pretty_print_array("statements", erb_for_node->statements, indent, relative_indent, false, buffer);
471
+ pretty_print_token_property(erb_for_node->tag_opening, hb_string("tag_opening"), indent, relative_indent, false, buffer);
472
+ pretty_print_token_property(erb_for_node->content, hb_string("content"), indent, relative_indent, false, buffer);
473
+ pretty_print_token_property(erb_for_node->tag_closing, hb_string("tag_closing"), indent, relative_indent, false, buffer);
474
+ pretty_print_array(hb_string("statements"), erb_for_node->statements, indent, relative_indent, false, buffer);
475
475
 
476
- pretty_print_label("end_node", indent, relative_indent, true, buffer);
476
+ pretty_print_label(hb_string("end_node"), indent, relative_indent, true, buffer);
477
477
 
478
478
  if (erb_for_node->end_node) {
479
- buffer_append(buffer, "\n");
479
+ hb_buffer_append(buffer, "\n");
480
480
  pretty_print_indent(buffer, indent);
481
481
  pretty_print_indent(buffer, relative_indent + 1);
482
482
 
483
- buffer_append(buffer, "└── ");
483
+ hb_buffer_append(buffer, "└── ");
484
484
  ast_pretty_print_node((AST_NODE_T*) erb_for_node->end_node, indent, relative_indent + 2, buffer);
485
485
  } else {
486
- buffer_append(buffer, " ∅\n");
486
+ hb_buffer_append(buffer, " ∅\n");
487
487
  }
488
- buffer_append(buffer, "\n");
488
+ hb_buffer_append(buffer, "\n");
489
489
 
490
490
  } break;
491
491
 
@@ -493,24 +493,24 @@ void ast_pretty_print_node(AST_NODE_T* node, const size_t indent, const size_t r
493
493
  const AST_ERB_RESCUE_NODE_T* erb_rescue_node = (AST_ERB_RESCUE_NODE_T*) node;
494
494
 
495
495
  pretty_print_errors(node, indent, relative_indent, false, buffer);
496
- pretty_print_token_property(erb_rescue_node->tag_opening, "tag_opening", indent, relative_indent, false, buffer);
497
- pretty_print_token_property(erb_rescue_node->content, "content", indent, relative_indent, false, buffer);
498
- pretty_print_token_property(erb_rescue_node->tag_closing, "tag_closing", indent, relative_indent, false, buffer);
499
- pretty_print_array("statements", erb_rescue_node->statements, indent, relative_indent, false, buffer);
496
+ pretty_print_token_property(erb_rescue_node->tag_opening, hb_string("tag_opening"), indent, relative_indent, false, buffer);
497
+ pretty_print_token_property(erb_rescue_node->content, hb_string("content"), indent, relative_indent, false, buffer);
498
+ pretty_print_token_property(erb_rescue_node->tag_closing, hb_string("tag_closing"), indent, relative_indent, false, buffer);
499
+ pretty_print_array(hb_string("statements"), erb_rescue_node->statements, indent, relative_indent, false, buffer);
500
500
 
501
- pretty_print_label("subsequent", indent, relative_indent, true, buffer);
501
+ pretty_print_label(hb_string("subsequent"), indent, relative_indent, true, buffer);
502
502
 
503
503
  if (erb_rescue_node->subsequent) {
504
- buffer_append(buffer, "\n");
504
+ hb_buffer_append(buffer, "\n");
505
505
  pretty_print_indent(buffer, indent);
506
506
  pretty_print_indent(buffer, relative_indent + 1);
507
507
 
508
- buffer_append(buffer, "└── ");
508
+ hb_buffer_append(buffer, "└── ");
509
509
  ast_pretty_print_node((AST_NODE_T*) erb_rescue_node->subsequent, indent, relative_indent + 2, buffer);
510
510
  } else {
511
- buffer_append(buffer, " ∅\n");
511
+ hb_buffer_append(buffer, " ∅\n");
512
512
  }
513
- buffer_append(buffer, "\n");
513
+ hb_buffer_append(buffer, "\n");
514
514
 
515
515
  } break;
516
516
 
@@ -518,79 +518,79 @@ void ast_pretty_print_node(AST_NODE_T* node, const size_t indent, const size_t r
518
518
  const AST_ERB_ENSURE_NODE_T* erb_ensure_node = (AST_ERB_ENSURE_NODE_T*) node;
519
519
 
520
520
  pretty_print_errors(node, indent, relative_indent, false, buffer);
521
- pretty_print_token_property(erb_ensure_node->tag_opening, "tag_opening", indent, relative_indent, false, buffer);
522
- pretty_print_token_property(erb_ensure_node->content, "content", indent, relative_indent, false, buffer);
523
- pretty_print_token_property(erb_ensure_node->tag_closing, "tag_closing", indent, relative_indent, false, buffer);
524
- pretty_print_array("statements", erb_ensure_node->statements, indent, relative_indent, true, buffer);
521
+ pretty_print_token_property(erb_ensure_node->tag_opening, hb_string("tag_opening"), indent, relative_indent, false, buffer);
522
+ pretty_print_token_property(erb_ensure_node->content, hb_string("content"), indent, relative_indent, false, buffer);
523
+ pretty_print_token_property(erb_ensure_node->tag_closing, hb_string("tag_closing"), indent, relative_indent, false, buffer);
524
+ pretty_print_array(hb_string("statements"), erb_ensure_node->statements, indent, relative_indent, true, buffer);
525
525
  } break;
526
526
 
527
527
  case AST_ERB_BEGIN_NODE: {
528
528
  const AST_ERB_BEGIN_NODE_T* erb_begin_node = (AST_ERB_BEGIN_NODE_T*) node;
529
529
 
530
530
  pretty_print_errors(node, indent, relative_indent, false, buffer);
531
- pretty_print_token_property(erb_begin_node->tag_opening, "tag_opening", indent, relative_indent, false, buffer);
532
- pretty_print_token_property(erb_begin_node->content, "content", indent, relative_indent, false, buffer);
533
- pretty_print_token_property(erb_begin_node->tag_closing, "tag_closing", indent, relative_indent, false, buffer);
534
- pretty_print_array("statements", erb_begin_node->statements, indent, relative_indent, false, buffer);
531
+ pretty_print_token_property(erb_begin_node->tag_opening, hb_string("tag_opening"), indent, relative_indent, false, buffer);
532
+ pretty_print_token_property(erb_begin_node->content, hb_string("content"), indent, relative_indent, false, buffer);
533
+ pretty_print_token_property(erb_begin_node->tag_closing, hb_string("tag_closing"), indent, relative_indent, false, buffer);
534
+ pretty_print_array(hb_string("statements"), erb_begin_node->statements, indent, relative_indent, false, buffer);
535
535
 
536
- pretty_print_label("rescue_clause", indent, relative_indent, false, buffer);
536
+ pretty_print_label(hb_string("rescue_clause"), indent, relative_indent, false, buffer);
537
537
 
538
538
  if (erb_begin_node->rescue_clause) {
539
- buffer_append(buffer, "\n");
539
+ hb_buffer_append(buffer, "\n");
540
540
  pretty_print_indent(buffer, indent);
541
541
  pretty_print_indent(buffer, relative_indent + 1);
542
542
 
543
- buffer_append(buffer, "└── ");
543
+ hb_buffer_append(buffer, "└── ");
544
544
  ast_pretty_print_node((AST_NODE_T*) erb_begin_node->rescue_clause, indent, relative_indent + 2, buffer);
545
545
  } else {
546
- buffer_append(buffer, " ∅\n");
546
+ hb_buffer_append(buffer, " ∅\n");
547
547
  }
548
- buffer_append(buffer, "\n");
548
+ hb_buffer_append(buffer, "\n");
549
549
 
550
550
 
551
- pretty_print_label("else_clause", indent, relative_indent, false, buffer);
551
+ pretty_print_label(hb_string("else_clause"), indent, relative_indent, false, buffer);
552
552
 
553
553
  if (erb_begin_node->else_clause) {
554
- buffer_append(buffer, "\n");
554
+ hb_buffer_append(buffer, "\n");
555
555
  pretty_print_indent(buffer, indent);
556
556
  pretty_print_indent(buffer, relative_indent + 1);
557
557
 
558
- buffer_append(buffer, "└── ");
558
+ hb_buffer_append(buffer, "└── ");
559
559
  ast_pretty_print_node((AST_NODE_T*) erb_begin_node->else_clause, indent, relative_indent + 2, buffer);
560
560
  } else {
561
- buffer_append(buffer, " ∅\n");
561
+ hb_buffer_append(buffer, " ∅\n");
562
562
  }
563
- buffer_append(buffer, "\n");
563
+ hb_buffer_append(buffer, "\n");
564
564
 
565
565
 
566
- pretty_print_label("ensure_clause", indent, relative_indent, false, buffer);
566
+ pretty_print_label(hb_string("ensure_clause"), indent, relative_indent, false, buffer);
567
567
 
568
568
  if (erb_begin_node->ensure_clause) {
569
- buffer_append(buffer, "\n");
569
+ hb_buffer_append(buffer, "\n");
570
570
  pretty_print_indent(buffer, indent);
571
571
  pretty_print_indent(buffer, relative_indent + 1);
572
572
 
573
- buffer_append(buffer, "└── ");
573
+ hb_buffer_append(buffer, "└── ");
574
574
  ast_pretty_print_node((AST_NODE_T*) erb_begin_node->ensure_clause, indent, relative_indent + 2, buffer);
575
575
  } else {
576
- buffer_append(buffer, " ∅\n");
576
+ hb_buffer_append(buffer, " ∅\n");
577
577
  }
578
- buffer_append(buffer, "\n");
578
+ hb_buffer_append(buffer, "\n");
579
579
 
580
580
 
581
- pretty_print_label("end_node", indent, relative_indent, true, buffer);
581
+ pretty_print_label(hb_string("end_node"), indent, relative_indent, true, buffer);
582
582
 
583
583
  if (erb_begin_node->end_node) {
584
- buffer_append(buffer, "\n");
584
+ hb_buffer_append(buffer, "\n");
585
585
  pretty_print_indent(buffer, indent);
586
586
  pretty_print_indent(buffer, relative_indent + 1);
587
587
 
588
- buffer_append(buffer, "└── ");
588
+ hb_buffer_append(buffer, "└── ");
589
589
  ast_pretty_print_node((AST_NODE_T*) erb_begin_node->end_node, indent, relative_indent + 2, buffer);
590
590
  } else {
591
- buffer_append(buffer, " ∅\n");
591
+ hb_buffer_append(buffer, " ∅\n");
592
592
  }
593
- buffer_append(buffer, "\n");
593
+ hb_buffer_append(buffer, "\n");
594
594
 
595
595
  } break;
596
596
 
@@ -598,39 +598,39 @@ void ast_pretty_print_node(AST_NODE_T* node, const size_t indent, const size_t r
598
598
  const AST_ERB_UNLESS_NODE_T* erb_unless_node = (AST_ERB_UNLESS_NODE_T*) node;
599
599
 
600
600
  pretty_print_errors(node, indent, relative_indent, false, buffer);
601
- pretty_print_token_property(erb_unless_node->tag_opening, "tag_opening", indent, relative_indent, false, buffer);
602
- pretty_print_token_property(erb_unless_node->content, "content", indent, relative_indent, false, buffer);
603
- pretty_print_token_property(erb_unless_node->tag_closing, "tag_closing", indent, relative_indent, false, buffer);
604
- pretty_print_array("statements", erb_unless_node->statements, indent, relative_indent, false, buffer);
601
+ pretty_print_token_property(erb_unless_node->tag_opening, hb_string("tag_opening"), indent, relative_indent, false, buffer);
602
+ pretty_print_token_property(erb_unless_node->content, hb_string("content"), indent, relative_indent, false, buffer);
603
+ pretty_print_token_property(erb_unless_node->tag_closing, hb_string("tag_closing"), indent, relative_indent, false, buffer);
604
+ pretty_print_array(hb_string("statements"), erb_unless_node->statements, indent, relative_indent, false, buffer);
605
605
 
606
- pretty_print_label("else_clause", indent, relative_indent, false, buffer);
606
+ pretty_print_label(hb_string("else_clause"), indent, relative_indent, false, buffer);
607
607
 
608
608
  if (erb_unless_node->else_clause) {
609
- buffer_append(buffer, "\n");
609
+ hb_buffer_append(buffer, "\n");
610
610
  pretty_print_indent(buffer, indent);
611
611
  pretty_print_indent(buffer, relative_indent + 1);
612
612
 
613
- buffer_append(buffer, "└── ");
613
+ hb_buffer_append(buffer, "└── ");
614
614
  ast_pretty_print_node((AST_NODE_T*) erb_unless_node->else_clause, indent, relative_indent + 2, buffer);
615
615
  } else {
616
- buffer_append(buffer, " ∅\n");
616
+ hb_buffer_append(buffer, " ∅\n");
617
617
  }
618
- buffer_append(buffer, "\n");
618
+ hb_buffer_append(buffer, "\n");
619
619
 
620
620
 
621
- pretty_print_label("end_node", indent, relative_indent, true, buffer);
621
+ pretty_print_label(hb_string("end_node"), indent, relative_indent, true, buffer);
622
622
 
623
623
  if (erb_unless_node->end_node) {
624
- buffer_append(buffer, "\n");
624
+ hb_buffer_append(buffer, "\n");
625
625
  pretty_print_indent(buffer, indent);
626
626
  pretty_print_indent(buffer, relative_indent + 1);
627
627
 
628
- buffer_append(buffer, "└── ");
628
+ hb_buffer_append(buffer, "└── ");
629
629
  ast_pretty_print_node((AST_NODE_T*) erb_unless_node->end_node, indent, relative_indent + 2, buffer);
630
630
  } else {
631
- buffer_append(buffer, " ∅\n");
631
+ hb_buffer_append(buffer, " ∅\n");
632
632
  }
633
- buffer_append(buffer, "\n");
633
+ hb_buffer_append(buffer, "\n");
634
634
 
635
635
  } break;
636
636
 
@@ -638,19 +638,19 @@ void ast_pretty_print_node(AST_NODE_T* node, const size_t indent, const size_t r
638
638
  const AST_ERB_YIELD_NODE_T* erb_yield_node = (AST_ERB_YIELD_NODE_T*) node;
639
639
 
640
640
  pretty_print_errors(node, indent, relative_indent, false, buffer);
641
- pretty_print_token_property(erb_yield_node->tag_opening, "tag_opening", indent, relative_indent, false, buffer);
642
- pretty_print_token_property(erb_yield_node->content, "content", indent, relative_indent, false, buffer);
643
- pretty_print_token_property(erb_yield_node->tag_closing, "tag_closing", indent, relative_indent, true, buffer);
641
+ pretty_print_token_property(erb_yield_node->tag_opening, hb_string("tag_opening"), indent, relative_indent, false, buffer);
642
+ pretty_print_token_property(erb_yield_node->content, hb_string("content"), indent, relative_indent, false, buffer);
643
+ pretty_print_token_property(erb_yield_node->tag_closing, hb_string("tag_closing"), indent, relative_indent, true, buffer);
644
644
  } break;
645
645
 
646
646
  case AST_ERB_IN_NODE: {
647
647
  const AST_ERB_IN_NODE_T* erb_in_node = (AST_ERB_IN_NODE_T*) node;
648
648
 
649
649
  pretty_print_errors(node, indent, relative_indent, false, buffer);
650
- pretty_print_token_property(erb_in_node->tag_opening, "tag_opening", indent, relative_indent, false, buffer);
651
- pretty_print_token_property(erb_in_node->content, "content", indent, relative_indent, false, buffer);
652
- pretty_print_token_property(erb_in_node->tag_closing, "tag_closing", indent, relative_indent, false, buffer);
653
- pretty_print_array("statements", erb_in_node->statements, indent, relative_indent, true, buffer);
650
+ pretty_print_token_property(erb_in_node->tag_opening, hb_string("tag_opening"), indent, relative_indent, false, buffer);
651
+ pretty_print_token_property(erb_in_node->content, hb_string("content"), indent, relative_indent, false, buffer);
652
+ pretty_print_token_property(erb_in_node->tag_closing, hb_string("tag_closing"), indent, relative_indent, false, buffer);
653
+ pretty_print_array(hb_string("statements"), erb_in_node->statements, indent, relative_indent, true, buffer);
654
654
  } break;
655
655
 
656
656
  }