diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 307ffd462..c3f8170e7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -56,12 +56,12 @@ jobs: - name: Steep run: bundle exec steep check + - name: Sorbet + run: bundle exec srb tc + - name: RBS Inline run: bundle exec rake rbs_inline - # - name: Sorbet - # run: bundle exec srb tc - - name: clang-tidy version run: clang-tidy-21 --version diff --git a/lib/herb/ast/helpers.rb b/lib/herb/ast/helpers.rb index dcd282e83..874cae3b5 100644 --- a/lib/herb/ast/helpers.rb +++ b/lib/herb/ast/helpers.rb @@ -4,12 +4,12 @@ module Herb module AST module Helpers - #: (Herb::AST::Node) -> bool + #: (Herb::AST::Node?) -> bool def erb_outputs?(node) return false unless node.is_a?(Herb::AST::ERBContentNode) - opening = node.tag_opening&.value - opening&.include?("=") && !opening&.start_with?("<%#") + opening = node.tag_opening&.value || "" + opening.include?("=") && !opening.start_with?("<%#") end #: (String) -> bool diff --git a/lib/herb/ast/node.rb b/lib/herb/ast/node.rb index e1b5768c6..78aa4b99b 100644 --- a/lib/herb/ast/node.rb +++ b/lib/herb/ast/node.rb @@ -2,13 +2,18 @@ # typed: true module Herb + #: type serialized_node = { + #| type: String, + #| location: serialized_location?, + #| errors: Array[serialized_error] + #| } module AST class Node attr_reader :type #: String attr_reader :location #: Location attr_reader :errors #: Array[Herb::Errors::Error] - #: (String, Location, Array[Herb::Errors::Error]) -> void + #: (String, Location, ?Array[Herb::Errors::Error]) -> void def initialize(type, location, errors = []) @type = type @location = location @@ -19,7 +24,7 @@ def initialize(type, location, errors = []) def to_hash { type: type, - location: location&.to_hash, + location: location.to_hash, errors: errors.map(&:to_hash), } end diff --git a/lib/herb/engine.rb b/lib/herb/engine.rb index 92b7fdcce..c619bae0a 100644 --- a/lib/herb/engine.rb +++ b/lib/herb/engine.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true +# typed: false require "json" require "time" diff --git a/lib/herb/engine/debug_visitor.rb b/lib/herb/engine/debug_visitor.rb index 87515e728..81334079f 100644 --- a/lib/herb/engine/debug_visitor.rb +++ b/lib/herb/engine/debug_visitor.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true +# typed: false module Herb class Engine @@ -31,6 +32,7 @@ def initialize(file_path: nil, project_path: nil) @in_html_comment = false @in_html_doctype = false @erb_nodes_to_wrap = [] #: Array[Herb::AST::ERBContentNode] + @top_level_elements = [] #: Array[Herb::AST::HTMLElementNode] end def visit_document_node(node) @@ -149,8 +151,6 @@ def replace_erb_nodes_recursive(node) end def find_top_level_elements(document_node) - @top_level_elements = [] #: Array[Herb::AST::HTMLElementNode] - document_node.children.each do |child| @top_level_elements << child if child.is_a?(Herb::AST::HTMLElementNode) end diff --git a/lib/herb/lex_result.rb b/lib/herb/lex_result.rb index 5c32a76d1..58a691900 100644 --- a/lib/herb/lex_result.rb +++ b/lib/herb/lex_result.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true +# typed: true module Herb class LexResult < Result diff --git a/lib/herb/location.rb b/lib/herb/location.rb index 276ce61aa..f74688a31 100644 --- a/lib/herb/location.rb +++ b/lib/herb/location.rb @@ -2,6 +2,10 @@ # typed: true module Herb + #: type serialized_location = { + #| start: serialized_position, + #| end: serialized_position + #| } class Location attr_reader :start #: Position attr_reader :end #: Position @@ -28,9 +32,9 @@ def self.[](start_line, start_column, end_line, end_column) #: () -> serialized_location def to_hash { - start: start, - end: self.end, - } #: Herb::serialized_location + start: start.to_hash, + end: self.end.to_hash, + } end #: (?untyped) -> String diff --git a/lib/herb/parse_result.rb b/lib/herb/parse_result.rb index d86df34f7..d5679064f 100644 --- a/lib/herb/parse_result.rb +++ b/lib/herb/parse_result.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true +# typed: true require "json" diff --git a/lib/herb/position.rb b/lib/herb/position.rb index f7131d151..a6d7404b3 100644 --- a/lib/herb/position.rb +++ b/lib/herb/position.rb @@ -2,6 +2,7 @@ # typed: true module Herb + #: type serialized_position = { line: Integer, column: Integer } class Position attr_reader :line #: Integer attr_reader :column #: Integer diff --git a/lib/herb/range.rb b/lib/herb/range.rb index 7adb16c10..749d36a89 100644 --- a/lib/herb/range.rb +++ b/lib/herb/range.rb @@ -2,6 +2,7 @@ # typed: true module Herb + #: type serialized_range = [Integer, Integer] class Range attr_reader :from #: Integer attr_reader :to #: Integer diff --git a/lib/herb/token.rb b/lib/herb/token.rb index 33742fe5a..16b6282f1 100644 --- a/lib/herb/token.rb +++ b/lib/herb/token.rb @@ -2,6 +2,12 @@ # typed: true module Herb + #: type serialized_token = { + #| value: String, + #| range: serialized_range?, + #| location: serialized_location?, + #| type: String + #| } class Token include Colors @@ -25,7 +31,7 @@ def to_hash range: range&.to_a, location: location&.to_hash, type: type, - } #: Herb::serialized_token + } end #: (?untyped) -> String diff --git a/lib/herb/warnings.rb b/lib/herb/warnings.rb index 9020a3d7d..565f4848e 100644 --- a/lib/herb/warnings.rb +++ b/lib/herb/warnings.rb @@ -3,9 +3,14 @@ module Herb module Warnings + #: type serialized_warning = { + #| type: String, + #| location: serialized_location?, + #| message: String + #| } class Warning attr_reader :type #: String - attr_reader :location #: Location + attr_reader :location #: Location? attr_reader :message #: String #: (String, Location, String) -> void diff --git a/sig/herb/ast/helpers.rbs b/sig/herb/ast/helpers.rbs index 0db42b8b6..a5ba41e11 100644 --- a/sig/herb/ast/helpers.rbs +++ b/sig/herb/ast/helpers.rbs @@ -3,8 +3,8 @@ module Herb module AST module Helpers - # : (Herb::AST::Node) -> bool - def erb_outputs?: (Herb::AST::Node) -> bool + # : (Herb::AST::Node?) -> bool + def erb_outputs?: (Herb::AST::Node?) -> bool # : (String) -> bool def erb_comment?: (String) -> bool diff --git a/sig/herb/ast/node.rbs b/sig/herb/ast/node.rbs index 7d52e7498..c505f4885 100644 --- a/sig/herb/ast/node.rbs +++ b/sig/herb/ast/node.rbs @@ -1,6 +1,11 @@ # Generated from lib/herb/ast/node.rb with RBS::Inline module Herb + # : type serialized_node = { + # | type: String, + # | location: serialized_location?, + # | errors: Array[serialized_error] + # | } module AST class Node attr_reader type: String @@ -9,8 +14,8 @@ module Herb attr_reader errors: Array[Herb::Errors::Error] - # : (String, Location, Array[Herb::Errors::Error]) -> void - def initialize: (String, Location, Array[Herb::Errors::Error]) -> void + # : (String, Location, ?Array[Herb::Errors::Error]) -> void + def initialize: (String, Location, ?Array[Herb::Errors::Error]) -> void # : () -> serialized_node def to_hash: () -> serialized_node diff --git a/sig/herb/ast/nodes.rbs b/sig/herb/ast/nodes.rbs index 1b09fe1fd..df666d09c 100644 --- a/sig/herb/ast/nodes.rbs +++ b/sig/herb/ast/nodes.rbs @@ -2,6 +2,9 @@ module Herb module AST + # : type serialized_document_node = { + # | children: Array[Herb::AST::Node], + # | } class DocumentNode < Node include Colors @@ -29,10 +32,13 @@ module Herb def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String end + # : type serialized_literal_node = { + # | content: String?, + # | } class LiteralNode < Node include Colors - attr_reader content: String + attr_reader content: String? # : (String, Location, Array[Herb::Errors::Error], String) -> void def initialize: (String, Location, Array[Herb::Errors::Error], String) -> void @@ -56,14 +62,21 @@ module Herb def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String end + # : type serialized_html_open_tag_node = { + # | tag_opening: Herb::Token?, + # | tag_name: Herb::Token?, + # | tag_closing: Herb::Token?, + # | children: Array[Herb::AST::Node], + # | is_void: bool, + # | } class HTMLOpenTagNode < Node include Colors - attr_reader tag_opening: Herb::Token + attr_reader tag_opening: Herb::Token? - attr_reader tag_name: Herb::Token + attr_reader tag_name: Herb::Token? - attr_reader tag_closing: Herb::Token + attr_reader tag_closing: Herb::Token? attr_reader children: Array[Herb::AST::Node] @@ -91,12 +104,17 @@ module Herb def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String end + # : type serialized_html_conditional_open_tag_node = { + # | conditional: (Herb::AST::ERBIfNode | Herb::AST::ERBUnlessNode)?, + # | tag_name: Herb::Token?, + # | is_void: bool, + # | } class HTMLConditionalOpenTagNode < Node include Colors - attr_reader conditional: Herb::AST::ERBIfNode | Herb::AST::ERBUnlessNode + attr_reader conditional: (Herb::AST::ERBIfNode | Herb::AST::ERBUnlessNode)? - attr_reader tag_name: Herb::Token + attr_reader tag_name: Herb::Token? attr_reader is_void: bool @@ -122,16 +140,22 @@ module Herb def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String end + # : type serialized_html_close_tag_node = { + # | tag_opening: Herb::Token?, + # | tag_name: Herb::Token?, + # | children: Array[Herb::AST::WhitespaceNode]?, + # | tag_closing: Herb::Token?, + # | } class HTMLCloseTagNode < Node include Colors - attr_reader tag_opening: Herb::Token + attr_reader tag_opening: Herb::Token? - attr_reader tag_name: Herb::Token + attr_reader tag_name: Herb::Token? - attr_reader children: Array[Herb::AST::WhitespaceNode] + attr_reader children: Array[Herb::AST::WhitespaceNode]? - attr_reader tag_closing: Herb::Token + attr_reader tag_closing: Herb::Token? # : (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Array[Herb::AST::WhitespaceNode], Herb::Token) -> void def initialize: (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Array[Herb::AST::WhitespaceNode], Herb::Token) -> void @@ -155,10 +179,13 @@ module Herb def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String end + # : type serialized_html_omitted_close_tag_node = { + # | tag_name: Herb::Token?, + # | } class HTMLOmittedCloseTagNode < Node include Colors - attr_reader tag_name: Herb::Token + attr_reader tag_name: Herb::Token? # : (String, Location, Array[Herb::Errors::Error], Herb::Token) -> void def initialize: (String, Location, Array[Herb::Errors::Error], Herb::Token) -> void @@ -182,20 +209,28 @@ module Herb def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String end + # : type serialized_html_element_node = { + # | open_tag: (Herb::AST::HTMLOpenTagNode | Herb::AST::HTMLConditionalOpenTagNode)?, + # | tag_name: Herb::Token?, + # | body: Array[Herb::AST::Node], + # | close_tag: (Herb::AST::HTMLCloseTagNode | Herb::AST::HTMLOmittedCloseTagNode)?, + # | is_void: bool, + # | source: String?, + # | } class HTMLElementNode < Node include Colors - attr_reader open_tag: Herb::AST::HTMLOpenTagNode | Herb::AST::HTMLConditionalOpenTagNode + attr_reader open_tag: (Herb::AST::HTMLOpenTagNode | Herb::AST::HTMLConditionalOpenTagNode)? - attr_reader tag_name: Herb::Token + attr_reader tag_name: Herb::Token? attr_reader body: Array[Herb::AST::Node] - attr_reader close_tag: Herb::AST::HTMLCloseTagNode | Herb::AST::HTMLOmittedCloseTagNode + attr_reader close_tag: (Herb::AST::HTMLCloseTagNode | Herb::AST::HTMLOmittedCloseTagNode)? attr_reader is_void: bool - attr_reader source: String + attr_reader source: String? # : (String, Location, Array[Herb::Errors::Error], (Herb::AST::HTMLOpenTagNode | Herb::AST::HTMLConditionalOpenTagNode), Herb::Token, Array[Herb::AST::Node], (Herb::AST::HTMLCloseTagNode | Herb::AST::HTMLOmittedCloseTagNode), bool, String) -> void def initialize: (String, Location, Array[Herb::Errors::Error], Herb::AST::HTMLOpenTagNode | Herb::AST::HTMLConditionalOpenTagNode, Herb::Token, Array[Herb::AST::Node], Herb::AST::HTMLCloseTagNode | Herb::AST::HTMLOmittedCloseTagNode, bool, String) -> void @@ -219,24 +254,34 @@ module Herb def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String end + # : type serialized_html_conditional_element_node = { + # | condition: String?, + # | open_conditional: (Herb::AST::ERBIfNode | Herb::AST::ERBUnlessNode)?, + # | open_tag: Herb::AST::HTMLOpenTagNode?, + # | body: Array[Herb::AST::Node], + # | close_tag: (Herb::AST::HTMLCloseTagNode | Herb::AST::HTMLOmittedCloseTagNode)?, + # | close_conditional: (Herb::AST::ERBIfNode | Herb::AST::ERBUnlessNode)?, + # | tag_name: Herb::Token?, + # | source: String?, + # | } class HTMLConditionalElementNode < Node include Colors - attr_reader condition: String + attr_reader condition: String? - attr_reader open_conditional: Herb::AST::ERBIfNode | Herb::AST::ERBUnlessNode + attr_reader open_conditional: (Herb::AST::ERBIfNode | Herb::AST::ERBUnlessNode)? - attr_reader open_tag: Herb::AST::HTMLOpenTagNode + attr_reader open_tag: Herb::AST::HTMLOpenTagNode? attr_reader body: Array[Herb::AST::Node] - attr_reader close_tag: Herb::AST::HTMLCloseTagNode | Herb::AST::HTMLOmittedCloseTagNode + attr_reader close_tag: (Herb::AST::HTMLCloseTagNode | Herb::AST::HTMLOmittedCloseTagNode)? - attr_reader close_conditional: Herb::AST::ERBIfNode | Herb::AST::ERBUnlessNode + attr_reader close_conditional: (Herb::AST::ERBIfNode | Herb::AST::ERBUnlessNode)? - attr_reader tag_name: Herb::Token + attr_reader tag_name: Herb::Token? - attr_reader source: String + attr_reader source: String? # : (String, Location, Array[Herb::Errors::Error], String, (Herb::AST::ERBIfNode | Herb::AST::ERBUnlessNode), Herb::AST::HTMLOpenTagNode, Array[Herb::AST::Node], (Herb::AST::HTMLCloseTagNode | Herb::AST::HTMLOmittedCloseTagNode), (Herb::AST::ERBIfNode | Herb::AST::ERBUnlessNode), Herb::Token, String) -> void def initialize: (String, Location, Array[Herb::Errors::Error], String, Herb::AST::ERBIfNode | Herb::AST::ERBUnlessNode, Herb::AST::HTMLOpenTagNode, Array[Herb::AST::Node], Herb::AST::HTMLCloseTagNode | Herb::AST::HTMLOmittedCloseTagNode, Herb::AST::ERBIfNode | Herb::AST::ERBUnlessNode, Herb::Token, String) -> void @@ -260,14 +305,20 @@ module Herb def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String end + # : type serialized_html_attribute_value_node = { + # | open_quote: Herb::Token?, + # | children: Array[Herb::AST::Node], + # | close_quote: Herb::Token?, + # | quoted: bool, + # | } class HTMLAttributeValueNode < Node include Colors - attr_reader open_quote: Herb::Token + attr_reader open_quote: Herb::Token? attr_reader children: Array[Herb::AST::Node] - attr_reader close_quote: Herb::Token + attr_reader close_quote: Herb::Token? attr_reader quoted: bool @@ -293,10 +344,13 @@ module Herb def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String end + # : type serialized_html_attribute_name_node = { + # | children: Array[(Herb::AST::LiteralNode | Herb::AST::ERBContentNode)]?, + # | } class HTMLAttributeNameNode < Node include Colors - attr_reader children: Array[Herb::AST::LiteralNode | Herb::AST::ERBContentNode] + attr_reader children: Array[Herb::AST::LiteralNode | Herb::AST::ERBContentNode]? # : (String, Location, Array[Herb::Errors::Error], Array[(Herb::AST::LiteralNode | Herb::AST::ERBContentNode)]) -> void def initialize: (String, Location, Array[Herb::Errors::Error], Array[Herb::AST::LiteralNode | Herb::AST::ERBContentNode]) -> void @@ -320,14 +374,19 @@ module Herb def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String end + # : type serialized_html_attribute_node = { + # | name: Herb::AST::HTMLAttributeNameNode?, + # | equals: Herb::Token?, + # | value: Herb::AST::HTMLAttributeValueNode?, + # | } class HTMLAttributeNode < Node include Colors - attr_reader name: Herb::AST::HTMLAttributeNameNode + attr_reader name: Herb::AST::HTMLAttributeNameNode? - attr_reader equals: Herb::Token + attr_reader equals: Herb::Token? - attr_reader value: Herb::AST::HTMLAttributeValueNode + attr_reader value: Herb::AST::HTMLAttributeValueNode? # : (String, Location, Array[Herb::Errors::Error], Herb::AST::HTMLAttributeNameNode, Herb::Token, Herb::AST::HTMLAttributeValueNode) -> void def initialize: (String, Location, Array[Herb::Errors::Error], Herb::AST::HTMLAttributeNameNode, Herb::Token, Herb::AST::HTMLAttributeValueNode) -> void @@ -351,10 +410,13 @@ module Herb def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String end + # : type serialized_html_text_node = { + # | content: String?, + # | } class HTMLTextNode < Node include Colors - attr_reader content: String + attr_reader content: String? # : (String, Location, Array[Herb::Errors::Error], String) -> void def initialize: (String, Location, Array[Herb::Errors::Error], String) -> void @@ -378,14 +440,19 @@ module Herb def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String end + # : type serialized_html_comment_node = { + # | comment_start: Herb::Token?, + # | children: Array[Herb::AST::Node], + # | comment_end: Herb::Token?, + # | } class HTMLCommentNode < Node include Colors - attr_reader comment_start: Herb::Token + attr_reader comment_start: Herb::Token? attr_reader children: Array[Herb::AST::Node] - attr_reader comment_end: Herb::Token + attr_reader comment_end: Herb::Token? # : (String, Location, Array[Herb::Errors::Error], Herb::Token, Array[Herb::AST::Node], Herb::Token) -> void def initialize: (String, Location, Array[Herb::Errors::Error], Herb::Token, Array[Herb::AST::Node], Herb::Token) -> void @@ -409,14 +476,19 @@ module Herb def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String end + # : type serialized_html_doctype_node = { + # | tag_opening: Herb::Token?, + # | children: Array[Herb::AST::Node], + # | tag_closing: Herb::Token?, + # | } class HTMLDoctypeNode < Node include Colors - attr_reader tag_opening: Herb::Token + attr_reader tag_opening: Herb::Token? attr_reader children: Array[Herb::AST::Node] - attr_reader tag_closing: Herb::Token + attr_reader tag_closing: Herb::Token? # : (String, Location, Array[Herb::Errors::Error], Herb::Token, Array[Herb::AST::Node], Herb::Token) -> void def initialize: (String, Location, Array[Herb::Errors::Error], Herb::Token, Array[Herb::AST::Node], Herb::Token) -> void @@ -440,14 +512,19 @@ module Herb def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String end + # : type serialized_xml_declaration_node = { + # | tag_opening: Herb::Token?, + # | children: Array[Herb::AST::Node], + # | tag_closing: Herb::Token?, + # | } class XMLDeclarationNode < Node include Colors - attr_reader tag_opening: Herb::Token + attr_reader tag_opening: Herb::Token? attr_reader children: Array[Herb::AST::Node] - attr_reader tag_closing: Herb::Token + attr_reader tag_closing: Herb::Token? # : (String, Location, Array[Herb::Errors::Error], Herb::Token, Array[Herb::AST::Node], Herb::Token) -> void def initialize: (String, Location, Array[Herb::Errors::Error], Herb::Token, Array[Herb::AST::Node], Herb::Token) -> void @@ -471,14 +548,19 @@ module Herb def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String end + # : type serialized_cdata_node = { + # | tag_opening: Herb::Token?, + # | children: Array[Herb::AST::Node], + # | tag_closing: Herb::Token?, + # | } class CDATANode < Node include Colors - attr_reader tag_opening: Herb::Token + attr_reader tag_opening: Herb::Token? attr_reader children: Array[Herb::AST::Node] - attr_reader tag_closing: Herb::Token + attr_reader tag_closing: Herb::Token? # : (String, Location, Array[Herb::Errors::Error], Herb::Token, Array[Herb::AST::Node], Herb::Token) -> void def initialize: (String, Location, Array[Herb::Errors::Error], Herb::Token, Array[Herb::AST::Node], Herb::Token) -> void @@ -502,10 +584,13 @@ module Herb def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String end + # : type serialized_whitespace_node = { + # | value: Herb::Token?, + # | } class WhitespaceNode < Node include Colors - attr_reader value: Herb::Token + attr_reader value: Herb::Token? # : (String, Location, Array[Herb::Errors::Error], Herb::Token) -> void def initialize: (String, Location, Array[Herb::Errors::Error], Herb::Token) -> void @@ -529,14 +614,22 @@ module Herb def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String end + # : type serialized_erb_content_node = { + # | tag_opening: Herb::Token?, + # | content: Herb::Token?, + # | tag_closing: Herb::Token?, + # | analyzed_ruby: nil, + # | parsed: bool, + # | valid: bool, + # | } class ERBContentNode < Node include Colors - attr_reader tag_opening: Herb::Token + attr_reader tag_opening: Herb::Token? - attr_reader content: Herb::Token + attr_reader content: Herb::Token? - attr_reader tag_closing: Herb::Token + attr_reader tag_closing: Herb::Token? attr_reader analyzed_ruby: nil @@ -566,14 +659,19 @@ module Herb def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String end + # : type serialized_erb_end_node = { + # | tag_opening: Herb::Token?, + # | content: Herb::Token?, + # | tag_closing: Herb::Token?, + # | } class ERBEndNode < Node include Colors - attr_reader tag_opening: Herb::Token + attr_reader tag_opening: Herb::Token? - attr_reader content: Herb::Token + attr_reader content: Herb::Token? - attr_reader tag_closing: Herb::Token + attr_reader tag_closing: Herb::Token? # : (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token) -> void def initialize: (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token) -> void @@ -597,14 +695,20 @@ module Herb def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String end + # : type serialized_erb_else_node = { + # | tag_opening: Herb::Token?, + # | content: Herb::Token?, + # | tag_closing: Herb::Token?, + # | statements: Array[Herb::AST::Node], + # | } class ERBElseNode < Node include Colors - attr_reader tag_opening: Herb::Token + attr_reader tag_opening: Herb::Token? - attr_reader content: Herb::Token + attr_reader content: Herb::Token? - attr_reader tag_closing: Herb::Token + attr_reader tag_closing: Herb::Token? attr_reader statements: Array[Herb::AST::Node] @@ -630,22 +734,31 @@ module Herb def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String end + # : type serialized_erb_if_node = { + # | tag_opening: Herb::Token?, + # | content: Herb::Token?, + # | tag_closing: Herb::Token?, + # | then_keyword: Herb::Location?, + # | statements: Array[Herb::AST::Node], + # | subsequent: (Herb::AST::ERBIfNode | Herb::AST::ERBElseNode)?, + # | end_node: Herb::AST::ERBEndNode?, + # | } class ERBIfNode < Node include Colors - attr_reader tag_opening: Herb::Token + attr_reader tag_opening: Herb::Token? - attr_reader content: Herb::Token + attr_reader content: Herb::Token? - attr_reader tag_closing: Herb::Token + attr_reader tag_closing: Herb::Token? - attr_reader then_keyword: Herb::Location + attr_reader then_keyword: Herb::Location? attr_reader statements: Array[Herb::AST::Node] - attr_reader subsequent: Herb::AST::ERBIfNode | Herb::AST::ERBElseNode + attr_reader subsequent: (Herb::AST::ERBIfNode | Herb::AST::ERBElseNode)? - attr_reader end_node: Herb::AST::ERBEndNode + attr_reader end_node: Herb::AST::ERBEndNode? # : (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token, Herb::Location, Array[Herb::AST::Node], (Herb::AST::ERBIfNode | Herb::AST::ERBElseNode), Herb::AST::ERBEndNode) -> void def initialize: (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token, Herb::Location, Array[Herb::AST::Node], Herb::AST::ERBIfNode | Herb::AST::ERBElseNode, Herb::AST::ERBEndNode) -> void @@ -669,18 +782,25 @@ module Herb def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String end + # : type serialized_erb_block_node = { + # | tag_opening: Herb::Token?, + # | content: Herb::Token?, + # | tag_closing: Herb::Token?, + # | body: Array[Herb::AST::Node], + # | end_node: Herb::AST::ERBEndNode?, + # | } class ERBBlockNode < Node include Colors - attr_reader tag_opening: Herb::Token + attr_reader tag_opening: Herb::Token? - attr_reader content: Herb::Token + attr_reader content: Herb::Token? - attr_reader tag_closing: Herb::Token + attr_reader tag_closing: Herb::Token? attr_reader body: Array[Herb::AST::Node] - attr_reader end_node: Herb::AST::ERBEndNode + attr_reader end_node: Herb::AST::ERBEndNode? # : (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token, Array[Herb::AST::Node], Herb::AST::ERBEndNode) -> void def initialize: (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token, Array[Herb::AST::Node], Herb::AST::ERBEndNode) -> void @@ -704,16 +824,23 @@ module Herb def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String end + # : type serialized_erb_when_node = { + # | tag_opening: Herb::Token?, + # | content: Herb::Token?, + # | tag_closing: Herb::Token?, + # | then_keyword: Herb::Location?, + # | statements: Array[Herb::AST::Node], + # | } class ERBWhenNode < Node include Colors - attr_reader tag_opening: Herb::Token + attr_reader tag_opening: Herb::Token? - attr_reader content: Herb::Token + attr_reader content: Herb::Token? - attr_reader tag_closing: Herb::Token + attr_reader tag_closing: Herb::Token? - attr_reader then_keyword: Herb::Location + attr_reader then_keyword: Herb::Location? attr_reader statements: Array[Herb::AST::Node] @@ -739,22 +866,31 @@ module Herb def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String end + # : type serialized_erb_case_node = { + # | tag_opening: Herb::Token?, + # | content: Herb::Token?, + # | tag_closing: Herb::Token?, + # | children: Array[Herb::AST::Node], + # | conditions: Array[Herb::AST::ERBWhenNode], + # | else_clause: Herb::AST::ERBElseNode?, + # | end_node: Herb::AST::ERBEndNode?, + # | } class ERBCaseNode < Node include Colors - attr_reader tag_opening: Herb::Token + attr_reader tag_opening: Herb::Token? - attr_reader content: Herb::Token + attr_reader content: Herb::Token? - attr_reader tag_closing: Herb::Token + attr_reader tag_closing: Herb::Token? attr_reader children: Array[Herb::AST::Node] attr_reader conditions: Array[Herb::AST::ERBWhenNode] - attr_reader else_clause: Herb::AST::ERBElseNode + attr_reader else_clause: Herb::AST::ERBElseNode? - attr_reader end_node: Herb::AST::ERBEndNode + attr_reader end_node: Herb::AST::ERBEndNode? # : (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token, Array[Herb::AST::Node], Array[Herb::AST::ERBWhenNode], Herb::AST::ERBElseNode, Herb::AST::ERBEndNode) -> void def initialize: (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token, Array[Herb::AST::Node], Array[Herb::AST::ERBWhenNode], Herb::AST::ERBElseNode, Herb::AST::ERBEndNode) -> void @@ -778,22 +914,31 @@ module Herb def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String end + # : type serialized_erb_case_match_node = { + # | tag_opening: Herb::Token?, + # | content: Herb::Token?, + # | tag_closing: Herb::Token?, + # | children: Array[Herb::AST::Node], + # | conditions: Array[Herb::AST::ERBInNode], + # | else_clause: Herb::AST::ERBElseNode?, + # | end_node: Herb::AST::ERBEndNode?, + # | } class ERBCaseMatchNode < Node include Colors - attr_reader tag_opening: Herb::Token + attr_reader tag_opening: Herb::Token? - attr_reader content: Herb::Token + attr_reader content: Herb::Token? - attr_reader tag_closing: Herb::Token + attr_reader tag_closing: Herb::Token? attr_reader children: Array[Herb::AST::Node] attr_reader conditions: Array[Herb::AST::ERBInNode] - attr_reader else_clause: Herb::AST::ERBElseNode + attr_reader else_clause: Herb::AST::ERBElseNode? - attr_reader end_node: Herb::AST::ERBEndNode + attr_reader end_node: Herb::AST::ERBEndNode? # : (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token, Array[Herb::AST::Node], Array[Herb::AST::ERBInNode], Herb::AST::ERBElseNode, Herb::AST::ERBEndNode) -> void def initialize: (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token, Array[Herb::AST::Node], Array[Herb::AST::ERBInNode], Herb::AST::ERBElseNode, Herb::AST::ERBEndNode) -> void @@ -817,18 +962,25 @@ module Herb def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String end + # : type serialized_erb_while_node = { + # | tag_opening: Herb::Token?, + # | content: Herb::Token?, + # | tag_closing: Herb::Token?, + # | statements: Array[Herb::AST::Node], + # | end_node: Herb::AST::ERBEndNode?, + # | } class ERBWhileNode < Node include Colors - attr_reader tag_opening: Herb::Token + attr_reader tag_opening: Herb::Token? - attr_reader content: Herb::Token + attr_reader content: Herb::Token? - attr_reader tag_closing: Herb::Token + attr_reader tag_closing: Herb::Token? attr_reader statements: Array[Herb::AST::Node] - attr_reader end_node: Herb::AST::ERBEndNode + attr_reader end_node: Herb::AST::ERBEndNode? # : (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token, Array[Herb::AST::Node], Herb::AST::ERBEndNode) -> void def initialize: (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token, Array[Herb::AST::Node], Herb::AST::ERBEndNode) -> void @@ -852,18 +1004,25 @@ module Herb def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String end + # : type serialized_erb_until_node = { + # | tag_opening: Herb::Token?, + # | content: Herb::Token?, + # | tag_closing: Herb::Token?, + # | statements: Array[Herb::AST::Node], + # | end_node: Herb::AST::ERBEndNode?, + # | } class ERBUntilNode < Node include Colors - attr_reader tag_opening: Herb::Token + attr_reader tag_opening: Herb::Token? - attr_reader content: Herb::Token + attr_reader content: Herb::Token? - attr_reader tag_closing: Herb::Token + attr_reader tag_closing: Herb::Token? attr_reader statements: Array[Herb::AST::Node] - attr_reader end_node: Herb::AST::ERBEndNode + attr_reader end_node: Herb::AST::ERBEndNode? # : (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token, Array[Herb::AST::Node], Herb::AST::ERBEndNode) -> void def initialize: (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token, Array[Herb::AST::Node], Herb::AST::ERBEndNode) -> void @@ -887,18 +1046,25 @@ module Herb def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String end + # : type serialized_erb_for_node = { + # | tag_opening: Herb::Token?, + # | content: Herb::Token?, + # | tag_closing: Herb::Token?, + # | statements: Array[Herb::AST::Node], + # | end_node: Herb::AST::ERBEndNode?, + # | } class ERBForNode < Node include Colors - attr_reader tag_opening: Herb::Token + attr_reader tag_opening: Herb::Token? - attr_reader content: Herb::Token + attr_reader content: Herb::Token? - attr_reader tag_closing: Herb::Token + attr_reader tag_closing: Herb::Token? attr_reader statements: Array[Herb::AST::Node] - attr_reader end_node: Herb::AST::ERBEndNode + attr_reader end_node: Herb::AST::ERBEndNode? # : (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token, Array[Herb::AST::Node], Herb::AST::ERBEndNode) -> void def initialize: (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token, Array[Herb::AST::Node], Herb::AST::ERBEndNode) -> void @@ -922,18 +1088,25 @@ module Herb def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String end + # : type serialized_erb_rescue_node = { + # | tag_opening: Herb::Token?, + # | content: Herb::Token?, + # | tag_closing: Herb::Token?, + # | statements: Array[Herb::AST::Node], + # | subsequent: Herb::AST::ERBRescueNode?, + # | } class ERBRescueNode < Node include Colors - attr_reader tag_opening: Herb::Token + attr_reader tag_opening: Herb::Token? - attr_reader content: Herb::Token + attr_reader content: Herb::Token? - attr_reader tag_closing: Herb::Token + attr_reader tag_closing: Herb::Token? attr_reader statements: Array[Herb::AST::Node] - attr_reader subsequent: Herb::AST::ERBRescueNode + attr_reader subsequent: Herb::AST::ERBRescueNode? # : (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token, Array[Herb::AST::Node], Herb::AST::ERBRescueNode) -> void def initialize: (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token, Array[Herb::AST::Node], Herb::AST::ERBRescueNode) -> void @@ -957,14 +1130,20 @@ module Herb def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String end + # : type serialized_erb_ensure_node = { + # | tag_opening: Herb::Token?, + # | content: Herb::Token?, + # | tag_closing: Herb::Token?, + # | statements: Array[Herb::AST::Node], + # | } class ERBEnsureNode < Node include Colors - attr_reader tag_opening: Herb::Token + attr_reader tag_opening: Herb::Token? - attr_reader content: Herb::Token + attr_reader content: Herb::Token? - attr_reader tag_closing: Herb::Token + attr_reader tag_closing: Herb::Token? attr_reader statements: Array[Herb::AST::Node] @@ -990,24 +1169,34 @@ module Herb def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String end + # : type serialized_erb_begin_node = { + # | tag_opening: Herb::Token?, + # | content: Herb::Token?, + # | tag_closing: Herb::Token?, + # | statements: Array[Herb::AST::Node], + # | rescue_clause: Herb::AST::ERBRescueNode?, + # | else_clause: Herb::AST::ERBElseNode?, + # | ensure_clause: Herb::AST::ERBEnsureNode?, + # | end_node: Herb::AST::ERBEndNode?, + # | } class ERBBeginNode < Node include Colors - attr_reader tag_opening: Herb::Token + attr_reader tag_opening: Herb::Token? - attr_reader content: Herb::Token + attr_reader content: Herb::Token? - attr_reader tag_closing: Herb::Token + attr_reader tag_closing: Herb::Token? attr_reader statements: Array[Herb::AST::Node] - attr_reader rescue_clause: Herb::AST::ERBRescueNode + attr_reader rescue_clause: Herb::AST::ERBRescueNode? - attr_reader else_clause: Herb::AST::ERBElseNode + attr_reader else_clause: Herb::AST::ERBElseNode? - attr_reader ensure_clause: Herb::AST::ERBEnsureNode + attr_reader ensure_clause: Herb::AST::ERBEnsureNode? - attr_reader end_node: Herb::AST::ERBEndNode + attr_reader end_node: Herb::AST::ERBEndNode? # : (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token, Array[Herb::AST::Node], Herb::AST::ERBRescueNode, Herb::AST::ERBElseNode, Herb::AST::ERBEnsureNode, Herb::AST::ERBEndNode) -> void def initialize: (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token, Array[Herb::AST::Node], Herb::AST::ERBRescueNode, Herb::AST::ERBElseNode, Herb::AST::ERBEnsureNode, Herb::AST::ERBEndNode) -> void @@ -1031,22 +1220,31 @@ module Herb def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String end + # : type serialized_erb_unless_node = { + # | tag_opening: Herb::Token?, + # | content: Herb::Token?, + # | tag_closing: Herb::Token?, + # | then_keyword: Herb::Location?, + # | statements: Array[Herb::AST::Node], + # | else_clause: Herb::AST::ERBElseNode?, + # | end_node: Herb::AST::ERBEndNode?, + # | } class ERBUnlessNode < Node include Colors - attr_reader tag_opening: Herb::Token + attr_reader tag_opening: Herb::Token? - attr_reader content: Herb::Token + attr_reader content: Herb::Token? - attr_reader tag_closing: Herb::Token + attr_reader tag_closing: Herb::Token? - attr_reader then_keyword: Herb::Location + attr_reader then_keyword: Herb::Location? attr_reader statements: Array[Herb::AST::Node] - attr_reader else_clause: Herb::AST::ERBElseNode + attr_reader else_clause: Herb::AST::ERBElseNode? - attr_reader end_node: Herb::AST::ERBEndNode + attr_reader end_node: Herb::AST::ERBEndNode? # : (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token, Herb::Location, Array[Herb::AST::Node], Herb::AST::ERBElseNode, Herb::AST::ERBEndNode) -> void def initialize: (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token, Herb::Location, Array[Herb::AST::Node], Herb::AST::ERBElseNode, Herb::AST::ERBEndNode) -> void @@ -1070,14 +1268,19 @@ module Herb def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String end + # : type serialized_erb_yield_node = { + # | tag_opening: Herb::Token?, + # | content: Herb::Token?, + # | tag_closing: Herb::Token?, + # | } class ERBYieldNode < Node include Colors - attr_reader tag_opening: Herb::Token + attr_reader tag_opening: Herb::Token? - attr_reader content: Herb::Token + attr_reader content: Herb::Token? - attr_reader tag_closing: Herb::Token + attr_reader tag_closing: Herb::Token? # : (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token) -> void def initialize: (String, Location, Array[Herb::Errors::Error], Herb::Token, Herb::Token, Herb::Token) -> void @@ -1101,16 +1304,23 @@ module Herb def tree_inspect: (?indent: Integer, ?depth: Integer, ?depth_limit: Integer) -> String end + # : type serialized_erb_in_node = { + # | tag_opening: Herb::Token?, + # | content: Herb::Token?, + # | tag_closing: Herb::Token?, + # | then_keyword: Herb::Location?, + # | statements: Array[Herb::AST::Node], + # | } class ERBInNode < Node include Colors - attr_reader tag_opening: Herb::Token + attr_reader tag_opening: Herb::Token? - attr_reader content: Herb::Token + attr_reader content: Herb::Token? - attr_reader tag_closing: Herb::Token + attr_reader tag_closing: Herb::Token? - attr_reader then_keyword: Herb::Location + attr_reader then_keyword: Herb::Location? attr_reader statements: Array[Herb::AST::Node] diff --git a/sig/herb/errors.rbs b/sig/herb/errors.rbs index d10cae911..abb892758 100644 --- a/sig/herb/errors.rbs +++ b/sig/herb/errors.rbs @@ -1,16 +1,21 @@ # Generated from lib/herb/errors.rb with RBS::Inline module Herb + # : type serialized_error = { + # | type: String, + # | location: serialized_location?, + # | message: String + # | } module Errors class Error attr_reader type: String - attr_reader location: Location + attr_reader location: Location? attr_reader message: String - # : (String, Location, String) -> void - def initialize: (String, Location, String) -> void + # : (String, Location?, String) -> void + def initialize: (String, Location?, String) -> void # : () -> serialized_error def to_hash: () -> serialized_error @@ -31,14 +36,14 @@ module Herb class UnexpectedError < Error include Colors - attr_reader description: String + attr_reader description: String? - attr_reader expected: String + attr_reader expected: String? - attr_reader found: String + attr_reader found: String? - # : (String, Location, String, String, String, String) -> void - def initialize: (String, Location, String, String, String, String) -> void + # : (String, Location?, String, String, String, String) -> void + def initialize: (String, Location?, String, String, String, String) -> void # : () -> String def inspect: () -> String @@ -53,12 +58,12 @@ module Herb class UnexpectedTokenError < Error include Colors - attr_reader expected_type: String + attr_reader expected_type: String? - attr_reader found: Herb::Token + attr_reader found: Herb::Token? - # : (String, Location, String, String, Herb::Token) -> void - def initialize: (String, Location, String, String, Herb::Token) -> void + # : (String, Location?, String, String, Herb::Token) -> void + def initialize: (String, Location?, String, String, Herb::Token) -> void # : () -> String def inspect: () -> String @@ -73,10 +78,10 @@ module Herb class MissingOpeningTagError < Error include Colors - attr_reader closing_tag: Herb::Token + attr_reader closing_tag: Herb::Token? - # : (String, Location, String, Herb::Token) -> void - def initialize: (String, Location, String, Herb::Token) -> void + # : (String, Location?, String, Herb::Token) -> void + def initialize: (String, Location?, String, Herb::Token) -> void # : () -> String def inspect: () -> String @@ -91,10 +96,10 @@ module Herb class MissingClosingTagError < Error include Colors - attr_reader opening_tag: Herb::Token + attr_reader opening_tag: Herb::Token? - # : (String, Location, String, Herb::Token) -> void - def initialize: (String, Location, String, Herb::Token) -> void + # : (String, Location?, String, Herb::Token) -> void + def initialize: (String, Location?, String, Herb::Token) -> void # : () -> String def inspect: () -> String @@ -109,12 +114,12 @@ module Herb class TagNamesMismatchError < Error include Colors - attr_reader opening_tag: Herb::Token + attr_reader opening_tag: Herb::Token? - attr_reader closing_tag: Herb::Token + attr_reader closing_tag: Herb::Token? - # : (String, Location, String, Herb::Token, Herb::Token) -> void - def initialize: (String, Location, String, Herb::Token, Herb::Token) -> void + # : (String, Location?, String, Herb::Token, Herb::Token) -> void + def initialize: (String, Location?, String, Herb::Token, Herb::Token) -> void # : () -> String def inspect: () -> String @@ -129,14 +134,14 @@ module Herb class VoidElementClosingTagError < Error include Colors - attr_reader tag_name: Herb::Token + attr_reader tag_name: Herb::Token? - attr_reader expected: String + attr_reader expected: String? - attr_reader found: String + attr_reader found: String? - # : (String, Location, String, Herb::Token, String, String) -> void - def initialize: (String, Location, String, Herb::Token, String, String) -> void + # : (String, Location?, String, Herb::Token, String, String) -> void + def initialize: (String, Location?, String, Herb::Token, String, String) -> void # : () -> String def inspect: () -> String @@ -151,10 +156,10 @@ module Herb class UnclosedElementError < Error include Colors - attr_reader opening_tag: Herb::Token + attr_reader opening_tag: Herb::Token? - # : (String, Location, String, Herb::Token) -> void - def initialize: (String, Location, String, Herb::Token) -> void + # : (String, Location?, String, Herb::Token) -> void + def initialize: (String, Location?, String, Herb::Token) -> void # : () -> String def inspect: () -> String @@ -169,14 +174,14 @@ module Herb class RubyParseError < Error include Colors - attr_reader error_message: String + attr_reader error_message: String? - attr_reader diagnostic_id: String + attr_reader diagnostic_id: String? - attr_reader level: String + attr_reader level: String? - # : (String, Location, String, String, String, String) -> void - def initialize: (String, Location, String, String, String, String) -> void + # : (String, Location?, String, String, String, String) -> void + def initialize: (String, Location?, String, String, String, String) -> void # : () -> String def inspect: () -> String @@ -191,10 +196,10 @@ module Herb class ERBControlFlowScopeError < Error include Colors - attr_reader keyword: String + attr_reader keyword: String? - # : (String, Location, String, String) -> void - def initialize: (String, Location, String, String) -> void + # : (String, Location?, String, String) -> void + def initialize: (String, Location?, String, String) -> void # : () -> String def inspect: () -> String @@ -209,10 +214,10 @@ module Herb class MissingERBEndTagError < Error include Colors - attr_reader keyword: String + attr_reader keyword: String? - # : (String, Location, String, String) -> void - def initialize: (String, Location, String, String) -> void + # : (String, Location?, String, String) -> void + def initialize: (String, Location?, String, String) -> void # : () -> String def inspect: () -> String @@ -247,12 +252,12 @@ module Herb class ConditionalElementMultipleTagsError < Error include Colors - attr_reader line: Integer + attr_reader line: Integer? - attr_reader column: Integer + attr_reader column: Integer? - # : (String, Location, String, Integer, Integer) -> void - def initialize: (String, Location, String, Integer, Integer) -> void + # : (String, Location?, String, Integer, Integer) -> void + def initialize: (String, Location?, String, Integer, Integer) -> void # : () -> String def inspect: () -> String @@ -267,22 +272,22 @@ module Herb class ConditionalElementConditionMismatchError < Error include Colors - attr_reader tag_name: String + attr_reader tag_name: String? - attr_reader open_condition: String + attr_reader open_condition: String? - attr_reader open_line: Integer + attr_reader open_line: Integer? - attr_reader open_column: Integer + attr_reader open_column: Integer? - attr_reader close_condition: String + attr_reader close_condition: String? - attr_reader close_line: Integer + attr_reader close_line: Integer? - attr_reader close_column: Integer + attr_reader close_column: Integer? - # : (String, Location, String, String, String, Integer, Integer, String, Integer, Integer) -> void - def initialize: (String, Location, String, String, String, Integer, Integer, String, Integer, Integer) -> void + # : (String, Location?, String, String, String, Integer, Integer, String, Integer, Integer) -> void + def initialize: (String, Location?, String, String, String, Integer, Integer, String, Integer, Integer) -> void # : () -> String def inspect: () -> String @@ -297,10 +302,10 @@ module Herb class InvalidCommentClosingTagError < Error include Colors - attr_reader closing_tag: Herb::Token + attr_reader closing_tag: Herb::Token? - # : (String, Location, String, Herb::Token) -> void - def initialize: (String, Location, String, Herb::Token) -> void + # : (String, Location?, String, Herb::Token) -> void + def initialize: (String, Location?, String, Herb::Token) -> void # : () -> String def inspect: () -> String @@ -315,12 +320,12 @@ module Herb class OmittedClosingTagError < Error include Colors - attr_reader opening_tag: Herb::Token + attr_reader opening_tag: Herb::Token? - attr_reader insertion_point: Herb::Position + attr_reader insertion_point: Herb::Position? - # : (String, Location, String, Herb::Token, Herb::Position) -> void - def initialize: (String, Location, String, Herb::Token, Herb::Position) -> void + # : (String, Location?, String, Herb::Token, Herb::Position) -> void + def initialize: (String, Location?, String, Herb::Token, Herb::Position) -> void # : () -> String def inspect: () -> String @@ -335,10 +340,10 @@ module Herb class UnclosedOpenTagError < Error include Colors - attr_reader tag_name: Herb::Token + attr_reader tag_name: Herb::Token? - # : (String, Location, String, Herb::Token) -> void - def initialize: (String, Location, String, Herb::Token) -> void + # : (String, Location?, String, Herb::Token) -> void + def initialize: (String, Location?, String, Herb::Token) -> void # : () -> String def inspect: () -> String @@ -353,10 +358,10 @@ module Herb class UnclosedCloseTagError < Error include Colors - attr_reader tag_name: Herb::Token + attr_reader tag_name: Herb::Token? - # : (String, Location, String, Herb::Token) -> void - def initialize: (String, Location, String, Herb::Token) -> void + # : (String, Location?, String, Herb::Token) -> void + def initialize: (String, Location?, String, Herb::Token) -> void # : () -> String def inspect: () -> String @@ -371,10 +376,10 @@ module Herb class UnclosedQuoteError < Error include Colors - attr_reader opening_quote: Herb::Token + attr_reader opening_quote: Herb::Token? - # : (String, Location, String, Herb::Token) -> void - def initialize: (String, Location, String, Herb::Token) -> void + # : (String, Location?, String, Herb::Token) -> void + def initialize: (String, Location?, String, Herb::Token) -> void # : () -> String def inspect: () -> String @@ -389,10 +394,10 @@ module Herb class MissingAttributeValueError < Error include Colors - attr_reader attribute_name: String + attr_reader attribute_name: String? - # : (String, Location, String, String) -> void - def initialize: (String, Location, String, String) -> void + # : (String, Location?, String, String) -> void + def initialize: (String, Location?, String, String) -> void # : () -> String def inspect: () -> String @@ -407,10 +412,10 @@ module Herb class UnclosedERBTagError < Error include Colors - attr_reader opening_tag: Herb::Token + attr_reader opening_tag: Herb::Token? - # : (String, Location, String, Herb::Token) -> void - def initialize: (String, Location, String, Herb::Token) -> void + # : (String, Location?, String, Herb::Token) -> void + def initialize: (String, Location?, String, Herb::Token) -> void # : () -> String def inspect: () -> String @@ -435,14 +440,14 @@ module Herb class NestedERBTagError < Error include Colors - attr_reader opening_tag: Herb::Token + attr_reader opening_tag: Herb::Token? - attr_reader nested_tag_line: Integer + attr_reader nested_tag_line: Integer? - attr_reader nested_tag_column: Integer + attr_reader nested_tag_column: Integer? - # : (String, Location, String, Herb::Token, Integer, Integer) -> void - def initialize: (String, Location, String, Herb::Token, Integer, Integer) -> void + # : (String, Location?, String, Herb::Token, Integer, Integer) -> void + def initialize: (String, Location?, String, Herb::Token, Integer, Integer) -> void # : () -> String def inspect: () -> String diff --git a/sig/herb/location.rbs b/sig/herb/location.rbs index b10799f1d..71c2e3daa 100644 --- a/sig/herb/location.rbs +++ b/sig/herb/location.rbs @@ -1,6 +1,10 @@ # Generated from lib/herb/location.rb with RBS::Inline module Herb + # : type serialized_location = { + # | start: serialized_position, + # | end: serialized_position + # | } class Location attr_reader start: Position diff --git a/sig/herb/position.rbs b/sig/herb/position.rbs index cb0c33ee4..eeed348bb 100644 --- a/sig/herb/position.rbs +++ b/sig/herb/position.rbs @@ -1,6 +1,7 @@ # Generated from lib/herb/position.rb with RBS::Inline module Herb + # : type serialized_position = { line: Integer, column: Integer } class Position attr_reader line: Integer diff --git a/sig/herb/range.rbs b/sig/herb/range.rbs index 9b6d02947..76a251338 100644 --- a/sig/herb/range.rbs +++ b/sig/herb/range.rbs @@ -1,6 +1,7 @@ # Generated from lib/herb/range.rb with RBS::Inline module Herb + # : type serialized_range = [Integer, Integer] class Range attr_reader from: Integer diff --git a/sig/herb/token.rbs b/sig/herb/token.rbs index ea8d71937..26d57e4c9 100644 --- a/sig/herb/token.rbs +++ b/sig/herb/token.rbs @@ -1,6 +1,12 @@ # Generated from lib/herb/token.rb with RBS::Inline module Herb + # : type serialized_token = { + # | value: String, + # | range: serialized_range?, + # | location: serialized_location?, + # | type: String + # | } class Token include Colors diff --git a/sig/herb/visitor.rbs b/sig/herb/visitor.rbs index f3b50f371..6636bad70 100644 --- a/sig/herb/visitor.rbs +++ b/sig/herb/visitor.rbs @@ -4,11 +4,11 @@ module Herb class Visitor include AST::Helpers - # : (Herb::AST::Node) -> void - def visit: (Herb::AST::Node) -> void + # : (Herb::AST::Node?) -> void + def visit: (Herb::AST::Node?) -> void - # : (Array[Herb::AST::Node]) -> void - def visit_all: (Array[Herb::AST::Node]) -> void + # : (Array[Herb::AST::Node?]) -> void + def visit_all: (Array[Herb::AST::Node?]) -> void # : (Herb::AST::Node) -> void def visit_child_nodes: (Herb::AST::Node) -> void diff --git a/sig/herb/warnings.rbs b/sig/herb/warnings.rbs index 4da04d0eb..0c85d3f76 100644 --- a/sig/herb/warnings.rbs +++ b/sig/herb/warnings.rbs @@ -2,10 +2,15 @@ module Herb module Warnings + # : type serialized_warning = { + # | type: String, + # | location: serialized_location?, + # | message: String + # | } class Warning attr_reader type: String - attr_reader location: Location + attr_reader location: Location? attr_reader message: String diff --git a/sorbet/config b/sorbet/config index e76047cc3..a9538c8a0 100644 --- a/sorbet/config +++ b/sorbet/config @@ -1,6 +1,4 @@ ---dir -lib/ +--dir=lib/ +--dir=sorbet/rbi --ignore=/tmp/ --ignore=/vendor/bundle ---enable-experimental-rbs-signatures ---enable-experimental-rbs-assertions diff --git a/sorbet/rbi/prism.rbi b/sorbet/rbi/prism.rbi new file mode 100644 index 000000000..10eaa3aca --- /dev/null +++ b/sorbet/rbi/prism.rbi @@ -0,0 +1,9 @@ +# typed: true + +# Shim for Prism::LexCompat which was removed in newer versions +# but is still referenced in the vendored prism RBI files. +module Prism + module LexCompat + Result = Prism::LexResult + end +end diff --git a/templates/lib/herb/ast/nodes.rb.erb b/templates/lib/herb/ast/nodes.rb.erb index 719cbb1c2..d5a9e6d72 100644 --- a/templates/lib/herb/ast/nodes.rb.erb +++ b/templates/lib/herb/ast/nodes.rb.erb @@ -1,11 +1,18 @@ module Herb module AST <%- nodes.each do |node| -%> + #: type serialized_<%= node.human %> = { + <%- node.fields.each do |field| -%> + <%- is_nilable = !%w[Array[Herb::AST::Node] Array[Herb::AST::ERBWhenNode] Array[Herb::AST::ERBInNode] bool nil].include?(field.ruby_type) -%> + #| <%= field.name %>: <%= field.ruby_type %><%= if is_nilable then "?" end %>, + <%- end -%> + #| } class <%= node.name -%> < Node include Colors <%- node.fields.each do |field| -%> - attr_reader :<%= field.name %> #: <%= field.ruby_type %> + <%- is_nilable = !%w[Array[Herb::AST::Node] Array[Herb::AST::ERBWhenNode] Array[Herb::AST::ERBInNode] bool nil].include?(field.ruby_type) -%> + attr_reader :<%= field.name %> #: <%= field.ruby_type %><%= if is_nilable then "?" end %> <%- end -%> #: (<%= ["String", "Location", "Array[Herb::Errors::Error]", *node.fields.map(&:ruby_type)].join(", ") %>) -> void @@ -40,7 +47,7 @@ module Herb if field.is_a?(Herb::Template::NodeField) || field.is_a?(Herb::Template::BorrowedNodeField) field.name elsif field.is_a?(Herb::Template::ArrayField) && (field.specific_kind&.end_with?("Node") || field.union_kind&.all? { |k| k.end_with?("Node") }) - "*#{field.name}" + "*(#{field.name} || [])" else nil end diff --git a/templates/lib/herb/errors.rb.erb b/templates/lib/herb/errors.rb.erb index c8bac9b78..0b42122f7 100644 --- a/templates/lib/herb/errors.rb.erb +++ b/templates/lib/herb/errors.rb.erb @@ -1,5 +1,10 @@ -<%- base_arguments = [["type", "String"], ["location", "Location"], ["message", "String"]] -%> +<%- base_arguments = [["type", "String"], ["location", "Location?"], ["message", "String"]] -%> module Herb + #: type serialized_error = { + #| type: String, + #| location: serialized_location?, + #| message: String + #| } module Errors class Error <%- base_arguments.each do |argument, type| -%> @@ -49,7 +54,12 @@ module Herb <%- if error.fields.any? -%> <%- error.fields.each do |field| -%> - attr_reader :<%= field.name %> #: <%= field.ruby_type %> + #| <%= "#{field.name}: #{field.ruby_type}?," %> + <%- end -%> + #| } + + <%- error.fields.each do |field| -%> + attr_reader :<%= field.name %> #: <%= field.ruby_type %>? <%- end -%> #: (<%= [*base_arguments.map(&:last), *error.fields.map(&:ruby_type)].join(", ") %>) -> void @@ -81,7 +91,7 @@ module Herb def tree_inspect(indent: 0, depth: 0, depth_limit: 25) output = +"" - output += white("@ #{bold(red(error_name))} #{dimmed("(location: #{location.tree_inspect})\n")}") + output += white("@ #{bold(red(error_name))} #{dimmed("(location: #{location&.tree_inspect})\n")}") <%- symbol = error.fields.none? ? "└──" : "├──" -%> output += white("<%= symbol %> message: #{green(message.inspect)}\n") <%- error.fields.each do |field| -%> diff --git a/templates/lib/herb/visitor.rb.erb b/templates/lib/herb/visitor.rb.erb index 06bbe335a..e9e5d9ed5 100644 --- a/templates/lib/herb/visitor.rb.erb +++ b/templates/lib/herb/visitor.rb.erb @@ -2,12 +2,12 @@ module Herb class Visitor include AST::Helpers - #: (Herb::AST::Node) -> void + #: (Herb::AST::Node?) -> void def visit(node) node&.accept(self) end - #: (Array[Herb::AST::Node]) -> void + #: (Array[Herb::AST::Node?]) -> void def visit_all(nodes) nodes.each { |node| node&.accept(self) } end