herb 0.7.2-x86_64-darwin → 0.7.3-x86_64-darwin

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 (130) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +2 -0
  3. data/README.md +1 -1
  4. data/Rakefile +46 -1
  5. data/config.yml +714 -0
  6. data/ext/herb/extconf.rb +2 -1
  7. data/ext/herb/nodes.c +1 -1
  8. data/herb.gemspec +3 -0
  9. data/lib/herb/3.0/herb.bundle +0 -0
  10. data/lib/herb/3.1/herb.bundle +0 -0
  11. data/lib/herb/3.2/herb.bundle +0 -0
  12. data/lib/herb/3.3/herb.bundle +0 -0
  13. data/lib/herb/3.4/herb.bundle +0 -0
  14. data/lib/herb/version.rb +1 -1
  15. data/src/analyze.c +5 -9
  16. data/src/analyze_helpers.c +17 -6
  17. data/src/include/pretty_print.h +1 -1
  18. data/src/include/version.h +1 -1
  19. data/src/parser.c +1 -0
  20. data/src/pretty_print.c +1 -1
  21. data/templates/ext/herb/error_helpers.c.erb +85 -0
  22. data/templates/ext/herb/error_helpers.h.erb +12 -0
  23. data/templates/ext/herb/nodes.c.erb +90 -0
  24. data/templates/ext/herb/nodes.h.erb +9 -0
  25. data/templates/javascript/packages/core/src/errors.ts.erb +193 -0
  26. data/templates/javascript/packages/core/src/node-type-guards.ts.erb +325 -0
  27. data/templates/javascript/packages/core/src/nodes.ts.erb +414 -0
  28. data/templates/javascript/packages/core/src/visitor.ts.erb +29 -0
  29. data/templates/javascript/packages/node/extension/error_helpers.cpp.erb +113 -0
  30. data/templates/javascript/packages/node/extension/error_helpers.h.erb +17 -0
  31. data/templates/javascript/packages/node/extension/nodes.cpp.erb +111 -0
  32. data/templates/javascript/packages/node/extension/nodes.h.erb +17 -0
  33. data/templates/lib/herb/ast/nodes.rb.erb +117 -0
  34. data/templates/lib/herb/errors.rb.erb +106 -0
  35. data/templates/lib/herb/visitor.rb.erb +28 -0
  36. data/templates/sig/serialized_ast_errors.rbs.erb +10 -0
  37. data/templates/sig/serialized_ast_nodes.rbs.erb +10 -0
  38. data/templates/src/ast_nodes.c.erb +145 -0
  39. data/templates/src/ast_pretty_print.c.erb +97 -0
  40. data/templates/src/errors.c.erb +245 -0
  41. data/templates/src/include/ast_nodes.h.erb +46 -0
  42. data/templates/src/include/ast_pretty_print.h.erb +14 -0
  43. data/templates/src/include/errors.h.erb +58 -0
  44. data/templates/src/visitor.c.erb +47 -0
  45. data/templates/template.rb +406 -0
  46. data/templates/wasm/error_helpers.cpp.erb +93 -0
  47. data/templates/wasm/error_helpers.h.erb +15 -0
  48. data/templates/wasm/nodes.cpp.erb +79 -0
  49. data/templates/wasm/nodes.h.erb +15 -0
  50. data/vendor/prism/Rakefile +75 -0
  51. data/vendor/prism/config.yml +4713 -0
  52. data/vendor/prism/include/prism/ast.h +8190 -0
  53. data/vendor/prism/include/prism/defines.h +260 -0
  54. data/vendor/prism/include/prism/diagnostic.h +455 -0
  55. data/vendor/prism/include/prism/encoding.h +283 -0
  56. data/vendor/prism/include/prism/node.h +129 -0
  57. data/vendor/prism/include/prism/options.h +482 -0
  58. data/vendor/prism/include/prism/pack.h +163 -0
  59. data/vendor/prism/include/prism/parser.h +933 -0
  60. data/vendor/prism/include/prism/prettyprint.h +34 -0
  61. data/vendor/prism/include/prism/regexp.h +43 -0
  62. data/vendor/prism/include/prism/static_literals.h +121 -0
  63. data/vendor/prism/include/prism/util/pm_buffer.h +236 -0
  64. data/vendor/prism/include/prism/util/pm_char.h +204 -0
  65. data/vendor/prism/include/prism/util/pm_constant_pool.h +218 -0
  66. data/vendor/prism/include/prism/util/pm_integer.h +130 -0
  67. data/vendor/prism/include/prism/util/pm_list.h +103 -0
  68. data/vendor/prism/include/prism/util/pm_memchr.h +29 -0
  69. data/vendor/prism/include/prism/util/pm_newline_list.h +113 -0
  70. data/vendor/prism/include/prism/util/pm_string.h +200 -0
  71. data/vendor/prism/include/prism/util/pm_strncasecmp.h +32 -0
  72. data/vendor/prism/include/prism/util/pm_strpbrk.h +46 -0
  73. data/vendor/prism/include/prism/version.h +29 -0
  74. data/vendor/prism/include/prism.h +408 -0
  75. data/vendor/prism/src/diagnostic.c +848 -0
  76. data/vendor/prism/src/encoding.c +5235 -0
  77. data/vendor/prism/src/node.c +8676 -0
  78. data/vendor/prism/src/options.c +328 -0
  79. data/vendor/prism/src/pack.c +509 -0
  80. data/vendor/prism/src/prettyprint.c +8941 -0
  81. data/vendor/prism/src/prism.c +23302 -0
  82. data/vendor/prism/src/regexp.c +790 -0
  83. data/vendor/prism/src/serialize.c +2268 -0
  84. data/vendor/prism/src/static_literals.c +617 -0
  85. data/vendor/prism/src/token_type.c +703 -0
  86. data/vendor/prism/src/util/pm_buffer.c +357 -0
  87. data/vendor/prism/src/util/pm_char.c +318 -0
  88. data/vendor/prism/src/util/pm_constant_pool.c +342 -0
  89. data/vendor/prism/src/util/pm_integer.c +670 -0
  90. data/vendor/prism/src/util/pm_list.c +49 -0
  91. data/vendor/prism/src/util/pm_memchr.c +35 -0
  92. data/vendor/prism/src/util/pm_newline_list.c +125 -0
  93. data/vendor/prism/src/util/pm_string.c +383 -0
  94. data/vendor/prism/src/util/pm_strncasecmp.c +36 -0
  95. data/vendor/prism/src/util/pm_strpbrk.c +206 -0
  96. data/vendor/prism/templates/ext/prism/api_node.c.erb +282 -0
  97. data/vendor/prism/templates/include/prism/ast.h.erb +226 -0
  98. data/vendor/prism/templates/include/prism/diagnostic.h.erb +130 -0
  99. data/vendor/prism/templates/java/org/prism/AbstractNodeVisitor.java.erb +22 -0
  100. data/vendor/prism/templates/java/org/prism/Loader.java.erb +434 -0
  101. data/vendor/prism/templates/java/org/prism/Nodes.java.erb +403 -0
  102. data/vendor/prism/templates/javascript/src/deserialize.js.erb +448 -0
  103. data/vendor/prism/templates/javascript/src/nodes.js.erb +197 -0
  104. data/vendor/prism/templates/javascript/src/visitor.js.erb +78 -0
  105. data/vendor/prism/templates/lib/prism/compiler.rb.erb +43 -0
  106. data/vendor/prism/templates/lib/prism/dispatcher.rb.erb +103 -0
  107. data/vendor/prism/templates/lib/prism/dot_visitor.rb.erb +189 -0
  108. data/vendor/prism/templates/lib/prism/dsl.rb.erb +133 -0
  109. data/vendor/prism/templates/lib/prism/inspect_visitor.rb.erb +131 -0
  110. data/vendor/prism/templates/lib/prism/mutation_compiler.rb.erb +19 -0
  111. data/vendor/prism/templates/lib/prism/node.rb.erb +515 -0
  112. data/vendor/prism/templates/lib/prism/reflection.rb.erb +136 -0
  113. data/vendor/prism/templates/lib/prism/serialize.rb.erb +602 -0
  114. data/vendor/prism/templates/lib/prism/visitor.rb.erb +55 -0
  115. data/vendor/prism/templates/rbi/prism/dsl.rbi.erb +68 -0
  116. data/vendor/prism/templates/rbi/prism/node.rbi.erb +164 -0
  117. data/vendor/prism/templates/rbi/prism/visitor.rbi.erb +18 -0
  118. data/vendor/prism/templates/sig/prism/_private/dot_visitor.rbs.erb +45 -0
  119. data/vendor/prism/templates/sig/prism/dsl.rbs.erb +31 -0
  120. data/vendor/prism/templates/sig/prism/mutation_compiler.rbs.erb +7 -0
  121. data/vendor/prism/templates/sig/prism/node.rbs.erb +132 -0
  122. data/vendor/prism/templates/sig/prism/visitor.rbs.erb +17 -0
  123. data/vendor/prism/templates/sig/prism.rbs.erb +89 -0
  124. data/vendor/prism/templates/src/diagnostic.c.erb +523 -0
  125. data/vendor/prism/templates/src/node.c.erb +333 -0
  126. data/vendor/prism/templates/src/prettyprint.c.erb +166 -0
  127. data/vendor/prism/templates/src/serialize.c.erb +406 -0
  128. data/vendor/prism/templates/src/token_type.c.erb +369 -0
  129. data/vendor/prism/templates/template.rb +689 -0
  130. metadata +112 -2
@@ -0,0 +1,245 @@
1
+ #include "include/array.h"
2
+ #include "include/errors.h"
3
+ #include "include/location.h"
4
+ #include "include/position.h"
5
+ #include "include/pretty_print.h"
6
+ #include "include/token.h"
7
+ #include "include/util.h"
8
+
9
+ #include <stdio.h>
10
+ #include <stdbool.h>
11
+ #include <stdlib.h>
12
+ #include <string.h>
13
+
14
+ #define ERROR_MESSAGES_TRUNCATED_LENGTH <%= Herb::Template::PrintfMessageTemplate::MAX_STRING_SIZE %>
15
+
16
+ size_t error_sizeof(void) {
17
+ return sizeof(struct ERROR_STRUCT);
18
+ }
19
+
20
+ void error_init(ERROR_T* error, const error_type_T type, position_T* start, position_T* end) {
21
+ if (!error) { return; }
22
+
23
+ error->type = type;
24
+ error->location = location_init(position_copy(start), position_copy(end));
25
+ }
26
+ <%- errors.each do |error| -%>
27
+ <%- error_arguments = error.fields.any? ? error.fields.map { |field| [field.c_type, " ", field.name].join } : [] -%>
28
+ <%- arguments = error_arguments + ["position_T* start", "position_T* end"] -%>
29
+
30
+ <%= error.struct_type %>* <%= error.human %>_init(<%= arguments.join(", ") %>) {
31
+ <%= error.struct_type %>* <%= error.human %> = malloc(sizeof(<%= error.struct_type %>));
32
+
33
+ error_init(&<%= error.human %>->base, <%= error.type %>, start, end);
34
+
35
+ <%- if error.message_arguments.any? -%>
36
+ const char* message_template = "<%= error.message_template %>";
37
+
38
+ size_t message_size = <%= Herb::Template::PrintfMessageTemplate.estimate_buffer_size(error.message_template) %>;
39
+ char* message = (char*) malloc(message_size);
40
+
41
+ if (message) {
42
+ <%- error.message_arguments.each_with_index do |argument, i| -%>
43
+ <%- if error.message_template.scan(/%[sdulfz]/)[i] == "%s" -%>
44
+ char truncated_argument_<%= i %>[ERROR_MESSAGES_TRUNCATED_LENGTH + 1];
45
+ strncpy(truncated_argument_<%= i %>, <%= argument %>, ERROR_MESSAGES_TRUNCATED_LENGTH);
46
+ truncated_argument_<%= i %>[ERROR_MESSAGES_TRUNCATED_LENGTH] = '\0';
47
+
48
+ <%- end -%>
49
+ <%- end -%>
50
+ snprintf(
51
+ message,
52
+ message_size,
53
+ message_template,
54
+ <%- error.message_arguments.each_with_index do |argument, index| -%>
55
+ <%- if error.message_template.scan(/%[sdulfz]/)[index] == "%s" -%>
56
+ truncated_argument_<%= index %><% if index != error.message_arguments.length - 1 %>,<% end %>
57
+ <%- else -%>
58
+ <%= argument %><% if index != error.message_arguments.length - 1 %>,<% end %>
59
+ <%- end -%>
60
+ <%- end -%>
61
+ );
62
+
63
+ <%= error.human %>->base.message = herb_strdup(message);
64
+ free(message);
65
+ } else {
66
+ <%= error.human %>->base.message = herb_strdup("<%= error.message_template %>");
67
+ }
68
+ <%- else -%>
69
+ <%= error.human %>->base.message = herb_strdup("<%= error.message_template %>");
70
+ <%- end -%>
71
+
72
+ <%- error.fields.each do |field| -%>
73
+ <%- case field -%>
74
+ <%- when Herb::Template::PositionField -%>
75
+ <%= error.human %>-><%= field.name %> = position_copy(<%= field.name %>);
76
+ <%- when Herb::Template::TokenField -%>
77
+ <%= error.human %>-><%= field.name %> = token_copy(<%= field.name %>);
78
+ <%- when Herb::Template::TokenTypeField -%>
79
+ <%= error.human %>-><%= field.name %> = <%= field.name %>;
80
+ <%- when Herb::Template::SizeTField -%>
81
+ <%= error.human %>-><%= field.name %> = <%= field.name %>;
82
+ <%- when Herb::Template::StringField -%>
83
+ <%= error.human %>-><%= field.name %> = herb_strdup(<%= field.name %>);
84
+ <%- else -%>
85
+ <%= field.inspect %>
86
+ <%- end -%>
87
+ <%- end -%>
88
+ return <%= error.human %>;
89
+ }
90
+
91
+ void append_<%= error.human %>(<%= (arguments + ["array_T* errors"]).join(", ") %>) {
92
+ array_append(errors, <%= error.human %>_init(<%= arguments.map { |argument| argument.split(" ").last.strip }.join(", ") %>));
93
+ }
94
+ <%- end -%>
95
+
96
+ const char* error_type_to_string(ERROR_T* error) {
97
+ switch (error->type) {
98
+ <%- errors.each do |error| -%>
99
+ case <%= error.type %>: return "<%= error.type %>";
100
+ <%- end -%>
101
+ }
102
+
103
+ return "Unknown error_type_T";
104
+ }
105
+
106
+ const char* error_human_type(ERROR_T* error) {
107
+ switch (error->type) {
108
+ <%- errors.each do |error| -%>
109
+ case <%= error.type %>: return "<%= error.name %>";
110
+ <%- end -%>
111
+ }
112
+
113
+ return "Unknown error_type_T";
114
+ }
115
+
116
+ void error_free_base_error(ERROR_T* error) {
117
+ if (error == NULL) { return; }
118
+
119
+ if (error->location != NULL) { location_free(error->location); }
120
+ if (error->message != NULL) { free(error->message); }
121
+
122
+ free(error);
123
+ }
124
+ <%- errors.each do |error| -%>
125
+ <%- arguments = error.fields.any? ? error.fields.map { |field| [field.c_type, " ", field.name].join }.join(", ") : "void" -%>
126
+
127
+ static void error_free_<%= error.human %>(<%= error.struct_type %>* <%= error.human %>) {
128
+ <%- if error.fields.none? -%>
129
+ /* no <%= error.struct_type %> specific fields to free up */
130
+ <%- end -%>
131
+ <%- error.fields.each do |field| -%>
132
+ <%- case field -%>
133
+ <%- when Herb::Template::PositionField -%>
134
+ if (<%= error.human %>-><%= field.name %> != NULL) { position_free(<%= error.human %>-><%= field.name %>); }
135
+ <%- when Herb::Template::TokenField -%>
136
+ if (<%= error.human %>-><%= field.name %> != NULL) { token_free(<%= error.human %>-><%= field.name %>); }
137
+ <%- when Herb::Template::TokenTypeField -%>
138
+ // token_type_T is part of struct
139
+ <%- when Herb::Template::SizeTField -%>
140
+ // size_t is part of struct
141
+ <%- when Herb::Template::StringField -%>
142
+ if (<%= error.human %>-><%= field.name %> != NULL) { free((char*) <%= error.human %>-><%= field.name %>); }
143
+ <%- else -%>
144
+ <%= field.inspect %>
145
+ <%- end -%>
146
+ <%- end -%>
147
+
148
+ error_free_base_error(&<%= error.human %>->base);
149
+ }
150
+ <%- end -%>
151
+
152
+ void error_free(ERROR_T* error) {
153
+ if (!error) { return; }
154
+
155
+ switch (error->type) {
156
+ <%- errors.each do |error| -%>
157
+ case <%= error.type %>: error_free_<%= error.human %>((<%= error.struct_type %>*) error); break;
158
+ <%- end -%>
159
+ }
160
+ }
161
+
162
+ void error_pretty_print_array(
163
+ const char* name, array_T* array, const size_t indent, const size_t relative_indent, const bool last_property,
164
+ buffer_T* buffer
165
+ ) {
166
+ if (array == NULL) {
167
+ pretty_print_property(name, "∅", indent, relative_indent, last_property, buffer);
168
+
169
+ return;
170
+ }
171
+
172
+ if (array_size(array) == 0) {
173
+ pretty_print_property(name, "[]", indent, relative_indent, last_property, buffer);
174
+
175
+ return;
176
+ }
177
+
178
+ pretty_print_label(name, indent, relative_indent, last_property, buffer);
179
+
180
+ buffer_append(buffer, "(");
181
+
182
+ char count[16];
183
+ sprintf(count, "%zu", array_size(array));
184
+ buffer_append(buffer, count);
185
+ buffer_append(buffer, ")\n");
186
+
187
+ if (indent < 20) {
188
+ for (size_t i = 0; i < array_size(array); i++) {
189
+ ERROR_T* child = array_get(array, i);
190
+ pretty_print_indent(buffer, indent);
191
+ pretty_print_indent(buffer, relative_indent + 1);
192
+
193
+ if (i == array_size(array) - 1) {
194
+ buffer_append(buffer, "└── ");
195
+ } else {
196
+ buffer_append(buffer, "├── ");
197
+ }
198
+
199
+ error_pretty_print(child, indent + 1, relative_indent + 1, buffer);
200
+
201
+ if (i != array_size(array) - 1) { pretty_print_newline(indent + 1, relative_indent, buffer); }
202
+ }
203
+ }
204
+ }
205
+
206
+ <%- errors.each do |error| -%>
207
+ static void error_pretty_print_<%= error.human %>(<%= error.struct_type %>* error, const size_t indent, const size_t relative_indent, buffer_T* buffer) {
208
+ if (!error) { return; }
209
+
210
+ buffer_append(buffer, "@ ");
211
+ buffer_append(buffer, error_human_type((ERROR_T*) error));
212
+ buffer_append(buffer, " ");
213
+
214
+ pretty_print_location(error->base.location, buffer);
215
+ buffer_append(buffer, "\n");
216
+
217
+ pretty_print_quoted_property("message", error->base.message, indent, relative_indent, <%= error.fields.none? %>, buffer);
218
+ <%- error.fields.each_with_index do |field, index| -%>
219
+ <%- case field -%>
220
+ <%- when Herb::Template::PositionField -%>
221
+ pretty_print_position_property(error-><%= field.name %>, "<%= field.name %>", indent, relative_indent, <%= error.fields.length - 1 == index %>, buffer);
222
+ <%- when Herb::Template::TokenField -%>
223
+ pretty_print_token_property(error-><%= field.name %>, "<%= field.name %>", indent, relative_indent, <%= error.fields.length - 1 == index %>, buffer);
224
+ <%- when Herb::Template::TokenTypeField -%>
225
+ pretty_print_property(token_type_to_string(error-><%= field.name %>), "<%= field.name %>", indent, relative_indent, <%= error.fields.length - 1 == index %>, buffer);
226
+ <%- when Herb::Template::SizeTField -%>
227
+ pretty_print_size_t_property(error-><%= field.name %>, "<%= field.name %>", indent, relative_indent, <%= error.fields.length - 1 == index %>, buffer);
228
+ <%- when Herb::Template::StringField -%>
229
+ pretty_print_quoted_property("<%= field.name %>", error-><%= field.name %>, indent, relative_indent, <%= error.fields.length - 1 == index %>, buffer);
230
+ <%- else -%>
231
+ <%= field.inspect %>
232
+ <%- end -%>
233
+ <%- end -%>
234
+ }
235
+
236
+ <%- end -%>
237
+ void error_pretty_print(ERROR_T* error, const size_t indent, const size_t relative_indent, buffer_T* buffer) {
238
+ if (!error) { return; }
239
+
240
+ switch (error->type) {
241
+ <%- errors.each do |error| -%>
242
+ case <%= error.type %>: error_pretty_print_<%= error.human %>((<%= error.struct_type %>*) error, indent, relative_indent, buffer); break;
243
+ <%- end -%>
244
+ }
245
+ }
@@ -0,0 +1,46 @@
1
+ #ifndef HERB_AST_NODES_H
2
+ #define HERB_AST_NODES_H
3
+
4
+ #include <stdbool.h>
5
+ #include <prism.h>
6
+
7
+ #include "array.h"
8
+ #include "buffer.h"
9
+ #include "position.h"
10
+ #include "location.h"
11
+ #include "token_struct.h"
12
+ #include "analyzed_ruby.h"
13
+ #include "element_source.h"
14
+
15
+ typedef enum {
16
+ <%- nodes.each do |node| -%>
17
+ <%= node.type.upcase %>,
18
+ <%- end -%>
19
+ } ast_node_type_T;
20
+
21
+ typedef struct AST_NODE_STRUCT {
22
+ ast_node_type_T type;
23
+ location_T* location;
24
+ // maybe a range too?
25
+ array_T* errors;
26
+ } AST_NODE_T;
27
+
28
+ <%- nodes.each do |node| -%>
29
+ <%- arguments = node.fields.any? ? node.fields.map { |field| [field.c_type, " ", field.name, ";"].join }.join("\n ") : "/* no additional fields */" -%>
30
+
31
+ typedef struct <%= node.struct_name %> {
32
+ AST_NODE_T base;
33
+ <%= arguments %>
34
+ } <%= node.struct_type %>;
35
+ <%- end -%>
36
+
37
+ <%- nodes.each do |node| -%>
38
+ <%- node_arguments = node.fields.any? ? node.fields.map { |field| [field.c_type, " ", field.name].join } : [] -%>
39
+ <%- arguments = node_arguments + ["position_T* start_position", "position_T* end_position", "array_T* errors"] -%>
40
+ <%= node.struct_type %>* ast_<%= node.human %>_init(<%= arguments.join(", ") %>);
41
+ <%- end -%>
42
+
43
+ const char* ast_node_type_to_string(AST_NODE_T* node);
44
+ const char* ast_node_human_type(AST_NODE_T* node);
45
+
46
+ #endif
@@ -0,0 +1,14 @@
1
+ #ifndef HERB_AST_PRETTY_PRINT_H
2
+ #define HERB_AST_PRETTY_PRINT_H
3
+
4
+ #include "ast_nodes.h"
5
+ #include "buffer.h"
6
+
7
+ void ast_pretty_print_node(
8
+ AST_NODE_T* node,
9
+ size_t indent,
10
+ size_t relative_indent,
11
+ buffer_T* buffer
12
+ );
13
+
14
+ #endif
@@ -0,0 +1,58 @@
1
+ #ifndef HERB_ERRORS_H
2
+ #define HERB_ERRORS_H
3
+
4
+ #include "array.h"
5
+ #include "buffer.h"
6
+ #include "errors.h"
7
+ #include "location.h"
8
+ #include "position.h"
9
+ #include "token.h"
10
+
11
+ typedef enum {
12
+ <%- errors.each do |error| -%>
13
+ <%= error.type.upcase %>,
14
+ <%- end -%>
15
+ } error_type_T;
16
+
17
+ typedef struct ERROR_STRUCT {
18
+ error_type_T type;
19
+ location_T* location;
20
+ char* message;
21
+ } ERROR_T;
22
+
23
+ <%- errors.each do |error| -%>
24
+ <%- arguments = error.fields.any? ? error.fields.map { |field| [field.c_type, " ", field.name, ";"].join }.join("\n ") : "/* no additional fields */" -%>
25
+
26
+ typedef struct {
27
+ ERROR_T base;
28
+ <%= arguments %>
29
+ } <%= error.struct_type %>;
30
+ <%- end -%>
31
+
32
+ <%- errors.each do |error| -%>
33
+ <%- error_arguments = error.fields.any? ? error.fields.map { |field| [field.c_type, " ", field.name].join } : [] -%>
34
+ <%- arguments = error_arguments + ["position_T* start", "position_T* end"] -%>
35
+ <%= error.struct_type %>* <%= error.human %>_init(<%= arguments.join(", ") %>);
36
+ void append_<%= error.human %>(<%= (arguments << "array_T* errors").join(", ") %>);
37
+ <%- end -%>
38
+
39
+ void error_init(ERROR_T* error, error_type_T type, position_T* start, position_T* end);
40
+
41
+ size_t error_sizeof(void);
42
+ error_type_T error_type(ERROR_T* error);
43
+
44
+ char* error_message(ERROR_T* error);
45
+
46
+ const char* error_type_to_string(ERROR_T* error);
47
+ const char* error_human_type(ERROR_T* error);
48
+
49
+ void error_free(ERROR_T* error);
50
+
51
+ void error_pretty_print(ERROR_T* error, size_t indent, size_t relative_indent, buffer_T* buffer);
52
+
53
+ void error_pretty_print_array(
54
+ const char* name, array_T* array, size_t indent, size_t relative_indent, bool last_property,
55
+ buffer_T* buffer
56
+ );
57
+
58
+ #endif
@@ -0,0 +1,47 @@
1
+ #include <stdio.h>
2
+
3
+ #include "include/array.h"
4
+ #include "include/visitor.h"
5
+ #include "include/ast_node.h"
6
+ #include "include/ast_nodes.h"
7
+
8
+ void herb_visit_node(const AST_NODE_T* node, bool (*visitor)(const AST_NODE_T*, void*), void* data) {
9
+ if (visitor(node, data) && node != NULL) {
10
+ herb_visit_child_nodes(node, visitor, data);
11
+ }
12
+ }
13
+
14
+ void herb_visit_child_nodes(const AST_NODE_T *node, bool (*visitor)(const AST_NODE_T *node, void *data), void *data) {
15
+ if (node == NULL) {
16
+ return;
17
+ }
18
+
19
+ switch (node->type) {
20
+ <%- nodes.each do |node| -%>
21
+ <%- if node.fields.count { |field| [Herb::Template::NodeField, Herb::Template::ArrayField].include?(field.class) }.positive? -%>
22
+ case <%= node.type %>: {
23
+ const <%= node.struct_type %>* <%= node.human %> = ((const <%= node.struct_type %> *) node);
24
+
25
+ <%- node.fields.each do |field| -%>
26
+ <%- case field -%>
27
+ <%- when Herb::Template::NodeField -%>
28
+ if (<%= node.human %>-><%= field.name %> != NULL) {
29
+ herb_visit_node((AST_NODE_T *) <%= node.human %>-><%= field.name %>, visitor, data);
30
+ }
31
+
32
+ <%- when Herb::Template::ArrayField -%>
33
+ if (<%= node.human %>-><%= field.name %> != NULL) {
34
+ for (size_t index = 0; index < array_size(<%= node.human %>-><%= field.name %>); index++) {
35
+ herb_visit_node(array_get(<%= node.human %>-><%= field.name %>, index), visitor, data);
36
+ }
37
+ }
38
+
39
+ <%- end -%>
40
+ <%- end -%>
41
+ } break;
42
+
43
+ <%- end -%>
44
+ <%- end -%>
45
+ default: break;
46
+ }
47
+ }