herb 0.9.2 → 0.9.3

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 (162) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -0
  3. data/config.yml +125 -0
  4. data/ext/herb/error_helpers.c +172 -2
  5. data/ext/herb/extconf.rb +6 -0
  6. data/ext/herb/extension.c +16 -2
  7. data/ext/herb/extension_helpers.c +6 -5
  8. data/ext/herb/extension_helpers.h +4 -4
  9. data/ext/herb/nodes.c +89 -3
  10. data/lib/herb/ast/erb_content_node.rb +32 -0
  11. data/lib/herb/ast/nodes.rb +244 -3
  12. data/lib/herb/cli.rb +12 -2
  13. data/lib/herb/engine/compiler.rb +122 -59
  14. data/lib/herb/engine/validators/security_validator.rb +40 -0
  15. data/lib/herb/errors.rb +268 -0
  16. data/lib/herb/parser_options.rb +7 -2
  17. data/lib/herb/version.rb +1 -1
  18. data/lib/herb/visitor.rb +82 -0
  19. data/lib/herb.rb +1 -0
  20. data/sig/herb/ast/erb_content_node.rbs +13 -0
  21. data/sig/herb/ast/nodes.rbs +98 -2
  22. data/sig/herb/engine/compiler.rbs +15 -2
  23. data/sig/herb/engine/validators/security_validator.rbs +4 -0
  24. data/sig/herb/errors.rbs +122 -0
  25. data/sig/herb/parser_options.rbs +6 -2
  26. data/sig/herb/visitor.rbs +12 -0
  27. data/sig/serialized_ast_errors.rbs +29 -0
  28. data/sig/serialized_ast_nodes.rbs +19 -0
  29. data/src/analyze/action_view/attribute_extraction_helpers.c +420 -91
  30. data/src/analyze/action_view/image_tag.c +87 -0
  31. data/src/analyze/action_view/javascript_include_tag.c +22 -12
  32. data/src/analyze/action_view/registry.c +6 -3
  33. data/src/analyze/action_view/tag.c +19 -2
  34. data/src/analyze/action_view/tag_helper_node_builders.c +105 -36
  35. data/src/analyze/action_view/tag_helpers.c +792 -44
  36. data/src/analyze/analyze.c +165 -10
  37. data/src/analyze/{helpers.c → analyze_helpers.c} +1 -1
  38. data/src/analyze/analyzed_ruby.c +1 -1
  39. data/src/analyze/builders.c +11 -8
  40. data/src/analyze/conditional_elements.c +6 -7
  41. data/src/analyze/conditional_open_tags.c +6 -7
  42. data/src/analyze/control_type.c +4 -2
  43. data/src/analyze/invalid_structures.c +5 -5
  44. data/src/analyze/missing_end.c +2 -2
  45. data/src/analyze/parse_errors.c +5 -5
  46. data/src/analyze/prism_annotate.c +7 -7
  47. data/src/analyze/render_nodes.c +6 -26
  48. data/src/analyze/strict_locals.c +637 -0
  49. data/src/analyze/transform.c +7 -0
  50. data/src/{ast_node.c → ast/ast_node.c} +8 -8
  51. data/src/{ast_nodes.c → ast/ast_nodes.c} +82 -11
  52. data/src/{ast_pretty_print.c → ast/ast_pretty_print.c} +113 -9
  53. data/src/{pretty_print.c → ast/pretty_print.c} +9 -9
  54. data/src/errors.c +398 -8
  55. data/src/extract.c +5 -5
  56. data/src/herb.c +15 -5
  57. data/src/include/analyze/action_view/attribute_extraction_helpers.h +3 -1
  58. data/src/include/analyze/action_view/tag_helper_handler.h +3 -3
  59. data/src/include/analyze/action_view/tag_helper_node_builders.h +34 -5
  60. data/src/include/analyze/action_view/tag_helpers.h +4 -3
  61. data/src/include/analyze/analyze.h +6 -4
  62. data/src/include/analyze/analyzed_ruby.h +2 -2
  63. data/src/include/analyze/builders.h +4 -4
  64. data/src/include/analyze/conditional_elements.h +2 -2
  65. data/src/include/analyze/conditional_open_tags.h +2 -2
  66. data/src/include/analyze/control_type.h +1 -1
  67. data/src/include/analyze/helpers.h +2 -2
  68. data/src/include/analyze/invalid_structures.h +1 -1
  69. data/src/include/analyze/prism_annotate.h +2 -2
  70. data/src/include/analyze/render_nodes.h +1 -1
  71. data/src/include/analyze/strict_locals.h +11 -0
  72. data/src/include/{ast_node.h → ast/ast_node.h} +4 -4
  73. data/src/include/{ast_nodes.h → ast/ast_nodes.h} +38 -14
  74. data/src/include/{ast_pretty_print.h → ast/ast_pretty_print.h} +3 -3
  75. data/src/include/{pretty_print.h → ast/pretty_print.h} +4 -4
  76. data/src/include/errors.h +65 -7
  77. data/src/include/extract.h +2 -2
  78. data/src/include/herb.h +5 -5
  79. data/src/include/{lex_helpers.h → lexer/lex_helpers.h} +5 -5
  80. data/src/include/{lexer.h → lexer/lexer.h} +1 -1
  81. data/src/include/{lexer_peek_helpers.h → lexer/lexer_peek_helpers.h} +2 -2
  82. data/src/include/{lexer_struct.h → lexer/lexer_struct.h} +2 -2
  83. data/src/include/{token.h → lexer/token.h} +3 -3
  84. data/src/include/{token_matchers.h → lexer/token_matchers.h} +1 -1
  85. data/src/include/{token_struct.h → lexer/token_struct.h} +3 -3
  86. data/src/include/{util → lib}/hb_foreach.h +1 -1
  87. data/src/include/{util → lib}/hb_string.h +5 -1
  88. data/src/include/{location.h → location/location.h} +1 -1
  89. data/src/include/parser/dot_notation.h +12 -0
  90. data/src/include/{parser.h → parser/parser.h} +11 -4
  91. data/src/include/{parser_helpers.h → parser/parser_helpers.h} +6 -6
  92. data/src/include/{prism_context.h → prism/prism_context.h} +2 -2
  93. data/src/include/{prism_helpers.h → prism/prism_helpers.h} +6 -6
  94. data/src/include/{html_util.h → util/html_util.h} +1 -1
  95. data/src/include/util/ruby_util.h +9 -0
  96. data/src/include/{utf8.h → util/utf8.h} +1 -1
  97. data/src/include/{util.h → util/util.h} +1 -1
  98. data/src/include/version.h +1 -1
  99. data/src/include/visitor.h +3 -3
  100. data/src/{lexer_peek_helpers.c → lexer/lexer_peek_helpers.c} +3 -3
  101. data/src/{token.c → lexer/token.c} +8 -8
  102. data/src/{token_matchers.c → lexer/token_matchers.c} +2 -2
  103. data/src/lexer.c +6 -6
  104. data/src/{util → lib}/hb_allocator.c +2 -2
  105. data/src/{util → lib}/hb_arena.c +1 -1
  106. data/src/{util → lib}/hb_arena_debug.c +2 -2
  107. data/src/{util → lib}/hb_array.c +2 -2
  108. data/src/{util → lib}/hb_buffer.c +2 -2
  109. data/src/{util → lib}/hb_narray.c +1 -1
  110. data/src/{util → lib}/hb_string.c +2 -2
  111. data/src/{location.c → location/location.c} +2 -2
  112. data/src/{position.c → location/position.c} +2 -2
  113. data/src/{range.c → location/range.c} +1 -1
  114. data/src/main.c +11 -11
  115. data/src/parser/dot_notation.c +100 -0
  116. data/src/{parser_match_tags.c → parser/match_tags.c} +34 -5
  117. data/src/{parser_helpers.c → parser/parser_helpers.c} +10 -10
  118. data/src/parser.c +68 -32
  119. data/src/{prism_helpers.c → prism/prism_helpers.c} +7 -7
  120. data/src/{ruby_parser.c → prism/ruby_parser.c} +1 -1
  121. data/src/{html_util.c → util/html_util.c} +4 -4
  122. data/src/{io.c → util/io.c} +3 -3
  123. data/src/util/ruby_util.c +42 -0
  124. data/src/{utf8.c → util/utf8.c} +2 -2
  125. data/src/{util.c → util/util.c} +4 -4
  126. data/src/visitor.c +35 -3
  127. data/templates/ext/herb/error_helpers.c.erb +2 -2
  128. data/templates/ext/herb/nodes.c.erb +1 -1
  129. data/templates/java/error_helpers.c.erb +1 -1
  130. data/templates/java/error_helpers.h.erb +2 -2
  131. data/templates/java/nodes.c.erb +4 -4
  132. data/templates/java/nodes.h.erb +1 -1
  133. data/templates/javascript/packages/node/extension/error_helpers.cpp.erb +4 -4
  134. data/templates/javascript/packages/node/extension/nodes.cpp.erb +4 -4
  135. data/templates/lib/herb/visitor.rb.erb +14 -0
  136. data/templates/src/analyze/missing_end.c.erb +2 -2
  137. data/templates/src/{ast_nodes.c.erb → ast/ast_nodes.c.erb} +9 -9
  138. data/templates/src/{ast_pretty_print.c.erb → ast/ast_pretty_print.c.erb} +8 -8
  139. data/templates/src/errors.c.erb +8 -8
  140. data/templates/src/include/{ast_nodes.h.erb → ast/ast_nodes.h.erb} +11 -12
  141. data/templates/src/include/{ast_pretty_print.h.erb → ast/ast_pretty_print.h.erb} +2 -2
  142. data/templates/src/include/errors.h.erb +7 -7
  143. data/templates/src/{parser_match_tags.c.erb → parser/match_tags.c.erb} +4 -4
  144. data/templates/src/visitor.c.erb +3 -3
  145. data/templates/wasm/error_helpers.cpp.erb +4 -4
  146. data/templates/wasm/nodes.cpp.erb +5 -5
  147. metadata +76 -68
  148. data/src/include/element_source.h +0 -10
  149. /data/src/include/{util → lib}/hb_allocator.h +0 -0
  150. /data/src/include/{util → lib}/hb_arena.h +0 -0
  151. /data/src/include/{util → lib}/hb_arena_debug.h +0 -0
  152. /data/src/include/{util → lib}/hb_array.h +0 -0
  153. /data/src/include/{util → lib}/hb_buffer.h +0 -0
  154. /data/src/include/{util → lib}/hb_narray.h +0 -0
  155. /data/src/include/{util → lib}/string.h +0 -0
  156. /data/src/include/{position.h → location/position.h} +0 -0
  157. /data/src/include/{range.h → location/range.h} +0 -0
  158. /data/src/include/{herb_prism_node.h → prism/herb_prism_node.h} +0 -0
  159. /data/src/include/{prism_serialized.h → prism/prism_serialized.h} +0 -0
  160. /data/src/include/{ruby_parser.h → prism/ruby_parser.h} +0 -0
  161. /data/src/include/{io.h → util/io.h} +0 -0
  162. /data/templates/src/include/{util → lib}/hb_foreach.h.erb +0 -0
@@ -944,6 +944,9 @@ module Herb
944
944
  # | tag_closing: Herb::Token?,
945
945
  # | prism_node: String?,
946
946
  # | body: Array[Herb::AST::Node],
947
+ # | rescue_clause: Herb::AST::ERBRescueNode?,
948
+ # | else_clause: Herb::AST::ERBElseNode?,
949
+ # | ensure_clause: Herb::AST::ERBEnsureNode?,
947
950
  # | end_node: Herb::AST::ERBEndNode?,
948
951
  # | }
949
952
  class ERBBlockNode < Node
@@ -959,10 +962,16 @@ module Herb
959
962
 
960
963
  attr_reader body: Array[Herb::AST::Node]
961
964
 
965
+ attr_reader rescue_clause: Herb::AST::ERBRescueNode?
966
+
967
+ attr_reader else_clause: Herb::AST::ERBElseNode?
968
+
969
+ attr_reader ensure_clause: Herb::AST::ERBEnsureNode?
970
+
962
971
  attr_reader end_node: Herb::AST::ERBEndNode?
963
972
 
964
- # : (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token, String, Array[Herb::AST::Node], Herb::AST::ERBEndNode) -> void
965
- def initialize: (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token, String, Array[Herb::AST::Node], Herb::AST::ERBEndNode) -> void
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
966
975
 
967
976
  # : () -> Prism::node?
968
977
  def deserialized_prism_node: () -> Prism::node?
@@ -1604,6 +1613,93 @@ module Herb
1604
1613
  def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String
1605
1614
  end
1606
1615
 
1616
+ # : type serialized_ruby_strict_local_node = {
1617
+ # | name: Herb::Token?,
1618
+ # | default_value: Herb::AST::RubyLiteralNode?,
1619
+ # | required: bool,
1620
+ # | double_splat: bool,
1621
+ # | }
1622
+ class RubyStrictLocalNode < Node
1623
+ include Colors
1624
+
1625
+ attr_reader name: Herb::Token?
1626
+
1627
+ attr_reader default_value: Herb::AST::RubyLiteralNode?
1628
+
1629
+ attr_reader required: bool
1630
+
1631
+ attr_reader double_splat: bool
1632
+
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
1635
+
1636
+ # : () -> serialized_ruby_strict_local_node
1637
+ def to_hash: () -> serialized_ruby_strict_local_node
1638
+
1639
+ # : (Visitor) -> void
1640
+ def accept: (Visitor) -> void
1641
+
1642
+ # : () -> Array[Herb::AST::Node?]
1643
+ def child_nodes: () -> Array[Herb::AST::Node?]
1644
+
1645
+ # : () -> Array[Herb::AST::Node]
1646
+ def compact_child_nodes: () -> Array[Herb::AST::Node]
1647
+
1648
+ # : () -> String
1649
+ def inspect: () -> String
1650
+
1651
+ # : (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String
1652
+ def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String
1653
+ end
1654
+
1655
+ # : type serialized_erb_strict_locals_node = {
1656
+ # | tag_opening: Herb::Token?,
1657
+ # | content: Herb::Token?,
1658
+ # | tag_closing: Herb::Token?,
1659
+ # | analyzed_ruby: nil,
1660
+ # | prism_node: String?,
1661
+ # | locals: Array[Herb::AST::RubyStrictLocalNode]?,
1662
+ # | }
1663
+ class ERBStrictLocalsNode < Node
1664
+ include Colors
1665
+
1666
+ attr_reader tag_opening: Herb::Token?
1667
+
1668
+ attr_reader content: Herb::Token?
1669
+
1670
+ attr_reader tag_closing: Herb::Token?
1671
+
1672
+ attr_reader analyzed_ruby: nil
1673
+
1674
+ attr_reader prism_node: String?
1675
+
1676
+ attr_reader locals: Array[Herb::AST::RubyStrictLocalNode]?
1677
+
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
1680
+
1681
+ # : () -> Prism::node?
1682
+ def deserialized_prism_node: () -> Prism::node?
1683
+
1684
+ # : () -> serialized_erb_strict_locals_node
1685
+ def to_hash: () -> serialized_erb_strict_locals_node
1686
+
1687
+ # : (Visitor) -> void
1688
+ def accept: (Visitor) -> void
1689
+
1690
+ # : () -> Array[Herb::AST::Node?]
1691
+ def child_nodes: () -> Array[Herb::AST::Node?]
1692
+
1693
+ # : () -> Array[Herb::AST::Node]
1694
+ def compact_child_nodes: () -> Array[Herb::AST::Node]
1695
+
1696
+ # : () -> String
1697
+ def inspect: () -> String
1698
+
1699
+ # : (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String
1700
+ def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String
1701
+ end
1702
+
1607
1703
  # : type serialized_erb_yield_node = {
1608
1704
  # | tag_opening: Herb::Token?,
1609
1705
  # | content: Herb::Token?,
@@ -3,6 +3,8 @@
3
3
  module Herb
4
4
  class Engine
5
5
  class Compiler < ::Herb::Visitor
6
+ EXPRESSION_TOKEN_TYPES: untyped
7
+
6
8
  attr_reader tokens: untyped
7
9
 
8
10
  def initialize: (untyped engine, ?untyped options) -> untyped
@@ -89,6 +91,9 @@ module Herb
89
91
 
90
92
  def pop_context: () -> untyped
91
93
 
94
+ # : (untyped node) { () -> untyped } -> untyped
95
+ def with_element_context: (untyped node) { () -> untyped } -> untyped
96
+
92
97
  def process_erb_tag: (untyped node, ?skip_comment_check: untyped) -> untyped
93
98
 
94
99
  def add_text: (untyped text) -> untyped
@@ -129,12 +134,20 @@ module Herb
129
134
 
130
135
  def preceding_token_ends_with_newline?: () -> untyped
131
136
 
132
- def extract_lspace: () -> untyped
137
+ def last_text_token: () -> untyped
138
+
139
+ def extract_leading_space: () -> untyped
133
140
 
134
- def extract_and_remove_lspace!: () -> untyped
141
+ def leading_space_follows_newline?: () -> untyped
142
+
143
+ def extract_and_remove_leading_space!: () -> untyped
135
144
 
136
145
  def apply_trim: (untyped node, untyped code) -> untyped
137
146
 
147
+ def save_pending_leading_whitespace!: (untyped whitespace) -> untyped
148
+
149
+ def restore_pending_leading_whitespace!: () -> untyped
150
+
138
151
  def remove_trailing_whitespace_from_last_token!: () -> untyped
139
152
  end
140
153
  end
@@ -14,6 +14,10 @@ module Herb
14
14
 
15
15
  def validate_attribute_name_security: (untyped node) -> untyped
16
16
 
17
+ def tag_attributes_prism_node?: (untyped prism_node) -> untyped
18
+
19
+ def conditional_tag_attributes_prism_node?: (untyped prism_node) -> untyped
20
+
17
21
  def add_security_error: (untyped location, untyped message, untyped suggestion) -> untyped
18
22
 
19
23
  def add_diagnostic: (untyped message, untyped location, untyped severity, ?code: untyped, ?source: untyped, ?suggestion: untyped) -> untyped
data/sig/herb/errors.rbs CHANGED
@@ -572,5 +572,127 @@ module Herb
572
572
  # : (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String
573
573
  def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String
574
574
  end
575
+
576
+ class StrictLocalsPositionalArgumentError < Error
577
+ include Colors
578
+
579
+ attr_reader name: String?
580
+
581
+ # : (String, Location?, String, String) -> void
582
+ def initialize: (String, Location?, String, String) -> void
583
+
584
+ # : () -> String
585
+ def inspect: () -> String
586
+
587
+ # : () -> serialized_strict_locals_positional_argument_error
588
+ def to_hash: () -> serialized_strict_locals_positional_argument_error
589
+
590
+ # : (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String
591
+ def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String
592
+ end
593
+
594
+ class StrictLocalsBlockArgumentError < Error
595
+ include Colors
596
+
597
+ attr_reader name: String?
598
+
599
+ # : (String, Location?, String, String) -> void
600
+ def initialize: (String, Location?, String, String) -> void
601
+
602
+ # : () -> String
603
+ def inspect: () -> String
604
+
605
+ # : () -> serialized_strict_locals_block_argument_error
606
+ def to_hash: () -> serialized_strict_locals_block_argument_error
607
+
608
+ # : (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String
609
+ def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String
610
+ end
611
+
612
+ class StrictLocalsSplatArgumentError < Error
613
+ include Colors
614
+
615
+ attr_reader name: String?
616
+
617
+ # : (String, Location?, String, String) -> void
618
+ def initialize: (String, Location?, String, String) -> void
619
+
620
+ # : () -> String
621
+ def inspect: () -> String
622
+
623
+ # : () -> serialized_strict_locals_splat_argument_error
624
+ def to_hash: () -> serialized_strict_locals_splat_argument_error
625
+
626
+ # : (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String
627
+ def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String
628
+ end
629
+
630
+ class StrictLocalsMissingParenthesisError < Error
631
+ include Colors
632
+
633
+ attr_reader rest: String?
634
+
635
+ # : (String, Location?, String, String) -> void
636
+ def initialize: (String, Location?, String, String) -> void
637
+
638
+ # : () -> String
639
+ def inspect: () -> String
640
+
641
+ # : () -> serialized_strict_locals_missing_parenthesis_error
642
+ def to_hash: () -> serialized_strict_locals_missing_parenthesis_error
643
+
644
+ # : (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String
645
+ def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String
646
+ end
647
+
648
+ class StrictLocalsDuplicateDeclarationError < Error
649
+ include Colors
650
+
651
+ # : () -> String
652
+ def inspect: () -> String
653
+
654
+ # : (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String
655
+ def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String
656
+ end
657
+
658
+ class VoidElementContentError < Error
659
+ include Colors
660
+
661
+ attr_reader tag_name: Herb::Token?
662
+
663
+ attr_reader helper_name: String?
664
+
665
+ attr_reader content_type: String?
666
+
667
+ # : (String, Location?, String, Herb::Token, String, String) -> void
668
+ def initialize: (String, Location?, String, Herb::Token, String, String) -> void
669
+
670
+ # : () -> String
671
+ def inspect: () -> String
672
+
673
+ # : () -> serialized_void_element_content_error
674
+ def to_hash: () -> serialized_void_element_content_error
675
+
676
+ # : (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String
677
+ def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String
678
+ end
679
+
680
+ class DotNotationCasingError < Error
681
+ include Colors
682
+
683
+ attr_reader segment: Herb::Token?
684
+
685
+ # : (String, Location?, String, Herb::Token) -> void
686
+ def initialize: (String, Location?, String, Herb::Token) -> void
687
+
688
+ # : () -> String
689
+ def inspect: () -> String
690
+
691
+ # : () -> serialized_dot_notation_casing_error
692
+ def to_hash: () -> serialized_dot_notation_casing_error
693
+
694
+ # : (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String
695
+ def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String
696
+ end
575
697
  end
576
698
  end
@@ -12,6 +12,8 @@ module Herb
12
12
 
13
13
  attr_reader render_nodes: bool
14
14
 
15
+ attr_reader strict_locals: bool
16
+
15
17
  attr_reader prism_program: bool
16
18
 
17
19
  attr_reader prism_nodes: bool
@@ -28,14 +30,16 @@ module Herb
28
30
 
29
31
  DEFAULT_RENDER_NODES: bool
30
32
 
33
+ DEFAULT_STRICT_LOCALS: bool
34
+
31
35
  DEFAULT_PRISM_PROGRAM: bool
32
36
 
33
37
  DEFAULT_PRISM_NODES: bool
34
38
 
35
39
  DEFAULT_PRISM_NODES_DEEP: bool
36
40
 
37
- # : (?strict: bool, ?track_whitespace: bool, ?analyze: bool, ?action_view_helpers: bool, ?prism_nodes: bool, ?prism_nodes_deep: bool, ?prism_program: bool) -> void
38
- def initialize: (?strict: bool, ?track_whitespace: bool, ?analyze: bool, ?action_view_helpers: bool, ?prism_nodes: bool, ?prism_nodes_deep: bool, ?prism_program: bool) -> void
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
39
43
 
40
44
  # : () -> Hash[Symbol, bool]
41
45
  def to_h: () -> Hash[Symbol, bool]
data/sig/herb/visitor.rbs CHANGED
@@ -13,6 +13,12 @@ module Herb
13
13
  # : (Herb::AST::Node) -> void
14
14
  def visit_child_nodes: (Herb::AST::Node) -> void
15
15
 
16
+ # : (Herb::AST::Node) -> void
17
+ def visit_node: (Herb::AST::Node) -> void
18
+
19
+ # : (Herb::AST::Node) -> void
20
+ def visit_erb_node: (Herb::AST::Node) -> void
21
+
16
22
  # : (Herb::AST::DocumentNode) -> void
17
23
  def visit_document_node: (Herb::AST::DocumentNode) -> void
18
24
 
@@ -127,6 +133,12 @@ module Herb
127
133
  # : (Herb::AST::ERBRenderNode) -> void
128
134
  def visit_erb_render_node: (Herb::AST::ERBRenderNode) -> void
129
135
 
136
+ # : (Herb::AST::RubyStrictLocalNode) -> void
137
+ def visit_ruby_strict_local_node: (Herb::AST::RubyStrictLocalNode) -> void
138
+
139
+ # : (Herb::AST::ERBStrictLocalsNode) -> void
140
+ def visit_erb_strict_locals_node: (Herb::AST::ERBStrictLocalsNode) -> void
141
+
130
142
  # : (Herb::AST::ERBYieldNode) -> void
131
143
  def visit_erb_yield_node: (Herb::AST::ERBYieldNode) -> void
132
144
 
@@ -140,4 +140,33 @@ module Herb
140
140
  layout: String,
141
141
  }
142
142
 
143
+ type serialized_strict_locals_positional_argument_error = serialized_error & {
144
+ name: String,
145
+ }
146
+
147
+ type serialized_strict_locals_block_argument_error = serialized_error & {
148
+ name: String,
149
+ }
150
+
151
+ type serialized_strict_locals_splat_argument_error = serialized_error & {
152
+ name: String,
153
+ }
154
+
155
+ type serialized_strict_locals_missing_parenthesis_error = serialized_error & {
156
+ rest: String,
157
+ }
158
+
159
+ type serialized_strict_locals_duplicate_declaration_error = serialized_error & {
160
+ }
161
+
162
+ type serialized_void_element_content_error = serialized_error & {
163
+ tag_name: Herb::Token,
164
+ helper_name: String,
165
+ content_type: String,
166
+ }
167
+
168
+ type serialized_dot_notation_casing_error = serialized_error & {
169
+ segment: Herb::Token,
170
+ }
171
+
143
172
  end
@@ -170,6 +170,9 @@ module Herb
170
170
  tag_closing: Herb::Token,
171
171
  prism_node: String,
172
172
  body: Array[Herb::AST::Node],
173
+ rescue_clause: Herb::AST::ERBRescueNode,
174
+ else_clause: Herb::AST::ERBElseNode,
175
+ ensure_clause: Herb::AST::ERBEnsureNode,
173
176
  end_node: Herb::AST::ERBEndNode,
174
177
  }
175
178
 
@@ -299,6 +302,22 @@ module Herb
299
302
  locals: Array[Herb::AST::RubyRenderLocalNode],
300
303
  }
301
304
 
305
+ type serialized_ruby_strict_local_node = serialized_node & {
306
+ name: Herb::Token,
307
+ default_value: Herb::AST::RubyLiteralNode,
308
+ required: bool,
309
+ double_splat: bool,
310
+ }
311
+
312
+ type serialized_erb_strict_locals_node = serialized_node & {
313
+ tag_opening: Herb::Token,
314
+ content: Herb::Token,
315
+ tag_closing: Herb::Token,
316
+ analyzed_ruby: nil,
317
+ prism_node: String,
318
+ locals: Array[Herb::AST::RubyStrictLocalNode],
319
+ }
320
+
302
321
  type serialized_erb_yield_node = serialized_node & {
303
322
  tag_opening: Herb::Token,
304
323
  content: Herb::Token,