Module: RuboCop::Cop::HashSubset

Extended by:
Macros
Includes:
RangeHelp
Included in:
Style::HashExcept, Style::HashSlice
Defined in:
lib/rubocop/cop/mixin/hash_subset.rb

Overview

Common functionality for Style/HashExcept and Style/HashSlice cops. It registers an offense on methods with blocks that are equivalent to Hash#except or Hash#slice. rubocop:disable Metrics/ModuleLength

Constant Summary collapse

RESTRICT_ON_SEND =
%i[reject select filter].freeze
SUBSET_METHODS =
%i[== != eql? include?].freeze
ACTIVE_SUPPORT_SUBSET_METHODS =
(SUBSET_METHODS + %i[in? exclude?]).freeze
MSG =
'Use `%<prefer>s` instead.'

Constants included from RangeHelp

RangeHelp::BYTE_ORDER_MARK, RangeHelp::NOT_GIVEN

Instance Method Summary collapse

Instance Method Details

#block_with_first_arg_check?(node) ⇒ Object

[View source]

21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/rubocop/cop/mixin/hash_subset.rb', line 21

def_node_matcher :block_with_first_arg_check?, <<~PATTERN
  (block
    (call _ _)
    (args
      $(arg _key)
      $(arg _))
    {
      $(send
        {(lvar _key) $_ _ | _ $_ (lvar _key)})
      (send
        $(send
          {(lvar _key) $_ _ | _ $_ (lvar _key)}) :!)
      })
PATTERN

#on_send(node) ⇒ Object Also known as: on_csend

[View source]

36
37
38
39
40
41
42
43
44
45
46
# File 'lib/rubocop/cop/mixin/hash_subset.rb', line 36

def on_send(node)
  offense_range, key_source = extract_offense(node)

  return unless offense_range
  return unless semantically_subset_method?(node)

  preferred_method = "#{preferred_method_name}(#{key_source})"
  add_offense(offense_range, message: format(MSG, prefer: preferred_method)) do |corrector|
    corrector.replace(offense_range, preferred_method)
  end
end