# frozen_string_literal: true module RuboCop module Cop module Style # This cop looks for uses of the *for* keyword, or *each* method. The # preferred alternative is set in the EnforcedStyle configuration # parameter. An *each* call with a block on a single line is always # allowed, however. class For < Cop include ConfigurableEnforcedStyle EACH_LENGTH = 'each'.length def on_for(node) if style == :each add_offense(node, :keyword, 'Prefer `each` over `for`.') do opposite_style_detected end else correct_style_detected end end def on_block(node) return if block_length(node).zero? method, _args, _body = *node return unless method.send_type? _receiver, method_name, *args = *method return unless method_name == :each && args.empty? if style == :for incorrect_style_detected(method) else correct_style_detected end end private def incorrect_style_detected(method) end_pos = method.source_range.end_pos range = range_between(end_pos - EACH_LENGTH, end_pos) add_offense(range, range, 'Prefer `for` over `each`.') do opposite_style_detected end end end end end end