herb 0.7.1-arm-linux-gnu → 0.7.3-arm-linux-gnu

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 (137) 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/error_helpers.c +27 -27
  7. data/ext/herb/extconf.rb +2 -1
  8. data/ext/herb/extension.c +6 -6
  9. data/ext/herb/extension_helpers.c +3 -3
  10. data/ext/herb/nodes.c +35 -35
  11. data/herb.gemspec +3 -0
  12. data/lib/herb/3.0/herb.so +0 -0
  13. data/lib/herb/3.1/herb.so +0 -0
  14. data/lib/herb/3.2/herb.so +0 -0
  15. data/lib/herb/3.3/herb.so +0 -0
  16. data/lib/herb/3.4/herb.so +0 -0
  17. data/lib/herb/engine/debug_visitor.rb +41 -21
  18. data/lib/herb/engine.rb +20 -6
  19. data/lib/herb/version.rb +1 -1
  20. data/sig/herb/engine/debug_visitor.rbs +3 -3
  21. data/sig/herb/engine.rbs +5 -0
  22. data/src/analyze.c +5 -9
  23. data/src/analyze_helpers.c +17 -6
  24. data/src/include/pretty_print.h +1 -1
  25. data/src/include/version.h +1 -1
  26. data/src/parser.c +6 -9
  27. data/src/pretty_print.c +1 -1
  28. data/templates/ext/herb/error_helpers.c.erb +85 -0
  29. data/templates/ext/herb/error_helpers.h.erb +12 -0
  30. data/templates/ext/herb/nodes.c.erb +90 -0
  31. data/templates/ext/herb/nodes.h.erb +9 -0
  32. data/templates/javascript/packages/core/src/errors.ts.erb +193 -0
  33. data/templates/javascript/packages/core/src/node-type-guards.ts.erb +325 -0
  34. data/templates/javascript/packages/core/src/nodes.ts.erb +414 -0
  35. data/templates/javascript/packages/core/src/visitor.ts.erb +29 -0
  36. data/templates/javascript/packages/node/extension/error_helpers.cpp.erb +113 -0
  37. data/templates/javascript/packages/node/extension/error_helpers.h.erb +17 -0
  38. data/templates/javascript/packages/node/extension/nodes.cpp.erb +111 -0
  39. data/templates/javascript/packages/node/extension/nodes.h.erb +17 -0
  40. data/templates/lib/herb/ast/nodes.rb.erb +117 -0
  41. data/templates/lib/herb/errors.rb.erb +106 -0
  42. data/templates/lib/herb/visitor.rb.erb +28 -0
  43. data/templates/sig/serialized_ast_errors.rbs.erb +10 -0
  44. data/templates/sig/serialized_ast_nodes.rbs.erb +10 -0
  45. data/templates/src/ast_nodes.c.erb +145 -0
  46. data/templates/src/ast_pretty_print.c.erb +97 -0
  47. data/templates/src/errors.c.erb +245 -0
  48. data/templates/src/include/ast_nodes.h.erb +46 -0
  49. data/templates/src/include/ast_pretty_print.h.erb +14 -0
  50. data/templates/src/include/errors.h.erb +58 -0
  51. data/templates/src/visitor.c.erb +47 -0
  52. data/templates/template.rb +406 -0
  53. data/templates/wasm/error_helpers.cpp.erb +93 -0
  54. data/templates/wasm/error_helpers.h.erb +15 -0
  55. data/templates/wasm/nodes.cpp.erb +79 -0
  56. data/templates/wasm/nodes.h.erb +15 -0
  57. data/vendor/prism/Rakefile +75 -0
  58. data/vendor/prism/config.yml +4713 -0
  59. data/vendor/prism/include/prism/ast.h +8190 -0
  60. data/vendor/prism/include/prism/defines.h +260 -0
  61. data/vendor/prism/include/prism/diagnostic.h +455 -0
  62. data/vendor/prism/include/prism/encoding.h +283 -0
  63. data/vendor/prism/include/prism/node.h +129 -0
  64. data/vendor/prism/include/prism/options.h +482 -0
  65. data/vendor/prism/include/prism/pack.h +163 -0
  66. data/vendor/prism/include/prism/parser.h +933 -0
  67. data/vendor/prism/include/prism/prettyprint.h +34 -0
  68. data/vendor/prism/include/prism/regexp.h +43 -0
  69. data/vendor/prism/include/prism/static_literals.h +121 -0
  70. data/vendor/prism/include/prism/util/pm_buffer.h +236 -0
  71. data/vendor/prism/include/prism/util/pm_char.h +204 -0
  72. data/vendor/prism/include/prism/util/pm_constant_pool.h +218 -0
  73. data/vendor/prism/include/prism/util/pm_integer.h +130 -0
  74. data/vendor/prism/include/prism/util/pm_list.h +103 -0
  75. data/vendor/prism/include/prism/util/pm_memchr.h +29 -0
  76. data/vendor/prism/include/prism/util/pm_newline_list.h +113 -0
  77. data/vendor/prism/include/prism/util/pm_string.h +200 -0
  78. data/vendor/prism/include/prism/util/pm_strncasecmp.h +32 -0
  79. data/vendor/prism/include/prism/util/pm_strpbrk.h +46 -0
  80. data/vendor/prism/include/prism/version.h +29 -0
  81. data/vendor/prism/include/prism.h +408 -0
  82. data/vendor/prism/src/diagnostic.c +848 -0
  83. data/vendor/prism/src/encoding.c +5235 -0
  84. data/vendor/prism/src/node.c +8676 -0
  85. data/vendor/prism/src/options.c +328 -0
  86. data/vendor/prism/src/pack.c +509 -0
  87. data/vendor/prism/src/prettyprint.c +8941 -0
  88. data/vendor/prism/src/prism.c +23302 -0
  89. data/vendor/prism/src/regexp.c +790 -0
  90. data/vendor/prism/src/serialize.c +2268 -0
  91. data/vendor/prism/src/static_literals.c +617 -0
  92. data/vendor/prism/src/token_type.c +703 -0
  93. data/vendor/prism/src/util/pm_buffer.c +357 -0
  94. data/vendor/prism/src/util/pm_char.c +318 -0
  95. data/vendor/prism/src/util/pm_constant_pool.c +342 -0
  96. data/vendor/prism/src/util/pm_integer.c +670 -0
  97. data/vendor/prism/src/util/pm_list.c +49 -0
  98. data/vendor/prism/src/util/pm_memchr.c +35 -0
  99. data/vendor/prism/src/util/pm_newline_list.c +125 -0
  100. data/vendor/prism/src/util/pm_string.c +383 -0
  101. data/vendor/prism/src/util/pm_strncasecmp.c +36 -0
  102. data/vendor/prism/src/util/pm_strpbrk.c +206 -0
  103. data/vendor/prism/templates/ext/prism/api_node.c.erb +282 -0
  104. data/vendor/prism/templates/include/prism/ast.h.erb +226 -0
  105. data/vendor/prism/templates/include/prism/diagnostic.h.erb +130 -0
  106. data/vendor/prism/templates/java/org/prism/AbstractNodeVisitor.java.erb +22 -0
  107. data/vendor/prism/templates/java/org/prism/Loader.java.erb +434 -0
  108. data/vendor/prism/templates/java/org/prism/Nodes.java.erb +403 -0
  109. data/vendor/prism/templates/javascript/src/deserialize.js.erb +448 -0
  110. data/vendor/prism/templates/javascript/src/nodes.js.erb +197 -0
  111. data/vendor/prism/templates/javascript/src/visitor.js.erb +78 -0
  112. data/vendor/prism/templates/lib/prism/compiler.rb.erb +43 -0
  113. data/vendor/prism/templates/lib/prism/dispatcher.rb.erb +103 -0
  114. data/vendor/prism/templates/lib/prism/dot_visitor.rb.erb +189 -0
  115. data/vendor/prism/templates/lib/prism/dsl.rb.erb +133 -0
  116. data/vendor/prism/templates/lib/prism/inspect_visitor.rb.erb +131 -0
  117. data/vendor/prism/templates/lib/prism/mutation_compiler.rb.erb +19 -0
  118. data/vendor/prism/templates/lib/prism/node.rb.erb +515 -0
  119. data/vendor/prism/templates/lib/prism/reflection.rb.erb +136 -0
  120. data/vendor/prism/templates/lib/prism/serialize.rb.erb +602 -0
  121. data/vendor/prism/templates/lib/prism/visitor.rb.erb +55 -0
  122. data/vendor/prism/templates/rbi/prism/dsl.rbi.erb +68 -0
  123. data/vendor/prism/templates/rbi/prism/node.rbi.erb +164 -0
  124. data/vendor/prism/templates/rbi/prism/visitor.rbi.erb +18 -0
  125. data/vendor/prism/templates/sig/prism/_private/dot_visitor.rbs.erb +45 -0
  126. data/vendor/prism/templates/sig/prism/dsl.rbs.erb +31 -0
  127. data/vendor/prism/templates/sig/prism/mutation_compiler.rbs.erb +7 -0
  128. data/vendor/prism/templates/sig/prism/node.rbs.erb +132 -0
  129. data/vendor/prism/templates/sig/prism/visitor.rbs.erb +17 -0
  130. data/vendor/prism/templates/sig/prism.rbs.erb +89 -0
  131. data/vendor/prism/templates/src/diagnostic.c.erb +523 -0
  132. data/vendor/prism/templates/src/node.c.erb +333 -0
  133. data/vendor/prism/templates/src/prettyprint.c.erb +166 -0
  134. data/vendor/prism/templates/src/serialize.c.erb +406 -0
  135. data/vendor/prism/templates/src/token_type.c.erb +369 -0
  136. data/vendor/prism/templates/template.rb +689 -0
  137. metadata +112 -2
@@ -0,0 +1,325 @@
1
+ import type { Node, NodeType, ERBNode } from "./nodes.js"
2
+
3
+ import { Token } from "./token.js"
4
+ import { ParseResult } from "./parse-result.js"
5
+
6
+ import {
7
+ <%- nodes.each_with_index do |node, index| -%>
8
+ <%= node.name %>,
9
+ <%- end -%>
10
+ } from "./nodes.js"
11
+
12
+ /**
13
+ * Type guard functions for AST nodes.
14
+ * These functions provide type checking by combining both instanceof
15
+ * checks and type string comparisons for maximum reliability across different
16
+ * runtime scenarios (e.g., serialized/deserialized nodes).
17
+ */
18
+
19
+ <%- nodes.each do |node| -%>
20
+ /**
21
+ * Checks if a node is a <%= node.name %>
22
+ */
23
+ export function is<%= node.name %>(node: Node): node is <%= node.name %> {
24
+ return node instanceof <%= node.name %> || node.type === "<%= node.type %>" || (node.constructor as any).type === "<%= node.type %>"
25
+ }
26
+
27
+ <%- end -%>
28
+ /**
29
+ * Convenience type guards for common node categories
30
+ */
31
+
32
+ /**
33
+ * Checks if a node is any HTML node type
34
+ */
35
+ export function isHTMLNode(node: Node): boolean {
36
+ <%- html_nodes = nodes.select { |n| n.name.start_with?("HTML") } -%>
37
+ return <%= html_nodes.map { |n| "is#{n.name}(node)" }.join(" ||\n ") %>
38
+ }
39
+
40
+ /**
41
+ * Checks if a node is any ERB node type
42
+ */
43
+ export function isERBNode(node: Node): node is ERBNode {
44
+ <%- erb_nodes = nodes.select { |n| n.name.start_with?("ERB") } -%>
45
+ return <%= erb_nodes.map { |n| "is#{n.name}(node)" }.join(" ||\n ") %>
46
+ }
47
+
48
+ /**
49
+ * Map of node classes to their corresponding type guard functions
50
+ *
51
+ * @example
52
+ * const guard = NODE_TYPE_GUARDS[HTMLTextNode]
53
+ *
54
+ * if (guard(node)) {
55
+ * // node is HTMLTextNode
56
+ * }
57
+ */
58
+ export const NODE_TYPE_GUARDS = new Map<new (...args: any[]) => Node, (node: Node) => boolean>([
59
+ <%- nodes.each_with_index do |node, index| -%>
60
+ [<%= node.name %>, is<%= node.name %>],
61
+ <%- end -%>
62
+ ])
63
+
64
+ /**
65
+ * Map of AST node type strings to their corresponding type guard functions
66
+ *
67
+ * @example
68
+ * const guard = AST_TYPE_GUARDS["AST_HTML_TEXT_NODE"]
69
+ *
70
+ * if (guard(node)) {
71
+ * // node is HTMLTextNode
72
+ * }
73
+ */
74
+ export const AST_TYPE_GUARDS = new Map<NodeType, (node: Node) => boolean>([
75
+ <%- nodes.each_with_index do |node, index| -%>
76
+ ["<%= node.type %>", is<%= node.name %>],
77
+ <%- end -%>
78
+ ])
79
+
80
+ type NodeTypeToClass = {
81
+ <%- nodes.each do |node| -%>
82
+ "<%= node.type %>": <%= node.name %>;
83
+ <%- end -%>
84
+ }
85
+
86
+ type ClassToInstance<T> = T extends new (...args: any[]) => infer R ? R : never
87
+
88
+ /**
89
+ * Checks if a node matches any of the provided type identifiers with proper type narrowing
90
+ * Supports AST type strings, node classes, or type guard functions
91
+ *
92
+ * @example
93
+ * if (isAnyOf(node, "AST_HTML_TEXT_NODE", "AST_LITERAL_NODE")) {
94
+ * // node is narrowed to HTMLTextNode | LiteralNode
95
+ * }
96
+ *
97
+ * @example
98
+ * if (isAnyOf(node, HTMLTextNode, LiteralNode)) {
99
+ * // node is narrowed to HTMLTextNode | LiteralNode
100
+ * }
101
+ */
102
+
103
+ export function isAnyOf(node: Node, ...types: Array<NodeType | (new (...args: any[]) => Node) | ((node: Node) => boolean)>): boolean {
104
+ return types.some(type => {
105
+ if (typeof type === 'string') {
106
+ return isNode(node, type)
107
+ } else if (typeof type === 'function' && type.prototype && type.prototype.constructor === type && NODE_TYPE_GUARDS.has(type as new (...args: any[]) => Node)) {
108
+ return isNode(node, type as new (...args: any[]) => Node)
109
+ } else if (typeof type === 'function') {
110
+ return (type as (node: Node) => boolean)(node)
111
+ } else {
112
+ return false
113
+ }
114
+ })
115
+ }
116
+
117
+ /**
118
+ * Checks if a node does NOT match any of the provided type identifiers
119
+ * Supports AST type strings, node classes, or type guard functions
120
+ * This is the logical inverse of isAnyOf
121
+ *
122
+ * @example
123
+ * if (isNoneOf(node, "AST_HTML_TEXT_NODE", "AST_LITERAL_NODE")) {
124
+ * // node is neither HTMLTextNode nor LiteralNode
125
+ * }
126
+ *
127
+ * @example
128
+ * if (isNoneOf(node, HTMLTextNode, LiteralNode)) {
129
+ * // node is neither HTMLTextNode nor LiteralNode
130
+ * }
131
+ *
132
+ * @example
133
+ * if (isNoneOf(node, isHTMLTextNode, isLiteralNode)) {
134
+ * // node is neither HTMLTextNode nor LiteralNode
135
+ * }
136
+ */
137
+ export function isNoneOf(
138
+ node: Node,
139
+ ...types: Array<NodeType | (new (...args: any[]) => Node) | ((node: Node) => boolean)>
140
+ ): boolean {
141
+ return !isAnyOf(node, ...types)
142
+ }
143
+
144
+ /**
145
+ * Checks if ALL nodes in an array match any of the provided type identifiers
146
+ * Supports AST type strings, node classes, or type guard functions
147
+ * Provides type narrowing for the array when true
148
+ *
149
+ * @example
150
+ * if (areAllOfType(nodes, "AST_HTML_TEXT_NODE", "AST_LITERAL_NODE")) {
151
+ * // nodes is narrowed to (HTMLTextNode | LiteralNode)[]
152
+ * }
153
+ *
154
+ * @example
155
+ * if (areAllOfType(nodes, HTMLTextNode, LiteralNode)) {
156
+ * // nodes is narrowed to (HTMLTextNode | LiteralNode)[]
157
+ * }
158
+ *
159
+ * @example
160
+ * if (areAllOfType(nodes, isHTMLTextNode, isLiteralNode)) {
161
+ * // all nodes are either HTMLTextNode or LiteralNode
162
+ * }
163
+ */
164
+
165
+ export function areAllOfType<T extends NodeType[]>(
166
+ nodes: Node[],
167
+ ...types: T
168
+ ): nodes is NodeTypeToClass[T[number]][]
169
+
170
+ export function areAllOfType<T extends (new (...args: any[]) => Node)[]>(
171
+ nodes: Node[],
172
+ ...types: T
173
+ ): nodes is ClassToInstance<T[number]>[]
174
+
175
+ export function areAllOfType(
176
+ nodes: Node[],
177
+ ...types: Array<(node: Node) => boolean>
178
+ ): boolean
179
+
180
+ export function areAllOfType(
181
+ nodes: Node[],
182
+ ...types: Array<NodeType | (new (...args: any[]) => Node) | ((node: Node) => boolean)>
183
+ ): boolean {
184
+ return nodes.every(node => isAnyOf(node, ...types))
185
+ }
186
+
187
+ /**
188
+ * Filters an array of nodes to only include nodes matching any of the provided type identifiers
189
+ * Supports AST type strings, node classes, or type guard functions
190
+ * Returns a properly typed array of the filtered nodes
191
+ *
192
+ * @example
193
+ * const filtered = filterNodes(nodes, "AST_HTML_TEXT_NODE", "AST_LITERAL_NODE")
194
+ * // filtered is typed as (HTMLTextNode | LiteralNode)[]
195
+ *
196
+ * @example
197
+ * const filtered = filterNodes(nodes, HTMLTextNode, LiteralNode)
198
+ * // filtered is typed as (HTMLTextNode | LiteralNode)[]
199
+ *
200
+ * @example
201
+ * const filtered = filterNodes(nodes, isHTMLTextNode, isLiteralNode)
202
+ * // filtered contains only HTMLTextNode or LiteralNode instances
203
+ *
204
+ * @example
205
+ * const filtered = filterNodes(nodes, "AST_LITERAL_NODE", HTMLTextNode, isERBContentNode)
206
+ * // filtered contains only LiteralNode, HTMLTextNode, or ERBContentNode instances
207
+ */
208
+
209
+ export function filterNodes<T extends NodeType[]>(
210
+ nodes: Node[] | undefined | null,
211
+ ...types: T
212
+ ): NodeTypeToClass[T[number]][]
213
+
214
+ export function filterNodes<T extends (new (...args: any[]) => Node)[]>(
215
+ nodes: Node[] | undefined | null,
216
+ ...types: T
217
+ ): ClassToInstance<T[number]>[]
218
+
219
+ export function filterNodes(
220
+ nodes: Node[] | undefined | null,
221
+ ...types: Array<(node: Node) => boolean>
222
+ ): Node[]
223
+
224
+ export function filterNodes(
225
+ nodes: Node[] | undefined | null,
226
+ ...types: Array<NodeType | (new (...args: any[]) => Node) | ((node: Node) => boolean)>
227
+ ): Node[] {
228
+ if (!nodes) return []
229
+
230
+ return nodes.filter(node => isAnyOf(node, ...types))
231
+ }
232
+
233
+ /**
234
+ * Checks if a node matches a specific type identifier with proper type narrowing
235
+ * Supports AST type strings or node classes
236
+ *
237
+ * @example
238
+ * if (isNode(node, "AST_HTML_TEXT_NODE")) {
239
+ * // node is narrowed to HTMLTextNode
240
+ * }
241
+ *
242
+ * @example
243
+ * if (isNode(node, HTMLTextNode)) {
244
+ * // node is narrowed to HTMLTextNode
245
+ * }
246
+ */
247
+
248
+ export function isNode<T extends NodeType>(
249
+ node: Node | null | undefined,
250
+ type: T
251
+ ): node is NodeTypeToClass[T]
252
+
253
+ export function isNode<T extends new (...args: any[]) => Node>(
254
+ node: Node | null | undefined,
255
+ type: T
256
+ ): node is ClassToInstance<T>
257
+
258
+ export function isNode(
259
+ node: Node | null | undefined,
260
+ type: NodeType | (new (...args: any[]) => Node)
261
+ ): boolean {
262
+ if (!node) return false
263
+
264
+ if (typeof type === 'string') {
265
+ const guard = AST_TYPE_GUARDS.get(type)
266
+
267
+ return guard ? guard(node) : false
268
+ } else if (typeof type === 'function') {
269
+ const guard = NODE_TYPE_GUARDS.get(type as new (...args: any[]) => Node)
270
+
271
+ return guard ? guard(node) : false
272
+ } else {
273
+ return false
274
+ }
275
+ }
276
+
277
+ export function isToken(object: any): object is Token {
278
+ return (object instanceof Token) || (object?.constructor?.name === "Token" && "value" in object) || (object as any).type?.startsWith('TOKEN_')
279
+ }
280
+
281
+ export function isParseResult(object: any): object is ParseResult {
282
+ return (object instanceof ParseResult) || (object?.constructor?.name === "ParseResult" && "value" in object)
283
+ }
284
+
285
+ /**
286
+ * Checks if a node has children (contains other nodes)
287
+ */
288
+ export function hasChildren(node: Node): boolean {
289
+ return isDocumentNode(node) ||
290
+ isHTMLOpenTagNode(node) ||
291
+ isHTMLCloseTagNode(node) ||
292
+ isHTMLElementNode(node) ||
293
+ isHTMLAttributeValueNode(node) ||
294
+ isHTMLAttributeNameNode(node) ||
295
+ isHTMLCommentNode(node) ||
296
+ isHTMLDoctypeNode(node) ||
297
+ isERBElseNode(node) ||
298
+ isERBIfNode(node) ||
299
+ isERBBlockNode(node) ||
300
+ isERBWhenNode(node) ||
301
+ isERBCaseNode(node) ||
302
+ isERBCaseMatchNode(node) ||
303
+ isERBWhileNode(node) ||
304
+ isERBUntilNode(node) ||
305
+ isERBForNode(node) ||
306
+ isERBRescueNode(node) ||
307
+ isERBEnsureNode(node) ||
308
+ isERBBeginNode(node) ||
309
+ isERBUnlessNode(node) ||
310
+ isERBInNode(node)
311
+ }
312
+
313
+ /**
314
+ * Filter functions for extracting specific node types from arrays
315
+ */
316
+
317
+ <%- nodes.each do |node| -%>
318
+ /**
319
+ * Filters an array of nodes to only include <%= node.name %> nodes
320
+ */
321
+ export function filter<%= node.name %>s(nodes: Node[]): <%= node.name %>[] {
322
+ return nodes.filter(is<%= node.name %>) as <%= node.name %>[]
323
+ }
324
+
325
+ <%- end -%>