/
space_inside_range_literal.rb
63 lines (53 loc) · 1.34 KB
/
space_inside_range_literal.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
# frozen_string_literal: true
module RuboCop
module Cop
module Layout
# Checks for spaces inside range literals.
#
# @example
# # bad
# 1 .. 3
#
# # good
# 1..3
#
# # bad
# 'a' .. 'z'
#
# # good
# 'a'..'z'
class SpaceInsideRangeLiteral < Cop
MSG = 'Space inside range literal.'
def on_irange(node)
check(node)
end
def on_erange(node)
check(node)
end
def autocorrect(node)
expression = node.source
operator = node.loc.operator.source
operator_escaped = operator.gsub(/\./, '\.')
lambda do |corrector|
corrector.replace(
node,
expression
.sub(/\s+#{operator_escaped}/, operator)
.sub(/#{operator_escaped}\s+/, operator)
)
end
end
private
def check(node)
expression = node.source
op = node.loc.operator.source
escaped_op = op.gsub(/\./, '\.')
# account for multiline range literals
expression.sub!(/#{escaped_op}\n\s*/, op)
return unless /(\s#{escaped_op})|(#{escaped_op}\s)/.match?(expression)
add_offense(node)
end
end
end
end
end