-
-
Notifications
You must be signed in to change notification settings - Fork 3k
/
empty_lines_around_arguments.rb
98 lines (87 loc) · 2.25 KB
/
empty_lines_around_arguments.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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# frozen_string_literal: true
module RuboCop
module Cop
module Layout
# This cop checks if empty lines exist around the arguments
# of a method invocation.
#
# @example
# # bad
# do_something(
# foo
#
# )
#
# process(bar,
#
# baz: qux,
# thud: fred)
#
# some_method(
#
# [1,2,3],
# x: y
# )
#
# # good
# do_something(
# foo
# )
#
# process(bar,
# baz: qux,
# thud: fred)
#
# some_method(
# [1,2,3],
# x: y
# )
#
class EmptyLinesAroundArguments < Base
include RangeHelp
extend AutoCorrector
MSG = 'Empty line detected around arguments.'
def on_send(node)
return if node.single_line? || node.arguments.empty?
extra_lines(node) do |range|
add_offense(range) do |corrector|
corrector.remove(range)
end
end
end
alias on_csend on_send
private
def empty_lines(node)
lines = processed_lines(node)
lines.select! { |code, _| code.empty? }
lines.map { |_, line| line }
end
def extra_lines(node)
empty_lines(node).each do |line|
range = source_range(processed_source.buffer, line, 0)
yield(range)
end
end
def processed_lines(node)
line_numbers(node).each_with_object([]) do |num, array|
array << [processed_source.lines[num - 1], num]
end
end
def line_numbers(node)
inner_lines = []
line_nums = node.arguments.each_with_object([]) do |arg_node, lines|
lines << outer_lines(arg_node)
inner_lines << inner_lines(arg_node) if arg_node.multiline?
end
line_nums.flatten.uniq - inner_lines.flatten - outer_lines(node)
end
def inner_lines(node)
[node.first_line + 1, node.last_line - 1]
end
def outer_lines(node)
[node.first_line - 1, node.last_line + 1]
end
end
end
end
end