Sha256: b226234a5c4981d4223256601664b066b2788892833c0c0f846063917fae201d
Contents?: true
Size: 1.76 KB
Versions: 4
Compression:
Stored size: 1.76 KB
Contents
# frozen_string_literal: true module RuboCop module Cop module Performance # This cop is used to identify usages of `count` on an # `Array` and `Hash` and change them to `size`. # # @example # # bad # [1, 2, 3].count # # # bad # {a: 1, b: 2, c: 3}.count # # # good # [1, 2, 3].size # # # good # {a: 1, b: 2, c: 3}.size # # # good # [1, 2, 3].count { |e| e > 2 } # TODO: Add advanced detection of variables that could # have been assigned to an array or a hash. class Size < Cop MSG = 'Use `size` instead of `count`.' def on_send(node) return unless eligible_node?(node) add_offense(node, location: :selector) end def autocorrect(node) ->(corrector) { corrector.replace(node.loc.selector, 'size') } end private def eligible_node?(node) return false unless node.method?(:count) && !node.arguments? eligible_receiver?(node.receiver) && !allowed_parent?(node.parent) end def eligible_receiver?(node) return false unless node array?(node) || hash?(node) end def allowed_parent?(node) node&.block_type? end def array?(node) return true if node.array_type? return false unless node.send_type? _, constant = *node.receiver constant == :Array || node.method?(:to_a) end def hash?(node) return true if node.hash_type? return false unless node.send_type? _, constant = *node.receiver constant == :Hash || node.method?(:to_h) end end end end end
Version data entries
4 entries across 4 versions & 1 rubygems