@@ -59,64 +59,78 @@ module RSpec
59
59
#
60
60
class ChangeByZero < Base
61
61
extend AutoCorrector
62
- MSG = 'Prefer `not_to change` over `to change .by(0)`.'
62
+ MSG = 'Prefer `not_to change` over `to %<method>s .by(0)`.'
63
63
MSG_COMPOUND = 'Prefer %<preferred>s with compound expectations ' \
64
- 'over `change.by(0)`.'
65
- RESTRICT_ON_SEND = %i[ change ] . freeze
64
+ 'over `%<method>s.by(0)`.'
65
+ CHANGE_METHODS = Set [ :change , :a_block_changing , :changing ] . freeze
66
+ RESTRICT_ON_SEND = CHANGE_METHODS . freeze
66
67
67
68
# @!method expect_change_with_arguments(node)
68
69
def_node_matcher :expect_change_with_arguments , <<-PATTERN
69
70
(send
70
- (send nil? :change ...) :by
71
+ $ (send nil? CHANGE_METHODS ...) :by
71
72
(int 0))
72
73
PATTERN
73
74
74
75
# @!method expect_change_with_block(node)
75
76
def_node_matcher :expect_change_with_block , <<-PATTERN
76
77
(send
77
78
(block
78
- (send nil? :change )
79
+ $ (send nil? CHANGE_METHODS )
79
80
(args)
80
81
(send (...) _)) :by
81
82
(int 0))
82
83
PATTERN
83
84
84
85
# @!method change_nodes(node)
85
86
def_node_search :change_nodes , <<-PATTERN
86
- $(send nil? :change ...)
87
+ $(send nil? CHANGE_METHODS ...)
87
88
PATTERN
88
89
89
90
def on_send ( node )
90
- expect_change_with_arguments ( node . parent ) do
91
- check_offense ( node . parent )
91
+ expect_change_with_arguments ( node . parent ) do | change |
92
+ register_offense ( node . parent , change )
92
93
end
93
94
94
- expect_change_with_block ( node . parent . parent ) do
95
- check_offense ( node . parent . parent )
95
+ expect_change_with_block ( node . parent . parent ) do | change |
96
+ register_offense ( node . parent . parent , change )
96
97
end
97
98
end
98
99
99
100
private
100
101
101
- def check_offense ( node )
102
- expression = node . source_range
102
+ # rubocop:disable Metrics/MethodLength
103
+ def register_offense ( node , change_node )
103
104
if compound_expectations? ( node )
104
- add_offense ( expression , message : message_compound ) do |corrector |
105
+ add_offense ( node . source_range ,
106
+ message : message_compound ( change_node ) ) do |corrector |
105
107
autocorrect_compound ( corrector , node )
106
108
end
107
109
else
108
- add_offense ( expression ) do |corrector |
109
- autocorrect ( corrector , node )
110
+ add_offense ( node . source_range ,
111
+ message : message ( change_node ) ) do |corrector |
112
+ autocorrect ( corrector , node , change_node )
110
113
end
111
114
end
112
115
end
116
+ # rubocop:enable Metrics/MethodLength
113
117
114
118
def compound_expectations? ( node )
115
119
%i[ and or & | ] . include? ( node . parent . method_name )
116
120
end
117
121
118
- def autocorrect ( corrector , node )
122
+ def message ( change_node )
123
+ format ( MSG , method : change_node . method_name )
124
+ end
125
+
126
+ def message_compound ( change_node )
127
+ format ( MSG_COMPOUND , preferred : preferred_method ,
128
+ method : change_node . method_name )
129
+ end
130
+
131
+ def autocorrect ( corrector , node , change_node )
119
132
corrector . replace ( node . parent . loc . selector , 'not_to' )
133
+ corrector . replace ( change_node . loc . selector , 'change' )
120
134
range = node . loc . dot . with ( end_pos : node . source_range . end_pos )
121
135
corrector . remove ( range )
122
136
end
@@ -135,10 +149,6 @@ def negated_matcher
135
149
cop_config [ 'NegatedMatcher' ]
136
150
end
137
151
138
- def message_compound
139
- format ( MSG_COMPOUND , preferred : preferred_method )
140
- end
141
-
142
152
def preferred_method
143
153
negated_matcher ? "`#{ negated_matcher } `" : 'negated matchers'
144
154
end
0 commit comments