@herb-tools/node 0.1.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 (131) hide show
  1. package/CHANGELOG.md +3 -0
  2. package/README.md +9 -0
  3. package/binding.gyp +98 -0
  4. package/dist/herb-node.cjs +20 -0
  5. package/dist/herb-node.cjs.map +1 -0
  6. package/dist/herb-node.esm.js +33 -0
  7. package/dist/herb-node.esm.js.map +1 -0
  8. package/dist/types/index-cjs.d.cts +1 -0
  9. package/dist/types/index-esm.d.mts +8 -0
  10. package/dist/types/node-backend.d.ts +4 -0
  11. package/dist/types/util.d.ts +2 -0
  12. package/extension/error_helpers.cpp +340 -0
  13. package/extension/error_helpers.h +26 -0
  14. package/extension/extension_helpers.cpp +206 -0
  15. package/extension/extension_helpers.h +22 -0
  16. package/extension/herb.cpp +232 -0
  17. package/extension/libherb/analyze.c +989 -0
  18. package/extension/libherb/analyze_helpers.c +241 -0
  19. package/extension/libherb/analyzed_ruby.c +35 -0
  20. package/extension/libherb/array.c +137 -0
  21. package/extension/libherb/ast_node.c +81 -0
  22. package/extension/libherb/ast_nodes.c +866 -0
  23. package/extension/libherb/ast_pretty_print.c +588 -0
  24. package/extension/libherb/buffer.c +199 -0
  25. package/extension/libherb/errors.c +740 -0
  26. package/extension/libherb/extract.c +110 -0
  27. package/extension/libherb/herb.c +103 -0
  28. package/extension/libherb/html_util.c +143 -0
  29. package/extension/libherb/include/analyze.h +36 -0
  30. package/extension/libherb/include/analyze_helpers.h +43 -0
  31. package/extension/libherb/include/analyzed_ruby.h +33 -0
  32. package/extension/libherb/include/array.h +33 -0
  33. package/extension/libherb/include/ast_node.h +35 -0
  34. package/extension/libherb/include/ast_nodes.h +303 -0
  35. package/extension/libherb/include/ast_pretty_print.h +17 -0
  36. package/extension/libherb/include/buffer.h +36 -0
  37. package/extension/libherb/include/errors.h +125 -0
  38. package/extension/libherb/include/extract.h +20 -0
  39. package/extension/libherb/include/herb.h +32 -0
  40. package/extension/libherb/include/html_util.h +13 -0
  41. package/extension/libherb/include/io.h +9 -0
  42. package/extension/libherb/include/json.h +28 -0
  43. package/extension/libherb/include/lexer.h +13 -0
  44. package/extension/libherb/include/lexer_peek_helpers.h +23 -0
  45. package/extension/libherb/include/lexer_struct.h +32 -0
  46. package/extension/libherb/include/location.h +25 -0
  47. package/extension/libherb/include/macros.h +10 -0
  48. package/extension/libherb/include/memory.h +12 -0
  49. package/extension/libherb/include/parser.h +22 -0
  50. package/extension/libherb/include/parser_helpers.h +33 -0
  51. package/extension/libherb/include/position.h +22 -0
  52. package/extension/libherb/include/pretty_print.h +53 -0
  53. package/extension/libherb/include/prism_helpers.h +18 -0
  54. package/extension/libherb/include/range.h +23 -0
  55. package/extension/libherb/include/ruby_parser.h +6 -0
  56. package/extension/libherb/include/token.h +25 -0
  57. package/extension/libherb/include/token_matchers.h +21 -0
  58. package/extension/libherb/include/token_struct.h +51 -0
  59. package/extension/libherb/include/util.h +25 -0
  60. package/extension/libherb/include/version.h +6 -0
  61. package/extension/libherb/include/visitor.h +11 -0
  62. package/extension/libherb/io.c +30 -0
  63. package/extension/libherb/json.c +205 -0
  64. package/extension/libherb/lexer.c +284 -0
  65. package/extension/libherb/lexer_peek_helpers.c +59 -0
  66. package/extension/libherb/location.c +41 -0
  67. package/extension/libherb/main.c +162 -0
  68. package/extension/libherb/memory.c +53 -0
  69. package/extension/libherb/parser.c +704 -0
  70. package/extension/libherb/parser_helpers.c +161 -0
  71. package/extension/libherb/position.c +33 -0
  72. package/extension/libherb/pretty_print.c +242 -0
  73. package/extension/libherb/prism_helpers.c +50 -0
  74. package/extension/libherb/range.c +38 -0
  75. package/extension/libherb/ruby_parser.c +47 -0
  76. package/extension/libherb/token.c +194 -0
  77. package/extension/libherb/token_matchers.c +32 -0
  78. package/extension/libherb/util.c +128 -0
  79. package/extension/libherb/visitor.c +321 -0
  80. package/extension/nodes.cpp +1060 -0
  81. package/extension/nodes.h +44 -0
  82. package/extension/prism/include/prism/ast.h +7964 -0
  83. package/extension/prism/include/prism/defines.h +260 -0
  84. package/extension/prism/include/prism/diagnostic.h +451 -0
  85. package/extension/prism/include/prism/encoding.h +283 -0
  86. package/extension/prism/include/prism/node.h +129 -0
  87. package/extension/prism/include/prism/options.h +442 -0
  88. package/extension/prism/include/prism/pack.h +163 -0
  89. package/extension/prism/include/prism/parser.h +933 -0
  90. package/extension/prism/include/prism/prettyprint.h +34 -0
  91. package/extension/prism/include/prism/regexp.h +43 -0
  92. package/extension/prism/include/prism/static_literals.h +121 -0
  93. package/extension/prism/include/prism/util/pm_buffer.h +228 -0
  94. package/extension/prism/include/prism/util/pm_char.h +204 -0
  95. package/extension/prism/include/prism/util/pm_constant_pool.h +218 -0
  96. package/extension/prism/include/prism/util/pm_integer.h +126 -0
  97. package/extension/prism/include/prism/util/pm_list.h +97 -0
  98. package/extension/prism/include/prism/util/pm_memchr.h +29 -0
  99. package/extension/prism/include/prism/util/pm_newline_list.h +113 -0
  100. package/extension/prism/include/prism/util/pm_string.h +190 -0
  101. package/extension/prism/include/prism/util/pm_strncasecmp.h +32 -0
  102. package/extension/prism/include/prism/util/pm_strpbrk.h +46 -0
  103. package/extension/prism/include/prism/version.h +29 -0
  104. package/extension/prism/include/prism.h +383 -0
  105. package/extension/prism/src/diagnostic.c +842 -0
  106. package/extension/prism/src/encoding.c +5235 -0
  107. package/extension/prism/src/node.c +8674 -0
  108. package/extension/prism/src/options.c +328 -0
  109. package/extension/prism/src/pack.c +509 -0
  110. package/extension/prism/src/prettyprint.c +8939 -0
  111. package/extension/prism/src/prism.c +23184 -0
  112. package/extension/prism/src/regexp.c +790 -0
  113. package/extension/prism/src/serialize.c +2266 -0
  114. package/extension/prism/src/static_literals.c +617 -0
  115. package/extension/prism/src/token_type.c +701 -0
  116. package/extension/prism/src/util/pm_buffer.c +357 -0
  117. package/extension/prism/src/util/pm_char.c +318 -0
  118. package/extension/prism/src/util/pm_constant_pool.c +342 -0
  119. package/extension/prism/src/util/pm_integer.c +670 -0
  120. package/extension/prism/src/util/pm_list.c +49 -0
  121. package/extension/prism/src/util/pm_memchr.c +35 -0
  122. package/extension/prism/src/util/pm_newline_list.c +125 -0
  123. package/extension/prism/src/util/pm_string.c +383 -0
  124. package/extension/prism/src/util/pm_strncasecmp.c +36 -0
  125. package/extension/prism/src/util/pm_strpbrk.c +206 -0
  126. package/package.json +74 -0
  127. package/src/index-cjs.cts +22 -0
  128. package/src/index-esm.mts +28 -0
  129. package/src/node-backend.ts +9 -0
  130. package/src/types/global.d.ts +18 -0
  131. package/src/util.ts +35 -0
@@ -0,0 +1,588 @@
1
+ // NOTE: This file is generated by the templates/template.rb script and should not
2
+ // be modified manually. See /Users/marcoroth/Development/herb-release/templates/src/ast_pretty_print.c.erb
3
+
4
+ #include "include/ast_node.h"
5
+ #include "include/ast_nodes.h"
6
+ #include "include/buffer.h"
7
+ #include "include/errors.h"
8
+ #include "include/pretty_print.h"
9
+ #include "include/token_struct.h"
10
+ #include "include/util.h"
11
+
12
+ #include <stdio.h>
13
+ #include <stdlib.h>
14
+ #include <stdbool.h>
15
+
16
+ void ast_pretty_print_node(AST_NODE_T* node, const size_t indent, const size_t relative_indent, buffer_T* buffer) {
17
+ if (!node) { return; }
18
+
19
+ bool print_location = true;
20
+
21
+ buffer_append(buffer, "@ ");
22
+ buffer_append(buffer, ast_node_human_type(node));
23
+ buffer_append(buffer, " ");
24
+
25
+ if (print_location) { pretty_print_location(node->location, buffer); }
26
+
27
+ buffer_append(buffer, "\n");
28
+
29
+ switch (node->type) {
30
+ case AST_DOCUMENT_NODE: {
31
+ const AST_DOCUMENT_NODE_T* document_node = (AST_DOCUMENT_NODE_T*) node;
32
+
33
+ pretty_print_errors(node, indent, relative_indent, false, buffer);
34
+ pretty_print_array("children", document_node->children, indent, relative_indent, true, buffer);
35
+ } break;
36
+
37
+ case AST_LITERAL_NODE: {
38
+ const AST_LITERAL_NODE_T* literal_node = (AST_LITERAL_NODE_T*) node;
39
+
40
+ pretty_print_errors(node, indent, relative_indent, false, buffer);
41
+ pretty_print_string_property(literal_node->content, "content", indent, relative_indent, true, buffer);
42
+ } break;
43
+
44
+ case AST_HTML_OPEN_TAG_NODE: {
45
+ const AST_HTML_OPEN_TAG_NODE_T* html_open_tag_node = (AST_HTML_OPEN_TAG_NODE_T*) node;
46
+
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);
53
+ } break;
54
+
55
+ case AST_HTML_CLOSE_TAG_NODE: {
56
+ const AST_HTML_CLOSE_TAG_NODE_T* html_close_tag_node = (AST_HTML_CLOSE_TAG_NODE_T*) node;
57
+
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_token_property(html_close_tag_node->tag_closing, "tag_closing", indent, relative_indent, true, buffer);
62
+ } break;
63
+
64
+ case AST_HTML_SELF_CLOSE_TAG_NODE: {
65
+ const AST_HTML_SELF_CLOSE_TAG_NODE_T* html_self_close_tag_node = (AST_HTML_SELF_CLOSE_TAG_NODE_T*) node;
66
+
67
+ pretty_print_errors(node, indent, relative_indent, false, buffer);
68
+ pretty_print_token_property(html_self_close_tag_node->tag_opening, "tag_opening", indent, relative_indent, false, buffer);
69
+ pretty_print_token_property(html_self_close_tag_node->tag_name, "tag_name", indent, relative_indent, false, buffer);
70
+ pretty_print_array("attributes", html_self_close_tag_node->attributes, indent, relative_indent, false, buffer);
71
+ pretty_print_token_property(html_self_close_tag_node->tag_closing, "tag_closing", indent, relative_indent, false, buffer);
72
+ pretty_print_boolean_property("is_void", html_self_close_tag_node->is_void, indent, relative_indent, true, buffer);
73
+ } break;
74
+
75
+ case AST_HTML_ELEMENT_NODE: {
76
+ const AST_HTML_ELEMENT_NODE_T* html_element_node = (AST_HTML_ELEMENT_NODE_T*) node;
77
+
78
+ pretty_print_errors(node, indent, relative_indent, false, buffer);
79
+
80
+ pretty_print_label("open_tag", indent, relative_indent, false, buffer);
81
+
82
+ if (html_element_node->open_tag) {
83
+ buffer_append(buffer, "\n");
84
+ pretty_print_indent(buffer, indent);
85
+ pretty_print_indent(buffer, relative_indent + 1);
86
+
87
+ buffer_append(buffer, "└── ");
88
+ ast_pretty_print_node((AST_NODE_T*) html_element_node->open_tag, indent, relative_indent + 2, buffer);
89
+ } else {
90
+ buffer_append(buffer, " ∅\n");
91
+ }
92
+ buffer_append(buffer, "\n");
93
+
94
+ pretty_print_token_property(html_element_node->tag_name, "tag_name", indent, relative_indent, false, buffer);
95
+ pretty_print_array("body", html_element_node->body, indent, relative_indent, false, buffer);
96
+
97
+ pretty_print_label("close_tag", indent, relative_indent, false, buffer);
98
+
99
+ if (html_element_node->close_tag) {
100
+ buffer_append(buffer, "\n");
101
+ pretty_print_indent(buffer, indent);
102
+ pretty_print_indent(buffer, relative_indent + 1);
103
+
104
+ buffer_append(buffer, "└── ");
105
+ ast_pretty_print_node((AST_NODE_T*) html_element_node->close_tag, indent, relative_indent + 2, buffer);
106
+ } else {
107
+ buffer_append(buffer, " ∅\n");
108
+ }
109
+ buffer_append(buffer, "\n");
110
+
111
+ pretty_print_boolean_property("is_void", html_element_node->is_void, indent, relative_indent, true, buffer);
112
+ } break;
113
+
114
+ case AST_HTML_ATTRIBUTE_VALUE_NODE: {
115
+ const AST_HTML_ATTRIBUTE_VALUE_NODE_T* html_attribute_value_node = (AST_HTML_ATTRIBUTE_VALUE_NODE_T*) node;
116
+
117
+ pretty_print_errors(node, indent, relative_indent, false, buffer);
118
+ pretty_print_token_property(html_attribute_value_node->open_quote, "open_quote", indent, relative_indent, false, buffer);
119
+ pretty_print_array("children", html_attribute_value_node->children, indent, relative_indent, false, buffer);
120
+ pretty_print_token_property(html_attribute_value_node->close_quote, "close_quote", indent, relative_indent, false, buffer);
121
+ pretty_print_boolean_property("quoted", html_attribute_value_node->quoted, indent, relative_indent, true, buffer);
122
+ } break;
123
+
124
+ case AST_HTML_ATTRIBUTE_NAME_NODE: {
125
+ const AST_HTML_ATTRIBUTE_NAME_NODE_T* html_attribute_name_node = (AST_HTML_ATTRIBUTE_NAME_NODE_T*) node;
126
+
127
+ pretty_print_errors(node, indent, relative_indent, false, buffer);
128
+ pretty_print_token_property(html_attribute_name_node->name, "name", indent, relative_indent, true, buffer);
129
+ } break;
130
+
131
+ case AST_HTML_ATTRIBUTE_NODE: {
132
+ const AST_HTML_ATTRIBUTE_NODE_T* html_attribute_node = (AST_HTML_ATTRIBUTE_NODE_T*) node;
133
+
134
+ pretty_print_errors(node, indent, relative_indent, false, buffer);
135
+
136
+ pretty_print_label("name", indent, relative_indent, false, buffer);
137
+
138
+ if (html_attribute_node->name) {
139
+ buffer_append(buffer, "\n");
140
+ pretty_print_indent(buffer, indent);
141
+ pretty_print_indent(buffer, relative_indent + 1);
142
+
143
+ buffer_append(buffer, "└── ");
144
+ ast_pretty_print_node((AST_NODE_T*) html_attribute_node->name, indent, relative_indent + 2, buffer);
145
+ } else {
146
+ buffer_append(buffer, " ∅\n");
147
+ }
148
+ buffer_append(buffer, "\n");
149
+
150
+ pretty_print_token_property(html_attribute_node->equals, "equals", indent, relative_indent, false, buffer);
151
+
152
+ pretty_print_label("value", indent, relative_indent, true, buffer);
153
+
154
+ if (html_attribute_node->value) {
155
+ buffer_append(buffer, "\n");
156
+ pretty_print_indent(buffer, indent);
157
+ pretty_print_indent(buffer, relative_indent + 1);
158
+
159
+ buffer_append(buffer, "└── ");
160
+ ast_pretty_print_node((AST_NODE_T*) html_attribute_node->value, indent, relative_indent + 2, buffer);
161
+ } else {
162
+ buffer_append(buffer, " ∅\n");
163
+ }
164
+ buffer_append(buffer, "\n");
165
+
166
+ } break;
167
+
168
+ case AST_HTML_TEXT_NODE: {
169
+ const AST_HTML_TEXT_NODE_T* html_text_node = (AST_HTML_TEXT_NODE_T*) node;
170
+
171
+ pretty_print_errors(node, indent, relative_indent, false, buffer);
172
+ pretty_print_string_property(html_text_node->content, "content", indent, relative_indent, true, buffer);
173
+ } break;
174
+
175
+ case AST_HTML_COMMENT_NODE: {
176
+ const AST_HTML_COMMENT_NODE_T* html_comment_node = (AST_HTML_COMMENT_NODE_T*) node;
177
+
178
+ pretty_print_errors(node, indent, relative_indent, false, buffer);
179
+ pretty_print_token_property(html_comment_node->comment_start, "comment_start", indent, relative_indent, false, buffer);
180
+ pretty_print_array("children", html_comment_node->children, indent, relative_indent, false, buffer);
181
+ pretty_print_token_property(html_comment_node->comment_end, "comment_end", indent, relative_indent, true, buffer);
182
+ } break;
183
+
184
+ case AST_HTML_DOCTYPE_NODE: {
185
+ const AST_HTML_DOCTYPE_NODE_T* html_doctype_node = (AST_HTML_DOCTYPE_NODE_T*) node;
186
+
187
+ pretty_print_errors(node, indent, relative_indent, false, buffer);
188
+ pretty_print_token_property(html_doctype_node->tag_opening, "tag_opening", indent, relative_indent, false, buffer);
189
+ pretty_print_array("children", html_doctype_node->children, indent, relative_indent, false, buffer);
190
+ pretty_print_token_property(html_doctype_node->tag_closing, "tag_closing", indent, relative_indent, true, buffer);
191
+ } break;
192
+
193
+ case AST_WHITESPACE_NODE: {
194
+ const AST_WHITESPACE_NODE_T* whitespace_node = (AST_WHITESPACE_NODE_T*) node;
195
+
196
+ pretty_print_errors(node, indent, relative_indent, false, buffer);
197
+ pretty_print_token_property(whitespace_node->value, "value", indent, relative_indent, true, buffer);
198
+ } break;
199
+
200
+ case AST_ERB_CONTENT_NODE: {
201
+ const AST_ERB_CONTENT_NODE_T* erb_content_node = (AST_ERB_CONTENT_NODE_T*) node;
202
+
203
+ pretty_print_errors(node, indent, relative_indent, false, buffer);
204
+ pretty_print_token_property(erb_content_node->tag_opening, "tag_opening", indent, relative_indent, false, buffer);
205
+ pretty_print_token_property(erb_content_node->content, "content", indent, relative_indent, false, buffer);
206
+ pretty_print_token_property(erb_content_node->tag_closing, "tag_closing", indent, relative_indent, false, buffer);
207
+ if (erb_content_node->analyzed_ruby) {
208
+ pretty_print_boolean_property("if_node", erb_content_node->analyzed_ruby->has_if_node, indent, relative_indent, false, buffer);
209
+ pretty_print_boolean_property("elsif_node", erb_content_node->analyzed_ruby->has_elsif_node, indent, relative_indent, false, buffer);
210
+ pretty_print_boolean_property("else_node", erb_content_node->analyzed_ruby->has_else_node, indent, relative_indent, false, buffer);
211
+ pretty_print_boolean_property("end", erb_content_node->analyzed_ruby->has_end, indent, relative_indent, false, buffer);
212
+ pretty_print_boolean_property("block_node", erb_content_node->analyzed_ruby->has_block_node, indent, relative_indent, false, buffer);
213
+ pretty_print_boolean_property("block_closing", erb_content_node->analyzed_ruby->has_block_closing, indent, relative_indent, false, buffer);
214
+ pretty_print_boolean_property("case_node", erb_content_node->analyzed_ruby->has_case_node, indent, relative_indent, false, buffer);
215
+ pretty_print_boolean_property("when_node", erb_content_node->analyzed_ruby->has_when_node, indent, relative_indent, false, buffer);
216
+ pretty_print_boolean_property("for_node", erb_content_node->analyzed_ruby->has_for_node, indent, relative_indent, false, buffer);
217
+ pretty_print_boolean_property("while_node", erb_content_node->analyzed_ruby->has_while_node, indent, relative_indent, false, buffer);
218
+ pretty_print_boolean_property("until_node", erb_content_node->analyzed_ruby->has_until_node, indent, relative_indent, false, buffer);
219
+ pretty_print_boolean_property("begin_node", erb_content_node->analyzed_ruby->has_begin_node, indent, relative_indent, false, buffer);
220
+ pretty_print_boolean_property("rescue_node", erb_content_node->analyzed_ruby->has_rescue_node, indent, relative_indent, false, buffer);
221
+ pretty_print_boolean_property("ensure_node", erb_content_node->analyzed_ruby->has_ensure_node, indent, relative_indent, false, buffer);
222
+ pretty_print_boolean_property("unless_node", erb_content_node->analyzed_ruby->has_unless_node, indent, relative_indent, false, buffer);
223
+ } else {
224
+ pretty_print_label("analyzed_ruby", indent, relative_indent, false, buffer);
225
+ buffer_append(buffer, " ∅\n");
226
+ }
227
+
228
+ pretty_print_boolean_property("parsed", erb_content_node->parsed, indent, relative_indent, false, buffer);
229
+ pretty_print_boolean_property("valid", erb_content_node->valid, indent, relative_indent, true, buffer);
230
+ } break;
231
+
232
+ case AST_ERB_END_NODE: {
233
+ const AST_ERB_END_NODE_T* erb_end_node = (AST_ERB_END_NODE_T*) node;
234
+
235
+ pretty_print_errors(node, indent, relative_indent, false, buffer);
236
+ pretty_print_token_property(erb_end_node->tag_opening, "tag_opening", indent, relative_indent, false, buffer);
237
+ pretty_print_token_property(erb_end_node->content, "content", indent, relative_indent, false, buffer);
238
+ pretty_print_token_property(erb_end_node->tag_closing, "tag_closing", indent, relative_indent, true, buffer);
239
+ } break;
240
+
241
+ case AST_ERB_ELSE_NODE: {
242
+ const AST_ERB_ELSE_NODE_T* erb_else_node = (AST_ERB_ELSE_NODE_T*) node;
243
+
244
+ pretty_print_errors(node, indent, relative_indent, false, buffer);
245
+ pretty_print_token_property(erb_else_node->tag_opening, "tag_opening", indent, relative_indent, false, buffer);
246
+ pretty_print_token_property(erb_else_node->content, "content", indent, relative_indent, false, buffer);
247
+ pretty_print_token_property(erb_else_node->tag_closing, "tag_closing", indent, relative_indent, false, buffer);
248
+ pretty_print_array("statements", erb_else_node->statements, indent, relative_indent, true, buffer);
249
+ } break;
250
+
251
+ case AST_ERB_IF_NODE: {
252
+ const AST_ERB_IF_NODE_T* erb_if_node = (AST_ERB_IF_NODE_T*) node;
253
+
254
+ pretty_print_errors(node, indent, relative_indent, false, buffer);
255
+ pretty_print_token_property(erb_if_node->tag_opening, "tag_opening", indent, relative_indent, false, buffer);
256
+ pretty_print_token_property(erb_if_node->content, "content", indent, relative_indent, false, buffer);
257
+ pretty_print_token_property(erb_if_node->tag_closing, "tag_closing", indent, relative_indent, false, buffer);
258
+ pretty_print_array("statements", erb_if_node->statements, indent, relative_indent, false, buffer);
259
+
260
+ pretty_print_label("subsequent", indent, relative_indent, false, buffer);
261
+
262
+ if (erb_if_node->subsequent) {
263
+ buffer_append(buffer, "\n");
264
+ pretty_print_indent(buffer, indent);
265
+ pretty_print_indent(buffer, relative_indent + 1);
266
+
267
+ buffer_append(buffer, "└── ");
268
+ ast_pretty_print_node((AST_NODE_T*) erb_if_node->subsequent, indent, relative_indent + 2, buffer);
269
+ } else {
270
+ buffer_append(buffer, " ∅\n");
271
+ }
272
+ buffer_append(buffer, "\n");
273
+
274
+
275
+ pretty_print_label("end_node", indent, relative_indent, true, buffer);
276
+
277
+ if (erb_if_node->end_node) {
278
+ buffer_append(buffer, "\n");
279
+ pretty_print_indent(buffer, indent);
280
+ pretty_print_indent(buffer, relative_indent + 1);
281
+
282
+ buffer_append(buffer, "└── ");
283
+ ast_pretty_print_node((AST_NODE_T*) erb_if_node->end_node, indent, relative_indent + 2, buffer);
284
+ } else {
285
+ buffer_append(buffer, " ∅\n");
286
+ }
287
+ buffer_append(buffer, "\n");
288
+
289
+ } break;
290
+
291
+ case AST_ERB_BLOCK_NODE: {
292
+ const AST_ERB_BLOCK_NODE_T* erb_block_node = (AST_ERB_BLOCK_NODE_T*) node;
293
+
294
+ pretty_print_errors(node, indent, relative_indent, false, buffer);
295
+ pretty_print_token_property(erb_block_node->tag_opening, "tag_opening", indent, relative_indent, false, buffer);
296
+ pretty_print_token_property(erb_block_node->content, "content", indent, relative_indent, false, buffer);
297
+ pretty_print_token_property(erb_block_node->tag_closing, "tag_closing", indent, relative_indent, false, buffer);
298
+ pretty_print_array("body", erb_block_node->body, indent, relative_indent, false, buffer);
299
+
300
+ pretty_print_label("end_node", indent, relative_indent, true, buffer);
301
+
302
+ if (erb_block_node->end_node) {
303
+ buffer_append(buffer, "\n");
304
+ pretty_print_indent(buffer, indent);
305
+ pretty_print_indent(buffer, relative_indent + 1);
306
+
307
+ buffer_append(buffer, "└── ");
308
+ ast_pretty_print_node((AST_NODE_T*) erb_block_node->end_node, indent, relative_indent + 2, buffer);
309
+ } else {
310
+ buffer_append(buffer, " ∅\n");
311
+ }
312
+ buffer_append(buffer, "\n");
313
+
314
+ } break;
315
+
316
+ case AST_ERB_WHEN_NODE: {
317
+ const AST_ERB_WHEN_NODE_T* erb_when_node = (AST_ERB_WHEN_NODE_T*) node;
318
+
319
+ pretty_print_errors(node, indent, relative_indent, false, buffer);
320
+ pretty_print_token_property(erb_when_node->tag_opening, "tag_opening", indent, relative_indent, false, buffer);
321
+ pretty_print_token_property(erb_when_node->content, "content", indent, relative_indent, false, buffer);
322
+ pretty_print_token_property(erb_when_node->tag_closing, "tag_closing", indent, relative_indent, false, buffer);
323
+ pretty_print_array("statements", erb_when_node->statements, indent, relative_indent, true, buffer);
324
+ } break;
325
+
326
+ case AST_ERB_CASE_NODE: {
327
+ const AST_ERB_CASE_NODE_T* erb_case_node = (AST_ERB_CASE_NODE_T*) node;
328
+
329
+ pretty_print_errors(node, indent, relative_indent, false, buffer);
330
+ pretty_print_token_property(erb_case_node->tag_opening, "tag_opening", indent, relative_indent, false, buffer);
331
+ pretty_print_token_property(erb_case_node->content, "content", indent, relative_indent, false, buffer);
332
+ pretty_print_token_property(erb_case_node->tag_closing, "tag_closing", indent, relative_indent, false, buffer);
333
+ pretty_print_array("children", erb_case_node->children, indent, relative_indent, false, buffer);
334
+ pretty_print_array("conditions", erb_case_node->conditions, indent, relative_indent, false, buffer);
335
+
336
+ pretty_print_label("else_clause", indent, relative_indent, false, buffer);
337
+
338
+ if (erb_case_node->else_clause) {
339
+ buffer_append(buffer, "\n");
340
+ pretty_print_indent(buffer, indent);
341
+ pretty_print_indent(buffer, relative_indent + 1);
342
+
343
+ buffer_append(buffer, "└── ");
344
+ ast_pretty_print_node((AST_NODE_T*) erb_case_node->else_clause, indent, relative_indent + 2, buffer);
345
+ } else {
346
+ buffer_append(buffer, " ∅\n");
347
+ }
348
+ buffer_append(buffer, "\n");
349
+
350
+
351
+ pretty_print_label("end_node", indent, relative_indent, true, buffer);
352
+
353
+ if (erb_case_node->end_node) {
354
+ buffer_append(buffer, "\n");
355
+ pretty_print_indent(buffer, indent);
356
+ pretty_print_indent(buffer, relative_indent + 1);
357
+
358
+ buffer_append(buffer, "└── ");
359
+ ast_pretty_print_node((AST_NODE_T*) erb_case_node->end_node, indent, relative_indent + 2, buffer);
360
+ } else {
361
+ buffer_append(buffer, " ∅\n");
362
+ }
363
+ buffer_append(buffer, "\n");
364
+
365
+ } break;
366
+
367
+ case AST_ERB_WHILE_NODE: {
368
+ const AST_ERB_WHILE_NODE_T* erb_while_node = (AST_ERB_WHILE_NODE_T*) node;
369
+
370
+ pretty_print_errors(node, indent, relative_indent, false, buffer);
371
+ pretty_print_token_property(erb_while_node->tag_opening, "tag_opening", indent, relative_indent, false, buffer);
372
+ pretty_print_token_property(erb_while_node->content, "content", indent, relative_indent, false, buffer);
373
+ pretty_print_token_property(erb_while_node->tag_closing, "tag_closing", indent, relative_indent, false, buffer);
374
+ pretty_print_array("statements", erb_while_node->statements, indent, relative_indent, false, buffer);
375
+
376
+ pretty_print_label("end_node", indent, relative_indent, true, buffer);
377
+
378
+ if (erb_while_node->end_node) {
379
+ buffer_append(buffer, "\n");
380
+ pretty_print_indent(buffer, indent);
381
+ pretty_print_indent(buffer, relative_indent + 1);
382
+
383
+ buffer_append(buffer, "└── ");
384
+ ast_pretty_print_node((AST_NODE_T*) erb_while_node->end_node, indent, relative_indent + 2, buffer);
385
+ } else {
386
+ buffer_append(buffer, " ∅\n");
387
+ }
388
+ buffer_append(buffer, "\n");
389
+
390
+ } break;
391
+
392
+ case AST_ERB_UNTIL_NODE: {
393
+ const AST_ERB_UNTIL_NODE_T* erb_until_node = (AST_ERB_UNTIL_NODE_T*) node;
394
+
395
+ pretty_print_errors(node, indent, relative_indent, false, buffer);
396
+ pretty_print_token_property(erb_until_node->tag_opening, "tag_opening", indent, relative_indent, false, buffer);
397
+ pretty_print_token_property(erb_until_node->content, "content", indent, relative_indent, false, buffer);
398
+ pretty_print_token_property(erb_until_node->tag_closing, "tag_closing", indent, relative_indent, false, buffer);
399
+ pretty_print_array("statements", erb_until_node->statements, indent, relative_indent, false, buffer);
400
+
401
+ pretty_print_label("end_node", indent, relative_indent, true, buffer);
402
+
403
+ if (erb_until_node->end_node) {
404
+ buffer_append(buffer, "\n");
405
+ pretty_print_indent(buffer, indent);
406
+ pretty_print_indent(buffer, relative_indent + 1);
407
+
408
+ buffer_append(buffer, "└── ");
409
+ ast_pretty_print_node((AST_NODE_T*) erb_until_node->end_node, indent, relative_indent + 2, buffer);
410
+ } else {
411
+ buffer_append(buffer, " ∅\n");
412
+ }
413
+ buffer_append(buffer, "\n");
414
+
415
+ } break;
416
+
417
+ case AST_ERB_FOR_NODE: {
418
+ const AST_ERB_FOR_NODE_T* erb_for_node = (AST_ERB_FOR_NODE_T*) node;
419
+
420
+ pretty_print_errors(node, indent, relative_indent, false, buffer);
421
+ pretty_print_token_property(erb_for_node->tag_opening, "tag_opening", indent, relative_indent, false, buffer);
422
+ pretty_print_token_property(erb_for_node->content, "content", indent, relative_indent, false, buffer);
423
+ pretty_print_token_property(erb_for_node->tag_closing, "tag_closing", indent, relative_indent, false, buffer);
424
+ pretty_print_array("statements", erb_for_node->statements, indent, relative_indent, false, buffer);
425
+
426
+ pretty_print_label("end_node", indent, relative_indent, true, buffer);
427
+
428
+ if (erb_for_node->end_node) {
429
+ buffer_append(buffer, "\n");
430
+ pretty_print_indent(buffer, indent);
431
+ pretty_print_indent(buffer, relative_indent + 1);
432
+
433
+ buffer_append(buffer, "└── ");
434
+ ast_pretty_print_node((AST_NODE_T*) erb_for_node->end_node, indent, relative_indent + 2, buffer);
435
+ } else {
436
+ buffer_append(buffer, " ∅\n");
437
+ }
438
+ buffer_append(buffer, "\n");
439
+
440
+ } break;
441
+
442
+ case AST_ERB_RESCUE_NODE: {
443
+ const AST_ERB_RESCUE_NODE_T* erb_rescue_node = (AST_ERB_RESCUE_NODE_T*) node;
444
+
445
+ pretty_print_errors(node, indent, relative_indent, false, buffer);
446
+ pretty_print_token_property(erb_rescue_node->tag_opening, "tag_opening", indent, relative_indent, false, buffer);
447
+ pretty_print_token_property(erb_rescue_node->content, "content", indent, relative_indent, false, buffer);
448
+ pretty_print_token_property(erb_rescue_node->tag_closing, "tag_closing", indent, relative_indent, false, buffer);
449
+ pretty_print_array("statements", erb_rescue_node->statements, indent, relative_indent, false, buffer);
450
+
451
+ pretty_print_label("subsequent", indent, relative_indent, true, buffer);
452
+
453
+ if (erb_rescue_node->subsequent) {
454
+ buffer_append(buffer, "\n");
455
+ pretty_print_indent(buffer, indent);
456
+ pretty_print_indent(buffer, relative_indent + 1);
457
+
458
+ buffer_append(buffer, "└── ");
459
+ ast_pretty_print_node((AST_NODE_T*) erb_rescue_node->subsequent, indent, relative_indent + 2, buffer);
460
+ } else {
461
+ buffer_append(buffer, " ∅\n");
462
+ }
463
+ buffer_append(buffer, "\n");
464
+
465
+ } break;
466
+
467
+ case AST_ERB_ENSURE_NODE: {
468
+ const AST_ERB_ENSURE_NODE_T* erb_ensure_node = (AST_ERB_ENSURE_NODE_T*) node;
469
+
470
+ pretty_print_errors(node, indent, relative_indent, false, buffer);
471
+ pretty_print_token_property(erb_ensure_node->tag_opening, "tag_opening", indent, relative_indent, false, buffer);
472
+ pretty_print_token_property(erb_ensure_node->content, "content", indent, relative_indent, false, buffer);
473
+ pretty_print_token_property(erb_ensure_node->tag_closing, "tag_closing", indent, relative_indent, false, buffer);
474
+ pretty_print_array("statements", erb_ensure_node->statements, indent, relative_indent, true, buffer);
475
+ } break;
476
+
477
+ case AST_ERB_BEGIN_NODE: {
478
+ const AST_ERB_BEGIN_NODE_T* erb_begin_node = (AST_ERB_BEGIN_NODE_T*) node;
479
+
480
+ pretty_print_errors(node, indent, relative_indent, false, buffer);
481
+ pretty_print_token_property(erb_begin_node->tag_opening, "tag_opening", indent, relative_indent, false, buffer);
482
+ pretty_print_token_property(erb_begin_node->content, "content", indent, relative_indent, false, buffer);
483
+ pretty_print_token_property(erb_begin_node->tag_closing, "tag_closing", indent, relative_indent, false, buffer);
484
+ pretty_print_array("statements", erb_begin_node->statements, indent, relative_indent, false, buffer);
485
+
486
+ pretty_print_label("rescue_clause", indent, relative_indent, false, buffer);
487
+
488
+ if (erb_begin_node->rescue_clause) {
489
+ buffer_append(buffer, "\n");
490
+ pretty_print_indent(buffer, indent);
491
+ pretty_print_indent(buffer, relative_indent + 1);
492
+
493
+ buffer_append(buffer, "└── ");
494
+ ast_pretty_print_node((AST_NODE_T*) erb_begin_node->rescue_clause, indent, relative_indent + 2, buffer);
495
+ } else {
496
+ buffer_append(buffer, " ∅\n");
497
+ }
498
+ buffer_append(buffer, "\n");
499
+
500
+
501
+ pretty_print_label("else_clause", indent, relative_indent, false, buffer);
502
+
503
+ if (erb_begin_node->else_clause) {
504
+ buffer_append(buffer, "\n");
505
+ pretty_print_indent(buffer, indent);
506
+ pretty_print_indent(buffer, relative_indent + 1);
507
+
508
+ buffer_append(buffer, "└── ");
509
+ ast_pretty_print_node((AST_NODE_T*) erb_begin_node->else_clause, indent, relative_indent + 2, buffer);
510
+ } else {
511
+ buffer_append(buffer, " ∅\n");
512
+ }
513
+ buffer_append(buffer, "\n");
514
+
515
+
516
+ pretty_print_label("ensure_clause", indent, relative_indent, false, buffer);
517
+
518
+ if (erb_begin_node->ensure_clause) {
519
+ buffer_append(buffer, "\n");
520
+ pretty_print_indent(buffer, indent);
521
+ pretty_print_indent(buffer, relative_indent + 1);
522
+
523
+ buffer_append(buffer, "└── ");
524
+ ast_pretty_print_node((AST_NODE_T*) erb_begin_node->ensure_clause, indent, relative_indent + 2, buffer);
525
+ } else {
526
+ buffer_append(buffer, " ∅\n");
527
+ }
528
+ buffer_append(buffer, "\n");
529
+
530
+
531
+ pretty_print_label("end_node", indent, relative_indent, true, buffer);
532
+
533
+ if (erb_begin_node->end_node) {
534
+ buffer_append(buffer, "\n");
535
+ pretty_print_indent(buffer, indent);
536
+ pretty_print_indent(buffer, relative_indent + 1);
537
+
538
+ buffer_append(buffer, "└── ");
539
+ ast_pretty_print_node((AST_NODE_T*) erb_begin_node->end_node, indent, relative_indent + 2, buffer);
540
+ } else {
541
+ buffer_append(buffer, " ∅\n");
542
+ }
543
+ buffer_append(buffer, "\n");
544
+
545
+ } break;
546
+
547
+ case AST_ERB_UNLESS_NODE: {
548
+ const AST_ERB_UNLESS_NODE_T* erb_unless_node = (AST_ERB_UNLESS_NODE_T*) node;
549
+
550
+ pretty_print_errors(node, indent, relative_indent, false, buffer);
551
+ pretty_print_token_property(erb_unless_node->tag_opening, "tag_opening", indent, relative_indent, false, buffer);
552
+ pretty_print_token_property(erb_unless_node->content, "content", indent, relative_indent, false, buffer);
553
+ pretty_print_token_property(erb_unless_node->tag_closing, "tag_closing", indent, relative_indent, false, buffer);
554
+ pretty_print_array("statements", erb_unless_node->statements, indent, relative_indent, false, buffer);
555
+
556
+ pretty_print_label("else_clause", indent, relative_indent, false, buffer);
557
+
558
+ if (erb_unless_node->else_clause) {
559
+ buffer_append(buffer, "\n");
560
+ pretty_print_indent(buffer, indent);
561
+ pretty_print_indent(buffer, relative_indent + 1);
562
+
563
+ buffer_append(buffer, "└── ");
564
+ ast_pretty_print_node((AST_NODE_T*) erb_unless_node->else_clause, indent, relative_indent + 2, buffer);
565
+ } else {
566
+ buffer_append(buffer, " ∅\n");
567
+ }
568
+ buffer_append(buffer, "\n");
569
+
570
+
571
+ pretty_print_label("end_node", indent, relative_indent, true, buffer);
572
+
573
+ if (erb_unless_node->end_node) {
574
+ buffer_append(buffer, "\n");
575
+ pretty_print_indent(buffer, indent);
576
+ pretty_print_indent(buffer, relative_indent + 1);
577
+
578
+ buffer_append(buffer, "└── ");
579
+ ast_pretty_print_node((AST_NODE_T*) erb_unless_node->end_node, indent, relative_indent + 2, buffer);
580
+ } else {
581
+ buffer_append(buffer, " ∅\n");
582
+ }
583
+ buffer_append(buffer, "\n");
584
+
585
+ } break;
586
+
587
+ }
588
+ }