From 2190b4437fbfbed0a52de96340c20f38507a7dac Mon Sep 17 00:00:00 2001 From: Miguel Date: Mon, 1 Sep 2025 13:55:52 +0200 Subject: [PATCH 1/3] Update Sorbet and start fixing sorbet errors --- lib/herb/position.rb | 7 +++++-- lib/herb/range.rb | 7 +++++-- sorbet/config | 5 +---- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/lib/herb/position.rb b/lib/herb/position.rb index f7131d151..1213b0355 100644 --- a/lib/herb/position.rb +++ b/lib/herb/position.rb @@ -2,9 +2,12 @@ # typed: true module Herb + #: type serialized_position = { line: Integer, column: Integer } class Position - attr_reader :line #: Integer - attr_reader :column #: Integer + #: Integer + attr_reader :line + #: Integer + attr_reader :column #: (Integer, Integer) -> void def initialize(line, column) diff --git a/lib/herb/range.rb b/lib/herb/range.rb index 7adb16c10..edd15a8e9 100644 --- a/lib/herb/range.rb +++ b/lib/herb/range.rb @@ -2,9 +2,12 @@ # typed: true module Herb + #: type serialized_range = [Integer, Integer] class Range - attr_reader :from #: Integer - attr_reader :to #: Integer + #: Integer + attr_reader :from + #: Integer + attr_reader :to #: (Integer, Integer) -> void def initialize(from, to) diff --git a/sorbet/config b/sorbet/config index e76047cc3..a215ea13d 100644 --- a/sorbet/config +++ b/sorbet/config @@ -1,6 +1,3 @@ ---dir -lib/ --ignore=/tmp/ --ignore=/vendor/bundle ---enable-experimental-rbs-signatures ---enable-experimental-rbs-assertions +--enable-experimental-rbs-comments From ca0eb72e66443c775ab30f403c71e5db0cf0fe0a Mon Sep 17 00:00:00 2001 From: Miguel Date: Mon, 22 Sep 2025 15:57:31 +0200 Subject: [PATCH 2/3] Update dynamic values --- .github/workflows/build.yml | 4 ++-- lib/herb/ast/helpers.rb | 6 +++--- lib/herb/ast/node.rb | 20 ++++++++++++++------ lib/herb/engine.rb | 1 + lib/herb/engine/debug_visitor.rb | 4 ++-- lib/herb/lex_result.rb | 4 +++- lib/herb/location.rb | 16 +++++++++++----- lib/herb/parse_result.rb | 1 + lib/herb/result.rb | 9 ++++++--- lib/herb/token.rb | 8 +++++++- lib/herb/warnings.rb | 14 +++++++++++--- sig/herb/ast/helpers.rbs | 2 +- sig/herb/token.rbs | 4 ++-- sorbet/config | 2 ++ templates/lib/herb/ast/nodes.rb.erb | 12 ++++++++++-- templates/lib/herb/errors.rb.erb | 18 +++++++++++++++--- templates/lib/herb/visitor.rb.erb | 4 ++-- 17 files changed, 93 insertions(+), 36 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 307ffd462..2ededbbef 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -59,8 +59,8 @@ jobs: - name: RBS Inline run: bundle exec rake rbs_inline - # - name: Sorbet - # run: bundle exec srb tc + - 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..c39f625d4 100644 --- a/lib/herb/ast/node.rb +++ b/lib/herb/ast/node.rb @@ -2,13 +2,21 @@ # 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 + attr_reader :type + #: Location + attr_reader :location + #: Array[Herb::Errors::Error] + attr_reader :errors + + #: (String, Location, ?Array[Herb::Errors::Error]) -> void def initialize(type, location, errors = []) @type = type @location = location @@ -19,7 +27,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..e7b0d15cc 100644 --- a/lib/herb/lex_result.rb +++ b/lib/herb/lex_result.rb @@ -1,8 +1,10 @@ # frozen_string_literal: true +# typed: true module Herb class LexResult < Result - attr_reader :value #: TokenList + #: TokenList + attr_reader :value #: (Array[Herb::Token], String, Array[Herb::Warnings::Warning], Array[Herb::Errors::Error]) -> void def initialize(value, source, warnings, errors) diff --git a/lib/herb/location.rb b/lib/herb/location.rb index 276ce61aa..1474adf57 100644 --- a/lib/herb/location.rb +++ b/lib/herb/location.rb @@ -2,9 +2,15 @@ # typed: true module Herb + #: type serialized_location = { + #| start: serialized_position, + #| end: serialized_position + #| } class Location - attr_reader :start #: Position - attr_reader :end #: Position + #: Position + attr_reader :start + #: Position + attr_reader :end #: (Position, Position) -> void def initialize(start_position, end_position) @@ -28,9 +34,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/result.rb b/lib/herb/result.rb index 9067e2843..1b0356b44 100644 --- a/lib/herb/result.rb +++ b/lib/herb/result.rb @@ -3,9 +3,12 @@ module Herb class Result - attr_reader :source #: String - attr_reader :warnings #: Array[Herb::Warnings::Warning] - attr_reader :errors #: Array[Herb::Errors::Error] + #: String + attr_reader :source + #: Array[Herb::Warnings::Warning] + attr_reader :warnings + #: Array[Herb::Errors::Error] + attr_reader :errors #: (String, Array[Herb::Warnings::Warning], Array[Herb::Errors::Error]) -> void def initialize(source, warnings, errors) 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..950effd54 100644 --- a/lib/herb/warnings.rb +++ b/lib/herb/warnings.rb @@ -3,10 +3,18 @@ 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 :message #: String + #: String + attr_reader :type + #: Location? + attr_reader :location + #: String + attr_reader :message #: (String, Location, String) -> void def initialize(type, location, message) diff --git a/sig/herb/ast/helpers.rbs b/sig/herb/ast/helpers.rbs index 0db42b8b6..03efb9642 100644 --- a/sig/herb/ast/helpers.rbs +++ b/sig/herb/ast/helpers.rbs @@ -3,7 +3,7 @@ module Herb module AST module Helpers - # : (Herb::AST::Node) -> bool + # : (Herb::AST::Node?) -> bool def erb_outputs?: (Herb::AST::Node) -> bool # : (String) -> bool diff --git a/sig/herb/token.rbs b/sig/herb/token.rbs index ea8d71937..59f580545 100644 --- a/sig/herb/token.rbs +++ b/sig/herb/token.rbs @@ -6,9 +6,9 @@ module Herb attr_reader value: String - attr_reader range: Range + attr_reader range: Range? - attr_reader location: Location + attr_reader location: Location? attr_reader type: String diff --git a/sorbet/config b/sorbet/config index a215ea13d..af3793756 100644 --- a/sorbet/config +++ b/sorbet/config @@ -1,3 +1,5 @@ +--dir +lib/ --ignore=/tmp/ --ignore=/vendor/bundle --enable-experimental-rbs-comments diff --git a/templates/lib/herb/ast/nodes.rb.erb b/templates/lib/herb/ast/nodes.rb.erb index 719cbb1c2..262ccd100 100644 --- a/templates/lib/herb/ast/nodes.rb.erb +++ b/templates/lib/herb/ast/nodes.rb.erb @@ -1,11 +1,19 @@ 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) -%> + #: <%= field.ruby_type %><%= if is_nilable then "?" end %> + attr_reader :<%= field.name %> <%- end -%> #: (<%= ["String", "Location", "Array[Herb::Errors::Error]", *node.fields.map(&:ruby_type)].join(", ") %>) -> void @@ -26,7 +34,7 @@ module Herb <%- node.fields.each do |field| -%> <%= field.name %>: <%= field.name %>, <%- end -%> - }) #: Herb::serialized_<%= node.human %> + }) end #: (Visitor) -> void diff --git a/templates/lib/herb/errors.rb.erb b/templates/lib/herb/errors.rb.erb index c8bac9b78..bdf227e18 100644 --- a/templates/lib/herb/errors.rb.erb +++ b/templates/lib/herb/errors.rb.erb @@ -1,9 +1,15 @@ -<%- 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| -%> - attr_reader :<%= argument %> #: <%= type %> + #: <%= type %> + attr_reader :<%= argument %> <%- end -%> #: (<%= base_arguments.map { |_argument, type| type }.join(", ") %>) -> void @@ -49,7 +55,13 @@ 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| -%> + #: <%= field.ruby_type %>? + attr_reader :<%= field.name %> <%- end -%> #: (<%= [*base_arguments.map(&:last), *error.fields.map(&:ruby_type)].join(", ") %>) -> void 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 From 105b4824fa920e08024db4106669d8861066537a Mon Sep 17 00:00:00 2001 From: Marco Roth Date: Sat, 28 Feb 2026 17:04:11 +0100 Subject: [PATCH 3/3] Drop `--enable-experimental-rbs-comments` and let sorbet rely on `.rbs` files --- .github/workflows/build.yml | 6 +- lib/herb/ast/node.rb | 9 +- lib/herb/lex_result.rb | 3 +- lib/herb/location.rb | 6 +- lib/herb/position.rb | 6 +- lib/herb/range.rb | 6 +- lib/herb/result.rb | 9 +- lib/herb/warnings.rb | 9 +- sig/herb/ast/helpers.rbs | 2 +- sig/herb/ast/node.rbs | 9 +- sig/herb/ast/nodes.rbs | 430 +++++++++++++++++++++------- sig/herb/errors.rbs | 167 +++++------ sig/herb/location.rbs | 4 + sig/herb/position.rbs | 1 + sig/herb/range.rbs | 1 + sig/herb/token.rbs | 10 +- sig/herb/visitor.rbs | 8 +- sig/herb/warnings.rbs | 7 +- sorbet/config | 5 +- sorbet/rbi/prism.rbi | 9 + templates/lib/herb/ast/nodes.rb.erb | 7 +- templates/lib/herb/errors.rb.erb | 8 +- 22 files changed, 474 insertions(+), 248 deletions(-) create mode 100644 sorbet/rbi/prism.rbi diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2ededbbef..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: RBS Inline - run: bundle exec rake rbs_inline - - name: Sorbet run: bundle exec srb tc + - name: RBS Inline + run: bundle exec rake rbs_inline + - name: clang-tidy version run: clang-tidy-21 --version diff --git a/lib/herb/ast/node.rb b/lib/herb/ast/node.rb index c39f625d4..78aa4b99b 100644 --- a/lib/herb/ast/node.rb +++ b/lib/herb/ast/node.rb @@ -9,12 +9,9 @@ module Herb #| } module AST class Node - #: String - attr_reader :type - #: Location - attr_reader :location - #: Array[Herb::Errors::Error] - attr_reader :errors + attr_reader :type #: String + attr_reader :location #: Location + attr_reader :errors #: Array[Herb::Errors::Error] #: (String, Location, ?Array[Herb::Errors::Error]) -> void def initialize(type, location, errors = []) diff --git a/lib/herb/lex_result.rb b/lib/herb/lex_result.rb index e7b0d15cc..58a691900 100644 --- a/lib/herb/lex_result.rb +++ b/lib/herb/lex_result.rb @@ -3,8 +3,7 @@ module Herb class LexResult < Result - #: TokenList - attr_reader :value + attr_reader :value #: TokenList #: (Array[Herb::Token], String, Array[Herb::Warnings::Warning], Array[Herb::Errors::Error]) -> void def initialize(value, source, warnings, errors) diff --git a/lib/herb/location.rb b/lib/herb/location.rb index 1474adf57..f74688a31 100644 --- a/lib/herb/location.rb +++ b/lib/herb/location.rb @@ -7,10 +7,8 @@ module Herb #| end: serialized_position #| } class Location - #: Position - attr_reader :start - #: Position - attr_reader :end + attr_reader :start #: Position + attr_reader :end #: Position #: (Position, Position) -> void def initialize(start_position, end_position) diff --git a/lib/herb/position.rb b/lib/herb/position.rb index 1213b0355..a6d7404b3 100644 --- a/lib/herb/position.rb +++ b/lib/herb/position.rb @@ -4,10 +4,8 @@ module Herb #: type serialized_position = { line: Integer, column: Integer } class Position - #: Integer - attr_reader :line - #: Integer - attr_reader :column + attr_reader :line #: Integer + attr_reader :column #: Integer #: (Integer, Integer) -> void def initialize(line, column) diff --git a/lib/herb/range.rb b/lib/herb/range.rb index edd15a8e9..749d36a89 100644 --- a/lib/herb/range.rb +++ b/lib/herb/range.rb @@ -4,10 +4,8 @@ module Herb #: type serialized_range = [Integer, Integer] class Range - #: Integer - attr_reader :from - #: Integer - attr_reader :to + attr_reader :from #: Integer + attr_reader :to #: Integer #: (Integer, Integer) -> void def initialize(from, to) diff --git a/lib/herb/result.rb b/lib/herb/result.rb index 1b0356b44..9067e2843 100644 --- a/lib/herb/result.rb +++ b/lib/herb/result.rb @@ -3,12 +3,9 @@ module Herb class Result - #: String - attr_reader :source - #: Array[Herb::Warnings::Warning] - attr_reader :warnings - #: Array[Herb::Errors::Error] - attr_reader :errors + attr_reader :source #: String + attr_reader :warnings #: Array[Herb::Warnings::Warning] + attr_reader :errors #: Array[Herb::Errors::Error] #: (String, Array[Herb::Warnings::Warning], Array[Herb::Errors::Error]) -> void def initialize(source, warnings, errors) diff --git a/lib/herb/warnings.rb b/lib/herb/warnings.rb index 950effd54..565f4848e 100644 --- a/lib/herb/warnings.rb +++ b/lib/herb/warnings.rb @@ -9,12 +9,9 @@ module Warnings #| message: String #| } class Warning - #: String - attr_reader :type - #: Location? - attr_reader :location - #: String - attr_reader :message + attr_reader :type #: String + attr_reader :location #: Location? + attr_reader :message #: String #: (String, Location, String) -> void def initialize(type, location, message) diff --git a/sig/herb/ast/helpers.rbs b/sig/herb/ast/helpers.rbs index 03efb9642..a5ba41e11 100644 --- a/sig/herb/ast/helpers.rbs +++ b/sig/herb/ast/helpers.rbs @@ -4,7 +4,7 @@ module Herb module AST module Helpers # : (Herb::AST::Node?) -> bool - def erb_outputs?: (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 59f580545..26d57e4c9 100644 --- a/sig/herb/token.rbs +++ b/sig/herb/token.rbs @@ -1,14 +1,20 @@ # 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 attr_reader value: String - attr_reader range: Range? + attr_reader range: Range - attr_reader location: Location? + attr_reader location: Location attr_reader type: String 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 af3793756..a9538c8a0 100644 --- a/sorbet/config +++ b/sorbet/config @@ -1,5 +1,4 @@ ---dir -lib/ +--dir=lib/ +--dir=sorbet/rbi --ignore=/tmp/ --ignore=/vendor/bundle ---enable-experimental-rbs-comments 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 262ccd100..d5a9e6d72 100644 --- a/templates/lib/herb/ast/nodes.rb.erb +++ b/templates/lib/herb/ast/nodes.rb.erb @@ -12,8 +12,7 @@ module Herb <%- 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.ruby_type %><%= if is_nilable then "?" end %> - attr_reader :<%= field.name %> + 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 @@ -34,7 +33,7 @@ module Herb <%- node.fields.each do |field| -%> <%= field.name %>: <%= field.name %>, <%- end -%> - }) + }) #: Herb::serialized_<%= node.human %> end #: (Visitor) -> void @@ -48,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 bdf227e18..0b42122f7 100644 --- a/templates/lib/herb/errors.rb.erb +++ b/templates/lib/herb/errors.rb.erb @@ -8,8 +8,7 @@ module Herb module Errors class Error <%- base_arguments.each do |argument, type| -%> - #: <%= type %> - attr_reader :<%= argument %> + attr_reader :<%= argument %> #: <%= type %> <%- end -%> #: (<%= base_arguments.map { |_argument, type| type }.join(", ") %>) -> void @@ -60,8 +59,7 @@ module Herb #| } <%- error.fields.each do |field| -%> - #: <%= field.ruby_type %>? - attr_reader :<%= field.name %> + attr_reader :<%= field.name %> #: <%= field.ruby_type %>? <%- end -%> #: (<%= [*base_arguments.map(&:last), *error.fields.map(&:ruby_type)].join(", ") %>) -> void @@ -93,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| -%>