herb 0.8.10-arm-linux-gnu → 0.9.1-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 (212) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +11 -3
  3. data/README.md +64 -34
  4. data/Rakefile +48 -40
  5. data/config.yml +473 -34
  6. data/ext/herb/error_helpers.c +535 -140
  7. data/ext/herb/error_helpers.h +1 -0
  8. data/ext/herb/extconf.rb +67 -28
  9. data/ext/herb/extension.c +321 -51
  10. data/ext/herb/extension.h +1 -0
  11. data/ext/herb/extension_helpers.c +24 -14
  12. data/ext/herb/extension_helpers.h +2 -2
  13. data/ext/herb/nodes.c +647 -270
  14. data/ext/herb/nodes.h +1 -0
  15. data/herb.gemspec +3 -2
  16. data/lib/herb/3.0/herb.so +0 -0
  17. data/lib/herb/3.1/herb.so +0 -0
  18. data/lib/herb/3.2/herb.so +0 -0
  19. data/lib/herb/3.3/herb.so +0 -0
  20. data/lib/herb/3.4/herb.so +0 -0
  21. data/lib/herb/4.0/herb.so +0 -0
  22. data/lib/herb/ast/helpers.rb +3 -3
  23. data/lib/herb/ast/node.rb +15 -2
  24. data/lib/herb/ast/nodes.rb +1530 -179
  25. data/lib/herb/bootstrap.rb +87 -0
  26. data/lib/herb/cli.rb +341 -31
  27. data/lib/herb/configuration.rb +248 -0
  28. data/lib/herb/defaults.yml +32 -0
  29. data/lib/herb/engine/compiler.rb +78 -11
  30. data/lib/herb/engine/debug_visitor.rb +13 -3
  31. data/lib/herb/engine/error_formatter.rb +13 -9
  32. data/lib/herb/engine/parser_error_overlay.rb +10 -6
  33. data/lib/herb/engine/validator.rb +8 -3
  34. data/lib/herb/engine/validators/nesting_validator.rb +2 -2
  35. data/lib/herb/engine.rb +119 -43
  36. data/lib/herb/errors.rb +808 -88
  37. data/lib/herb/lex_result.rb +1 -0
  38. data/lib/herb/location.rb +7 -3
  39. data/lib/herb/parse_result.rb +12 -2
  40. data/lib/herb/parser_options.rb +62 -0
  41. data/lib/herb/position.rb +1 -0
  42. data/lib/herb/prism_inspect.rb +120 -0
  43. data/lib/herb/project.rb +923 -331
  44. data/lib/herb/range.rb +1 -0
  45. data/lib/herb/token.rb +7 -1
  46. data/lib/herb/version.rb +1 -1
  47. data/lib/herb/visitor.rb +47 -2
  48. data/lib/herb/warnings.rb +6 -1
  49. data/lib/herb.rb +35 -3
  50. data/sig/herb/ast/helpers.rbs +2 -2
  51. data/sig/herb/ast/node.rbs +12 -2
  52. data/sig/herb/ast/nodes.rbs +773 -128
  53. data/sig/herb/bootstrap.rbs +31 -0
  54. data/sig/herb/configuration.rbs +89 -0
  55. data/sig/herb/engine/compiler.rbs +9 -1
  56. data/sig/herb/engine/debug_visitor.rbs +2 -0
  57. data/sig/herb/engine/validator.rbs +5 -1
  58. data/sig/herb/engine.rbs +21 -3
  59. data/sig/herb/errors.rbs +372 -63
  60. data/sig/herb/location.rbs +4 -0
  61. data/sig/herb/parse_result.rbs +4 -2
  62. data/sig/herb/parser_options.rbs +46 -0
  63. data/sig/herb/position.rbs +1 -0
  64. data/sig/herb/prism_inspect.rbs +28 -0
  65. data/sig/herb/range.rbs +1 -0
  66. data/sig/herb/token.rbs +6 -0
  67. data/sig/herb/visitor.rbs +31 -4
  68. data/sig/herb/warnings.rbs +6 -1
  69. data/sig/herb.rbs +14 -0
  70. data/sig/herb_c_extension.rbs +5 -2
  71. data/sig/rubyvm.rbs +5 -0
  72. data/sig/serialized_ast_errors.rbs +82 -6
  73. data/sig/serialized_ast_nodes.rbs +91 -6
  74. data/src/analyze/action_view/attribute_extraction_helpers.c +303 -0
  75. data/src/analyze/action_view/content_tag.c +78 -0
  76. data/src/analyze/action_view/link_to.c +167 -0
  77. data/src/analyze/action_view/registry.c +83 -0
  78. data/src/analyze/action_view/tag.c +70 -0
  79. data/src/analyze/action_view/tag_helper_node_builders.c +305 -0
  80. data/src/analyze/action_view/tag_helpers.c +815 -0
  81. data/src/analyze/action_view/turbo_frame_tag.c +88 -0
  82. data/src/analyze/analyze.c +885 -0
  83. data/src/{analyzed_ruby.c → analyze/analyzed_ruby.c} +13 -11
  84. data/src/analyze/builders.c +343 -0
  85. data/src/analyze/conditional_elements.c +594 -0
  86. data/src/analyze/conditional_open_tags.c +640 -0
  87. data/src/analyze/control_type.c +250 -0
  88. data/src/{analyze_helpers.c → analyze/helpers.c} +48 -23
  89. data/src/analyze/invalid_structures.c +193 -0
  90. data/src/{analyze_missing_end.c → analyze/missing_end.c} +33 -22
  91. data/src/analyze/parse_errors.c +84 -0
  92. data/src/analyze/prism_annotate.c +399 -0
  93. data/src/analyze/render_nodes.c +761 -0
  94. data/src/{analyze_transform.c → analyze/transform.c} +24 -3
  95. data/src/ast_node.c +17 -7
  96. data/src/ast_nodes.c +759 -387
  97. data/src/ast_pretty_print.c +264 -6
  98. data/src/errors.c +1454 -519
  99. data/src/extract.c +145 -49
  100. data/src/herb.c +52 -34
  101. data/src/html_util.c +241 -12
  102. data/src/include/analyze/action_view/attribute_extraction_helpers.h +36 -0
  103. data/src/include/analyze/action_view/tag_helper_handler.h +43 -0
  104. data/src/include/analyze/action_view/tag_helper_node_builders.h +70 -0
  105. data/src/include/analyze/action_view/tag_helpers.h +38 -0
  106. data/src/include/{analyze.h → analyze/analyze.h} +14 -4
  107. data/src/include/{analyzed_ruby.h → analyze/analyzed_ruby.h} +3 -3
  108. data/src/include/analyze/builders.h +27 -0
  109. data/src/include/analyze/conditional_elements.h +9 -0
  110. data/src/include/analyze/conditional_open_tags.h +9 -0
  111. data/src/include/analyze/control_type.h +14 -0
  112. data/src/include/{analyze_helpers.h → analyze/helpers.h} +4 -2
  113. data/src/include/analyze/invalid_structures.h +11 -0
  114. data/src/include/analyze/prism_annotate.h +16 -0
  115. data/src/include/analyze/render_nodes.h +11 -0
  116. data/src/include/ast_node.h +11 -5
  117. data/src/include/ast_nodes.h +154 -38
  118. data/src/include/ast_pretty_print.h +5 -0
  119. data/src/include/element_source.h +3 -8
  120. data/src/include/errors.h +206 -55
  121. data/src/include/extract.h +21 -5
  122. data/src/include/herb.h +18 -6
  123. data/src/include/herb_prism_node.h +13 -0
  124. data/src/include/html_util.h +7 -2
  125. data/src/include/io.h +3 -1
  126. data/src/include/lex_helpers.h +29 -0
  127. data/src/include/lexer.h +1 -1
  128. data/src/include/lexer_peek_helpers.h +87 -13
  129. data/src/include/lexer_struct.h +2 -0
  130. data/src/include/location.h +2 -1
  131. data/src/include/parser.h +28 -2
  132. data/src/include/parser_helpers.h +19 -3
  133. data/src/include/pretty_print.h +10 -5
  134. data/src/include/prism_context.h +45 -0
  135. data/src/include/prism_helpers.h +10 -7
  136. data/src/include/prism_serialized.h +12 -0
  137. data/src/include/token.h +16 -4
  138. data/src/include/token_struct.h +10 -3
  139. data/src/include/utf8.h +2 -1
  140. data/src/include/util/hb_allocator.h +78 -0
  141. data/src/include/util/hb_arena.h +6 -1
  142. data/src/include/util/hb_arena_debug.h +12 -1
  143. data/src/include/util/hb_array.h +7 -3
  144. data/src/include/util/hb_buffer.h +6 -4
  145. data/src/include/util/hb_foreach.h +79 -0
  146. data/src/include/util/hb_narray.h +8 -4
  147. data/src/include/util/hb_string.h +56 -9
  148. data/src/include/util.h +6 -3
  149. data/src/include/version.h +1 -1
  150. data/src/io.c +3 -2
  151. data/src/lexer.c +42 -30
  152. data/src/lexer_peek_helpers.c +12 -74
  153. data/src/location.c +2 -2
  154. data/src/main.c +53 -28
  155. data/src/parser.c +784 -247
  156. data/src/parser_helpers.c +110 -23
  157. data/src/parser_match_tags.c +129 -48
  158. data/src/pretty_print.c +29 -24
  159. data/src/prism_helpers.c +30 -27
  160. data/src/ruby_parser.c +2 -0
  161. data/src/token.c +151 -66
  162. data/src/token_matchers.c +0 -1
  163. data/src/utf8.c +7 -6
  164. data/src/util/hb_allocator.c +341 -0
  165. data/src/util/hb_arena.c +81 -56
  166. data/src/util/hb_arena_debug.c +32 -17
  167. data/src/util/hb_array.c +30 -15
  168. data/src/util/hb_buffer.c +17 -21
  169. data/src/util/hb_narray.c +22 -7
  170. data/src/util/hb_string.c +49 -35
  171. data/src/util.c +21 -11
  172. data/src/visitor.c +67 -0
  173. data/templates/ext/herb/error_helpers.c.erb +24 -11
  174. data/templates/ext/herb/error_helpers.h.erb +1 -0
  175. data/templates/ext/herb/nodes.c.erb +50 -16
  176. data/templates/ext/herb/nodes.h.erb +1 -0
  177. data/templates/java/error_helpers.c.erb +1 -1
  178. data/templates/java/nodes.c.erb +30 -8
  179. data/templates/java/org/herb/ast/Errors.java.erb +24 -1
  180. data/templates/java/org/herb/ast/Nodes.java.erb +80 -21
  181. data/templates/javascript/packages/core/src/errors.ts.erb +16 -3
  182. data/templates/javascript/packages/core/src/node-type-guards.ts.erb +3 -1
  183. data/templates/javascript/packages/core/src/nodes.ts.erb +109 -32
  184. data/templates/javascript/packages/node/extension/error_helpers.cpp.erb +13 -4
  185. data/templates/javascript/packages/node/extension/nodes.cpp.erb +43 -4
  186. data/templates/lib/herb/ast/nodes.rb.erb +95 -32
  187. data/templates/lib/herb/errors.rb.erb +15 -3
  188. data/templates/lib/herb/visitor.rb.erb +2 -2
  189. data/templates/rust/src/ast/nodes.rs.erb +97 -44
  190. data/templates/rust/src/errors.rs.erb +2 -1
  191. data/templates/rust/src/nodes.rs.erb +168 -16
  192. data/templates/rust/src/union_types.rs.erb +60 -0
  193. data/templates/rust/src/visitor.rs.erb +81 -0
  194. data/templates/src/{analyze_missing_end.c.erb → analyze/missing_end.c.erb} +9 -6
  195. data/templates/src/{analyze_transform.c.erb → analyze/transform.c.erb} +2 -2
  196. data/templates/src/ast_nodes.c.erb +34 -26
  197. data/templates/src/ast_pretty_print.c.erb +24 -5
  198. data/templates/src/errors.c.erb +60 -54
  199. data/templates/src/include/ast_nodes.h.erb +6 -2
  200. data/templates/src/include/ast_pretty_print.h.erb +5 -0
  201. data/templates/src/include/errors.h.erb +15 -11
  202. data/templates/src/include/util/hb_foreach.h.erb +20 -0
  203. data/templates/src/parser_match_tags.c.erb +10 -4
  204. data/templates/src/visitor.c.erb +2 -2
  205. data/templates/template.rb +204 -29
  206. data/templates/wasm/error_helpers.cpp.erb +9 -5
  207. data/templates/wasm/nodes.cpp.erb +41 -4
  208. metadata +60 -16
  209. data/src/analyze.c +0 -1608
  210. data/src/element_source.c +0 -12
  211. data/src/include/util/hb_system.h +0 -9
  212. data/src/util/hb_system.c +0 -30
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
 
3
4
  module Herb
4
5
  class LexResult < Result
data/lib/herb/location.rb CHANGED
@@ -2,6 +2,10 @@
2
2
  # typed: true
3
3
 
4
4
  module Herb
5
+ #: type serialized_location = {
6
+ #| start: serialized_position,
7
+ #| end: serialized_position
8
+ #| }
5
9
  class Location
6
10
  attr_reader :start #: Position
7
11
  attr_reader :end #: Position
@@ -28,9 +32,9 @@ module Herb
28
32
  #: () -> serialized_location
29
33
  def to_hash
30
34
  {
31
- start: start,
32
- end: self.end,
33
- } #: Herb::serialized_location
35
+ start: start.to_hash,
36
+ end: self.end.to_hash,
37
+ }
34
38
  end
35
39
 
36
40
  #: (?untyped) -> String
@@ -1,15 +1,25 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
 
3
4
  require "json"
4
5
 
5
6
  module Herb
6
7
  class ParseResult < Result
7
8
  attr_reader :value #: Herb::AST::DocumentNode
9
+ attr_reader :options #: Herb::ParserOptions
8
10
 
9
- #: (Herb::AST::DocumentNode, String, Array[Herb::Warnings::Warning], Array[Herb::Errors::Error]) -> void
10
- def initialize(value, source, warnings, errors)
11
+ #: (Herb::AST::DocumentNode, String, Array[Herb::Warnings::Warning], Array[Herb::Errors::Error], Herb::ParserOptions) -> void
12
+ def initialize(value, source, warnings, errors, options)
11
13
  @value = value
14
+ @options = options
12
15
  super(source, warnings, errors)
16
+
17
+ if options.prism_nodes || options.prism_nodes_deep
18
+ value.source = source
19
+ elsif options.prism_program
20
+ # Using `instance_variable_set` doesn't propagate the source being set on the whole tree
21
+ value.instance_variable_set(:@source, source)
22
+ end
13
23
  end
14
24
 
15
25
  #: () -> Array[Herb::Errors::Error]
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Herb
4
+ class ParserOptions
5
+ attr_reader :strict #: bool
6
+ attr_reader :track_whitespace #: bool
7
+ attr_reader :analyze #: bool
8
+ attr_reader :action_view_helpers #: bool
9
+ attr_reader :render_nodes #: bool
10
+ attr_reader :prism_program #: bool
11
+ attr_reader :prism_nodes #: bool
12
+ attr_reader :prism_nodes_deep #: bool
13
+
14
+ DEFAULT_STRICT = true #: bool
15
+ DEFAULT_TRACK_WHITESPACE = false #: bool
16
+ DEFAULT_ANALYZE = true #: bool
17
+ DEFAULT_ACTION_VIEW_HELPERS = false #: bool
18
+ DEFAULT_RENDER_NODES = false #: bool
19
+ DEFAULT_PRISM_PROGRAM = false #: bool
20
+ DEFAULT_PRISM_NODES = false #: bool
21
+ DEFAULT_PRISM_NODES_DEEP = false #: bool
22
+
23
+ #: (?strict: bool, ?track_whitespace: bool, ?analyze: bool, ?action_view_helpers: bool, ?prism_nodes: bool, ?prism_nodes_deep: bool, ?prism_program: bool) -> void
24
+ def initialize(strict: DEFAULT_STRICT, track_whitespace: DEFAULT_TRACK_WHITESPACE, analyze: DEFAULT_ANALYZE, action_view_helpers: DEFAULT_ACTION_VIEW_HELPERS, render_nodes: DEFAULT_RENDER_NODES, prism_nodes: DEFAULT_PRISM_NODES, prism_nodes_deep: DEFAULT_PRISM_NODES_DEEP, prism_program: DEFAULT_PRISM_PROGRAM)
25
+ @strict = strict
26
+ @track_whitespace = track_whitespace
27
+ @analyze = analyze
28
+ @action_view_helpers = action_view_helpers
29
+ @render_nodes = render_nodes
30
+ @prism_nodes = prism_nodes
31
+ @prism_nodes_deep = prism_nodes_deep
32
+ @prism_program = prism_program
33
+ end
34
+
35
+ #: () -> Hash[Symbol, bool]
36
+ def to_h
37
+ {
38
+ strict: @strict,
39
+ track_whitespace: @track_whitespace,
40
+ analyze: @analyze,
41
+ action_view_helpers: @action_view_helpers,
42
+ render_nodes: @render_nodes,
43
+ prism_nodes: @prism_nodes,
44
+ prism_nodes_deep: @prism_nodes_deep,
45
+ prism_program: @prism_program,
46
+ }
47
+ end
48
+
49
+ #: () -> String
50
+ def inspect
51
+ "#<#{self.class.name}\n " \
52
+ "strict=#{@strict}\n " \
53
+ "track_whitespace=#{@track_whitespace}\n " \
54
+ "analyze=#{@analyze}\n " \
55
+ "action_view_helpers=#{@action_view_helpers}\n " \
56
+ "render_nodes=#{@render_nodes}\n " \
57
+ "prism_nodes=#{@prism_nodes}\n " \
58
+ "prism_nodes_deep=#{@prism_nodes_deep}\n " \
59
+ "prism_program=#{@prism_program}>"
60
+ end
61
+ end
62
+ end
data/lib/herb/position.rb CHANGED
@@ -2,6 +2,7 @@
2
2
  # typed: true
3
3
 
4
4
  module Herb
5
+ #: type serialized_position = { line: Integer, column: Integer }
5
6
  class Position
6
7
  attr_reader :line #: Integer
7
8
  attr_reader :column #: Integer
@@ -0,0 +1,120 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Herb
4
+ module PrismInspect
5
+ SKIP_FIELDS = [:node_id, :location, :flags].freeze
6
+
7
+ class << self
8
+ #: (String, String, String) -> String
9
+ def inspect_prism_serialized(serialized_bytes, source, prefix)
10
+ return "∅" unless serialized_bytes
11
+
12
+ begin
13
+ require "prism"
14
+ rescue LoadError
15
+ return "(#{serialized_bytes.bytesize} bytes, prism gem not available)"
16
+ end
17
+
18
+ node = Prism.load(source, serialized_bytes).value
19
+ return "∅" unless node
20
+
21
+ tree = inspect_prism_node(node, source, "#{prefix} ")
22
+
23
+ "\n#{prefix}└── #{tree.strip}"
24
+ rescue StandardError => e
25
+ "(#{serialized_bytes.bytesize} bytes, deserialize error: #{e.message})"
26
+ end
27
+
28
+ #: (Prism::Node, String, String) -> String
29
+ def inspect_prism_node(node, source, prefix)
30
+ output = +""
31
+ node_name = node.class.name&.split("::")&.last || "Node"
32
+ output << "@ #{node_name} (location: #{format_location(node.location)})\n"
33
+
34
+ fields = display_fields(node)
35
+
36
+ fields.each_with_index do |(name, value), i|
37
+ is_last = i == fields.size - 1
38
+ symbol = is_last ? "└── " : "├── "
39
+ child_prefix = prefix + (is_last ? " " : "│ ")
40
+
41
+ output << inspect_field(name, value, source, prefix, symbol, child_prefix)
42
+ end
43
+
44
+ output
45
+ end
46
+
47
+ private
48
+
49
+ #: (Symbol, untyped, String, String, String, String) -> String
50
+ def inspect_field(name, value, source, prefix, symbol, child_prefix)
51
+ case value
52
+ when nil
53
+ "#{prefix}#{symbol}#{name}: ∅\n"
54
+ when Prism::Node
55
+ inspect_node_field(name, value, source, prefix, symbol, child_prefix)
56
+ when Array
57
+ inspect_array_field(name, value, source, prefix, symbol, child_prefix)
58
+ when Prism::Location
59
+ "#{prefix}#{symbol}#{name}: #{format_location(value)}\n"
60
+ when Symbol
61
+ "#{prefix}#{symbol}#{name}: :#{value}\n"
62
+ when Integer, Float, true, false
63
+ "#{prefix}#{symbol}#{name}: #{value}\n"
64
+ else
65
+ "#{prefix}#{symbol}#{name}: #{value.inspect}\n"
66
+ end
67
+ end
68
+
69
+ #: (Symbol, Prism::Node, String, String, String, String) -> String
70
+ def inspect_node_field(name, value, source, prefix, symbol, child_prefix)
71
+ output = +""
72
+
73
+ output << "#{prefix}#{symbol}#{name}:\n"
74
+ output << "#{child_prefix}└── "
75
+ output << inspect_prism_node(value, source, "#{child_prefix} ").lstrip
76
+
77
+ output
78
+ end
79
+
80
+ #: (Symbol, Array[untyped], String, String, String, String) -> String
81
+ def inspect_array_field(name, value, source, prefix, symbol, child_prefix)
82
+ output = "#{prefix}#{symbol}#{name}: "
83
+
84
+ if value.empty?
85
+ output << "[]\n"
86
+ else
87
+ output << "(#{value.size} #{value.size == 1 ? "item" : "items"})\n"
88
+
89
+ value.each_with_index do |item, j|
90
+ is_last_item = j == value.size - 1
91
+ item_symbol = is_last_item ? "└── " : "├── "
92
+ item_prefix = child_prefix + (is_last_item ? " " : "│ ")
93
+
94
+ if item.is_a?(Prism::Node)
95
+ output << "#{child_prefix}#{item_symbol}"
96
+ output << inspect_prism_node(item, source, item_prefix).lstrip
97
+ else
98
+ output << "#{child_prefix}#{item_symbol}#{item.inspect}\n"
99
+ end
100
+ end
101
+ end
102
+
103
+ output
104
+ end
105
+
106
+ #: (untyped) -> Array[[Symbol, untyped]]
107
+ def display_fields(node)
108
+ node.deconstruct_keys(nil).except(*SKIP_FIELDS).to_a
109
+ end
110
+
111
+ #: (Prism::Location) -> String
112
+ def format_location(location)
113
+ start_line = location.start_line + 1
114
+ end_line = location.end_line + 1
115
+
116
+ "(#{start_line}:#{location.start_column})-(#{end_line}:#{location.end_column})"
117
+ end
118
+ end
119
+ end
120
+ end