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.
- checksums.yaml +4 -4
- data/config.yml +57 -21
- data/ext/herb/extension.c +8 -0
- data/ext/herb/extension_helpers.c +1 -0
- data/ext/herb/nodes.c +93 -55
- data/lib/herb/3.0/herb.so +0 -0
- data/lib/herb/3.1/herb.so +0 -0
- data/lib/herb/3.2/herb.so +0 -0
- data/lib/herb/3.3/herb.so +0 -0
- data/lib/herb/3.4/herb.so +0 -0
- data/lib/herb/4.0/herb.so +0 -0
- data/lib/herb/action_view/helper_registry.rb +8107 -0
- data/lib/herb/ast/nodes.rb +212 -78
- data/lib/herb/engine/compiler.rb +4 -6
- data/lib/herb/parser_options.rb +7 -2
- data/lib/herb/project.rb +2 -5
- data/lib/herb/version.rb +1 -1
- data/lib/herb/visitor.rb +8 -2
- data/sig/herb/action_view/helper_registry.rbs +1144 -0
- data/sig/herb/ast/nodes.rbs +85 -34
- data/sig/herb/parser_options.rbs +6 -2
- data/sig/herb/visitor.rbs +5 -2
- data/sig/serialized_ast_nodes.rbs +20 -9
- data/src/analyze/action_view/generated_handlers.c +355 -0
- data/src/analyze/action_view/generated_handlers.h +16 -0
- data/src/analyze/action_view/helper_registry.c +7244 -0
- data/src/analyze/action_view/image_tag.c +4 -31
- data/src/analyze/action_view/javascript_include_tag.c +1 -42
- data/src/analyze/action_view/javascript_tag.c +26 -40
- data/src/analyze/action_view/registry.c +2 -2
- data/src/analyze/action_view/tag_helper_node_builders.c +23 -2
- data/src/analyze/action_view/tag_helpers.c +61 -134
- data/src/analyze/action_view/turbo_frame_tag.c +1 -36
- data/src/analyze/analyze.c +28 -0
- data/src/analyze/analyze_helpers.c +406 -0
- data/src/analyze/builders.c +1 -0
- data/src/analyze/missing_end.c +16 -0
- data/src/analyze/parse_errors.c +3 -2
- data/src/analyze/postfix_conditionals.c +326 -0
- data/src/analyze/render_nodes.c +231 -35
- data/src/analyze/strict_locals.c +22 -338
- data/src/analyze/ternary_conditionals.c +265 -0
- data/src/analyze/transform.c +23 -2
- data/src/ast/ast_nodes.c +114 -57
- data/src/ast/ast_pretty_print.c +109 -25
- data/src/include/analyze/action_view/helper_registry.h +325 -0
- data/src/include/analyze/action_view/tag_helper_handler.h +3 -0
- data/src/include/analyze/action_view/tag_helper_node_builders.h +7 -0
- data/src/include/analyze/action_view/tag_helpers.h +0 -1
- data/src/include/analyze/helpers.h +18 -0
- data/src/include/analyze/postfix_conditionals.h +9 -0
- data/src/include/analyze/ternary_conditionals.h +15 -0
- data/src/include/ast/ast_nodes.h +27 -13
- data/src/include/parser/parser.h +1 -0
- data/src/include/version.h +1 -1
- data/src/parser/match_tags.c +37 -6
- data/src/parser.c +9 -0
- data/src/visitor.c +50 -7
- data/templates/java/org/herb/ast/HelperRegistry.java.erb +258 -0
- data/templates/javascript/packages/core/src/action-view-helpers.ts.erb +171 -0
- data/templates/javascript/packages/core/src/nodes.ts.erb +5 -1
- data/templates/lib/herb/action_view/helper_registry.rb.erb +288 -0
- data/templates/rust/src/action_view_helpers.rs.erb +154 -0
- data/templates/src/analyze/action_view/generated_handlers.c.erb +230 -0
- data/templates/src/analyze/action_view/generated_handlers.h.erb +12 -0
- data/templates/src/analyze/action_view/helper_registry.c.erb +114 -0
- data/templates/src/include/analyze/action_view/helper_registry.h.erb +82 -0
- data/templates/template.rb +338 -1
- metadata +19 -3
- data/src/analyze/action_view/content_tag.c +0 -78
- data/src/analyze/action_view/tag.c +0 -87
data/sig/herb/ast/nodes.rbs
CHANGED
|
@@ -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
|
|
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
|
|
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,
|
|
1592
|
-
def initialize: (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token,
|
|
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
|
|
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
|
|
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
|
|
1680
|
+
attr_reader kind: String?
|
|
1630
1681
|
|
|
1631
|
-
attr_reader
|
|
1682
|
+
attr_reader required: bool
|
|
1632
1683
|
|
|
1633
|
-
# : (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::AST::RubyLiteralNode,
|
|
1634
|
-
def initialize: (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::AST::RubyLiteralNode,
|
|
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
|
-
# : () ->
|
|
1637
|
-
def to_hash: () ->
|
|
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::
|
|
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::
|
|
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::
|
|
1679
|
-
def initialize: (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token, nil, String, Array[Herb::AST::
|
|
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?
|
data/sig/herb/parser_options.rbs
CHANGED
|
@@ -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::
|
|
137
|
-
def
|
|
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
|
|
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
|
|
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::
|
|
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
|