herb 0.7.2-arm64-darwin → 0.7.3-arm64-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,17 @@
1
+ #ifndef HERB_EXTENSION_NODES_H
2
+ #define HERB_EXTENSION_NODES_H
3
+
4
+ #include <node_api.h>
5
+
6
+ extern "C" {
7
+ #include "../extension/libherb/include/herb.h"
8
+ }
9
+
10
+ napi_value NodeFromCStruct(napi_env env, AST_NODE_T* node);
11
+ napi_value NodesArrayFromCArray(napi_env env, array_T* array);
12
+
13
+ <%- nodes.each do |node| -%>
14
+ napi_value <%= node.human %>NodeFromCStruct(napi_env env, <%= node.struct_type %>* <%= node.human %>);
15
+ <%- end -%>
16
+
17
+ #endif
@@ -0,0 +1,117 @@
1
+ module Herb
2
+ module AST
3
+ <%- nodes.each do |node| -%>
4
+ class <%= node.name -%> < Node
5
+ <%- node.fields.each do |field| -%>
6
+ attr_reader :<%= field.name %> #: <%= field.ruby_type %>
7
+ <%- end -%>
8
+
9
+ #: (<%= ["String", "Location", "Array[Herb::Errors::Error]", *node.fields.map(&:ruby_type)].join(", ") %>) -> void
10
+ def initialize(<%= ["type", "location", "errors", *node.fields.map(&:name)].join(", ") %>)
11
+ super(type, location, errors)
12
+ <%- node.fields.each do |field| -%>
13
+ <%- if field.is_a?(Herb::Template::StringField) -%>
14
+ @<%= field.name %> = <%= field.name %>.force_encoding("utf-8")
15
+ <%- else -%>
16
+ @<%= field.name %> = <%= field.name %>
17
+ <%- end -%>
18
+ <%- end -%>
19
+ end
20
+
21
+ #: () -> serialized_<%= node.human %>
22
+ def to_hash
23
+ super.merge({
24
+ <%- node.fields.each do |field| -%>
25
+ <%= field.name %>: <%= field.name %>,
26
+ <%- end -%>
27
+ }) #: Herb::serialized_<%= node.human %>
28
+ end
29
+
30
+ #: (Visitor) -> void
31
+ def accept(visitor)
32
+ visitor.visit_<%= node.human %>(self)
33
+ end
34
+
35
+ #: () -> Array[Herb::AST::Node?]
36
+ def child_nodes
37
+ [<%= node.fields.map { |field|
38
+ if field.is_a?(Herb::Template::NodeField)
39
+ field.name
40
+ elsif field.is_a?(Herb::Template::ArrayField) && field.specific_kind.end_with?("Node")
41
+ "*#{field.name}"
42
+ else
43
+ nil
44
+ end
45
+ }.compact.join(", ") %>]
46
+ end
47
+
48
+ #: () -> Array[Herb::AST::Node]
49
+ def compact_child_nodes
50
+ child_nodes.compact
51
+ end
52
+
53
+ #: () -> String
54
+ def inspect
55
+ tree_inspect.rstrip.gsub(/\s+$/, "")
56
+ end
57
+
58
+ #: (?Integer) -> String
59
+ def tree_inspect(indent = 0)
60
+ output = +""
61
+
62
+ output += "@ #{node_name} "
63
+ output += location.tree_inspect
64
+ output += "\n"
65
+
66
+ output += inspect_errors(prefix: "<%= node.fields.any? ? "│ " : " " %>")
67
+
68
+ <%- node.fields.each do |field| -%>
69
+ <%- symbol = node.fields.last == field ? "└──" : "├──" -%>
70
+ <%- name = "#{symbol} #{field.name}: " -%>
71
+ <%- case field -%>
72
+ <%- when Herb::Template::StringField -%>
73
+ output += %(<%= name %>#{<%= field.name %>.inspect}\n)
74
+ <%- when Herb::Template::TokenField -%>
75
+ output += "<%= name %>"
76
+ output += <%= field.name %> ? <%= field.name %>.tree_inspect : "∅"
77
+ output += "\n"
78
+ <%- when Herb::Template::BooleanField -%>
79
+ output += "<%= name %>"
80
+ output += [true, false].include?(<%= field.name %>) ? <%= field.name %>.to_s : "∅"
81
+ output += "\n"
82
+ <%- when Herb::Template::ElementSourceField -%>
83
+ output += %(<%= name %>#{<%= field.name %>.inspect}\n)
84
+ <%- when Herb::Template::PrismNodeField -%>
85
+ # no-op for <%= field.name %>
86
+ <%- when Herb::Template::AnalyzedRubyField -%>
87
+ # no-op for <%= field.name %>
88
+ <%- when Herb::Template::NodeField -%>
89
+ output += "<%= name %>"
90
+ if <%= field.name %>
91
+ <%- prefix = (node.fields.last == field) ? " " : "│ " -%>
92
+ output += "\n"
93
+ <%- if (node.fields.last == field) -%>
94
+ output += " └── "
95
+ <%- else -%>
96
+ output += "│ └── "
97
+ <%- end -%>
98
+ output += <%= field.name %>.tree_inspect(indent).gsub(/^/, " " * (indent + 1)).lstrip.gsub(/^/, "<%= prefix %>").delete_prefix("<%= prefix %>")
99
+ else
100
+ output += "∅\n"
101
+ end
102
+ <%- when Herb::Template::ArrayField -%>
103
+ output += "<%= name %>"
104
+ output += inspect_array(<%= field.name %>, prefix: "<%= (node.fields.last == field) ? " " : "│ " %>")
105
+ <%- else -%>
106
+ <%- raise "Unhandled type: #{field.class}" -%>
107
+ <%- end -%>
108
+ <%- end -%>
109
+ output += "\n"
110
+
111
+ output.gsub(/^/, " " * indent)
112
+ end
113
+ end
114
+
115
+ <%- end -%>
116
+ end
117
+ end
@@ -0,0 +1,106 @@
1
+ <%- base_arguments = [["type", "String"], ["location", "Location"], ["message", "String"]] -%>
2
+ module Herb
3
+ module Errors
4
+ class Error
5
+ <%- base_arguments.each do |argument, type| -%>
6
+ attr_reader :<%= argument %> #: <%= type %>
7
+ <%- end -%>
8
+
9
+ #: (<%= base_arguments.map { |_argument, type| type }.join(", ") %>) -> void
10
+ def initialize(<%= base_arguments.map(&:first).join(", ") %>)
11
+ <%- base_arguments.each do |argument, _type| -%>
12
+ @<%= argument %> = <%= argument %>
13
+ <%- end -%>
14
+ end
15
+
16
+ #: () -> serialized_error
17
+ def to_hash
18
+ {
19
+ type: type,
20
+ location: location&.to_hash,
21
+ message: message,
22
+ }
23
+ end
24
+
25
+ #: () -> String
26
+ def class_name
27
+ self.class.name || "Error"
28
+ end
29
+
30
+ #: () -> String
31
+ def error_name
32
+ class_name.split("::").last || "Error"
33
+ end
34
+
35
+ #: (?untyped) -> String
36
+ def to_json(state = nil)
37
+ to_hash.to_json(state)
38
+ end
39
+
40
+ #: (?Integer) -> String
41
+ def tree_inspect(_indent = 0)
42
+ raise NotImplementedError
43
+ end
44
+ end
45
+
46
+ <%- errors.each do |error| -%>
47
+ class <%= error.name -%> < Error
48
+ <%- error.fields.each do |field| -%>
49
+ attr_reader :<%= field.name %> #: <%= field.ruby_type %>
50
+ <%- end -%>
51
+
52
+ #: (<%= [*base_arguments.map(&:last), *error.fields.map(&:ruby_type)].join(", ") %>) -> void
53
+ def initialize(<%= [*base_arguments.map(&:first), *error.fields.map(&:name)].join(", ") %>)
54
+ super(<%= base_arguments.map(&:first).join(", ") %>)
55
+
56
+ <%- error.fields.each do |field| -%>
57
+ @<%= field.name %> = <%= field.name %>
58
+ <%- end -%>
59
+ end
60
+
61
+ #: () -> String
62
+ def inspect
63
+ tree_inspect.rstrip.gsub(/\s+$/, "")
64
+ end
65
+
66
+ #: () -> serialized_<%= error.human %>
67
+ def to_hash
68
+ super.merge({
69
+ <%- error.fields.each do |field| -%>
70
+ <%= field.name %>: <%= field.name %>,
71
+ <%- end -%>
72
+ }) #: Herb::serialized_<%= error.human %>
73
+ end
74
+
75
+ #: (?Integer) -> String
76
+ def tree_inspect(indent = 0)
77
+ output = +""
78
+
79
+ output += %(@ #{error_name} #{location.tree_inspect}\n)
80
+ <%- symbol = error.fields.none? ? "└──" : "├──" -%>
81
+ output += %(<%= symbol %> message: #{message.inspect}\n)
82
+ <%- error.fields.each do |field| -%>
83
+ <%- symbol = error.fields.last == field ? "└──" : "├──" -%>
84
+ <%- name = "#{symbol} #{field.name}: " -%>
85
+ <%- case field -%>
86
+ <%- when Herb::Template::PositionField -%>
87
+ output += %(<%= name %>#{<%= field.name %> ? <%= field.name %>.tree_inspect : "∅"}\n)
88
+ <%- when Herb::Template::TokenField -%>
89
+ output += %(<%= name %>#{<%= field.name %> ? <%= field.name %>.tree_inspect : "∅"}\n)
90
+ <%- when Herb::Template::TokenTypeField -%>
91
+ output += %(<%= name %>#{<%= field.name %>.inspect}\n)
92
+ <%- when Herb::Template::StringField -%>
93
+ output += %(<%= name %>#{<%= field.name %>.inspect}\n)
94
+ <%- else -%>
95
+ output += "<%= name %>'#{<%= field.name %>.class}'\n"
96
+ <%- end -%>
97
+ <%- end -%>
98
+ output += %(\n)
99
+
100
+ output.gsub(/^/, " " * indent)
101
+ end
102
+ end
103
+
104
+ <%- end -%>
105
+ end
106
+ end
@@ -0,0 +1,28 @@
1
+ module Herb
2
+ class Visitor
3
+ include AST::Helpers
4
+
5
+ #: (Herb::AST::Node) -> void
6
+ def visit(node)
7
+ node&.accept(self)
8
+ end
9
+
10
+ #: (Array[Herb::AST::Node]) -> void
11
+ def visit_all(nodes)
12
+ nodes.each { |node| node&.accept(self) }
13
+ end
14
+
15
+ #: (Herb::AST::Node) -> void
16
+ def visit_child_nodes(node)
17
+ node.compact_child_nodes.each { |node| node.accept(self) }
18
+ end
19
+
20
+ <%- nodes.each do |node| -%>
21
+ #: (Herb::AST::<%= node.name %>) -> void
22
+ def visit_<%= node.human %>(node)
23
+ visit_child_nodes(node)
24
+ end
25
+
26
+ <%- end -%>
27
+ end
28
+ end
@@ -0,0 +1,10 @@
1
+ module Herb
2
+ <%- errors.each do |error| -%>
3
+ type serialized_<%= error.human %> = serialized_error & {
4
+ <%- error.fields.each do |field| -%>
5
+ <%= field.name %>: <%= field.ruby_type %>,
6
+ <%- end -%>
7
+ }
8
+
9
+ <%- end -%>
10
+ end
@@ -0,0 +1,10 @@
1
+ module Herb
2
+ <%- nodes.each do |node| -%>
3
+ type serialized_<%= node.human %> = serialized_node & {
4
+ <%- node.fields.each do |field| -%>
5
+ <%= field.name %>: <%= field.ruby_type %>,
6
+ <%- end -%>
7
+ }
8
+
9
+ <%- end -%>
10
+ end
@@ -0,0 +1,145 @@
1
+ #include <stdio.h>
2
+ #include <stdbool.h>
3
+
4
+ #include <prism.h>
5
+
6
+ #include "include/analyzed_ruby.h"
7
+ #include "include/array.h"
8
+ #include "include/ast_node.h"
9
+ #include "include/ast_nodes.h"
10
+ #include "include/errors.h"
11
+ #include "include/token.h"
12
+ #include "include/util.h"
13
+
14
+ <%- nodes.each do |node| -%>
15
+ <%- node_arguments = node.fields.any? ? node.fields.map { |field| [field.c_type, " ", field.name].join } : [] -%>
16
+ <%- arguments = node_arguments + ["position_T* start_position", "position_T* end_position", "array_T* errors"] -%>
17
+
18
+ <%= node.struct_type %>* ast_<%= node.human %>_init(<%= arguments.join(", ") %>) {
19
+ <%= node.struct_type %>* <%= node.human %> = malloc(sizeof(<%= node.struct_type %>));
20
+
21
+ ast_node_init(&<%= node.human %>->base, <%= node.type %>, start_position, end_position, errors);
22
+
23
+ <%- node.fields.each do |field| -%>
24
+ <%- case field -%>
25
+ <%- when Herb::Template::TokenField -%>
26
+ <%= node.human %>-><%= field.name %> = token_copy(<%= field.name %>);
27
+ <%- when Herb::Template::NodeField -%>
28
+ <%= node.human %>-><%= field.name %> = <%= field.name %>;
29
+ <%- when Herb::Template::ArrayField -%>
30
+ <%= node.human %>-><%= field.name %> = <%= field.name %>;
31
+ <%- when Herb::Template::BooleanField -%>
32
+ <%= node.human %>-><%= field.name %> = <%= field.name %>;
33
+ <%- when Herb::Template::ElementSourceField -%>
34
+ <%= node.human %>-><%= field.name %> = <%= field.name %>;
35
+ <%- when Herb::Template::PrismNodeField -%>
36
+ <%= node.human %>-><%= field.name %> = <%= field.name %>;
37
+ <%- when Herb::Template::StringField -%>
38
+ <%= node.human %>-><%= field.name %> = herb_strdup(<%= field.name %>);
39
+ <%- when Herb::Template::AnalyzedRubyField -%>
40
+ <%= node.human %>-><%= field.name %> = <%= field.name %>;
41
+ <%- when Herb::Template::VoidPointerField -%>
42
+ <%= node.human %>-><%= field.name %> = <%= field.name %>;
43
+ <%- else -%>
44
+ <%= field.inspect %>
45
+ <%- end -%>
46
+ <%- end -%>
47
+
48
+ return <%= node.human %>;
49
+ }
50
+ <%- end -%>
51
+
52
+ const char* ast_node_type_to_string(AST_NODE_T* node) {
53
+ switch (node->type) {
54
+ <%- nodes.each do |node| -%>
55
+ case <%= node.type %>: return "<%= node.type %>";
56
+ <%- end -%>
57
+ }
58
+
59
+ return "Unknown ast_node_type_T";
60
+ }
61
+
62
+ const char* ast_node_human_type(AST_NODE_T* node) {
63
+ switch (node->type) {
64
+ <%- nodes.each do |node| -%>
65
+ case <%= node.type %>: return "<%= node.name %>";
66
+ <%- end -%>
67
+ }
68
+
69
+ return "Unknown ast_node_type_T";
70
+ }
71
+
72
+ void ast_free_base_node(AST_NODE_T* node) {
73
+ if (node == NULL) { return; }
74
+
75
+ if (node->errors) {
76
+ for (size_t i = 0; i < array_size(node->errors); i++) {
77
+ ERROR_T* child = array_get(node->errors, i);
78
+ if (child != NULL) { error_free(child); }
79
+ }
80
+
81
+ array_free(&node->errors);
82
+ }
83
+
84
+ if (node->location) { location_free(node->location); }
85
+
86
+ free(node);
87
+ }
88
+
89
+ <%- nodes.each do |node| -%>
90
+ <%- arguments = node.fields.any? ? node.fields.map { |field| [field.c_type, " ", field.name].join }.join(", ") : "void" -%>
91
+
92
+ static void ast_free_<%= node.human %>(<%= node.struct_type %>* <%= node.human %>) {
93
+ <%- if node.fields.none? -%>
94
+ /* no <%= node.struct_type %> specific fields to free up */
95
+ <%- end -%>
96
+ <%- node.fields.each do |field| -%>
97
+ <%- case field -%>
98
+ <%- when Herb::Template::TokenField -%>
99
+ if (<%= node.human %>-><%= field.name %> != NULL) { token_free(<%= node.human %>-><%= field.name %>); }
100
+ <%- when Herb::Template::NodeField -%>
101
+ ast_node_free((AST_NODE_T*) <%= node.human %>-><%= field.name %>);
102
+ <%- when Herb::Template::ArrayField -%>
103
+ if (<%= node.human %>-><%= field.name %> != NULL) {
104
+ for (size_t i = 0; i < array_size(<%= node.human %>-><%= field.name %>); i++) {
105
+ AST_NODE_T* child = array_get(<%= node.human %>-><%= field.name %>, i);
106
+ if (child) { ast_node_free(child); }
107
+ }
108
+
109
+ array_free(&<%= node.human %>-><%= field.name %>);
110
+ }
111
+ <%- when Herb::Template::StringField -%>
112
+ if (<%= node.human %>-><%= field.name %> != NULL) { free((char*) <%= node.human %>-><%= field.name %>); }
113
+ <%- when Herb::Template::PrismNodeField -%>
114
+ if (<%= node.human %>-><%= field.name %> != NULL) {
115
+ // The first argument to `pm_node_destroy` is a `pm_parser_t`, but it's currently unused:
116
+ // See: https://github.com/ruby/ruby/blob/efb2d4363709b36a205791787f6812259027c6e1/prism/templates/src/node.c.erb#L100-L104
117
+ //
118
+ pm_node_destroy(NULL, <%= node.human %>-><%= field.name %>);
119
+ }
120
+ <%- when Herb::Template::AnalyzedRubyField -%>
121
+ if (<%= node.human %>-><%= field.name %> != NULL) {
122
+ free_analyzed_ruby(<%= node.human %>-><%= field.name %>);
123
+ }
124
+ <%- when Herb::Template::VoidPointerField -%>
125
+ free(<%= node.human %>-><%= field.name %>);
126
+ <%- when Herb::Template::BooleanField -%>
127
+ <%- when Herb::Template::ElementSourceField -%>
128
+ <%- else -%>
129
+ <%= field.inspect %>
130
+ <%- end -%>
131
+ <%- end -%>
132
+
133
+ ast_free_base_node(&<%= node.human %>->base);
134
+ }
135
+ <%- end -%>
136
+
137
+ void ast_node_free(AST_NODE_T* node) {
138
+ if (!node) { return; }
139
+
140
+ switch (node->type) {
141
+ <%- nodes.each do |node| -%>
142
+ case <%= node.type %>: ast_free_<%= node.human %>((<%= node.struct_type %>*) node); break;
143
+ <%- end -%>
144
+ }
145
+ }
@@ -0,0 +1,97 @@
1
+ #include "include/ast_node.h"
2
+ #include "include/ast_nodes.h"
3
+ #include "include/buffer.h"
4
+ #include "include/errors.h"
5
+ #include "include/pretty_print.h"
6
+ #include "include/token_struct.h"
7
+ #include "include/util.h"
8
+
9
+ #include <stdio.h>
10
+ #include <stdlib.h>
11
+ #include <stdbool.h>
12
+
13
+ void ast_pretty_print_node(AST_NODE_T* node, const size_t indent, const size_t relative_indent, buffer_T* buffer) {
14
+ if (!node) { return; }
15
+
16
+ bool print_location = true;
17
+
18
+ buffer_append(buffer, "@ ");
19
+ buffer_append(buffer, ast_node_human_type(node));
20
+ buffer_append(buffer, " ");
21
+
22
+ if (print_location) { pretty_print_location(node->location, buffer); }
23
+
24
+ buffer_append(buffer, "\n");
25
+
26
+ switch (node->type) {
27
+ <%- nodes.each do |node| -%>
28
+ case <%= node.type %>: {
29
+ const <%= node.struct_type %>* <%= node.human %> = (<%= node.struct_type %>*) node;
30
+
31
+ pretty_print_errors(node, indent, relative_indent, <%= node.fields.none? %>, buffer);
32
+ <%- node.fields.each_with_index do |field, index| -%>
33
+ <%- last = index == node.fields.length - 1 -%>
34
+ <%- case field -%>
35
+ <%- when Herb::Template::TokenField -%>
36
+ pretty_print_token_property(<%= node.human %>-><%= field.name %>, "<%= field.name %>", indent, relative_indent, <%= last %>, buffer);
37
+ <%- when Herb::Template::ArrayField -%>
38
+ pretty_print_array("<%= field.name %>", <%= node.human %>-><%= field.name %>, indent, relative_indent, <%= last %>, buffer);
39
+ <%- when Herb::Template::BooleanField -%>
40
+ pretty_print_boolean_property("<%= field.name %>", <%= node.human %>-><%= field.name %>, indent, relative_indent, <%= last %>, buffer);
41
+ <%- when Herb::Template::ElementSourceField -%>
42
+ pretty_print_string_property(element_source_to_string(<%= node.human %>-><%= field.name %>), "<%= field.name %>", indent, relative_indent, <%= last %>, buffer);
43
+ <%- when Herb::Template::StringField -%>
44
+ pretty_print_string_property(<%= node.human %>-><%= field.name %>, "<%= field.name %>", indent, relative_indent, <%= last %>, buffer);
45
+ <%- when Herb::Template::PrismNodeField -%>
46
+ pretty_print_string_property("<%= field.name %>", "<%= field.name %>", indent, relative_indent, <%= last %>, buffer);
47
+ <%- when Herb::Template::NodeField -%>
48
+
49
+ pretty_print_label("<%= field.name %>", indent, relative_indent, <%= last %>, buffer);
50
+
51
+ if (<%= node.human %>-><%= field.name %>) {
52
+ buffer_append(buffer, "\n");
53
+ pretty_print_indent(buffer, indent);
54
+ pretty_print_indent(buffer, relative_indent + 1);
55
+
56
+ buffer_append(buffer, "└── ");
57
+ ast_pretty_print_node((AST_NODE_T*) <%= node.human %>-><%= field.name %>, indent, relative_indent + 2, buffer);
58
+ } else {
59
+ buffer_append(buffer, " ∅\n");
60
+ }
61
+ buffer_append(buffer, "\n");
62
+
63
+ <%- when Herb::Template::AnalyzedRubyField -%>
64
+ if (<%= node.human %>-><%= field.name %>) {
65
+ pretty_print_boolean_property("if_node", <%= node.human %>-><%= field.name %>->has_if_node, indent, relative_indent, false, buffer);
66
+ pretty_print_boolean_property("elsif_node", <%= node.human %>-><%= field.name %>->has_elsif_node, indent, relative_indent, false, buffer);
67
+ pretty_print_boolean_property("else_node", <%= node.human %>-><%= field.name %>->has_else_node, indent, relative_indent, false, buffer);
68
+ pretty_print_boolean_property("end", <%= node.human %>-><%= field.name %>->has_end, indent, relative_indent, false, buffer);
69
+ pretty_print_boolean_property("block_node", <%= node.human %>-><%= field.name %>->has_block_node, indent, relative_indent, false, buffer);
70
+ pretty_print_boolean_property("block_closing", <%= node.human %>-><%= field.name %>->has_block_closing, indent, relative_indent, false, buffer);
71
+ pretty_print_boolean_property("case_node", <%= node.human %>-><%= field.name %>->has_case_node, indent, relative_indent, false, buffer);
72
+ pretty_print_boolean_property("when_node", <%= node.human %>-><%= field.name %>->has_when_node, indent, relative_indent, false, buffer);
73
+ pretty_print_boolean_property("for_node", <%= node.human %>-><%= field.name %>->has_for_node, indent, relative_indent, false, buffer);
74
+ pretty_print_boolean_property("while_node", <%= node.human %>-><%= field.name %>->has_while_node, indent, relative_indent, false, buffer);
75
+ pretty_print_boolean_property("until_node", <%= node.human %>-><%= field.name %>->has_until_node, indent, relative_indent, false, buffer);
76
+ pretty_print_boolean_property("begin_node", <%= node.human %>-><%= field.name %>->has_begin_node, indent, relative_indent, false, buffer);
77
+ pretty_print_boolean_property("rescue_node", <%= node.human %>-><%= field.name %>->has_rescue_node, indent, relative_indent, false, buffer);
78
+ pretty_print_boolean_property("ensure_node", <%= node.human %>-><%= field.name %>->has_ensure_node, indent, relative_indent, <%= last %>, buffer);
79
+ pretty_print_boolean_property("unless_node", <%= node.human %>-><%= field.name %>->has_unless_node, indent, relative_indent, <%= last %>, buffer);
80
+ } else {
81
+ pretty_print_label("<%= field.name %>", indent, relative_indent, <%= last %>, buffer);
82
+ buffer_append(buffer, " ∅\n");
83
+ }
84
+
85
+ <%- when Herb::Template::VoidPointerField -%>
86
+ pretty_print_label("<%= field.name %>", indent, relative_indent, <%= last %>, buffer);
87
+ buffer_append(buffer, " ?\n");
88
+
89
+ <%- else -%>
90
+ <%= field.inspect %>
91
+ <%- end -%>
92
+ <%- end -%>
93
+ } break;
94
+
95
+ <%- end -%>
96
+ }
97
+ }