herb 0.9.4-arm-linux-gnu → 0.9.6-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 (71) hide show
  1. checksums.yaml +4 -4
  2. data/config.yml +57 -21
  3. data/ext/herb/extension.c +8 -0
  4. data/ext/herb/extension_helpers.c +1 -0
  5. data/ext/herb/nodes.c +93 -55
  6. data/lib/herb/3.0/herb.so +0 -0
  7. data/lib/herb/3.1/herb.so +0 -0
  8. data/lib/herb/3.2/herb.so +0 -0
  9. data/lib/herb/3.3/herb.so +0 -0
  10. data/lib/herb/3.4/herb.so +0 -0
  11. data/lib/herb/4.0/herb.so +0 -0
  12. data/lib/herb/action_view/helper_registry.rb +8107 -0
  13. data/lib/herb/ast/nodes.rb +212 -78
  14. data/lib/herb/engine/compiler.rb +4 -6
  15. data/lib/herb/parser_options.rb +7 -2
  16. data/lib/herb/project.rb +2 -5
  17. data/lib/herb/version.rb +1 -1
  18. data/lib/herb/visitor.rb +8 -2
  19. data/sig/herb/action_view/helper_registry.rbs +1144 -0
  20. data/sig/herb/ast/nodes.rbs +85 -34
  21. data/sig/herb/parser_options.rbs +6 -2
  22. data/sig/herb/visitor.rbs +5 -2
  23. data/sig/serialized_ast_nodes.rbs +20 -9
  24. data/src/analyze/action_view/generated_handlers.c +355 -0
  25. data/src/analyze/action_view/generated_handlers.h +16 -0
  26. data/src/analyze/action_view/helper_registry.c +7244 -0
  27. data/src/analyze/action_view/image_tag.c +4 -31
  28. data/src/analyze/action_view/javascript_include_tag.c +1 -42
  29. data/src/analyze/action_view/javascript_tag.c +26 -40
  30. data/src/analyze/action_view/registry.c +2 -2
  31. data/src/analyze/action_view/tag_helper_node_builders.c +23 -2
  32. data/src/analyze/action_view/tag_helpers.c +61 -134
  33. data/src/analyze/action_view/turbo_frame_tag.c +1 -36
  34. data/src/analyze/analyze.c +28 -0
  35. data/src/analyze/analyze_helpers.c +406 -0
  36. data/src/analyze/builders.c +1 -0
  37. data/src/analyze/missing_end.c +16 -0
  38. data/src/analyze/parse_errors.c +3 -2
  39. data/src/analyze/postfix_conditionals.c +326 -0
  40. data/src/analyze/render_nodes.c +231 -35
  41. data/src/analyze/strict_locals.c +22 -338
  42. data/src/analyze/ternary_conditionals.c +265 -0
  43. data/src/analyze/transform.c +23 -2
  44. data/src/ast/ast_nodes.c +114 -57
  45. data/src/ast/ast_pretty_print.c +109 -25
  46. data/src/include/analyze/action_view/helper_registry.h +325 -0
  47. data/src/include/analyze/action_view/tag_helper_handler.h +3 -0
  48. data/src/include/analyze/action_view/tag_helper_node_builders.h +7 -0
  49. data/src/include/analyze/action_view/tag_helpers.h +0 -1
  50. data/src/include/analyze/helpers.h +18 -0
  51. data/src/include/analyze/postfix_conditionals.h +9 -0
  52. data/src/include/analyze/ternary_conditionals.h +15 -0
  53. data/src/include/ast/ast_nodes.h +27 -13
  54. data/src/include/parser/parser.h +1 -0
  55. data/src/include/version.h +1 -1
  56. data/src/parser/match_tags.c +37 -6
  57. data/src/parser.c +9 -0
  58. data/src/visitor.c +50 -7
  59. data/templates/java/org/herb/ast/HelperRegistry.java.erb +258 -0
  60. data/templates/javascript/packages/core/src/action-view-helpers.ts.erb +171 -0
  61. data/templates/javascript/packages/core/src/nodes.ts.erb +5 -1
  62. data/templates/lib/herb/action_view/helper_registry.rb.erb +288 -0
  63. data/templates/rust/src/action_view_helpers.rs.erb +154 -0
  64. data/templates/src/analyze/action_view/generated_handlers.c.erb +230 -0
  65. data/templates/src/analyze/action_view/generated_handlers.h.erb +12 -0
  66. data/templates/src/analyze/action_view/helper_registry.c.erb +114 -0
  67. data/templates/src/include/analyze/action_view/helper_registry.h.erb +82 -0
  68. data/templates/template.rb +338 -1
  69. metadata +19 -3
  70. data/src/analyze/action_view/content_tag.c +0 -78
  71. data/src/analyze/action_view/tag.c +0 -87
@@ -944,6 +944,7 @@ module Herb
944
944
  # | tag_closing: Herb::Token?,
945
945
  # | prism_node: String?,
946
946
  # | body: Array[Herb::AST::Node],
947
+ # | block_arguments: Array[Herb::AST::RubyParameterNode]?,
947
948
  # | rescue_clause: Herb::AST::ERBRescueNode?,
948
949
  # | else_clause: Herb::AST::ERBElseNode?,
949
950
  # | ensure_clause: Herb::AST::ERBEnsureNode?,
@@ -962,6 +963,8 @@ module Herb
962
963
 
963
964
  attr_reader body: Array[Herb::AST::Node]
964
965
 
966
+ attr_reader block_arguments: Array[Herb::AST::RubyParameterNode]?
967
+
965
968
  attr_reader rescue_clause: Herb::AST::ERBRescueNode?
966
969
 
967
970
  attr_reader else_clause: Herb::AST::ERBElseNode?
@@ -970,8 +973,8 @@ module Herb
970
973
 
971
974
  attr_reader end_node: Herb::AST::ERBEndNode?
972
975
 
973
- # : (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token, String, Array[Herb::AST::Node], Herb::AST::ERBRescueNode, Herb::AST::ERBElseNode, Herb::AST::ERBEnsureNode, Herb::AST::ERBEndNode) -> void
974
- def initialize: (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token, String, Array[Herb::AST::Node], Herb::AST::ERBRescueNode, Herb::AST::ERBElseNode, Herb::AST::ERBEnsureNode, Herb::AST::ERBEndNode) -> void
976
+ # : (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token, String, Array[Herb::AST::Node], Array[Herb::AST::RubyParameterNode], Herb::AST::ERBRescueNode, Herb::AST::ERBElseNode, Herb::AST::ERBEnsureNode, Herb::AST::ERBEndNode) -> void
977
+ def initialize: (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token, String, Array[Herb::AST::Node], Array[Herb::AST::RubyParameterNode], Herb::AST::ERBRescueNode, Herb::AST::ERBElseNode, Herb::AST::ERBEnsureNode, Herb::AST::ERBEndNode) -> void
975
978
 
976
979
  # : () -> Prism::node?
977
980
  def deserialized_prism_node: () -> Prism::node?
@@ -1514,12 +1517,7 @@ module Herb
1514
1517
  def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String
1515
1518
  end
1516
1519
 
1517
- # : type serialized_erb_render_node = {
1518
- # | tag_opening: Herb::Token?,
1519
- # | content: Herb::Token?,
1520
- # | tag_closing: Herb::Token?,
1521
- # | analyzed_ruby: nil,
1522
- # | prism_node: String?,
1520
+ # : type serialized_ruby_render_keywords_node = {
1523
1521
  # | partial: Herb::Token?,
1524
1522
  # | template_path: Herb::Token?,
1525
1523
  # | layout: Herb::Token?,
@@ -1539,19 +1537,9 @@ module Herb
1539
1537
  # | content_type: Herb::Token?,
1540
1538
  # | locals: Array[Herb::AST::RubyRenderLocalNode]?,
1541
1539
  # | }
1542
- class ERBRenderNode < Node
1540
+ class RubyRenderKeywordsNode < Node
1543
1541
  include Colors
1544
1542
 
1545
- attr_reader tag_opening: Herb::Token?
1546
-
1547
- attr_reader content: Herb::Token?
1548
-
1549
- attr_reader tag_closing: Herb::Token?
1550
-
1551
- attr_reader analyzed_ruby: nil
1552
-
1553
- attr_reader prism_node: String?
1554
-
1555
1543
  attr_reader partial: Herb::Token?
1556
1544
 
1557
1545
  attr_reader template_path: Herb::Token?
@@ -1588,8 +1576,71 @@ module Herb
1588
1576
 
1589
1577
  attr_reader locals: Array[Herb::AST::RubyRenderLocalNode]?
1590
1578
 
1591
- # : (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token, nil, String, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Array[Herb::AST::RubyRenderLocalNode]) -> void
1592
- def initialize: (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token, nil, String, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Array[Herb::AST::RubyRenderLocalNode]) -> void
1579
+ # : (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Array[Herb::AST::RubyRenderLocalNode]) -> void
1580
+ def initialize: (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Herb::Token, Array[Herb::AST::RubyRenderLocalNode]) -> void
1581
+
1582
+ # : () -> serialized_ruby_render_keywords_node
1583
+ def to_hash: () -> serialized_ruby_render_keywords_node
1584
+
1585
+ # : (Visitor) -> void
1586
+ def accept: (Visitor) -> void
1587
+
1588
+ # : () -> Array[Herb::AST::Node?]
1589
+ def child_nodes: () -> Array[Herb::AST::Node?]
1590
+
1591
+ # : () -> Array[Herb::AST::Node]
1592
+ def compact_child_nodes: () -> Array[Herb::AST::Node]
1593
+
1594
+ # : () -> String
1595
+ def inspect: () -> String
1596
+
1597
+ # : (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String
1598
+ def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String
1599
+ end
1600
+
1601
+ # : type serialized_erb_render_node = {
1602
+ # | tag_opening: Herb::Token?,
1603
+ # | content: Herb::Token?,
1604
+ # | tag_closing: Herb::Token?,
1605
+ # | analyzed_ruby: nil,
1606
+ # | prism_node: String?,
1607
+ # | keywords: Herb::AST::RubyRenderKeywordsNode?,
1608
+ # | body: Array[Herb::AST::Node],
1609
+ # | block_arguments: Array[Herb::AST::RubyParameterNode]?,
1610
+ # | rescue_clause: Herb::AST::ERBRescueNode?,
1611
+ # | else_clause: Herb::AST::ERBElseNode?,
1612
+ # | ensure_clause: Herb::AST::ERBEnsureNode?,
1613
+ # | end_node: Herb::AST::ERBEndNode?,
1614
+ # | }
1615
+ class ERBRenderNode < Node
1616
+ include Colors
1617
+
1618
+ attr_reader tag_opening: Herb::Token?
1619
+
1620
+ attr_reader content: Herb::Token?
1621
+
1622
+ attr_reader tag_closing: Herb::Token?
1623
+
1624
+ attr_reader analyzed_ruby: nil
1625
+
1626
+ attr_reader prism_node: String?
1627
+
1628
+ attr_reader keywords: Herb::AST::RubyRenderKeywordsNode?
1629
+
1630
+ attr_reader body: Array[Herb::AST::Node]
1631
+
1632
+ attr_reader block_arguments: Array[Herb::AST::RubyParameterNode]?
1633
+
1634
+ attr_reader rescue_clause: Herb::AST::ERBRescueNode?
1635
+
1636
+ attr_reader else_clause: Herb::AST::ERBElseNode?
1637
+
1638
+ attr_reader ensure_clause: Herb::AST::ERBEnsureNode?
1639
+
1640
+ attr_reader end_node: Herb::AST::ERBEndNode?
1641
+
1642
+ # : (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token, nil, String, Herb::AST::RubyRenderKeywordsNode, Array[Herb::AST::Node], Array[Herb::AST::RubyParameterNode], Herb::AST::ERBRescueNode, Herb::AST::ERBElseNode, Herb::AST::ERBEnsureNode, Herb::AST::ERBEndNode) -> void
1643
+ def initialize: (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token, nil, String, Herb::AST::RubyRenderKeywordsNode, Array[Herb::AST::Node], Array[Herb::AST::RubyParameterNode], Herb::AST::ERBRescueNode, Herb::AST::ERBElseNode, Herb::AST::ERBEnsureNode, Herb::AST::ERBEndNode) -> void
1593
1644
 
1594
1645
  # : () -> Prism::node?
1595
1646
  def deserialized_prism_node: () -> Prism::node?
@@ -1613,28 +1664,28 @@ module Herb
1613
1664
  def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String
1614
1665
  end
1615
1666
 
1616
- # : type serialized_ruby_strict_local_node = {
1667
+ # : type serialized_ruby_parameter_node = {
1617
1668
  # | name: Herb::Token?,
1618
1669
  # | default_value: Herb::AST::RubyLiteralNode?,
1670
+ # | kind: String?,
1619
1671
  # | required: bool,
1620
- # | double_splat: bool,
1621
1672
  # | }
1622
- class RubyStrictLocalNode < Node
1673
+ class RubyParameterNode < Node
1623
1674
  include Colors
1624
1675
 
1625
1676
  attr_reader name: Herb::Token?
1626
1677
 
1627
1678
  attr_reader default_value: Herb::AST::RubyLiteralNode?
1628
1679
 
1629
- attr_reader required: bool
1680
+ attr_reader kind: String?
1630
1681
 
1631
- attr_reader double_splat: bool
1682
+ attr_reader required: bool
1632
1683
 
1633
- # : (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::AST::RubyLiteralNode, bool, bool) -> void
1634
- def initialize: (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::AST::RubyLiteralNode, bool, bool) -> void
1684
+ # : (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::AST::RubyLiteralNode, String, bool) -> void
1685
+ def initialize: (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::AST::RubyLiteralNode, String, bool) -> void
1635
1686
 
1636
- # : () -> serialized_ruby_strict_local_node
1637
- def to_hash: () -> serialized_ruby_strict_local_node
1687
+ # : () -> serialized_ruby_parameter_node
1688
+ def to_hash: () -> serialized_ruby_parameter_node
1638
1689
 
1639
1690
  # : (Visitor) -> void
1640
1691
  def accept: (Visitor) -> void
@@ -1658,7 +1709,7 @@ module Herb
1658
1709
  # | tag_closing: Herb::Token?,
1659
1710
  # | analyzed_ruby: nil,
1660
1711
  # | prism_node: String?,
1661
- # | locals: Array[Herb::AST::RubyStrictLocalNode]?,
1712
+ # | locals: Array[Herb::AST::RubyParameterNode]?,
1662
1713
  # | }
1663
1714
  class ERBStrictLocalsNode < Node
1664
1715
  include Colors
@@ -1673,10 +1724,10 @@ module Herb
1673
1724
 
1674
1725
  attr_reader prism_node: String?
1675
1726
 
1676
- attr_reader locals: Array[Herb::AST::RubyStrictLocalNode]?
1727
+ attr_reader locals: Array[Herb::AST::RubyParameterNode]?
1677
1728
 
1678
- # : (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token, nil, String, Array[Herb::AST::RubyStrictLocalNode]) -> void
1679
- def initialize: (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token, nil, String, Array[Herb::AST::RubyStrictLocalNode]) -> void
1729
+ # : (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token, nil, String, Array[Herb::AST::RubyParameterNode]) -> void
1730
+ def initialize: (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token, nil, String, Array[Herb::AST::RubyParameterNode]) -> void
1680
1731
 
1681
1732
  # : () -> Prism::node?
1682
1733
  def deserialized_prism_node: () -> Prism::node?
@@ -10,6 +10,8 @@ module Herb
10
10
 
11
11
  attr_reader action_view_helpers: bool
12
12
 
13
+ attr_reader transform_conditionals: bool
14
+
13
15
  attr_reader render_nodes: bool
14
16
 
15
17
  attr_reader strict_locals: bool
@@ -28,6 +30,8 @@ module Herb
28
30
 
29
31
  DEFAULT_ACTION_VIEW_HELPERS: bool
30
32
 
33
+ DEFAULT_TRANSFORM_CONDITIONALS: bool
34
+
31
35
  DEFAULT_RENDER_NODES: bool
32
36
 
33
37
  DEFAULT_STRICT_LOCALS: bool
@@ -38,8 +42,8 @@ module Herb
38
42
 
39
43
  DEFAULT_PRISM_NODES_DEEP: bool
40
44
 
41
- # : (?strict: bool, ?track_whitespace: bool, ?analyze: bool, ?action_view_helpers: bool, ?render_nodes: bool, ?strict_locals: bool, ?prism_nodes: bool, ?prism_nodes_deep: bool, ?prism_program: bool) -> void
42
- def initialize: (?strict: bool, ?track_whitespace: bool, ?analyze: bool, ?action_view_helpers: bool, ?render_nodes: bool, ?strict_locals: bool, ?prism_nodes: bool, ?prism_nodes_deep: bool, ?prism_program: bool) -> void
45
+ # : (?strict: bool, ?track_whitespace: bool, ?analyze: bool, ?action_view_helpers: bool, ?transform_conditionals: bool, ?render_nodes: bool, ?strict_locals: bool, ?prism_nodes: bool, ?prism_nodes_deep: bool, ?prism_program: bool) -> void
46
+ def initialize: (?strict: bool, ?track_whitespace: bool, ?analyze: bool, ?action_view_helpers: bool, ?transform_conditionals: bool, ?render_nodes: bool, ?strict_locals: bool, ?prism_nodes: bool, ?prism_nodes_deep: bool, ?prism_program: bool) -> void
43
47
 
44
48
  # : () -> Hash[Symbol, bool]
45
49
  def to_h: () -> Hash[Symbol, bool]
data/sig/herb/visitor.rbs CHANGED
@@ -130,11 +130,14 @@ module Herb
130
130
  # : (Herb::AST::RubyRenderLocalNode) -> void
131
131
  def visit_ruby_render_local_node: (Herb::AST::RubyRenderLocalNode) -> void
132
132
 
133
+ # : (Herb::AST::RubyRenderKeywordsNode) -> void
134
+ def visit_ruby_render_keywords_node: (Herb::AST::RubyRenderKeywordsNode) -> void
135
+
133
136
  # : (Herb::AST::ERBRenderNode) -> void
134
137
  def visit_erb_render_node: (Herb::AST::ERBRenderNode) -> void
135
138
 
136
- # : (Herb::AST::RubyStrictLocalNode) -> void
137
- def visit_ruby_strict_local_node: (Herb::AST::RubyStrictLocalNode) -> void
139
+ # : (Herb::AST::RubyParameterNode) -> void
140
+ def visit_ruby_parameter_node: (Herb::AST::RubyParameterNode) -> void
138
141
 
139
142
  # : (Herb::AST::ERBStrictLocalsNode) -> void
140
143
  def visit_erb_strict_locals_node: (Herb::AST::ERBStrictLocalsNode) -> void
@@ -170,6 +170,7 @@ module Herb
170
170
  tag_closing: Herb::Token,
171
171
  prism_node: String,
172
172
  body: Array[Herb::AST::Node],
173
+ block_arguments: Array[Herb::AST::RubyParameterNode],
173
174
  rescue_clause: Herb::AST::ERBRescueNode,
174
175
  else_clause: Herb::AST::ERBElseNode,
175
176
  ensure_clause: Herb::AST::ERBEnsureNode,
@@ -276,12 +277,7 @@ module Herb
276
277
  value: Herb::AST::RubyLiteralNode,
277
278
  }
278
279
 
279
- type serialized_erb_render_node = serialized_node & {
280
- tag_opening: Herb::Token,
281
- content: Herb::Token,
282
- tag_closing: Herb::Token,
283
- analyzed_ruby: nil,
284
- prism_node: String,
280
+ type serialized_ruby_render_keywords_node = serialized_node & {
285
281
  partial: Herb::Token,
286
282
  template_path: Herb::Token,
287
283
  layout: Herb::Token,
@@ -302,11 +298,26 @@ module Herb
302
298
  locals: Array[Herb::AST::RubyRenderLocalNode],
303
299
  }
304
300
 
305
- type serialized_ruby_strict_local_node = serialized_node & {
301
+ type serialized_erb_render_node = serialized_node & {
302
+ tag_opening: Herb::Token,
303
+ content: Herb::Token,
304
+ tag_closing: Herb::Token,
305
+ analyzed_ruby: nil,
306
+ prism_node: String,
307
+ keywords: Herb::AST::RubyRenderKeywordsNode,
308
+ body: Array[Herb::AST::Node],
309
+ block_arguments: Array[Herb::AST::RubyParameterNode],
310
+ rescue_clause: Herb::AST::ERBRescueNode,
311
+ else_clause: Herb::AST::ERBElseNode,
312
+ ensure_clause: Herb::AST::ERBEnsureNode,
313
+ end_node: Herb::AST::ERBEndNode,
314
+ }
315
+
316
+ type serialized_ruby_parameter_node = serialized_node & {
306
317
  name: Herb::Token,
307
318
  default_value: Herb::AST::RubyLiteralNode,
319
+ kind: String,
308
320
  required: bool,
309
- double_splat: bool,
310
321
  }
311
322
 
312
323
  type serialized_erb_strict_locals_node = serialized_node & {
@@ -315,7 +326,7 @@ module Herb
315
326
  tag_closing: Herb::Token,
316
327
  analyzed_ruby: nil,
317
328
  prism_node: String,
318
- locals: Array[Herb::AST::RubyStrictLocalNode],
329
+ locals: Array[Herb::AST::RubyParameterNode],
319
330
  }
320
331
 
321
332
  type serialized_erb_yield_node = serialized_node & {
@@ -0,0 +1,355 @@
1
+ // NOTE: This file is generated by the templates/template.rb script and should not
2
+ // be modified manually. See /home/runner/work/herb/herb/templates/src/analyze/action_view/generated_handlers.c.erb
3
+
4
+ #include "../../include/analyze/action_view/tag_helper_handler.h"
5
+ #include "../../include/lib/hb_allocator.h"
6
+ #include "../../include/lib/hb_string.h"
7
+
8
+ #include <prism.h>
9
+ #include <stdbool.h>
10
+ #include <string.h>
11
+
12
+ // ==========================================================================
13
+ // Generated detect functions
14
+ // ==========================================================================
15
+
16
+ bool detect_image_tag(pm_call_node_t* call_node, pm_parser_t* parser) {
17
+ if (!call_node || !call_node->name) { return false; }
18
+
19
+ pm_constant_t* constant = pm_constant_pool_id_to_constant(&parser->constant_pool, call_node->name);
20
+
21
+ return constant && constant->length == 9 && strncmp((const char*) constant->start, "image_tag", 9) == 0;
22
+ }
23
+
24
+ bool detect_javascript_include_tag(pm_call_node_t* call_node, pm_parser_t* parser) {
25
+ if (!call_node || !call_node->name) { return false; }
26
+
27
+ pm_constant_t* constant = pm_constant_pool_id_to_constant(&parser->constant_pool, call_node->name);
28
+
29
+ return constant && constant->length == 22 && strncmp((const char*) constant->start, "javascript_include_tag", 22) == 0;
30
+ }
31
+
32
+ bool detect_javascript_tag(pm_call_node_t* call_node, pm_parser_t* parser) {
33
+ if (!call_node || !call_node->name) { return false; }
34
+
35
+ pm_constant_t* constant = pm_constant_pool_id_to_constant(&parser->constant_pool, call_node->name);
36
+
37
+ return constant && constant->length == 14 && strncmp((const char*) constant->start, "javascript_tag", 14) == 0;
38
+ }
39
+
40
+ bool detect_content_tag(pm_call_node_t* call_node, pm_parser_t* parser) {
41
+ if (!call_node || !call_node->name) { return false; }
42
+
43
+ pm_constant_t* constant = pm_constant_pool_id_to_constant(&parser->constant_pool, call_node->name);
44
+
45
+ return constant && constant->length == 11 && strncmp((const char*) constant->start, "content_tag", 11) == 0;
46
+ }
47
+
48
+ bool detect_tag(pm_call_node_t* call_node, pm_parser_t* parser) {
49
+ if (!call_node || !call_node->receiver) { return false; }
50
+ if (call_node->receiver->type != PM_CALL_NODE) { return false; }
51
+
52
+ pm_call_node_t* receiver_node = (pm_call_node_t*) call_node->receiver;
53
+ if (!receiver_node->name) { return false; }
54
+
55
+ pm_constant_t* constant = pm_constant_pool_id_to_constant(&parser->constant_pool, receiver_node->name);
56
+
57
+ return constant && constant->length == 3 && strncmp((const char*) constant->start, "tag", 3) == 0;
58
+ }
59
+
60
+ bool detect_turbo_frame_tag(pm_call_node_t* call_node, pm_parser_t* parser) {
61
+ if (!call_node || !call_node->name) { return false; }
62
+
63
+ pm_constant_t* constant = pm_constant_pool_id_to_constant(&parser->constant_pool, call_node->name);
64
+
65
+ return constant && constant->length == 15 && strncmp((const char*) constant->start, "turbo_frame_tag", 15) == 0;
66
+ }
67
+
68
+ // ==========================================================================
69
+ // Generated extract_tag_name functions
70
+ // ==========================================================================
71
+
72
+ static char* extract_image_tag_tag_name(pm_call_node_t* _call_node, pm_parser_t* _parser, hb_allocator_T* allocator) {
73
+ (void) _call_node;
74
+ (void) _parser;
75
+
76
+ return hb_allocator_strdup(allocator, "img");
77
+ }
78
+
79
+ static char* extract_javascript_include_tag_tag_name(pm_call_node_t* _call_node, pm_parser_t* _parser, hb_allocator_T* allocator) {
80
+ (void) _call_node;
81
+ (void) _parser;
82
+
83
+ return hb_allocator_strdup(allocator, "script");
84
+ }
85
+
86
+ static char* extract_javascript_tag_tag_name(pm_call_node_t* _call_node, pm_parser_t* _parser, hb_allocator_T* allocator) {
87
+ (void) _call_node;
88
+ (void) _parser;
89
+
90
+ return hb_allocator_strdup(allocator, "script");
91
+ }
92
+
93
+ static char* extract_content_tag_tag_name(pm_call_node_t* call_node, pm_parser_t* parser, hb_allocator_T* allocator) {
94
+ (void) parser;
95
+
96
+ if (!call_node || !call_node->arguments) { return NULL; }
97
+
98
+ pm_arguments_node_t* arguments = call_node->arguments;
99
+ if (!arguments->arguments.size) { return NULL; }
100
+
101
+ pm_node_t* first_argument = arguments->arguments.nodes[0];
102
+
103
+ if (first_argument->type == PM_STRING_NODE) {
104
+ pm_string_node_t* string_node = (pm_string_node_t*) first_argument;
105
+ size_t length = pm_string_length(&string_node->unescaped);
106
+ return hb_allocator_strndup(allocator, (const char*) pm_string_source(&string_node->unescaped), length);
107
+ } else if (first_argument->type == PM_SYMBOL_NODE) {
108
+ pm_symbol_node_t* symbol_node = (pm_symbol_node_t*) first_argument;
109
+ size_t length = pm_string_length(&symbol_node->unescaped);
110
+ return hb_allocator_strndup(allocator, (const char*) pm_string_source(&symbol_node->unescaped), length);
111
+ }
112
+
113
+ return NULL;
114
+ }
115
+
116
+ extern bool is_ruby_introspection_method(hb_string_T method_name);
117
+
118
+ static char* extract_tag_tag_name(pm_call_node_t* call_node, pm_parser_t* parser, hb_allocator_T* allocator) {
119
+ if (!call_node || !call_node->name) { return NULL; }
120
+
121
+ pm_constant_t* constant = pm_constant_pool_id_to_constant(&parser->constant_pool, call_node->name);
122
+ if (!constant) { return NULL; }
123
+
124
+ if (is_ruby_introspection_method(hb_string_from_data((const char*) constant->start, constant->length))) { return NULL; }
125
+
126
+ char* name = hb_allocator_strndup(allocator, (const char*) constant->start, constant->length);
127
+
128
+ for (size_t i = 0; i < constant->length && name[i] != '\0'; i++) {
129
+ if (name[i] == '_') { name[i] = '-'; }
130
+ }
131
+
132
+ return name;
133
+ }
134
+
135
+ static char* extract_turbo_frame_tag_tag_name(pm_call_node_t* _call_node, pm_parser_t* _parser, hb_allocator_T* allocator) {
136
+ (void) _call_node;
137
+ (void) _parser;
138
+
139
+ return hb_allocator_strdup(allocator, "turbo-frame");
140
+ }
141
+
142
+ // ==========================================================================
143
+ // Generated extract_content functions
144
+ // ==========================================================================
145
+
146
+ static char* extract_image_tag_content(pm_call_node_t* _call_node, pm_parser_t* _parser, hb_allocator_T* _allocator) {
147
+ (void) _call_node;
148
+ (void) _parser;
149
+ (void) _allocator;
150
+
151
+ return NULL;
152
+ }
153
+
154
+ static char* extract_javascript_include_tag_content(pm_call_node_t* _call_node, pm_parser_t* _parser, hb_allocator_T* _allocator) {
155
+ (void) _call_node;
156
+ (void) _parser;
157
+ (void) _allocator;
158
+
159
+ return NULL;
160
+ }
161
+
162
+ static char* extract_javascript_tag_content(pm_call_node_t* call_node, pm_parser_t* _parser, hb_allocator_T* allocator) {
163
+ (void) _parser;
164
+
165
+ if (!call_node || !call_node->arguments) { return NULL; }
166
+
167
+ pm_arguments_node_t* arguments = call_node->arguments;
168
+ if (!arguments->arguments.size) { return NULL; }
169
+
170
+ pm_node_t* first_argument = arguments->arguments.nodes[0];
171
+
172
+ if (first_argument->type == PM_KEYWORD_HASH_NODE) { return NULL; }
173
+
174
+ if (first_argument->type == PM_STRING_NODE) {
175
+ pm_string_node_t* string_node = (pm_string_node_t*) first_argument;
176
+ size_t length = pm_string_length(&string_node->unescaped);
177
+ return hb_allocator_strndup(allocator, (const char*) pm_string_source(&string_node->unescaped), length);
178
+ }
179
+
180
+ size_t source_length = first_argument->location.end - first_argument->location.start;
181
+ return hb_allocator_strndup(allocator, (const char*) first_argument->location.start, source_length);
182
+ }
183
+
184
+ static char* extract_content_tag_content(pm_call_node_t* call_node, pm_parser_t* _parser, hb_allocator_T* allocator) {
185
+ (void) _parser;
186
+
187
+ if (!call_node) { return NULL; }
188
+
189
+
190
+ char* block_content = extract_inline_block_content(call_node, allocator);
191
+ if (block_content) { return block_content; }
192
+
193
+
194
+ if (call_node->arguments) {
195
+ pm_arguments_node_t* arguments = call_node->arguments;
196
+
197
+ if (arguments->arguments.size >= 2) {
198
+ pm_node_t* argument = arguments->arguments.nodes[1];
199
+
200
+ if (argument->type != PM_KEYWORD_HASH_NODE) {
201
+
202
+ if (argument->type == PM_STRING_NODE) {
203
+ pm_string_node_t* string_node = (pm_string_node_t*) argument;
204
+ size_t length = pm_string_length(&string_node->unescaped);
205
+ return hb_allocator_strndup(allocator, (const char*) pm_string_source(&string_node->unescaped), length);
206
+ }
207
+
208
+ size_t source_length = argument->location.end - argument->location.start;
209
+
210
+
211
+ return hb_allocator_strndup(allocator, (const char*) argument->location.start, source_length);
212
+
213
+ }
214
+ }
215
+ }
216
+
217
+ return NULL;
218
+ }
219
+
220
+ static char* extract_tag_content(pm_call_node_t* call_node, pm_parser_t* parser, hb_allocator_T* allocator) {
221
+ (void) parser;
222
+
223
+ if (!call_node) { return NULL; }
224
+
225
+ if (call_node->name) {
226
+ pm_constant_t* constant = pm_constant_pool_id_to_constant(&parser->constant_pool, call_node->name);
227
+
228
+ if (constant && is_ruby_introspection_method(hb_string_from_data((const char*) constant->start, constant->length))) {
229
+ return NULL;
230
+ }
231
+ }
232
+
233
+ char* block_content = extract_inline_block_content(call_node, allocator);
234
+ if (block_content) { return block_content; }
235
+
236
+
237
+ if (call_node->arguments) {
238
+ pm_arguments_node_t* arguments = call_node->arguments;
239
+
240
+ if (arguments->arguments.size >= 1) {
241
+ pm_node_t* argument = arguments->arguments.nodes[0];
242
+
243
+ if (argument->type != PM_KEYWORD_HASH_NODE) {
244
+
245
+ if (argument->type == PM_STRING_NODE) {
246
+ pm_string_node_t* string_node = (pm_string_node_t*) argument;
247
+ size_t length = pm_string_length(&string_node->unescaped);
248
+ return hb_allocator_strndup(allocator, (const char*) pm_string_source(&string_node->unescaped), length);
249
+ }
250
+
251
+ size_t source_length = argument->location.end - argument->location.start;
252
+
253
+
254
+ return hb_allocator_strndup(allocator, (const char*) argument->location.start, source_length);
255
+
256
+ }
257
+ }
258
+ }
259
+
260
+ return NULL;
261
+ }
262
+
263
+ static char* extract_turbo_frame_tag_content(pm_call_node_t* _call_node, pm_parser_t* _parser, hb_allocator_T* _allocator) {
264
+ (void) _call_node;
265
+ (void) _parser;
266
+ (void) _allocator;
267
+
268
+ return NULL;
269
+ }
270
+
271
+ // ==========================================================================
272
+ // Generated supports_block functions
273
+ // ==========================================================================
274
+
275
+ static bool image_tag_supports_block(void) {
276
+ return false;
277
+ }
278
+
279
+ static bool javascript_include_tag_supports_block(void) {
280
+ return false;
281
+ }
282
+
283
+ static bool javascript_tag_supports_block(void) {
284
+ return true;
285
+ }
286
+
287
+ static bool content_tag_supports_block(void) {
288
+ return true;
289
+ }
290
+
291
+ static bool tag_supports_block(void) {
292
+ return true;
293
+ }
294
+
295
+ static bool turbo_frame_tag_supports_block(void) {
296
+ return true;
297
+ }
298
+
299
+ // ==========================================================================
300
+ // Generated handler structs
301
+ // ==========================================================================
302
+
303
+ const tag_helper_handler_T image_tag_handler = {
304
+ .name = "image_tag",
305
+ .source = HB_STRING_LITERAL("ActionView::Helpers::AssetTagHelper#image_tag"),
306
+ .detect = detect_image_tag,
307
+ .extract_tag_name = extract_image_tag_tag_name,
308
+ .extract_content = extract_image_tag_content,
309
+ .supports_block = image_tag_supports_block,
310
+ };
311
+
312
+ const tag_helper_handler_T javascript_include_tag_handler = {
313
+ .name = "javascript_include_tag",
314
+ .source = HB_STRING_LITERAL("ActionView::Helpers::AssetTagHelper#javascript_include_tag"),
315
+ .detect = detect_javascript_include_tag,
316
+ .extract_tag_name = extract_javascript_include_tag_tag_name,
317
+ .extract_content = extract_javascript_include_tag_content,
318
+ .supports_block = javascript_include_tag_supports_block,
319
+ };
320
+
321
+ const tag_helper_handler_T javascript_tag_handler = {
322
+ .name = "javascript_tag",
323
+ .source = HB_STRING_LITERAL("ActionView::Helpers::JavaScriptHelper#javascript_tag"),
324
+ .detect = detect_javascript_tag,
325
+ .extract_tag_name = extract_javascript_tag_tag_name,
326
+ .extract_content = extract_javascript_tag_content,
327
+ .supports_block = javascript_tag_supports_block,
328
+ };
329
+
330
+ const tag_helper_handler_T content_tag_handler = {
331
+ .name = "content_tag",
332
+ .source = HB_STRING_LITERAL("ActionView::Helpers::TagHelper#content_tag"),
333
+ .detect = detect_content_tag,
334
+ .extract_tag_name = extract_content_tag_tag_name,
335
+ .extract_content = extract_content_tag_content,
336
+ .supports_block = content_tag_supports_block,
337
+ };
338
+
339
+ const tag_helper_handler_T tag_handler = {
340
+ .name = "tag",
341
+ .source = HB_STRING_LITERAL("ActionView::Helpers::TagHelper#tag"),
342
+ .detect = detect_tag,
343
+ .extract_tag_name = extract_tag_tag_name,
344
+ .extract_content = extract_tag_content,
345
+ .supports_block = tag_supports_block,
346
+ };
347
+
348
+ const tag_helper_handler_T turbo_frame_tag_handler = {
349
+ .name = "turbo_frame_tag",
350
+ .source = HB_STRING_LITERAL("Turbo::FramesHelper#turbo_frame_tag"),
351
+ .detect = detect_turbo_frame_tag,
352
+ .extract_tag_name = extract_turbo_frame_tag_tag_name,
353
+ .extract_content = extract_turbo_frame_tag_content,
354
+ .supports_block = turbo_frame_tag_supports_block,
355
+ };
@@ -0,0 +1,16 @@
1
+ // NOTE: This file is generated by the templates/template.rb script and should not
2
+ // be modified manually. See /home/runner/work/herb/herb/templates/src/analyze/action_view/generated_handlers.h.erb
3
+
4
+ #ifndef GENERATED_HANDLERS_H
5
+ #define GENERATED_HANDLERS_H
6
+
7
+ #include "../../include/analyze/action_view/tag_helper_handler.h"
8
+
9
+ extern const tag_helper_handler_T image_tag_handler;
10
+ extern const tag_helper_handler_T javascript_include_tag_handler;
11
+ extern const tag_helper_handler_T javascript_tag_handler;
12
+ extern const tag_helper_handler_T content_tag_handler;
13
+ extern const tag_helper_handler_T tag_handler;
14
+ extern const tag_helper_handler_T turbo_frame_tag_handler;
15
+
16
+ #endif