From 6c93f6fe914472ac5bfc54528f6b9679f103aa79 Mon Sep 17 00:00:00 2001 From: Douglas Eichelberger Date: Tue, 14 Feb 2023 19:19:37 -0800 Subject: [PATCH] Enable typing in rubocops --- Library/Homebrew/rubocops/cask/extend/node.rb | 10 ++++++---- Library/Homebrew/rubocops/cask/mixin/cask_help.rb | 9 ++++++++- Library/Homebrew/rubocops/cask/mixin/cask_help.rbi | 5 +++++ .../Homebrew/rubocops/cask/mixin/on_desc_stanza.rb | 2 +- .../Homebrew/rubocops/cask/mixin/on_desc_stanza.rbi | 5 +++++ .../rubocops/cask/mixin/on_homepage_stanza.rb | 2 +- .../rubocops/cask/mixin/on_homepage_stanza.rbi | 5 +++++ .../Homebrew/rubocops/cask/mixin/on_url_stanza.rb | 2 +- .../Homebrew/rubocops/cask/mixin/on_url_stanza.rbi | 5 +++++ Library/Homebrew/rubocops/components_order.rb | 10 +++++----- Library/Homebrew/rubocops/dependency_order.rb | 13 ++++++++----- Library/Homebrew/rubocops/extend/formula.rb | 6 +++++- Library/Homebrew/rubocops/lines.rb | 4 ++-- Library/Homebrew/rubocops/platform.rb | 2 +- Library/Homebrew/rubocops/shared/desc_helper.rb | 6 ++++-- Library/Homebrew/rubocops/shared/desc_helper.rbi | 5 +++++ .../Homebrew/rubocops/shared/helper_functions.rb | 8 +++++--- .../Homebrew/rubocops/shared/helper_functions.rbi | 6 ++++++ .../shared/on_system_conditionals_helper.rb | 4 ++-- Library/Homebrew/rubocops/text.rb | 6 +++--- Library/Homebrew/rubocops/urls.rb | 6 +++--- Library/Homebrew/sorbet/config | 12 ++++-------- 22 files changed, 90 insertions(+), 43 deletions(-) create mode 100644 Library/Homebrew/rubocops/cask/mixin/cask_help.rbi create mode 100644 Library/Homebrew/rubocops/cask/mixin/on_desc_stanza.rbi create mode 100644 Library/Homebrew/rubocops/cask/mixin/on_homepage_stanza.rbi create mode 100644 Library/Homebrew/rubocops/cask/mixin/on_url_stanza.rbi create mode 100644 Library/Homebrew/rubocops/shared/desc_helper.rbi create mode 100644 Library/Homebrew/rubocops/shared/helper_functions.rbi diff --git a/Library/Homebrew/rubocops/cask/extend/node.rb b/Library/Homebrew/rubocops/cask/extend/node.rb index 50e93a5743..20e1e4b7cc 100644 --- a/Library/Homebrew/rubocops/cask/extend/node.rb +++ b/Library/Homebrew/rubocops/cask/extend/node.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true module RuboCop @@ -19,10 +19,12 @@ module RuboCop def stanza? return true if arch_variable? - return false if !send_type? && !block_type? - return true if ON_SYSTEM_METHODS.include?(method_name) - STANZA_ORDER.include?(method_name) + case self + when RuboCop::AST::BlockNode, RuboCop::AST::SendNode + ON_SYSTEM_METHODS.include?(method_name) || STANZA_ORDER.include?(method_name) + else false + end end def heredoc? diff --git a/Library/Homebrew/rubocops/cask/mixin/cask_help.rb b/Library/Homebrew/rubocops/cask/mixin/cask_help.rb index 192e72c99c..66b8f04471 100644 --- a/Library/Homebrew/rubocops/cask/mixin/cask_help.rb +++ b/Library/Homebrew/rubocops/cask/mixin/cask_help.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true module RuboCop @@ -6,6 +6,13 @@ module RuboCop module Cask # Common functionality for cops checking casks. module CaskHelp + extend T::Helpers + extend T::Sig + abstract! + + sig { abstract.params(cask_block: RuboCop::Cask::AST::CaskBlock).void } + def on_cask(cask_block); end + def on_block(block_node) super if defined? super return unless respond_to?(:on_cask) diff --git a/Library/Homebrew/rubocops/cask/mixin/cask_help.rbi b/Library/Homebrew/rubocops/cask/mixin/cask_help.rbi new file mode 100644 index 0000000000..c3fe624f8e --- /dev/null +++ b/Library/Homebrew/rubocops/cask/mixin/cask_help.rbi @@ -0,0 +1,5 @@ +# typed: strict + +module RuboCop::Cop::Cask::CaskHelp + requires_ancestor { RuboCop::Cop::Base } +end diff --git a/Library/Homebrew/rubocops/cask/mixin/on_desc_stanza.rb b/Library/Homebrew/rubocops/cask/mixin/on_desc_stanza.rb index 759b899d67..7a1050d6b9 100644 --- a/Library/Homebrew/rubocops/cask/mixin/on_desc_stanza.rb +++ b/Library/Homebrew/rubocops/cask/mixin/on_desc_stanza.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true module RuboCop diff --git a/Library/Homebrew/rubocops/cask/mixin/on_desc_stanza.rbi b/Library/Homebrew/rubocops/cask/mixin/on_desc_stanza.rbi new file mode 100644 index 0000000000..f1e8ae8be4 --- /dev/null +++ b/Library/Homebrew/rubocops/cask/mixin/on_desc_stanza.rbi @@ -0,0 +1,5 @@ +# typed: strict + +module RuboCop::Cop::Cask::OnDescStanza + requires_ancestor { RuboCop::Cop::Cask::Desc } +end diff --git a/Library/Homebrew/rubocops/cask/mixin/on_homepage_stanza.rb b/Library/Homebrew/rubocops/cask/mixin/on_homepage_stanza.rb index 97607aa568..4340bcaa7c 100644 --- a/Library/Homebrew/rubocops/cask/mixin/on_homepage_stanza.rb +++ b/Library/Homebrew/rubocops/cask/mixin/on_homepage_stanza.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true module RuboCop diff --git a/Library/Homebrew/rubocops/cask/mixin/on_homepage_stanza.rbi b/Library/Homebrew/rubocops/cask/mixin/on_homepage_stanza.rbi new file mode 100644 index 0000000000..b4aabf1446 --- /dev/null +++ b/Library/Homebrew/rubocops/cask/mixin/on_homepage_stanza.rbi @@ -0,0 +1,5 @@ +# typed: strict + +module RuboCop::Cop::Cask::OnHomepageStanza + requires_ancestor { RuboCop::Cop::Cask::HomepageUrlTrailingSlash } +end diff --git a/Library/Homebrew/rubocops/cask/mixin/on_url_stanza.rb b/Library/Homebrew/rubocops/cask/mixin/on_url_stanza.rb index ad26e67a11..73c83e7837 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: false +# typed: true # frozen_string_literal: true module RuboCop diff --git a/Library/Homebrew/rubocops/cask/mixin/on_url_stanza.rbi b/Library/Homebrew/rubocops/cask/mixin/on_url_stanza.rbi new file mode 100644 index 0000000000..fb829d0a72 --- /dev/null +++ b/Library/Homebrew/rubocops/cask/mixin/on_url_stanza.rbi @@ -0,0 +1,5 @@ +# typed: strict + +module RuboCop::Cop::Cask::OnUrlStanza + requires_ancestor { RuboCop::Cop::Cask::UrlLegacyCommaSeparators } +end diff --git a/Library/Homebrew/rubocops/components_order.rb b/Library/Homebrew/rubocops/components_order.rb index 6759b22106..7a59d6acdb 100644 --- a/Library/Homebrew/rubocops/components_order.rb +++ b/Library/Homebrew/rubocops/components_order.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true require "ast_constants" @@ -58,7 +58,7 @@ module RuboCop @offensive_node = resource_block - on_system_bodies = [] + on_system_bodies = T.let([], T::Array[[RuboCop::AST::BlockNode, RuboCop::AST::Node]]) on_system_blocks.each_value do |blocks| blocks.each do |on_system_block| @@ -68,7 +68,7 @@ module RuboCop end end - message = nil + message = T.let(nil, T.nilable(String)) allowed_methods = [ [:url, :sha256], [:url, :mirror, :sha256], @@ -97,7 +97,7 @@ module RuboCop break end - if message.present? + if message problem message next end @@ -199,7 +199,7 @@ module RuboCop end # Check if each present_components is above rest of the present_components - offensive_nodes = nil + offensive_nodes = T.let(nil, T.nilable(T::Array[RuboCop::AST::Node])) present_components.take(present_components.size - 1).each_with_index do |preceding_component, p_idx| next if preceding_component.empty? diff --git a/Library/Homebrew/rubocops/dependency_order.rb b/Library/Homebrew/rubocops/dependency_order.rb index 34775de930..d5660d5635 100644 --- a/Library/Homebrew/rubocops/dependency_order.rb +++ b/Library/Homebrew/rubocops/dependency_order.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true require "rubocops/extend/formula" @@ -11,6 +11,7 @@ module RuboCop # precedence order: # build-time > test > normal > recommended > optional class DependencyOrder < FormulaCop + extend T::Sig extend AutoCorrector def audit_formula(_node, _class_node, _parent_class_node, body_node) @@ -65,11 +66,13 @@ module RuboCop # `depends_on :apple if build.with? "foo"` should always be defined # after `depends_on :foo`. # This method reorders the dependencies array according to the above rule. + sig { params(ordered: T::Array[RuboCop::AST::Node]).returns(T::Array[RuboCop::AST::Node]) } def sort_conditional_dependencies!(ordered) length = ordered.size idx = 0 while idx < length - idx1, idx2 = nil + idx1 = T.let(nil, T.nilable(Integer)) + idx2 = T.let(nil, T.nilable(Integer)) ordered.each_with_index do |dep, pos| idx = pos+1 match_nodes = build_with_dependency_name(dep) @@ -83,7 +86,7 @@ module RuboCop end break if idx2 end - insert_after!(ordered, idx1, idx2+idx1) if idx2 + insert_after!(ordered, idx1, idx2 + T.must(idx1)) if idx2 end ordered end @@ -93,8 +96,8 @@ module RuboCop def verify_order_in_source(ordered) ordered.each_with_index do |node_1, idx| l1 = line_number(node_1) - l2 = nil - node_2 = nil + l2 = T.let(nil, T.nilable(Integer)) + node_2 = T.let(nil, T.nilable(RuboCop::AST::Node)) ordered.drop(idx + 1).each do |test_node| l2 = line_number(test_node) node_2 = test_node if l2 < l1 diff --git a/Library/Homebrew/rubocops/extend/formula.rb b/Library/Homebrew/rubocops/extend/formula.rb index a92d8a7780..9da3c59555 100644 --- a/Library/Homebrew/rubocops/extend/formula.rb +++ b/Library/Homebrew/rubocops/extend/formula.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true require "rubocops/shared/helper_functions" @@ -29,6 +29,10 @@ module RuboCop audit_formula(node, class_node, parent_class_node, @body) end + def audit_formula(node, class_node, parent_class_node, body_node) + raise NotImplementedError, "Subclasses must implement this method." + end + # Yields to block when there is a match. # # @param urls [Array] url/mirror method call nodes diff --git a/Library/Homebrew/rubocops/lines.rb b/Library/Homebrew/rubocops/lines.rb index cb02f75e5d..c7538f8834 100644 --- a/Library/Homebrew/rubocops/lines.rb +++ b/Library/Homebrew/rubocops/lines.rb @@ -686,13 +686,13 @@ module RuboCop end find_instance_method_call(body_node, :version, :==) do |method| - next unless parameters_passed?(method, "HEAD") + next unless parameters_passed?(method, ["HEAD"]) problem "Use 'build.head?' instead of inspecting 'version'" end find_instance_method_call(body_node, "ARGV", :include?) do |method| - next unless parameters_passed?(method, "--HEAD") + next unless parameters_passed?(method, ["--HEAD"]) problem "Use \"if build.head?\" instead" end diff --git a/Library/Homebrew/rubocops/platform.rb b/Library/Homebrew/rubocops/platform.rb index 31706ed63f..f5a1f9bfe3 100644 --- a/Library/Homebrew/rubocops/platform.rb +++ b/Library/Homebrew/rubocops/platform.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true module RuboCop diff --git a/Library/Homebrew/rubocops/shared/desc_helper.rb b/Library/Homebrew/rubocops/shared/desc_helper.rb index f095efd8a8..38462b59e1 100644 --- a/Library/Homebrew/rubocops/shared/desc_helper.rb +++ b/Library/Homebrew/rubocops/shared/desc_helper.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true require "rubocops/shared/helper_functions" @@ -85,7 +85,9 @@ module RuboCop # Auto correct desc problems. `regex_match_group` must be called before this to populate @offense_source_range. def desc_problem(message) add_offense(@offensive_source_range, message: message) do |corrector| - /\A(?["'])(?.*)(?:\k)\Z/ =~ @offensive_node.source + match_data = @offensive_node.source.match(/\A(?["'])(?.*)(?:\k)\Z/) + correction = match_data[:correction] + quote = match_data[:quote] next if correction.nil? diff --git a/Library/Homebrew/rubocops/shared/desc_helper.rbi b/Library/Homebrew/rubocops/shared/desc_helper.rbi new file mode 100644 index 0000000000..ee694db1f1 --- /dev/null +++ b/Library/Homebrew/rubocops/shared/desc_helper.rbi @@ -0,0 +1,5 @@ +# typed: strict + +module RuboCop::Cop::DescHelper + requires_ancestor { RuboCop::Cop::Base } +end diff --git a/Library/Homebrew/rubocops/shared/helper_functions.rb b/Library/Homebrew/rubocops/shared/helper_functions.rb index 83f8c04b53..67229a2623 100644 --- a/Library/Homebrew/rubocops/shared/helper_functions.rb +++ b/Library/Homebrew/rubocops/shared/helper_functions.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true require "rubocop" @@ -14,6 +14,7 @@ module RuboCop # # @api private module HelperFunctions + extend T::Sig include RangeHelp # Checks for regex match of pattern in the node and @@ -49,6 +50,7 @@ module RuboCop end # Returns the line number of the node. + sig { params(node: RuboCop::AST::Node).returns(Integer) } def line_number(node) node.loc.line end @@ -166,7 +168,7 @@ module RuboCop def find_method_with_args(node, method_name, *args) methods = find_every_method_call_by_name(node, method_name) methods.each do |method| - next unless parameters_passed?(method, *args) + next unless parameters_passed?(method, args) return true unless block_given? yield method @@ -358,7 +360,7 @@ module RuboCop # Returns true if the given parameters are present in method call # and sets the method call as the offending node. # Params can be string, symbol, array, hash, matching regex. - def parameters_passed?(method_node, *params) + def parameters_passed?(method_node, params) method_params = parameters(method_node) @offensive_node = method_node params.all? do |given_param| diff --git a/Library/Homebrew/rubocops/shared/helper_functions.rbi b/Library/Homebrew/rubocops/shared/helper_functions.rbi new file mode 100644 index 0000000000..be76e34a43 --- /dev/null +++ b/Library/Homebrew/rubocops/shared/helper_functions.rbi @@ -0,0 +1,6 @@ +# typed: strict + +module RuboCop::Cop::HelperFunctions + include Kernel + requires_ancestor { RuboCop::Cop::Base } +end diff --git a/Library/Homebrew/rubocops/shared/on_system_conditionals_helper.rb b/Library/Homebrew/rubocops/shared/on_system_conditionals_helper.rb index 7763756615..432b42ed5e 100644 --- a/Library/Homebrew/rubocops/shared/on_system_conditionals_helper.rb +++ b/Library/Homebrew/rubocops/shared/on_system_conditionals_helper.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true require "macos_versions" @@ -172,7 +172,7 @@ module RuboCop def if_node_is_allowed?(if_node, allowed_methods: [], allowed_blocks: []) # TODO: check to see if it's legal - valid = false + valid = T.let(false, T::Boolean) if_node.each_ancestor do |ancestor| valid_method_names = case ancestor.type when :def diff --git a/Library/Homebrew/rubocops/text.rb b/Library/Homebrew/rubocops/text.rb index 1908efe3be..11f7f67cf0 100644 --- a/Library/Homebrew/rubocops/text.rb +++ b/Library/Homebrew/rubocops/text.rb @@ -59,20 +59,20 @@ module RuboCop end find_method_with_args(body_node, :system, "dep", "ensure") do |d| - next if parameters_passed?(d, /vendor-only/) + next if parameters_passed?(d, [/vendor-only/]) next if @formula_name == "goose" # needed in 2.3.0 problem "use \"dep\", \"ensure\", \"-vendor-only\"" end find_method_with_args(body_node, :system, "cargo", "build") do |m| - next if parameters_passed?(m, /--lib/) + next if parameters_passed?(m, [/--lib/]) problem "use \"cargo\", \"install\", *std_cargo_args" end find_every_method_call_by_name(body_node, :system).each do |m| - next unless parameters_passed?(m, /make && make/) + next unless parameters_passed?(m, [/make && make/]) offending_node(m) problem "Use separate `make` calls" diff --git a/Library/Homebrew/rubocops/urls.rb b/Library/Homebrew/rubocops/urls.rb index a9c10176dc..a2e66b55c7 100644 --- a/Library/Homebrew/rubocops/urls.rb +++ b/Library/Homebrew/rubocops/urls.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true require "rubocops/extend/formula" @@ -88,7 +88,7 @@ module RuboCop audit_urls(urls, http_to_https_patterns) do |_, url, index| # It's fine to have a plain HTTP mirror further down the mirror list. https_url = url.dup.insert(4, "s") - https_index = nil + https_index = T.let(nil, T.nilable(Integer)) audit_urls(urls, https_url) do |_, _, found_https_index| https_index = found_https_index end @@ -286,7 +286,7 @@ module RuboCop sig { params(url: String).returns(String) } def get_pypi_url(url) package_file = File.basename(url) - package_name = package_file.match(/^(.+)-[a-z0-9.]+$/)[1] + package_name = T.must(package_file.match(/^(.+)-[a-z0-9.]+$/))[1] "https://pypi.org/project/#{package_name}/#files" end end diff --git a/Library/Homebrew/sorbet/config b/Library/Homebrew/sorbet/config index 02fbf5ab02..5209b98964 100644 --- a/Library/Homebrew/sorbet/config +++ b/Library/Homebrew/sorbet/config @@ -1,8 +1,4 @@ ---dir -. - ---ignore -/vendor - ---ignore -/test/.gem +--dir=. +--enable-experimental-requires-ancestor +--ignore=/vendor +--ignore=/test/.gem