@@ -13,7 +13,8 @@ module Layout
13
13
# `AllowAdjacentOneLineDefs` configures whether adjacent
14
14
# one-line method definitions are considered an offense.
15
15
#
16
- # @example
16
+ # @example EmptyLineBetweenMethodDefs: true (default)
17
+ # # checks for empty lines between method definitions.
17
18
#
18
19
# # bad
19
20
# def a
@@ -29,11 +30,57 @@ module Layout
29
30
#
30
31
# def b
31
32
# end
33
+ #
34
+ # @example EmptyLineBetweenClassDefs: true (default)
35
+ # # checks for empty lines between class definitions.
36
+ #
37
+ # # bad
38
+ # class A
39
+ # end
40
+ # class B
41
+ # end
42
+ # def b
43
+ # end
44
+ #
45
+ # @example
46
+ #
47
+ # # good
48
+ # class A
49
+ # end
50
+ #
51
+ # class B
52
+ # end
53
+ #
54
+ # def b
55
+ # end
56
+ #
57
+ # @example EmptyLineBetweenModuleDefs: true (default)
58
+ # # checks for empty lines between module definitions.
59
+ #
60
+ # # bad
61
+ # module A
62
+ # end
63
+ # module B
64
+ # end
65
+ # def b
66
+ # end
67
+ #
68
+ # @example
69
+ #
70
+ # # good
71
+ # module A
72
+ # end
73
+ #
74
+ # module B
75
+ # end
76
+ #
77
+ # def b
78
+ # end
32
79
class EmptyLineBetweenDefs < Base
33
80
include RangeHelp
34
81
extend AutoCorrector
35
82
36
- MSG = 'Use empty lines between method definitions.'
83
+ MSG = 'Use empty lines between %<type>s definitions.'
37
84
38
85
def self . autocorrect_incompatible_with
39
86
[ Layout ::EmptyLines ]
@@ -47,7 +94,7 @@ def self.autocorrect_incompatible_with
47
94
def on_begin ( node )
48
95
node . children . each_cons ( 2 ) do |prev , n |
49
96
nodes = [ prev , n ]
50
- check_defs ( nodes ) if nodes . all? { |def_candidate | def_node ?( def_candidate ) }
97
+ check_defs ( nodes ) if nodes . all? { |def_candidate | candidate ?( def_candidate ) }
51
98
end
52
99
end
53
100
@@ -57,8 +104,9 @@ def check_defs(nodes)
57
104
return if nodes . all? ( &:single_line? ) &&
58
105
cop_config [ 'AllowAdjacentOneLineDefs' ]
59
106
60
- location = nodes . last . loc . keyword . join ( nodes . last . loc . name )
61
- add_offense ( location ) do |corrector |
107
+ correction_node = nodes . last
108
+ location = correction_node . loc . keyword . join ( correction_node . loc . name )
109
+ add_offense ( location , message : message ( correction_node ) ) do |corrector |
62
110
autocorrect ( corrector , *nodes )
63
111
end
64
112
end
@@ -83,10 +131,32 @@ def autocorrect(corrector, prev_def, node)
83
131
84
132
private
85
133
86
- def def_node ?( node )
134
+ def candidate ?( node )
87
135
return unless node
88
136
89
- node . def_type? || node . defs_type?
137
+ method_candidate? ( node ) || class_candidate? ( node ) || module_candidate? ( node )
138
+ end
139
+
140
+ def method_candidate? ( node )
141
+ cop_config [ 'EmptyLineBetweenMethodDefs' ] && ( node . def_type? || node . defs_type? )
142
+ end
143
+
144
+ def class_candidate? ( node )
145
+ cop_config [ 'EmptyLineBetweenClassDefs' ] && node . class_type?
146
+ end
147
+
148
+ def module_candidate? ( node )
149
+ cop_config [ 'EmptyLineBetweenModuleDefs' ] && node . module_type?
150
+ end
151
+
152
+ def message ( node )
153
+ type = case node . type
154
+ when :def , :defs
155
+ :method
156
+ else
157
+ node . type
158
+ end
159
+ format ( MSG , type : type )
90
160
end
91
161
92
162
def multiple_blank_lines_groups? ( first_def_node , second_def_node )
0 commit comments