herb 0.0.1 → 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 (108) hide show
  1. checksums.yaml +5 -5
  2. data/{LICENSE → LICENSE.txt} +4 -3
  3. data/Makefile +121 -0
  4. data/README.md +102 -107
  5. data/Rakefile +184 -0
  6. data/exe/herb +5 -0
  7. data/ext/herb/error_helpers.c +302 -0
  8. data/ext/herb/error_helpers.h +15 -0
  9. data/ext/herb/extconf.rb +75 -0
  10. data/ext/herb/extension.c +110 -0
  11. data/ext/herb/extension.h +6 -0
  12. data/ext/herb/extension_helpers.c +117 -0
  13. data/ext/herb/extension_helpers.h +24 -0
  14. data/ext/herb/nodes.c +936 -0
  15. data/ext/herb/nodes.h +12 -0
  16. data/herb.gemspec +49 -0
  17. data/lib/herb/ast/node.rb +61 -0
  18. data/lib/herb/ast/nodes.rb +1542 -0
  19. data/lib/herb/ast.rb +6 -0
  20. data/lib/herb/cli.rb +164 -0
  21. data/lib/herb/errors.rb +352 -0
  22. data/lib/herb/lex_result.rb +20 -0
  23. data/lib/herb/libherb/array.rb +48 -0
  24. data/lib/herb/libherb/ast_node.rb +47 -0
  25. data/lib/herb/libherb/buffer.rb +53 -0
  26. data/lib/herb/libherb/extract_result.rb +17 -0
  27. data/lib/herb/libherb/lex_result.rb +29 -0
  28. data/lib/herb/libherb/libherb.rb +49 -0
  29. data/lib/herb/libherb/parse_result.rb +17 -0
  30. data/lib/herb/libherb/token.rb +43 -0
  31. data/lib/herb/libherb.rb +32 -0
  32. data/lib/herb/location.rb +42 -0
  33. data/lib/herb/parse_result.rb +26 -0
  34. data/lib/herb/position.rb +36 -0
  35. data/lib/herb/project.rb +361 -0
  36. data/lib/herb/range.rb +40 -0
  37. data/lib/herb/result.rb +21 -0
  38. data/lib/herb/token.rb +43 -0
  39. data/lib/herb/token_list.rb +11 -0
  40. data/lib/herb/version.rb +5 -0
  41. data/lib/herb.rb +21 -68
  42. data/src/analyze.c +989 -0
  43. data/src/analyze_helpers.c +241 -0
  44. data/src/analyzed_ruby.c +35 -0
  45. data/src/array.c +137 -0
  46. data/src/ast_node.c +81 -0
  47. data/src/ast_nodes.c +866 -0
  48. data/src/ast_pretty_print.c +588 -0
  49. data/src/buffer.c +199 -0
  50. data/src/errors.c +740 -0
  51. data/src/extract.c +110 -0
  52. data/src/herb.c +103 -0
  53. data/src/html_util.c +143 -0
  54. data/src/include/analyze.h +36 -0
  55. data/src/include/analyze_helpers.h +43 -0
  56. data/src/include/analyzed_ruby.h +33 -0
  57. data/src/include/array.h +33 -0
  58. data/src/include/ast_node.h +35 -0
  59. data/src/include/ast_nodes.h +303 -0
  60. data/src/include/ast_pretty_print.h +17 -0
  61. data/src/include/buffer.h +36 -0
  62. data/src/include/errors.h +125 -0
  63. data/src/include/extract.h +20 -0
  64. data/src/include/herb.h +32 -0
  65. data/src/include/html_util.h +13 -0
  66. data/src/include/io.h +9 -0
  67. data/src/include/json.h +28 -0
  68. data/src/include/lexer.h +13 -0
  69. data/src/include/lexer_peek_helpers.h +23 -0
  70. data/src/include/lexer_struct.h +32 -0
  71. data/src/include/location.h +25 -0
  72. data/src/include/macros.h +10 -0
  73. data/src/include/memory.h +12 -0
  74. data/src/include/parser.h +22 -0
  75. data/src/include/parser_helpers.h +33 -0
  76. data/src/include/position.h +22 -0
  77. data/src/include/pretty_print.h +53 -0
  78. data/src/include/prism_helpers.h +18 -0
  79. data/src/include/range.h +23 -0
  80. data/src/include/ruby_parser.h +6 -0
  81. data/src/include/token.h +25 -0
  82. data/src/include/token_matchers.h +21 -0
  83. data/src/include/token_struct.h +51 -0
  84. data/src/include/util.h +25 -0
  85. data/src/include/version.h +6 -0
  86. data/src/include/visitor.h +11 -0
  87. data/src/io.c +30 -0
  88. data/src/json.c +205 -0
  89. data/src/lexer.c +284 -0
  90. data/src/lexer_peek_helpers.c +59 -0
  91. data/src/location.c +41 -0
  92. data/src/main.c +162 -0
  93. data/src/memory.c +53 -0
  94. data/src/parser.c +704 -0
  95. data/src/parser_helpers.c +161 -0
  96. data/src/position.c +33 -0
  97. data/src/pretty_print.c +242 -0
  98. data/src/prism_helpers.c +50 -0
  99. data/src/range.c +38 -0
  100. data/src/ruby_parser.c +47 -0
  101. data/src/token.c +194 -0
  102. data/src/token_matchers.c +32 -0
  103. data/src/util.c +128 -0
  104. data/src/visitor.c +321 -0
  105. metadata +126 -82
  106. data/test/helper.rb +0 -7
  107. data/test/helpers_test.rb +0 -25
  108. data/test/parsing_test.rb +0 -110
@@ -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
+ }