lib/rubocop/cop/style/collection_methods.rb



# encoding: utf-8

module RuboCop
  module Cop
    module Style
      # This cop checks for uses of unidiomatic method names
      # from the Enumerable module.
      #
      # The current definition of the check is flawed and should be
      # enhanced by check for by blocks & procs as arguments of the
      # methods.
      class CollectionMethods < Cop
        MSG = 'Prefer `%s` over `%s`.'

        def on_block(node)
          method, _args, _body = *node

          check_method_node(method)
        end

        def on_send(node)
          _receiver, _method_name, *args = *node
          return unless args.size == 1 && args.first.type == :block_pass

          check_method_node(node)
        end

        def autocorrect(node)
          @corrections << lambda do |corrector|
            corrector.replace(node.loc.selector,
                              preferred_method(node.loc.selector.source))
          end
        end

        private

        def check_method_node(node)
          _receiver, method_name, *_args = *node

          return unless preferred_methods[method_name]
          add_offense(node, :selector,
                      format(MSG,
                             preferred_method(method_name),
                             method_name)
                     )
        end

        def preferred_method(method)
          preferred_methods[method.to_sym]
        end

        def preferred_methods
          @preferred_methods ||=
            begin
              # Make sure default configuration 'foo' => 'bar' is removed from
              # the total configuration if there is a 'bar' => 'foo' override.
              default = default_cop_config['PreferredMethods']
              merged = cop_config['PreferredMethods']
              overrides = merged.values - default.values
              merged.reject { |key, _| overrides.include?(key) }.symbolize_keys
            end
        end

        def default_cop_config
          ConfigLoader.default_configuration[cop_name]
        end
      end
    end
  end
end