@@ -69,9 +69,9 @@ def on_send(node)
69
69
70
70
def autocorrect ( node )
71
71
if style == :create_list
72
- autocorrect_n_times_to_create_list ( node )
72
+ CreateListCorrector . new ( node )
73
73
else
74
- autocorrect_create_list_to_n_times ( node )
74
+ TimesCorrector . new ( node )
75
75
end
76
76
end
77
77
@@ -85,63 +85,127 @@ def contains_only_factory?(node)
85
85
end
86
86
end
87
87
88
- def autocorrect_n_times_to_create_list ( node )
89
- block = node . parent
90
- count = block . receiver . source
91
- replacement = factory_call_replacement ( block . body , count )
88
+ # :nodoc
89
+ class Corrector
90
+ private
92
91
93
- lambda do |corrector |
94
- corrector . replace ( block . loc . expression , replacement )
92
+ def build_options_string ( options )
93
+ options . map ( &:source ) . join ( ', ' )
94
+ end
95
+
96
+ def format_method_call ( node , method , arguments )
97
+ if node . block_type? || node . parenthesized?
98
+ "#{ method } (#{ arguments } )"
99
+ else
100
+ "#{ method } #{ arguments } "
101
+ end
102
+ end
103
+
104
+ def format_receiver ( receiver )
105
+ return '' unless receiver
106
+
107
+ "#{ receiver . source } ."
95
108
end
96
109
end
97
110
98
- def autocorrect_create_list_to_n_times ( node )
99
- replacement = generate_n_times_block ( node )
100
- lambda do |corrector |
111
+ # :nodoc
112
+ class TimesCorrector < Corrector
113
+ def initialize ( node )
114
+ @node = node
115
+ end
116
+
117
+ def call ( corrector )
118
+ replacement = generate_n_times_block ( node )
101
119
corrector . replace ( node . loc . expression , replacement )
102
120
end
103
- end
104
121
105
- def generate_n_times_block ( node )
106
- receiver , factory , count , options = *factory_list_call ( node )
122
+ private
107
123
108
- arguments = ":#{ factory } "
109
- options = build_options_string ( options )
110
- arguments += ", #{ options } " unless options . empty?
124
+ attr_reader :node
111
125
112
- replacement = format_receiver ( receiver )
113
- replacement += format_method_call ( node , 'create' , arguments )
114
- "#{ count } .times { #{ replacement } }"
126
+ def generate_n_times_block ( node )
127
+ factory , count , *options = node . arguments
128
+
129
+ arguments = factory . source
130
+ options = build_options_string ( options )
131
+ arguments += ", #{ options } " unless options . empty?
132
+
133
+ replacement = format_receiver ( node . receiver )
134
+ replacement += format_method_call ( node , 'create' , arguments )
135
+ "#{ count . source } .times { #{ replacement } }"
136
+ end
115
137
end
116
138
117
- def factory_call_replacement ( body , count )
118
- receiver , factory , options = *factory_call ( body )
139
+ # :nodoc:
140
+ class CreateListCorrector < Corrector
141
+ def initialize ( node )
142
+ @node = node . parent
143
+ end
119
144
120
- arguments = ":#{ factory } , #{ count } "
121
- options = build_options_string ( options )
122
- arguments += ", #{ options } " unless options . empty?
145
+ def call ( corrector )
146
+ replacement = if node . body . block_type?
147
+ call_with_block_replacement ( node )
148
+ else
149
+ call_replacement ( node )
150
+ end
123
151
124
- replacement = format_receiver ( receiver )
125
- replacement += format_method_call ( body , 'create_list' , arguments )
126
- replacement
127
- end
152
+ corrector . replace ( node . loc . expression , replacement )
153
+ end
128
154
129
- def build_options_string ( options )
130
- options . map ( &:source ) . join ( ', ' )
131
- end
155
+ private
132
156
133
- def format_method_call ( node , method , arguments )
134
- if node . parenthesized?
135
- "#{ method } (#{ arguments } )"
136
- else
137
- "#{ method } #{ arguments } "
157
+ attr_reader :node
158
+
159
+ def call_with_block_replacement ( node )
160
+ block = node . body
161
+ arguments = build_arguments ( block , node . receiver . source )
162
+ replacement = format_receiver ( block . send_node . receiver )
163
+ replacement += format_method_call ( block , 'create_list' , arguments )
164
+ replacement += format_block ( block )
165
+ replacement
138
166
end
139
- end
140
167
141
- def format_receiver ( receiver )
142
- return '' unless receiver
168
+ def build_arguments ( node , count )
169
+ factory , *options = *node . send_node . arguments
170
+
171
+ arguments = ":#{ factory . value } , #{ count } "
172
+ options = build_options_string ( options )
173
+ arguments += ", #{ options } " unless options . empty?
174
+ arguments
175
+ end
176
+
177
+ def call_replacement ( node )
178
+ block = node . body
179
+ factory , *options = *block . arguments
180
+
181
+ arguments = "#{ factory . source } , #{ node . receiver . source } "
182
+ options = build_options_string ( options )
183
+ arguments += ", #{ options } " unless options . empty?
143
184
144
- "#{ receiver . source } ."
185
+ replacement = format_receiver ( block . receiver )
186
+ replacement += format_method_call ( block , 'create_list' , arguments )
187
+ replacement
188
+ end
189
+
190
+ def format_block ( node )
191
+ if node . body . begin_type?
192
+ format_multiline_block ( node )
193
+ else
194
+ format_singeline_block ( node )
195
+ end
196
+ end
197
+
198
+ def format_multiline_block ( node )
199
+ indent = ' ' * node . body . loc . column
200
+ indent_end = ' ' * node . parent . loc . column
201
+ " do #{ node . arguments . source } \n " \
202
+ "#{ indent } #{ node . body . source } \n " \
203
+ "#{ indent_end } end"
204
+ end
205
+
206
+ def format_singeline_block ( node )
207
+ " { #{ node . arguments . source } #{ node . body . source } }"
208
+ end
145
209
end
146
210
end
147
211
end
0 commit comments