rubocop: preserve comments when ordering uninstall methods

This commit is contained in:
Razvan Azamfirei 2024-01-27 16:19:16 -05:00
parent 7c540dd3c5
commit 9aabe1ba91
No known key found for this signature in database
GPG Key ID: 62E97BFCB12046BD
2 changed files with 26 additions and 10 deletions

View File

@ -9,10 +9,9 @@ module RuboCop
# This cop checks for the correct order of methods within the 'uninstall' and 'zap' stanzas. # This cop checks for the correct order of methods within the 'uninstall' and 'zap' stanzas.
class UninstallMethodsOrder < Base class UninstallMethodsOrder < Base
extend AutoCorrector extend AutoCorrector
include CaskHelp
include HelperFunctions include HelperFunctions
MSG = T.let("`%<method>s` method out of order".freeze, String) MSG = T.let("`%<method>s` method out of order", String)
sig { params(node: AST::SendNode).void } sig { params(node: AST::SendNode).void }
def on_send(node) def on_send(node)
@ -23,20 +22,37 @@ module RuboCop
method_nodes = hash_node.pairs.map(&:key) method_nodes = hash_node.pairs.map(&:key)
expected_order = method_nodes.sort_by { |method| method_order_index(method) } expected_order = method_nodes.sort_by { |method| method_order_index(method) }
comments = processed_source.comments
method_nodes.each_with_index do |method, index| method_nodes.each_with_index do |method, index|
next if method == expected_order[index] next if method == expected_order[index]
report_and_correct_offense(method, hash_node, expected_order, comments)
end
end
sig {
params(method: AST::Node,
hash_node: AST::HashNode,
expected_order: T::Array[AST::Node],
comments: T::Array[Parser::Source::Comment]).void
}
def report_and_correct_offense(method, hash_node, expected_order, comments)
add_offense(method, message: format(MSG, method: method.children.first)) do |corrector| add_offense(method, message: format(MSG, method: method.children.first)) do |corrector|
indentation = " " * (start_column(method) - line_start_column(method)) indentation = " " * (start_column(method) - line_start_column(method))
ordered_sources = expected_order.map do |expected_method| new_code = expected_order.map do |expected_method|
hash_node.pairs.find { |pair| pair.key == expected_method }.source method_pair = hash_node.pairs.find { |pair| pair.key == expected_method }
source = method_pair.source
# Find and attach a comment on the same line as the method_pair, if any
inline_comment = comments.find do |comment|
comment.location.line == method_pair.loc.line && comment.location.column > method_pair.loc.column
end end
new_code = ordered_sources.join(",\n#{indentation}") inline_comment ? "#{source} #{inline_comment.text}" : source
end.join(",\n#{indentation}")
corrector.replace(hash_node.source_range, new_code) corrector.replace(hash_node.source_range, new_code)
end end
end end
end
sig { params(method_node: AST::SymbolNode).returns(Integer) } sig { params(method_node: AST::SymbolNode).returns(Integer) }
def method_order_index(method_node) def method_order_index(method_node)

View File

@ -18,9 +18,9 @@ require_relative "cask/discontinued"
require_relative "cask/homepage_url_trailing_slash" require_relative "cask/homepage_url_trailing_slash"
require_relative "cask/no_overrides" require_relative "cask/no_overrides"
require_relative "cask/on_system_conditionals" require_relative "cask/on_system_conditionals"
require_relative "cask/uninstall_methods_order"
require_relative "cask/stanza_order" require_relative "cask/stanza_order"
require_relative "cask/stanza_grouping" require_relative "cask/stanza_grouping"
require_relative "cask/uninstall_methods_order"
require_relative "cask/url" require_relative "cask/url"
require_relative "cask/url_legacy_comma_separators" require_relative "cask/url_legacy_comma_separators"
require_relative "cask/variables" require_relative "cask/variables"