1- # typed: true # rubocop:todo Sorbet/StrictSigil
1+ # typed: strict
22# frozen_string_literal: true
33
44require "forwardable"
@@ -17,9 +17,10 @@ class StanzaGrouping < Base
1717 MISSING_LINE_MSG = "stanza groups should be separated by a single empty line"
1818 EXTRA_LINE_MSG = "stanzas within the same group should have no lines between them"
1919
20+ sig { override . params ( cask_block : RuboCop ::Cask ::AST ::CaskBlock ) . void }
2021 def on_cask ( cask_block )
21- @cask_block = cask_block
22- @line_ops = { }
22+ @cask_block = T . let ( cask_block , T . nilable ( RuboCop :: Cask :: AST :: CaskBlock ) )
23+ @line_ops = T . let ( { } , T . nilable ( T :: Hash [ Integer , Symbol ] ) )
2324 cask_stanzas = cask_block . toplevel_stanzas
2425 add_offenses ( cask_stanzas )
2526
@@ -33,13 +34,15 @@ def on_cask(cask_block)
3334
3435 private
3536
36- attr_reader :cask_block , :line_ops
37+ sig { returns ( T . nilable ( RuboCop ::Cask ::AST ::CaskBlock ) ) }
38+ attr_reader :cask_block
3739
3840 def_delegators :cask_block , :cask_node , :toplevel_stanzas
3941
42+ sig { params ( stanzas : T ::Array [ RuboCop ::Cask ::AST ::Stanza ] ) . void }
4043 def add_offenses ( stanzas )
4144 stanzas . each_cons ( 2 ) do |stanza , next_stanza |
42- next unless next_stanza
45+ next if ! stanza || ! next_stanza
4346
4447 if missing_line_after? ( stanza , next_stanza )
4548 add_offense_missing_line ( stanza )
@@ -49,28 +52,39 @@ def add_offenses(stanzas)
4952 end
5053 end
5154
55+ sig { returns ( T ::Hash [ Integer , Symbol ] ) }
56+ def line_ops
57+ @line_ops || raise ( "Call to line_ops before it has been initialized" )
58+ end
59+
60+ sig { params ( stanza : RuboCop ::Cask ::AST ::Stanza , next_stanza : RuboCop ::Cask ::AST ::Stanza ) . returns ( T ::Boolean ) }
5261 def missing_line_after? ( stanza , next_stanza )
5362 !( stanza . same_group? ( next_stanza ) ||
5463 empty_line_after? ( stanza ) )
5564 end
5665
66+ sig { params ( stanza : RuboCop ::Cask ::AST ::Stanza , next_stanza : RuboCop ::Cask ::AST ::Stanza ) . returns ( T ::Boolean ) }
5767 def extra_line_after? ( stanza , next_stanza )
5868 stanza . same_group? ( next_stanza ) &&
5969 empty_line_after? ( stanza )
6070 end
6171
72+ sig { params ( stanza : RuboCop ::Cask ::AST ::Stanza ) . returns ( T ::Boolean ) }
6273 def empty_line_after? ( stanza )
6374 source_line_after ( stanza ) . empty?
6475 end
6576
77+ sig { params ( stanza : RuboCop ::Cask ::AST ::Stanza ) . returns ( String ) }
6678 def source_line_after ( stanza )
6779 processed_source [ index_of_line_after ( stanza ) ]
6880 end
6981
82+ sig { params ( stanza : RuboCop ::Cask ::AST ::Stanza ) . returns ( Integer ) }
7083 def index_of_line_after ( stanza )
7184 stanza . source_range . last_line
7285 end
7386
87+ sig { params ( stanza : RuboCop ::Cask ::AST ::Stanza ) . void }
7488 def add_offense_missing_line ( stanza )
7589 line_index = index_of_line_after ( stanza )
7690 line_ops [ line_index ] = :insert
@@ -79,6 +93,7 @@ def add_offense_missing_line(stanza)
7993 end
8094 end
8195
96+ sig { params ( stanza : RuboCop ::Cask ::AST ::Stanza ) . void }
8297 def add_offense_extra_line ( stanza )
8398 line_index = index_of_line_after ( stanza )
8499 line_ops [ line_index ] = :remove
@@ -87,11 +102,14 @@ def add_offense_extra_line(stanza)
87102 end
88103 end
89104
90- def add_offense ( line_index , message :)
105+ sig { params ( line_index : Integer , message : String , block : T . proc . params ( corrector : RuboCop ::Cop ::Corrector ) . void ) . void }
106+ def add_offense ( line_index , message :, &block )
91107 line_length = [ processed_source [ line_index ] . size , 1 ] . max
92- @range = source_range ( processed_source . buffer , line_index + 1 , 0 ,
93- line_length )
94- super ( @range , message :)
108+ @range = T . let (
109+ source_range ( processed_source . buffer , line_index + 1 , 0 , line_length ) ,
110+ T . nilable ( Parser ::Source ::Range ) ,
111+ )
112+ super ( @range , message :, &block )
95113 end
96114 end
97115 end
0 commit comments