diff --git a/Library/Homebrew/rubocops/cask/ast/cask_block.rb b/Library/Homebrew/rubocops/cask/ast/cask_block.rb index 943c09185a..8925ad4686 100644 --- a/Library/Homebrew/rubocops/cask/ast/cask_block.rb +++ b/Library/Homebrew/rubocops/cask/ast/cask_block.rb @@ -1,4 +1,4 @@ -# typed: true # rubocop:todo Sorbet/StrictSigil +# typed: strict # frozen_string_literal: true require "forwardable" @@ -33,10 +33,13 @@ module RuboCop ->(node) { node.parent == block_node } end - @stanzas ||= block_body.each_node - .select(&:stanza?) - .select(&is_stanza) - .map { |node| Stanza.new(node, comments) } + @stanzas ||= T.let( + block_body.each_node + .select(&:stanza?) + .select(&is_stanza) + .map { |node| Stanza.new(node, comments) }, + T.nilable(T::Array[Stanza]), + ) end end @@ -46,17 +49,20 @@ module RuboCop class CaskBlock < StanzaBlock extend Forwardable + sig { returns(RuboCop::AST::BlockNode) } def cask_node block_node end def_delegator :cask_node, :block_body, :cask_body + sig { returns(CaskHeader) } def header - @header ||= CaskHeader.new(block_node.method_node) + @header ||= T.let(CaskHeader.new(block_node.method_node), T.nilable(CaskHeader)) end # TODO: Use `StanzaBlock#stanzas` for all cops, where possible. + sig { returns(T::Array[Stanza]) } def stanzas return [] unless cask_body @@ -65,6 +71,7 @@ module RuboCop .map { |node| Stanza.new(node, comments) } end + sig { returns(T::Array[Stanza]) } def toplevel_stanzas # If a `cask` block only contains one stanza, it is that stanza's direct parent, # otherwise stanzas are grouped in a block and `cask` is that block's parent. @@ -74,7 +81,7 @@ module RuboCop ->(stanza) { stanza.parent_node.cask_block? } end - @toplevel_stanzas ||= stanzas.select(&is_toplevel_stanza) + @toplevel_stanzas ||= T.let(stanzas.select(&is_toplevel_stanza), T.nilable(T::Array[Stanza])) end end end diff --git a/Library/Homebrew/rubocops/cask/desc.rb b/Library/Homebrew/rubocops/cask/desc.rb index 64149fc0eb..b032485d5c 100644 --- a/Library/Homebrew/rubocops/cask/desc.rb +++ b/Library/Homebrew/rubocops/cask/desc.rb @@ -1,4 +1,4 @@ -# typed: true # rubocop:todo Sorbet/StrictSigil +# typed: strict # frozen_string_literal: true require "rubocops/cask/mixin/on_desc_stanza" @@ -14,8 +14,9 @@ module RuboCop include DescHelper extend AutoCorrector + sig { params(stanza: RuboCop::Cask::AST::Stanza).void } def on_desc_stanza(stanza) - @name = cask_block.header.cask_token + @name = T.let(cask_block.header.cask_token, T.nilable(String)) desc_call = stanza.stanza_node audit_desc(:cask, @name, desc_call) end diff --git a/Library/Homebrew/rubocops/cask/homepage_url_styling.rb b/Library/Homebrew/rubocops/cask/homepage_url_styling.rb index 98820f5c73..efb82b7b94 100644 --- a/Library/Homebrew/rubocops/cask/homepage_url_styling.rb +++ b/Library/Homebrew/rubocops/cask/homepage_url_styling.rb @@ -1,4 +1,4 @@ -# typed: true # rubocop:todo Sorbet/StrictSigil +# typed: strict # frozen_string_literal: true require "forwardable" @@ -17,8 +17,9 @@ module RuboCop MSG_NO_SLASH = "'%s' must have a slash after the domain." + sig { params(stanza: RuboCop::Cask::AST::Stanza).void } def on_homepage_stanza(stanza) - @name = cask_block.header.cask_token + @name = T.let(cask_block.header.cask_token, T.nilable(String)) desc_call = stanza.stanza_node url_node = desc_call.first_argument diff --git a/Library/Homebrew/rubocops/cask/mixin/on_url_stanza.rb b/Library/Homebrew/rubocops/cask/mixin/on_url_stanza.rb index ad2223644b..26e2b3b30d 100644 --- a/Library/Homebrew/rubocops/cask/mixin/on_url_stanza.rb +++ b/Library/Homebrew/rubocops/cask/mixin/on_url_stanza.rb @@ -1,4 +1,4 @@ -# typed: true # rubocop:todo Sorbet/StrictSigil +# typed: strict # frozen_string_literal: true module RuboCop @@ -9,8 +9,9 @@ module RuboCop extend Forwardable include CaskHelp + sig { override.params(cask_block: T.nilable(RuboCop::Cask::AST::CaskBlock)).void } def on_cask(cask_block) - @cask_block = cask_block + @cask_block = T.let(cask_block, T.nilable(RuboCop::Cask::AST::CaskBlock)) toplevel_stanzas.select(&:url?).each do |stanza| on_url_stanza(stanza) @@ -19,6 +20,7 @@ module RuboCop private + sig { returns(T.nilable(RuboCop::Cask::AST::CaskBlock)) } attr_reader :cask_block def_delegators :cask_block, diff --git a/Library/Homebrew/rubocops/cask/no_overrides.rb b/Library/Homebrew/rubocops/cask/no_overrides.rb index 382de67878..6f313f41ed 100644 --- a/Library/Homebrew/rubocops/cask/no_overrides.rb +++ b/Library/Homebrew/rubocops/cask/no_overrides.rb @@ -1,4 +1,4 @@ -# typed: true # rubocop:todo Sorbet/StrictSigil +# typed: strict # frozen_string_literal: true module RuboCop @@ -17,6 +17,7 @@ module RuboCop "Add it to an `on_{system}` block instead. " \ "Use `:or_older` or `:or_newer` to specify a range of macOS versions." + sig { override.params(cask_block: RuboCop::Cask::AST::CaskBlock).void } def on_cask(cask_block) cask_stanzas = cask_block.toplevel_stanzas @@ -34,8 +35,9 @@ module RuboCop end end + sig { params(on_system: T::Array[RuboCop::Cask::AST::Stanza]).returns(T::Set[Symbol]) } def on_system_stanzas(on_system) - names = Set.new + names = T.let(Set.new, T::Set[Symbol]) method_nodes = on_system.map(&:method_node) method_nodes.select(&:block_type?).each do |node| node.child_nodes.each do |child| @@ -56,14 +58,17 @@ module RuboCop names end + sig { params(node: RuboCop::AST::Node).returns(T::Boolean) } def inside_livecheck_defined?(node) single_stanza_livecheck_defined?(node) || multi_stanza_livecheck_defined?(node) end + sig { params(node: RuboCop::AST::Node).returns(T::Boolean) } def single_stanza_livecheck_defined?(node) node.parent.block_type? && node.parent.method_name == :livecheck end + sig { params(node: RuboCop::AST::Node).returns(T::Boolean) } def multi_stanza_livecheck_defined?(node) grandparent_node = node.parent.parent node.parent.begin_type? && grandparent_node.block_type? && grandparent_node.method_name == :livecheck diff --git a/Library/Homebrew/rubocops/cask/on_system_conditionals.rb b/Library/Homebrew/rubocops/cask/on_system_conditionals.rb index eab312a8b5..5b52af327e 100644 --- a/Library/Homebrew/rubocops/cask/on_system_conditionals.rb +++ b/Library/Homebrew/rubocops/cask/on_system_conditionals.rb @@ -1,4 +1,4 @@ -# typed: true # rubocop:todo Sorbet/StrictSigil +# typed: strict # frozen_string_literal: true require "forwardable" @@ -34,8 +34,9 @@ module RuboCop FLIGHT_STANZA_NAMES = [:preflight, :postflight, :uninstall_preflight, :uninstall_postflight].freeze + sig { override.params(cask_block: RuboCop::Cask::AST::CaskBlock).void } def on_cask(cask_block) - @cask_block = cask_block + @cask_block = T.let(cask_block, T.nilable(RuboCop::Cask::AST::CaskBlock)) toplevel_stanzas.each do |stanza| next unless FLIGHT_STANZA_NAMES.include? stanza.stanza_name @@ -50,10 +51,12 @@ module RuboCop private + sig { returns(T.nilable(RuboCop::Cask::AST::CaskBlock)) } attr_reader :cask_block def_delegators :cask_block, :toplevel_stanzas, :cask_body + sig { void } def simplify_sha256_stanzas nodes = {} diff --git a/Library/Homebrew/rubocops/cask/url_legacy_comma_separators.rb b/Library/Homebrew/rubocops/cask/url_legacy_comma_separators.rb index 3111361a50..e0afa1626f 100644 --- a/Library/Homebrew/rubocops/cask/url_legacy_comma_separators.rb +++ b/Library/Homebrew/rubocops/cask/url_legacy_comma_separators.rb @@ -1,4 +1,4 @@ -# typed: true # rubocop:todo Sorbet/StrictSigil +# typed: strict # frozen_string_literal: true module RuboCop @@ -12,6 +12,7 @@ module RuboCop MSG_CSV = "Use `version.csv.first` instead of `version.before_comma` " \ "and `version.csv.second` instead of `version.after_comma`." + sig { override.params(stanza: RuboCop::Cask::AST::Stanza).void } def on_url_stanza(stanza) return if stanza.stanza_node.type == :block diff --git a/Library/Homebrew/rubocops/install_bundler_gems.rb b/Library/Homebrew/rubocops/install_bundler_gems.rb index f10bf15f9d..e5f3948034 100644 --- a/Library/Homebrew/rubocops/install_bundler_gems.rb +++ b/Library/Homebrew/rubocops/install_bundler_gems.rb @@ -1,4 +1,4 @@ -# typed: true # rubocop:todo Sorbet/StrictSigil +# typed: strict # frozen_string_literal: true module RuboCop @@ -9,6 +9,7 @@ module RuboCop MSG = "Only use `Homebrew.install_bundler_gems!` in dev-cmd." RESTRICT_ON_SEND = [:install_bundler_gems!].freeze + sig { params(node: RuboCop::AST::Node).void } def on_send(node) file_path = processed_source.file_path return if file_path.match?(%r{/(dev-cmd/.+|standalone/init|startup/bootsnap)\.rb\z}) diff --git a/Library/Homebrew/rubocops/no_fileutils_rmrf.rb b/Library/Homebrew/rubocops/no_fileutils_rmrf.rb index 7ddf6ca5ee..75aad1bb2e 100644 --- a/Library/Homebrew/rubocops/no_fileutils_rmrf.rb +++ b/Library/Homebrew/rubocops/no_fileutils_rmrf.rb @@ -1,4 +1,4 @@ -# typed: true # rubocop:todo Sorbet/StrictSigil +# typed: strict # frozen_string_literal: true module RuboCop @@ -30,6 +30,7 @@ module RuboCop (send !nil? :rmtree ...) PATTERN + sig { params(node: RuboCop::AST::SendNode).void } def on_send(node) return if neither_rm_rf_nor_rmtree?(node) @@ -51,6 +52,7 @@ module RuboCop end end + sig { params(node: RuboCop::AST::SendNode).returns(T::Boolean) } def neither_rm_rf_nor_rmtree?(node) !any_receiver_rm_r_f?(node) && !no_receiver_rm_r_f?(node) && !any_receiver_rmtree?(node) && !no_receiver_rmtree?(node)