herb 0.7.5 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +8 -5
  3. data/config.yml +26 -6
  4. data/ext/herb/error_helpers.c +57 -3
  5. data/ext/herb/error_helpers.h +1 -1
  6. data/ext/herb/extconf.rb +1 -0
  7. data/ext/herb/extension.c +10 -24
  8. data/ext/herb/extension_helpers.c +3 -3
  9. data/ext/herb/extension_helpers.h +1 -1
  10. data/ext/herb/nodes.c +72 -37
  11. data/herb.gemspec +0 -2
  12. data/lib/herb/ast/helpers.rb +11 -0
  13. data/lib/herb/ast/node.rb +15 -6
  14. data/lib/herb/ast/nodes.rb +609 -392
  15. data/lib/herb/cli.rb +31 -0
  16. data/lib/herb/colors.rb +82 -0
  17. data/lib/herb/engine/compiler.rb +140 -14
  18. data/lib/herb/engine/debug_visitor.rb +1 -5
  19. data/lib/herb/engine/parser_error_overlay.rb +1 -1
  20. data/lib/herb/engine.rb +8 -14
  21. data/lib/herb/errors.rb +166 -56
  22. data/lib/herb/location.rb +2 -2
  23. data/lib/herb/project.rb +86 -21
  24. data/lib/herb/token.rb +14 -2
  25. data/lib/herb/version.rb +1 -1
  26. data/lib/herb.rb +1 -0
  27. data/sig/herb/ast/helpers.rbs +3 -0
  28. data/sig/herb/ast/node.rbs +12 -5
  29. data/sig/herb/ast/nodes.rbs +124 -62
  30. data/sig/herb/colors.rbs +35 -0
  31. data/sig/herb/engine/compiler.rbs +23 -1
  32. data/sig/herb/errors.rbs +74 -20
  33. data/sig/herb/token.rbs +8 -0
  34. data/sig/herb_c_extension.rbs +1 -1
  35. data/sig/serialized_ast_errors.rbs +8 -0
  36. data/src/analyze.c +420 -171
  37. data/src/analyze_helpers.c +5 -0
  38. data/src/analyze_missing_end.c +147 -0
  39. data/src/analyze_transform.c +196 -0
  40. data/src/analyzed_ruby.c +23 -2
  41. data/src/ast_node.c +5 -5
  42. data/src/ast_nodes.c +179 -179
  43. data/src/ast_pretty_print.c +232 -232
  44. data/src/element_source.c +7 -6
  45. data/src/errors.c +246 -126
  46. data/src/extract.c +92 -34
  47. data/src/herb.c +37 -49
  48. data/src/html_util.c +34 -96
  49. data/src/include/analyze.h +10 -2
  50. data/src/include/analyze_helpers.h +3 -0
  51. data/src/include/analyzed_ruby.h +4 -2
  52. data/src/include/ast_node.h +2 -2
  53. data/src/include/ast_nodes.h +67 -66
  54. data/src/include/ast_pretty_print.h +2 -2
  55. data/src/include/element_source.h +3 -1
  56. data/src/include/errors.h +30 -14
  57. data/src/include/extract.h +4 -4
  58. data/src/include/herb.h +6 -7
  59. data/src/include/html_util.h +4 -5
  60. data/src/include/lexer.h +1 -3
  61. data/src/include/lexer_peek_helpers.h +14 -14
  62. data/src/include/lexer_struct.h +3 -2
  63. data/src/include/macros.h +4 -0
  64. data/src/include/parser.h +12 -6
  65. data/src/include/parser_helpers.h +25 -15
  66. data/src/include/pretty_print.h +38 -28
  67. data/src/include/token.h +5 -8
  68. data/src/include/utf8.h +3 -2
  69. data/src/include/util/hb_arena.h +31 -0
  70. data/src/include/util/hb_arena_debug.h +8 -0
  71. data/src/include/util/hb_array.h +33 -0
  72. data/src/include/util/hb_buffer.h +34 -0
  73. data/src/include/util/hb_string.h +29 -0
  74. data/src/include/util/hb_system.h +9 -0
  75. data/src/include/util.h +3 -14
  76. data/src/include/version.h +1 -1
  77. data/src/include/visitor.h +1 -1
  78. data/src/io.c +7 -4
  79. data/src/lexer.c +61 -88
  80. data/src/lexer_peek_helpers.c +35 -37
  81. data/src/main.c +19 -23
  82. data/src/parser.c +282 -201
  83. data/src/parser_helpers.c +46 -40
  84. data/src/parser_match_tags.c +316 -0
  85. data/src/pretty_print.c +82 -106
  86. data/src/token.c +18 -65
  87. data/src/utf8.c +4 -4
  88. data/src/util/hb_arena.c +179 -0
  89. data/src/util/hb_arena_debug.c +237 -0
  90. data/src/{array.c → util/hb_array.c} +26 -27
  91. data/src/util/hb_buffer.c +203 -0
  92. data/src/util/hb_string.c +85 -0
  93. data/src/util/hb_system.c +30 -0
  94. data/src/util.c +29 -99
  95. data/src/visitor.c +54 -54
  96. data/templates/ext/herb/error_helpers.c.erb +3 -3
  97. data/templates/ext/herb/error_helpers.h.erb +1 -1
  98. data/templates/ext/herb/nodes.c.erb +11 -6
  99. data/templates/java/error_helpers.c.erb +75 -0
  100. data/templates/java/error_helpers.h.erb +20 -0
  101. data/templates/java/nodes.c.erb +97 -0
  102. data/templates/java/nodes.h.erb +23 -0
  103. data/templates/java/org/herb/ast/Errors.java.erb +121 -0
  104. data/templates/java/org/herb/ast/NodeVisitor.java.erb +14 -0
  105. data/templates/java/org/herb/ast/Nodes.java.erb +220 -0
  106. data/templates/java/org/herb/ast/Visitor.java.erb +56 -0
  107. data/templates/javascript/packages/node/extension/error_helpers.cpp.erb +8 -8
  108. data/templates/javascript/packages/node/extension/error_helpers.h.erb +1 -1
  109. data/templates/javascript/packages/node/extension/nodes.cpp.erb +9 -9
  110. data/templates/javascript/packages/node/extension/nodes.h.erb +1 -1
  111. data/templates/lib/herb/ast/nodes.rb.erb +28 -16
  112. data/templates/lib/herb/errors.rb.erb +17 -12
  113. data/templates/rust/src/ast/nodes.rs.erb +220 -0
  114. data/templates/rust/src/errors.rs.erb +216 -0
  115. data/templates/rust/src/nodes.rs.erb +374 -0
  116. data/templates/src/analyze_missing_end.c.erb +36 -0
  117. data/templates/src/analyze_transform.c.erb +24 -0
  118. data/templates/src/ast_nodes.c.erb +14 -14
  119. data/templates/src/ast_pretty_print.c.erb +36 -36
  120. data/templates/src/errors.c.erb +31 -31
  121. data/templates/src/include/ast_nodes.h.erb +10 -9
  122. data/templates/src/include/ast_pretty_print.h.erb +2 -2
  123. data/templates/src/include/errors.h.erb +6 -6
  124. data/templates/src/parser_match_tags.c.erb +38 -0
  125. data/templates/src/visitor.c.erb +4 -4
  126. data/templates/template.rb +22 -3
  127. data/templates/wasm/error_helpers.cpp.erb +9 -9
  128. data/templates/wasm/error_helpers.h.erb +1 -1
  129. data/templates/wasm/nodes.cpp.erb +9 -9
  130. data/templates/wasm/nodes.h.erb +1 -1
  131. data/vendor/prism/Rakefile +4 -1
  132. data/vendor/prism/config.yml +2 -1
  133. data/vendor/prism/include/prism/ast.h +31 -1
  134. data/vendor/prism/include/prism/diagnostic.h +1 -0
  135. data/vendor/prism/include/prism/version.h +3 -3
  136. data/vendor/prism/src/diagnostic.c +3 -1
  137. data/vendor/prism/src/prism.c +130 -71
  138. data/vendor/prism/src/util/pm_string.c +6 -8
  139. data/vendor/prism/templates/include/prism/ast.h.erb +2 -0
  140. data/vendor/prism/templates/java/org/prism/Loader.java.erb +2 -2
  141. data/vendor/prism/templates/javascript/src/deserialize.js.erb +2 -2
  142. data/vendor/prism/templates/lib/prism/serialize.rb.erb +2 -2
  143. data/vendor/prism/templates/sig/prism.rbs.erb +4 -0
  144. data/vendor/prism/templates/src/diagnostic.c.erb +1 -0
  145. metadata +34 -20
  146. data/lib/herb/libherb/array.rb +0 -51
  147. data/lib/herb/libherb/ast_node.rb +0 -50
  148. data/lib/herb/libherb/buffer.rb +0 -56
  149. data/lib/herb/libherb/extract_result.rb +0 -20
  150. data/lib/herb/libherb/lex_result.rb +0 -32
  151. data/lib/herb/libherb/libherb.rb +0 -52
  152. data/lib/herb/libherb/parse_result.rb +0 -20
  153. data/lib/herb/libherb/token.rb +0 -46
  154. data/lib/herb/libherb.rb +0 -35
  155. data/src/buffer.c +0 -241
  156. data/src/include/array.h +0 -33
  157. data/src/include/buffer.h +0 -39
  158. data/src/include/json.h +0 -28
  159. data/src/include/memory.h +0 -12
  160. data/src/json.c +0 -205
  161. data/src/memory.c +0 -53
data/src/include/json.h DELETED
@@ -1,28 +0,0 @@
1
- #ifndef HERB_JSON_H
2
- #define HERB_JSON_H
3
-
4
- #include "buffer.h"
5
-
6
- void json_start_root_object(buffer_T* json);
7
- void json_start_root_array(buffer_T* json);
8
-
9
- void json_escape_string(buffer_T* json, const char* string);
10
-
11
- void json_add_string(buffer_T* json, const char* key, const char* value);
12
- void json_add_int(buffer_T* json, const char* key, int value);
13
- void json_add_size_t(buffer_T* json, const char* key, size_t value);
14
- void json_add_double(buffer_T* json, const char* key, double value);
15
- void json_add_bool(buffer_T* json, const char* key, int value);
16
-
17
- void json_add_raw_string(buffer_T* json, const char* string);
18
-
19
- void json_start_object(buffer_T* json, const char* key);
20
- void json_end_object(buffer_T* json);
21
-
22
- void json_start_array(buffer_T* json, const char* key);
23
- void json_end_array(buffer_T* json);
24
-
25
- void json_double_to_string(double value, char* buffer);
26
- void json_int_to_string(int value, char* buffer);
27
-
28
- #endif
data/src/include/memory.h DELETED
@@ -1,12 +0,0 @@
1
- #ifndef HERB_MEMORY_H
2
- #define HERB_MEMORY_H
3
-
4
- #include <stddef.h>
5
-
6
- void* safe_malloc(size_t size);
7
- void* safe_realloc(void* pointer, size_t new_size);
8
-
9
- void* nullable_safe_malloc(size_t size);
10
- void* nullable_safe_realloc(void* pointer, size_t new_size);
11
-
12
- #endif
data/src/json.c DELETED
@@ -1,205 +0,0 @@
1
- #include "include/json.h"
2
- #include "include/buffer.h"
3
-
4
- void json_escape_string(buffer_T* json, const char* string) {
5
- if (!string) {
6
- buffer_append(json, "null");
7
- return;
8
- }
9
-
10
- buffer_append(json, "\"");
11
-
12
- while (*string) {
13
- switch (*string) {
14
- case '\"': buffer_append(json, "\\\""); break;
15
- case '\\': buffer_append(json, "\\\\"); break;
16
- case '\n': buffer_append(json, "\\n"); break;
17
- case '\t': buffer_append(json, "\\t"); break;
18
- default: buffer_append_char(json, *string); break;
19
- }
20
- string++;
21
- }
22
-
23
- buffer_append(json, "\"");
24
- }
25
-
26
- void json_int_to_string(const int value, char* buffer) {
27
- char string[20]; // Enough to hold all possible int values
28
- int i = 0;
29
-
30
- // Handle negative numbers
31
- unsigned int abs_value = (unsigned int) abs(value);
32
-
33
- do {
34
- string[i++] = (char) ((abs_value % 10) + '0');
35
- abs_value /= 10;
36
- } while (abs_value > 0);
37
-
38
- if (value < 0) { string[i++] = '-'; }
39
-
40
- int j = 0;
41
-
42
- while (i > 0) {
43
- buffer[j++] = string[--i];
44
- }
45
-
46
- buffer[j] = '\0';
47
- }
48
-
49
- void json_double_to_string(const double value, char* buffer) {
50
- const int int_part = (int) value;
51
- const double frac_part = value - (double) int_part;
52
- const int frac_as_int = (int) (frac_part * 100); // Keep 2 decimal places
53
-
54
- char int_buffer[20];
55
- char frac_buffer[5];
56
-
57
- json_int_to_string(int_part, int_buffer);
58
- json_int_to_string(frac_as_int < 0 ? -frac_as_int : frac_as_int, frac_buffer);
59
-
60
- char* pointer = buffer;
61
- for (const char* source = int_buffer; *source != '\0'; ++source) {
62
- *pointer++ = *source;
63
- }
64
-
65
- *pointer++ = '.';
66
-
67
- for (const char* source = frac_buffer; *source != '\0'; ++source) {
68
- *pointer++ = *source;
69
- }
70
-
71
- *pointer = '\0';
72
- }
73
-
74
- void json_add_string(buffer_T* json, const char* key, const char* value) {
75
- if (!json) { return; }
76
-
77
- if (json->length > 1) { buffer_append(json, ", "); }
78
-
79
- if (key) {
80
- json_escape_string(json, key);
81
- buffer_append(json, ": ");
82
- }
83
-
84
- json_escape_string(json, value);
85
- }
86
-
87
- void json_add_double(buffer_T* json, const char* key, const double value) {
88
- if (!json) { return; }
89
-
90
- char number[32];
91
- json_double_to_string(value, number);
92
-
93
- if (json->length > 1) { buffer_append(json, ", "); }
94
-
95
- if (key) {
96
- json_escape_string(json, key);
97
- buffer_append(json, ": ");
98
- }
99
-
100
- buffer_append(json, number);
101
- }
102
-
103
- void json_add_int(buffer_T* json, const char* key, const int value) {
104
- if (!json) { return; }
105
-
106
- char number[20];
107
- json_int_to_string(value, number);
108
-
109
- if (json->length > 1) { buffer_append(json, ", "); }
110
-
111
- if (key) {
112
- json_escape_string(json, key);
113
- buffer_append(json, ": ");
114
- }
115
-
116
- buffer_append(json, number);
117
- if (json->length == 1) { buffer_append(json, " "); }
118
- }
119
-
120
- void json_add_size_t(buffer_T* json, const char* key, size_t value) {
121
- if (!json) { return; }
122
-
123
- char number[32];
124
- char temp[32];
125
- int i = 0;
126
-
127
- do {
128
- temp[i++] = (char) ((value % 10) + '0');
129
- value /= 10;
130
- } while (value > 0);
131
-
132
- int j = 0;
133
- while (i > 0) {
134
- number[j++] = temp[--i];
135
- }
136
- number[j] = '\0';
137
-
138
- if (json->length > 1) { buffer_append(json, ", "); }
139
-
140
- if (key) {
141
- json_escape_string(json, key);
142
- buffer_append(json, ": ");
143
- }
144
-
145
- buffer_append(json, number);
146
- if (json->length == 1) { buffer_append(json, " "); }
147
- }
148
-
149
- void json_add_bool(buffer_T* json, const char* key, const int value) {
150
- if (!json) { return; }
151
-
152
- if (json->length > 1) { buffer_append(json, ", "); }
153
-
154
- if (key) {
155
- json_escape_string(json, key);
156
- buffer_append(json, ": ");
157
- }
158
-
159
- buffer_append(json, value ? "true" : "false");
160
- }
161
-
162
- void json_add_raw_string(buffer_T* json, const char* string) {
163
- if (!json) { return; }
164
-
165
- if (json->length > 1) { buffer_append(json, ", "); }
166
-
167
- buffer_append(json, string);
168
- }
169
-
170
- void json_start_root_object(buffer_T* json) {
171
- if (json) { buffer_append(json, "{"); }
172
- }
173
-
174
- void json_start_object(buffer_T* json, const char* key) {
175
- if (!json) { return; }
176
-
177
- if (json->length > 1) { buffer_append(json, ", "); }
178
-
179
- if (key) {
180
- json_escape_string(json, key);
181
- buffer_append(json, ": ");
182
- }
183
-
184
- buffer_append(json, "{");
185
- }
186
-
187
- void json_end_object(buffer_T* json) {
188
- if (json) { buffer_append(json, "}"); }
189
- }
190
-
191
- void json_start_root_array(buffer_T* json) {
192
- if (json) { buffer_append(json, "["); }
193
- }
194
-
195
- void json_start_array(buffer_T* json, const char* key) {
196
- if (!json) { return; }
197
-
198
- if (json->length > 1) { buffer_append(json, ", "); }
199
- json_escape_string(json, key);
200
- buffer_append(json, ": [");
201
- }
202
-
203
- void json_end_array(buffer_T* json) {
204
- if (json) { buffer_append(json, "]"); }
205
- }
data/src/memory.c DELETED
@@ -1,53 +0,0 @@
1
- #include "memory.h"
2
-
3
- #include <stdbool.h>
4
- #include <stdio.h>
5
- #include <stdlib.h>
6
-
7
- static void* safe_malloc_internal(const size_t size, const bool fail_fast) {
8
- if (size == 0) { return NULL; }
9
-
10
- void* pointer = malloc(size);
11
-
12
- if (!pointer) {
13
- fprintf(stderr, "Error: Failed to allocate %zu bytes.\n", size);
14
- fflush(stderr);
15
- if (fail_fast) { exit(1); }
16
- return NULL;
17
- }
18
-
19
- return pointer;
20
- }
21
-
22
- static void* safe_realloc_internal(void* pointer, const size_t new_size, const bool fail_fast) {
23
- if (new_size == 0) { return NULL; }
24
-
25
- if (!pointer) { return safe_malloc_internal(new_size, fail_fast); }
26
-
27
- void* new_pointer = realloc(pointer, new_size);
28
-
29
- if (!new_pointer) {
30
- fprintf(stderr, "Error: Memory reallocation failed (size: %zu bytes).\n", new_size);
31
- fflush(stderr);
32
- if (fail_fast) { exit(1); }
33
- return NULL;
34
- }
35
-
36
- return new_pointer;
37
- }
38
-
39
- void* safe_malloc(const size_t size) {
40
- return safe_malloc_internal(size, true);
41
- }
42
-
43
- void* nullable_safe_malloc(const size_t size) {
44
- return safe_malloc_internal(size, false);
45
- }
46
-
47
- void* safe_realloc(void* pointer, const size_t new_size) {
48
- return safe_realloc_internal(pointer, new_size, true);
49
- }
50
-
51
- void* nullable_safe_realloc(void* pointer, const size_t new_size) {
52
- return safe_realloc_internal(pointer, new_size, false);
53
- }