/
for.rb
80 lines (73 loc) · 1.91 KB
/
for.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# 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.
#
# @example EnforcedStyle: each (default)
# # bad
# def foo
# for n in [1, 2, 3] do
# puts n
# end
# end
#
# # good
# def foo
# [1, 2, 3].each do |n|
# puts n
# end
# end
#
# @example EnforcedStyle: for
# # bad
# def foo
# [1, 2, 3].each do |n|
# puts n
# end
# end
#
# # good
# def foo
# for n in [1, 2, 3] do
# puts n
# end
# end
#
class For < Base
include ConfigurableEnforcedStyle
include RangeHelp
extend AutoCorrector
EACH_LENGTH = 'each'.length
PREFER_EACH = 'Prefer `each` over `for`.'
PREFER_FOR = 'Prefer `for` over `each`.'
def on_for(node)
if style == :each
add_offense(node, message: PREFER_EACH) do |corrector|
ForToEachCorrector.new(node).call(corrector)
end
else
correct_style_detected
end
end
def on_block(node)
return unless suspect_enumerable?(node)
if style == :for
add_offense(node, message: PREFER_FOR) do |corrector|
EachToForCorrector.new(node).call(corrector)
end
else
correct_style_detected
end
end
private
def suspect_enumerable?(node)
node.multiline? && node.send_node.method?(:each) && !node.send_node.arguments?
end
end
end
end
end