herb 0.8.10-arm-linux-gnu → 0.9.0-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 (209) 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 +317 -34
  6. data/ext/herb/error_helpers.c +367 -140
  7. data/ext/herb/error_helpers.h +1 -0
  8. data/ext/herb/extconf.rb +67 -28
  9. data/ext/herb/extension.c +317 -51
  10. data/ext/herb/extension.h +1 -0
  11. data/ext/herb/extension_helpers.c +23 -14
  12. data/ext/herb/extension_helpers.h +2 -2
  13. data/ext/herb/nodes.c +537 -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 +1132 -157
  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 +82 -35
  36. data/lib/herb/errors.rb +563 -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 +57 -0
  41. data/lib/herb/position.rb +1 -0
  42. data/lib/herb/prism_inspect.rb +116 -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 +37 -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 +641 -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 +17 -3
  59. data/sig/herb/errors.rbs +258 -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 +42 -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 +25 -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/serialized_ast_errors.rbs +54 -6
  72. data/sig/serialized_ast_nodes.rbs +60 -6
  73. data/src/analyze/action_view/attribute_extraction_helpers.c +290 -0
  74. data/src/analyze/action_view/content_tag.c +70 -0
  75. data/src/analyze/action_view/link_to.c +143 -0
  76. data/src/analyze/action_view/registry.c +60 -0
  77. data/src/analyze/action_view/tag.c +64 -0
  78. data/src/analyze/action_view/tag_helper_node_builders.c +305 -0
  79. data/src/analyze/action_view/tag_helpers.c +748 -0
  80. data/src/analyze/action_view/turbo_frame_tag.c +88 -0
  81. data/src/analyze/analyze.c +882 -0
  82. data/src/{analyzed_ruby.c → analyze/analyzed_ruby.c} +13 -11
  83. data/src/analyze/builders.c +343 -0
  84. data/src/analyze/conditional_elements.c +594 -0
  85. data/src/analyze/conditional_open_tags.c +640 -0
  86. data/src/analyze/control_type.c +250 -0
  87. data/src/{analyze_helpers.c → analyze/helpers.c} +48 -23
  88. data/src/analyze/invalid_structures.c +193 -0
  89. data/src/{analyze_missing_end.c → analyze/missing_end.c} +33 -22
  90. data/src/analyze/parse_errors.c +84 -0
  91. data/src/analyze/prism_annotate.c +397 -0
  92. data/src/{analyze_transform.c → analyze/transform.c} +17 -3
  93. data/src/ast_node.c +17 -7
  94. data/src/ast_nodes.c +662 -387
  95. data/src/ast_pretty_print.c +190 -6
  96. data/src/errors.c +1076 -520
  97. data/src/extract.c +145 -49
  98. data/src/herb.c +52 -34
  99. data/src/html_util.c +241 -12
  100. data/src/include/analyze/action_view/attribute_extraction_helpers.h +36 -0
  101. data/src/include/analyze/action_view/tag_helper_handler.h +41 -0
  102. data/src/include/analyze/action_view/tag_helper_node_builders.h +70 -0
  103. data/src/include/analyze/action_view/tag_helpers.h +38 -0
  104. data/src/include/{analyze.h → analyze/analyze.h} +14 -4
  105. data/src/include/{analyzed_ruby.h → analyze/analyzed_ruby.h} +3 -3
  106. data/src/include/analyze/builders.h +27 -0
  107. data/src/include/analyze/conditional_elements.h +9 -0
  108. data/src/include/analyze/conditional_open_tags.h +9 -0
  109. data/src/include/analyze/control_type.h +14 -0
  110. data/src/include/{analyze_helpers.h → analyze/helpers.h} +4 -2
  111. data/src/include/analyze/invalid_structures.h +11 -0
  112. data/src/include/analyze/prism_annotate.h +16 -0
  113. data/src/include/ast_node.h +11 -5
  114. data/src/include/ast_nodes.h +117 -38
  115. data/src/include/ast_pretty_print.h +5 -0
  116. data/src/include/element_source.h +3 -8
  117. data/src/include/errors.h +148 -55
  118. data/src/include/extract.h +21 -5
  119. data/src/include/herb.h +18 -6
  120. data/src/include/herb_prism_node.h +13 -0
  121. data/src/include/html_util.h +7 -2
  122. data/src/include/io.h +3 -1
  123. data/src/include/lex_helpers.h +29 -0
  124. data/src/include/lexer.h +1 -1
  125. data/src/include/lexer_peek_helpers.h +87 -13
  126. data/src/include/lexer_struct.h +2 -0
  127. data/src/include/location.h +2 -1
  128. data/src/include/parser.h +27 -2
  129. data/src/include/parser_helpers.h +19 -3
  130. data/src/include/pretty_print.h +10 -5
  131. data/src/include/prism_context.h +45 -0
  132. data/src/include/prism_helpers.h +10 -7
  133. data/src/include/prism_serialized.h +12 -0
  134. data/src/include/token.h +16 -4
  135. data/src/include/token_struct.h +10 -3
  136. data/src/include/utf8.h +2 -1
  137. data/src/include/util/hb_allocator.h +78 -0
  138. data/src/include/util/hb_arena.h +6 -1
  139. data/src/include/util/hb_arena_debug.h +12 -1
  140. data/src/include/util/hb_array.h +7 -3
  141. data/src/include/util/hb_buffer.h +6 -4
  142. data/src/include/util/hb_foreach.h +79 -0
  143. data/src/include/util/hb_narray.h +8 -4
  144. data/src/include/util/hb_string.h +56 -9
  145. data/src/include/util.h +6 -3
  146. data/src/include/version.h +1 -1
  147. data/src/io.c +3 -2
  148. data/src/lexer.c +42 -30
  149. data/src/lexer_peek_helpers.c +12 -74
  150. data/src/location.c +2 -2
  151. data/src/main.c +53 -28
  152. data/src/parser.c +783 -247
  153. data/src/parser_helpers.c +110 -23
  154. data/src/parser_match_tags.c +109 -48
  155. data/src/pretty_print.c +29 -24
  156. data/src/prism_helpers.c +30 -27
  157. data/src/ruby_parser.c +2 -0
  158. data/src/token.c +151 -66
  159. data/src/token_matchers.c +0 -1
  160. data/src/utf8.c +7 -6
  161. data/src/util/hb_allocator.c +341 -0
  162. data/src/util/hb_arena.c +81 -56
  163. data/src/util/hb_arena_debug.c +32 -17
  164. data/src/util/hb_array.c +30 -15
  165. data/src/util/hb_buffer.c +17 -21
  166. data/src/util/hb_narray.c +22 -7
  167. data/src/util/hb_string.c +49 -35
  168. data/src/util.c +21 -11
  169. data/src/visitor.c +47 -0
  170. data/templates/ext/herb/error_helpers.c.erb +24 -11
  171. data/templates/ext/herb/error_helpers.h.erb +1 -0
  172. data/templates/ext/herb/nodes.c.erb +50 -16
  173. data/templates/ext/herb/nodes.h.erb +1 -0
  174. data/templates/java/error_helpers.c.erb +1 -1
  175. data/templates/java/nodes.c.erb +30 -8
  176. data/templates/java/org/herb/ast/Errors.java.erb +24 -1
  177. data/templates/java/org/herb/ast/Nodes.java.erb +80 -21
  178. data/templates/javascript/packages/core/src/errors.ts.erb +16 -3
  179. data/templates/javascript/packages/core/src/node-type-guards.ts.erb +3 -1
  180. data/templates/javascript/packages/core/src/nodes.ts.erb +109 -32
  181. data/templates/javascript/packages/node/extension/error_helpers.cpp.erb +13 -4
  182. data/templates/javascript/packages/node/extension/nodes.cpp.erb +43 -4
  183. data/templates/lib/herb/ast/nodes.rb.erb +88 -31
  184. data/templates/lib/herb/errors.rb.erb +15 -3
  185. data/templates/lib/herb/visitor.rb.erb +2 -2
  186. data/templates/rust/src/ast/nodes.rs.erb +97 -44
  187. data/templates/rust/src/errors.rs.erb +2 -1
  188. data/templates/rust/src/nodes.rs.erb +167 -15
  189. data/templates/rust/src/union_types.rs.erb +60 -0
  190. data/templates/rust/src/visitor.rs.erb +81 -0
  191. data/templates/src/{analyze_missing_end.c.erb → analyze/missing_end.c.erb} +9 -6
  192. data/templates/src/{analyze_transform.c.erb → analyze/transform.c.erb} +2 -2
  193. data/templates/src/ast_nodes.c.erb +34 -26
  194. data/templates/src/ast_pretty_print.c.erb +24 -5
  195. data/templates/src/errors.c.erb +60 -54
  196. data/templates/src/include/ast_nodes.h.erb +6 -2
  197. data/templates/src/include/ast_pretty_print.h.erb +5 -0
  198. data/templates/src/include/errors.h.erb +15 -11
  199. data/templates/src/include/util/hb_foreach.h.erb +20 -0
  200. data/templates/src/parser_match_tags.c.erb +10 -4
  201. data/templates/src/visitor.c.erb +2 -2
  202. data/templates/template.rb +204 -29
  203. data/templates/wasm/error_helpers.cpp.erb +9 -5
  204. data/templates/wasm/nodes.cpp.erb +41 -4
  205. metadata +57 -16
  206. data/src/analyze.c +0 -1608
  207. data/src/element_source.c +0 -12
  208. data/src/include/util/hb_system.h +0 -9
  209. 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,57 @@
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 :prism_program #: bool
10
+ attr_reader :prism_nodes #: bool
11
+ attr_reader :prism_nodes_deep #: bool
12
+
13
+ DEFAULT_STRICT = true #: bool
14
+ DEFAULT_TRACK_WHITESPACE = false #: bool
15
+ DEFAULT_ANALYZE = true #: bool
16
+ DEFAULT_ACTION_VIEW_HELPERS = false #: bool
17
+ DEFAULT_PRISM_PROGRAM = false #: bool
18
+ DEFAULT_PRISM_NODES = false #: bool
19
+ DEFAULT_PRISM_NODES_DEEP = false #: bool
20
+
21
+ #: (?strict: bool, ?track_whitespace: bool, ?analyze: bool, ?action_view_helpers: bool, ?prism_nodes: bool, ?prism_nodes_deep: bool, ?prism_program: bool) -> void
22
+ def initialize(strict: DEFAULT_STRICT, track_whitespace: DEFAULT_TRACK_WHITESPACE, analyze: DEFAULT_ANALYZE, action_view_helpers: DEFAULT_ACTION_VIEW_HELPERS, prism_nodes: DEFAULT_PRISM_NODES, prism_nodes_deep: DEFAULT_PRISM_NODES_DEEP, prism_program: DEFAULT_PRISM_PROGRAM)
23
+ @strict = strict
24
+ @track_whitespace = track_whitespace
25
+ @analyze = analyze
26
+ @action_view_helpers = action_view_helpers
27
+ @prism_nodes = prism_nodes
28
+ @prism_nodes_deep = prism_nodes_deep
29
+ @prism_program = prism_program
30
+ end
31
+
32
+ #: () -> Hash[Symbol, bool]
33
+ def to_h
34
+ {
35
+ strict: @strict,
36
+ track_whitespace: @track_whitespace,
37
+ analyze: @analyze,
38
+ action_view_helpers: @action_view_helpers,
39
+ prism_nodes: @prism_nodes,
40
+ prism_nodes_deep: @prism_nodes_deep,
41
+ prism_program: @prism_program,
42
+ }
43
+ end
44
+
45
+ #: () -> String
46
+ def inspect
47
+ "#<#{self.class.name}\n " \
48
+ "strict=#{@strict}\n " \
49
+ "track_whitespace=#{@track_whitespace}\n " \
50
+ "analyze=#{@analyze}\n " \
51
+ "action_view_helpers=#{@action_view_helpers}\n " \
52
+ "prism_nodes=#{@prism_nodes}\n " \
53
+ "prism_nodes_deep=#{@prism_nodes_deep}\n " \
54
+ "prism_program=#{@prism_program}>"
55
+ end
56
+ end
57
+ 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,116 @@
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
+ require "prism"
13
+
14
+ node = Prism.load(source, serialized_bytes).value
15
+ return "∅" unless node
16
+
17
+ tree = inspect_prism_node(node, source, "#{prefix} ")
18
+
19
+ "\n#{prefix}└── #{tree.strip}"
20
+ rescue StandardError => e
21
+ "(#{serialized_bytes.bytesize} bytes, deserialize error: #{e.message})"
22
+ end
23
+
24
+ #: (Prism::Node, String, String) -> String
25
+ def inspect_prism_node(node, source, prefix)
26
+ output = +""
27
+ node_name = node.class.name&.split("::")&.last || "Node"
28
+ output << "@ #{node_name} (location: #{format_location(node.location)})\n"
29
+
30
+ fields = display_fields(node)
31
+
32
+ fields.each_with_index do |(name, value), i|
33
+ is_last = i == fields.size - 1
34
+ symbol = is_last ? "└── " : "├── "
35
+ child_prefix = prefix + (is_last ? " " : "│ ")
36
+
37
+ output << inspect_field(name, value, source, prefix, symbol, child_prefix)
38
+ end
39
+
40
+ output
41
+ end
42
+
43
+ private
44
+
45
+ #: (Symbol, untyped, String, String, String, String) -> String
46
+ def inspect_field(name, value, source, prefix, symbol, child_prefix)
47
+ case value
48
+ when nil
49
+ "#{prefix}#{symbol}#{name}: ∅\n"
50
+ when Prism::Node
51
+ inspect_node_field(name, value, source, prefix, symbol, child_prefix)
52
+ when Array
53
+ inspect_array_field(name, value, source, prefix, symbol, child_prefix)
54
+ when Prism::Location
55
+ "#{prefix}#{symbol}#{name}: #{format_location(value)}\n"
56
+ when Symbol
57
+ "#{prefix}#{symbol}#{name}: :#{value}\n"
58
+ when Integer, Float, true, false
59
+ "#{prefix}#{symbol}#{name}: #{value}\n"
60
+ else
61
+ "#{prefix}#{symbol}#{name}: #{value.inspect}\n"
62
+ end
63
+ end
64
+
65
+ #: (Symbol, Prism::Node, String, String, String, String) -> String
66
+ def inspect_node_field(name, value, source, prefix, symbol, child_prefix)
67
+ output = +""
68
+
69
+ output << "#{prefix}#{symbol}#{name}:\n"
70
+ output << "#{child_prefix}└── "
71
+ output << inspect_prism_node(value, source, "#{child_prefix} ").lstrip
72
+
73
+ output
74
+ end
75
+
76
+ #: (Symbol, Array[untyped], String, String, String, String) -> String
77
+ def inspect_array_field(name, value, source, prefix, symbol, child_prefix)
78
+ output = "#{prefix}#{symbol}#{name}: "
79
+
80
+ if value.empty?
81
+ output << "[]\n"
82
+ else
83
+ output << "(#{value.size} #{value.size == 1 ? "item" : "items"})\n"
84
+
85
+ value.each_with_index do |item, j|
86
+ is_last_item = j == value.size - 1
87
+ item_symbol = is_last_item ? "└── " : "├── "
88
+ item_prefix = child_prefix + (is_last_item ? " " : "│ ")
89
+
90
+ if item.is_a?(Prism::Node)
91
+ output << "#{child_prefix}#{item_symbol}"
92
+ output << inspect_prism_node(item, source, item_prefix).lstrip
93
+ else
94
+ output << "#{child_prefix}#{item_symbol}#{item.inspect}\n"
95
+ end
96
+ end
97
+ end
98
+
99
+ output
100
+ end
101
+
102
+ #: (untyped) -> Array[[Symbol, untyped]]
103
+ def display_fields(node)
104
+ node.deconstruct_keys(nil).except(*SKIP_FIELDS).to_a
105
+ end
106
+
107
+ #: (Prism::Location) -> String
108
+ def format_location(location)
109
+ start_line = location.start_line + 1
110
+ end_line = location.end_line + 1
111
+
112
+ "(#{start_line}:#{location.start_column})-(#{end_line}:#{location.end_column})"
113
+ end
114
+ end
115
+ end
116
+ end