Class: RuboCop::Cop::Style::InverseMethods
- Defined in:
- lib/rubocop/cop/style/inverse_methods.rb
Overview
This cop check for usages of not (not or !) called on a method
when an inverse of that method can be used instead.
Methods that can be inverted by a not (not or !) should be defined
in InverseMethods
Methods that are inverted by inverting the return
of the block that is passed to the method should be defined in
InverseBlocks
Constant Summary collapse
- MSG =
'Use `%<inverse>s` instead of inverting `%<method>s`.'.freeze
- EQUALITY_METHODS =
%i[== != =~ !~ <= >= < >].freeze
Constants included from Util
Util::ASGN_NODES, Util::BYTE_ORDER_MARK, Util::CONDITIONAL_NODES, Util::EQUALS_ASGN_NODES, Util::LITERAL_REGEX, Util::LOGICAL_OPERATOR_NODES, Util::MODIFIER_NODES, Util::OPERATOR_METHODS, Util::SHORTHAND_ASGN_NODES
Instance Attribute Summary
Attributes inherited from Cop
#config, #corrections, #offenses, #processed_source
Instance Method Summary collapse
- #autocorrect(node) ⇒ Object
- #correct_inverse_block(node) ⇒ Object
- #on_block(node) ⇒ Object
- #on_send(node) ⇒ Object
Methods inherited from Cop
#add_offense, all, autocorrect_incompatible_with, badge, #config_to_allow_offenses, #config_to_allow_offenses=, #cop_config, cop_name, #cop_name, #correct, department, #duplicate_location?, #excluded_file?, #find_location, #highlights, inherited, #initialize, #join_force?, lint?, match?, #message, #messages, non_rails, #parse, qualified_cop_name, #relevant_file?, #target_rails_version, #target_ruby_version
Methods included from AST::Sexp
Methods included from NodePattern::Macros
#def_node_matcher, #def_node_search, #node_search, #node_search_all, #node_search_body, #node_search_first
Methods included from AutocorrectLogic
#autocorrect?, #autocorrect_enabled?, #autocorrect_requested?, #support_autocorrect?
Methods included from IgnoredNode
#ignore_node, #ignored_node?, #part_of_ignored_node?
Methods included from Util
begins_its_line?, block_length, comment_line?, compatible_external_encoding_for?, directions, double_quotes_required?, effective_column, ends_its_line?, escape_string, first_part_of_call_chain, interpret_string_escapes, line_distance, line_range, move_pos, needs_escaping?, on_node, operator?, parentheses?, parenthesized_call?, preceed?, range_between, range_by_whole_lines, range_with_surrounding_comma, range_with_surrounding_space, same_line?, source_range, strip_quotes, stripped_source_upto, symbol_without_quote?, to_string_literal, to_supported_styles, to_symbol_literal, within_node?
Methods included from PathUtil
absolute?, match_path?, relative_path, smart_path
Constructor Details
This class inherits a constructor from RuboCop::Cop::Cop
Instance Method Details
#autocorrect(node) ⇒ Object
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
# File 'lib/rubocop/cop/style/inverse_methods.rb', line 74 def autocorrect(node) method_call, method = inverse_candidate?(node) if method_call && method lambda do |corrector| corrector.remove(not_to_receiver(node, method_call)) corrector.replace(method_call.loc.selector, inverse_methods[method].to_s) if EQUALITY_METHODS.include?(method) corrector.remove(end_parentheses(node, method_call)) end end else correct_inverse_block(node) end end |
#correct_inverse_block(node) ⇒ Object
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
# File 'lib/rubocop/cop/style/inverse_methods.rb', line 92 def correct_inverse_block(node) method_call, method, block = inverse_block?(node) selector = block.loc.selector.source lambda do |corrector| corrector.replace(method_call.loc.selector, inverse_blocks[method].to_s) if ['!=', '!~'].include?(selector) selector[0] = '=' corrector.replace(block.loc.selector, selector) else corrector.remove(block.loc.selector) end end end |
#on_block(node) ⇒ Object
62 63 64 65 66 67 68 69 70 71 72 |
# File 'lib/rubocop/cop/style/inverse_methods.rb', line 62 def on_block(node) inverse_block?(node) do |_method_call, method, _block| return unless inverse_blocks.key?(method) return if negated?(node) && negated?(node.parent) add_offense(node, :expression, format(MSG, method: method, inverse: inverse_blocks[method])) end end |
#on_send(node) ⇒ Object
50 51 52 53 54 55 56 57 58 59 60 |
# File 'lib/rubocop/cop/style/inverse_methods.rb', line 50 def on_send(node) inverse_candidate?(node) do |_method_call, method| return unless inverse_methods.key?(method) return if negated?(node) add_offense(node, :expression, format(MSG, method: method, inverse: inverse_methods[method])) end end |