rubocop 0.89.0 → 0.92.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (416) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/config/default.yml +128 -14
  4. data/lib/rubocop.rb +30 -4
  5. data/lib/rubocop/cached_data.rb +1 -0
  6. data/lib/rubocop/cli/command.rb +1 -0
  7. data/lib/rubocop/cli/command/auto_genenerate_config.rb +1 -0
  8. data/lib/rubocop/cli/command/base.rb +1 -0
  9. data/lib/rubocop/cli/command/execute_runner.rb +9 -0
  10. data/lib/rubocop/cli/command/init_dotfile.rb +1 -0
  11. data/lib/rubocop/cli/command/show_cops.rb +2 -1
  12. data/lib/rubocop/cli/command/version.rb +1 -0
  13. data/lib/rubocop/cli/environment.rb +1 -0
  14. data/lib/rubocop/comment_config.rb +17 -10
  15. data/lib/rubocop/config.rb +1 -1
  16. data/lib/rubocop/config_loader.rb +21 -10
  17. data/lib/rubocop/config_loader_resolver.rb +1 -0
  18. data/lib/rubocop/config_obsoletion.rb +1 -0
  19. data/lib/rubocop/config_regeneration.rb +33 -0
  20. data/lib/rubocop/config_store.rb +3 -3
  21. data/lib/rubocop/config_validator.rb +4 -1
  22. data/lib/rubocop/cop/base.rb +23 -0
  23. data/lib/rubocop/cop/bundler/duplicated_gem.rb +5 -1
  24. data/lib/rubocop/cop/bundler/gem_comment.rb +8 -3
  25. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +2 -0
  26. data/lib/rubocop/cop/commissioner.rb +47 -7
  27. data/lib/rubocop/cop/correctors/alignment_corrector.rb +4 -4
  28. data/lib/rubocop/cop/correctors/condition_corrector.rb +3 -5
  29. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +9 -10
  30. data/lib/rubocop/cop/correctors/line_break_corrector.rb +4 -4
  31. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +8 -3
  32. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -8
  33. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +5 -10
  34. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +8 -10
  35. data/lib/rubocop/cop/documentation.rb +22 -0
  36. data/lib/rubocop/cop/generator.rb +2 -1
  37. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +1 -0
  38. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -0
  39. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +1 -0
  40. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -0
  41. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +1 -0
  42. data/lib/rubocop/cop/layout/array_alignment.rb +1 -0
  43. data/lib/rubocop/cop/layout/begin_end_alignment.rb +77 -0
  44. data/lib/rubocop/cop/layout/block_alignment.rb +23 -19
  45. data/lib/rubocop/cop/layout/case_indentation.rb +4 -7
  46. data/lib/rubocop/cop/layout/class_structure.rb +14 -17
  47. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +4 -6
  48. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  49. data/lib/rubocop/cop/layout/condition_position.rb +13 -15
  50. data/lib/rubocop/cop/layout/def_end_alignment.rb +8 -5
  51. data/lib/rubocop/cop/layout/dot_position.rb +21 -17
  52. data/lib/rubocop/cop/layout/empty_comment.rb +30 -23
  53. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +21 -18
  54. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +13 -13
  55. data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +136 -0
  56. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +21 -23
  57. data/lib/rubocop/cop/layout/empty_lines.rb +6 -7
  58. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +18 -14
  59. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +7 -8
  60. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +4 -7
  61. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -5
  62. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +2 -5
  63. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -5
  64. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +3 -7
  65. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +2 -5
  66. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +2 -5
  67. data/lib/rubocop/cop/layout/end_alignment.rb +11 -17
  68. data/lib/rubocop/cop/layout/extra_spacing.rb +14 -21
  69. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +2 -5
  70. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +2 -5
  71. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +4 -8
  72. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +2 -5
  73. data/lib/rubocop/cop/layout/hash_alignment.rb +17 -20
  74. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +15 -14
  75. data/lib/rubocop/cop/layout/heredoc_indentation.rb +14 -11
  76. data/lib/rubocop/cop/layout/initial_indentation.rb +6 -7
  77. data/lib/rubocop/cop/layout/leading_comment_space.rb +12 -10
  78. data/lib/rubocop/cop/layout/leading_empty_lines.rb +6 -11
  79. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +2 -5
  80. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +2 -5
  81. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +10 -14
  82. data/lib/rubocop/cop/layout/multiline_block_layout.rb +21 -19
  83. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +2 -5
  84. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +2 -5
  85. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +5 -9
  86. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -5
  87. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +2 -5
  88. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +41 -22
  89. data/lib/rubocop/cop/layout/space_after_colon.rb +11 -7
  90. data/lib/rubocop/cop/layout/space_after_comma.rb +2 -5
  91. data/lib/rubocop/cop/layout/space_after_method_name.rb +5 -6
  92. data/lib/rubocop/cop/layout/space_after_not.rb +9 -11
  93. data/lib/rubocop/cop/layout/space_after_semicolon.rb +2 -5
  94. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +22 -17
  95. data/lib/rubocop/cop/layout/space_around_keyword.rb +17 -18
  96. data/lib/rubocop/cop/layout/space_around_operators.rb +17 -16
  97. data/lib/rubocop/cop/layout/space_before_block_braces.rb +23 -22
  98. data/lib/rubocop/cop/layout/space_before_comma.rb +3 -5
  99. data/lib/rubocop/cop/layout/space_before_comment.rb +10 -7
  100. data/lib/rubocop/cop/layout/space_before_first_arg.rb +7 -7
  101. data/lib/rubocop/cop/layout/space_before_semicolon.rb +2 -5
  102. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -17
  103. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +20 -23
  104. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +3 -8
  105. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +17 -16
  106. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +19 -37
  107. data/lib/rubocop/cop/layout/space_inside_parens.rb +9 -14
  108. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +5 -10
  109. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +8 -17
  110. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +16 -24
  111. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +12 -13
  112. data/lib/rubocop/cop/layout/trailing_empty_lines.rb +10 -15
  113. data/lib/rubocop/cop/layout/trailing_whitespace.rb +11 -11
  114. data/lib/rubocop/cop/lint/ambiguous_operator.rb +2 -0
  115. data/lib/rubocop/cop/lint/big_decimal_new.rb +1 -2
  116. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +2 -1
  117. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +74 -0
  118. data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
  119. data/lib/rubocop/cop/lint/debugger.rb +2 -3
  120. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -3
  121. data/lib/rubocop/cop/lint/duplicate_methods.rb +2 -4
  122. data/lib/rubocop/cop/lint/duplicate_require.rb +46 -0
  123. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +2 -15
  124. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -0
  125. data/lib/rubocop/cop/lint/empty_file.rb +50 -0
  126. data/lib/rubocop/cop/lint/erb_new_arguments.rb +2 -0
  127. data/lib/rubocop/cop/lint/float_comparison.rb +2 -2
  128. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
  129. data/lib/rubocop/cop/lint/identity_comparison.rb +51 -0
  130. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +2 -5
  131. data/lib/rubocop/cop/lint/inherit_exception.rb +2 -2
  132. data/lib/rubocop/cop/lint/missing_super.rb +11 -11
  133. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +2 -35
  134. data/lib/rubocop/cop/lint/multiple_comparison.rb +3 -1
  135. data/lib/rubocop/cop/lint/number_conversion.rb +1 -0
  136. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +33 -15
  137. data/lib/rubocop/cop/lint/percent_string_array.rb +8 -12
  138. data/lib/rubocop/cop/lint/raise_exception.rb +1 -0
  139. data/lib/rubocop/cop/lint/rand_one.rb +2 -1
  140. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +36 -29
  141. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +14 -4
  142. data/lib/rubocop/cop/lint/redundant_require_statement.rb +1 -0
  143. data/lib/rubocop/cop/lint/rescue_type.rb +0 -1
  144. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +3 -1
  145. data/lib/rubocop/cop/lint/shadowed_exception.rb +6 -6
  146. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +4 -4
  147. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -0
  148. data/lib/rubocop/cop/lint/to_json.rb +16 -5
  149. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
  150. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +57 -0
  151. data/lib/rubocop/cop/lint/unreachable_loop.rb +3 -6
  152. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +3 -1
  153. data/lib/rubocop/cop/lint/uri_regexp.rb +10 -25
  154. data/lib/rubocop/cop/lint/useless_access_modifier.rb +3 -9
  155. data/lib/rubocop/cop/lint/useless_method_definition.rb +70 -0
  156. data/lib/rubocop/cop/lint/useless_times.rb +106 -0
  157. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +27 -16
  158. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -0
  159. data/lib/rubocop/cop/migration/department_name.rb +2 -2
  160. data/lib/rubocop/cop/mixin/alignment.rb +5 -1
  161. data/lib/rubocop/cop/mixin/allowed_methods.rb +2 -0
  162. data/lib/rubocop/cop/mixin/annotation_comment.rb +5 -0
  163. data/lib/rubocop/cop/mixin/check_line_breakable.rb +17 -8
  164. data/lib/rubocop/cop/mixin/comments_help.rb +48 -0
  165. data/lib/rubocop/cop/mixin/configurable_naming.rb +2 -2
  166. data/lib/rubocop/cop/mixin/configurable_numbering.rb +3 -3
  167. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +8 -7
  168. data/lib/rubocop/cop/mixin/empty_parameter.rb +3 -1
  169. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +12 -1
  170. data/lib/rubocop/cop/mixin/enforce_superclass.rb +0 -2
  171. data/lib/rubocop/cop/mixin/first_element_line_break.rb +3 -1
  172. data/lib/rubocop/cop/mixin/hash_transform_method.rb +31 -12
  173. data/lib/rubocop/cop/mixin/line_length_help.rb +1 -3
  174. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +3 -1
  175. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +13 -12
  176. data/lib/rubocop/cop/mixin/negative_conditional.rb +2 -2
  177. data/lib/rubocop/cop/mixin/percent_array.rb +16 -9
  178. data/lib/rubocop/cop/mixin/range_help.rb +18 -4
  179. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +1 -1
  180. data/lib/rubocop/cop/mixin/rescue_node.rb +11 -1
  181. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +4 -3
  182. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +4 -3
  183. data/lib/rubocop/cop/mixin/statement_modifier.rb +12 -6
  184. data/lib/rubocop/cop/mixin/surrounding_space.rb +8 -4
  185. data/lib/rubocop/cop/mixin/trailing_comma.rb +9 -11
  186. data/lib/rubocop/cop/mixin/visibility_help.rb +4 -16
  187. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
  188. data/lib/rubocop/cop/naming/file_name.rb +1 -1
  189. data/lib/rubocop/cop/offense.rb +1 -0
  190. data/lib/rubocop/cop/security/eval.rb +1 -0
  191. data/lib/rubocop/cop/security/json_load.rb +1 -0
  192. data/lib/rubocop/cop/security/marshal_load.rb +1 -0
  193. data/lib/rubocop/cop/security/open.rb +1 -0
  194. data/lib/rubocop/cop/security/yaml_load.rb +1 -0
  195. data/lib/rubocop/cop/severity.rb +0 -8
  196. data/lib/rubocop/cop/style/access_modifier_declarations.rb +8 -19
  197. data/lib/rubocop/cop/style/accessor_grouping.rb +20 -20
  198. data/lib/rubocop/cop/style/alias.rb +36 -33
  199. data/lib/rubocop/cop/style/and_or.rb +9 -11
  200. data/lib/rubocop/cop/style/array_coercion.rb +4 -0
  201. data/lib/rubocop/cop/style/array_join.rb +7 -8
  202. data/lib/rubocop/cop/style/ascii_comments.rb +4 -4
  203. data/lib/rubocop/cop/style/attr.rb +12 -9
  204. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +4 -5
  205. data/lib/rubocop/cop/style/bare_percent_literals.rb +10 -12
  206. data/lib/rubocop/cop/style/begin_block.rb +2 -2
  207. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +9 -12
  208. data/lib/rubocop/cop/style/block_comments.rb +14 -18
  209. data/lib/rubocop/cop/style/block_delimiters.rb +23 -23
  210. data/lib/rubocop/cop/style/case_equality.rb +11 -3
  211. data/lib/rubocop/cop/style/case_like_if.rb +37 -18
  212. data/lib/rubocop/cop/style/class_and_module_children.rb +16 -11
  213. data/lib/rubocop/cop/style/class_check.rb +6 -11
  214. data/lib/rubocop/cop/style/class_methods.rb +7 -11
  215. data/lib/rubocop/cop/style/class_methods_definitions.rb +157 -0
  216. data/lib/rubocop/cop/style/class_vars.rb +7 -12
  217. data/lib/rubocop/cop/style/collection_methods.rb +11 -17
  218. data/lib/rubocop/cop/style/colon_method_call.rb +6 -7
  219. data/lib/rubocop/cop/style/colon_method_definition.rb +6 -6
  220. data/lib/rubocop/cop/style/combinable_loops.rb +84 -0
  221. data/lib/rubocop/cop/style/command_literal.rb +23 -24
  222. data/lib/rubocop/cop/style/comment_annotation.rb +15 -15
  223. data/lib/rubocop/cop/style/commented_keyword.rb +8 -9
  224. data/lib/rubocop/cop/style/conditional_assignment.rb +50 -61
  225. data/lib/rubocop/cop/style/constant_visibility.rb +3 -2
  226. data/lib/rubocop/cop/style/copyright.rb +12 -12
  227. data/lib/rubocop/cop/style/date_time.rb +13 -2
  228. data/lib/rubocop/cop/style/def_with_parentheses.rb +8 -10
  229. data/lib/rubocop/cop/style/dir.rb +8 -10
  230. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +7 -9
  231. data/lib/rubocop/cop/style/documentation.rb +2 -4
  232. data/lib/rubocop/cop/style/documentation_method.rb +1 -1
  233. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +12 -15
  234. data/lib/rubocop/cop/style/double_negation.rb +3 -2
  235. data/lib/rubocop/cop/style/each_for_simple_loop.rb +5 -8
  236. data/lib/rubocop/cop/style/each_with_object.rb +16 -17
  237. data/lib/rubocop/cop/style/empty_block_parameter.rb +9 -10
  238. data/lib/rubocop/cop/style/empty_case_condition.rb +19 -20
  239. data/lib/rubocop/cop/style/empty_else.rb +17 -19
  240. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +9 -10
  241. data/lib/rubocop/cop/style/empty_literal.rb +18 -17
  242. data/lib/rubocop/cop/style/empty_method.rb +5 -8
  243. data/lib/rubocop/cop/style/encoding.rb +5 -9
  244. data/lib/rubocop/cop/style/end_block.rb +4 -6
  245. data/lib/rubocop/cop/style/eval_with_location.rb +6 -10
  246. data/lib/rubocop/cop/style/even_odd.rb +8 -11
  247. data/lib/rubocop/cop/style/expand_path_arguments.rb +23 -26
  248. data/lib/rubocop/cop/style/explicit_block_argument.rb +1 -1
  249. data/lib/rubocop/cop/style/exponential_notation.rb +1 -1
  250. data/lib/rubocop/cop/style/float_division.rb +3 -1
  251. data/lib/rubocop/cop/style/for.rb +11 -15
  252. data/lib/rubocop/cop/style/format_string.rb +18 -23
  253. data/lib/rubocop/cop/style/format_string_token.rb +4 -7
  254. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +19 -41
  255. data/lib/rubocop/cop/style/global_vars.rb +2 -2
  256. data/lib/rubocop/cop/style/guard_clause.rb +4 -4
  257. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +24 -5
  258. data/lib/rubocop/cop/style/hash_each_methods.rb +5 -8
  259. data/lib/rubocop/cop/style/hash_syntax.rb +6 -7
  260. data/lib/rubocop/cop/style/hash_transform_keys.rb +19 -11
  261. data/lib/rubocop/cop/style/hash_transform_values.rb +18 -10
  262. data/lib/rubocop/cop/style/identical_conditional_branches.rb +1 -1
  263. data/lib/rubocop/cop/style/if_inside_else.rb +2 -2
  264. data/lib/rubocop/cop/style/if_unless_modifier.rb +11 -17
  265. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +3 -7
  266. data/lib/rubocop/cop/style/if_with_semicolon.rb +3 -6
  267. data/lib/rubocop/cop/style/implicit_runtime_error.rb +2 -1
  268. data/lib/rubocop/cop/style/infinite_loop.rb +23 -23
  269. data/lib/rubocop/cop/style/inline_comment.rb +3 -3
  270. data/lib/rubocop/cop/style/inverse_methods.rb +20 -29
  271. data/lib/rubocop/cop/style/keyword_parameters_order.rb +53 -0
  272. data/lib/rubocop/cop/style/lambda.rb +7 -12
  273. data/lib/rubocop/cop/style/lambda_call.rb +17 -14
  274. data/lib/rubocop/cop/style/line_end_concatenation.rb +19 -16
  275. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -1
  276. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +11 -11
  277. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +4 -8
  278. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +7 -6
  279. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +12 -3
  280. data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -16
  281. data/lib/rubocop/cop/style/min_max.rb +8 -12
  282. data/lib/rubocop/cop/style/missing_else.rb +13 -13
  283. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +1 -1
  284. data/lib/rubocop/cop/style/mixin_grouping.rb +24 -27
  285. data/lib/rubocop/cop/style/mixin_usage.rb +9 -28
  286. data/lib/rubocop/cop/style/module_function.rb +10 -13
  287. data/lib/rubocop/cop/style/multiline_block_chain.rb +2 -2
  288. data/lib/rubocop/cop/style/multiline_if_modifier.rb +3 -10
  289. data/lib/rubocop/cop/style/multiline_if_then.rb +4 -10
  290. data/lib/rubocop/cop/style/multiline_memoization.rb +12 -10
  291. data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -1
  292. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +17 -6
  293. data/lib/rubocop/cop/style/multiline_when_then.rb +10 -11
  294. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  295. data/lib/rubocop/cop/style/mutable_constant.rb +23 -20
  296. data/lib/rubocop/cop/style/negated_if.rb +6 -6
  297. data/lib/rubocop/cop/style/negated_unless.rb +6 -6
  298. data/lib/rubocop/cop/style/negated_while.rb +7 -15
  299. data/lib/rubocop/cop/style/nested_modifier.rb +10 -13
  300. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +14 -12
  301. data/lib/rubocop/cop/style/nested_ternary_operator.rb +14 -16
  302. data/lib/rubocop/cop/style/next.rb +10 -14
  303. data/lib/rubocop/cop/style/nil_comparison.rb +13 -11
  304. data/lib/rubocop/cop/style/non_nil_check.rb +34 -26
  305. data/lib/rubocop/cop/style/not.rb +20 -26
  306. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +4 -9
  307. data/lib/rubocop/cop/style/numeric_predicate.rb +5 -14
  308. data/lib/rubocop/cop/style/one_line_conditional.rb +73 -23
  309. data/lib/rubocop/cop/style/option_hash.rb +1 -1
  310. data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
  311. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +12 -1
  312. data/lib/rubocop/cop/style/or_assignment.rb +13 -10
  313. data/lib/rubocop/cop/style/parallel_assignment.rb +14 -14
  314. data/lib/rubocop/cop/style/parentheses_around_condition.rb +6 -6
  315. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +13 -19
  316. data/lib/rubocop/cop/style/percent_q_literals.rb +8 -10
  317. data/lib/rubocop/cop/style/perl_backrefs.rb +8 -10
  318. data/lib/rubocop/cop/style/preferred_hash_methods.rb +11 -14
  319. data/lib/rubocop/cop/style/proc.rb +6 -6
  320. data/lib/rubocop/cop/style/raise_args.rb +15 -24
  321. data/lib/rubocop/cop/style/random_with_offset.rb +19 -19
  322. data/lib/rubocop/cop/style/redundant_assignment.rb +8 -18
  323. data/lib/rubocop/cop/style/redundant_begin.rb +7 -9
  324. data/lib/rubocop/cop/style/redundant_capital_w.rb +6 -9
  325. data/lib/rubocop/cop/style/redundant_condition.rb +5 -6
  326. data/lib/rubocop/cop/style/redundant_conditional.rb +4 -5
  327. data/lib/rubocop/cop/style/redundant_exception.rb +1 -3
  328. data/lib/rubocop/cop/style/redundant_fetch_block.rb +3 -12
  329. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +9 -8
  330. data/lib/rubocop/cop/style/redundant_freeze.rb +5 -7
  331. data/lib/rubocop/cop/style/redundant_interpolation.rb +25 -24
  332. data/lib/rubocop/cop/style/redundant_parentheses.rb +21 -15
  333. data/lib/rubocop/cop/style/redundant_percent_q.rb +9 -11
  334. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +6 -13
  335. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +5 -14
  336. data/lib/rubocop/cop/style/redundant_return.rb +17 -17
  337. data/lib/rubocop/cop/style/redundant_self.rb +9 -11
  338. data/lib/rubocop/cop/style/redundant_self_assignment.rb +116 -0
  339. data/lib/rubocop/cop/style/redundant_sort.rb +12 -31
  340. data/lib/rubocop/cop/style/redundant_sort_by.rb +5 -9
  341. data/lib/rubocop/cop/style/regexp_literal.rb +10 -21
  342. data/lib/rubocop/cop/style/rescue_modifier.rb +29 -9
  343. data/lib/rubocop/cop/style/rescue_standard_error.rb +20 -16
  344. data/lib/rubocop/cop/style/return_nil.rb +5 -5
  345. data/lib/rubocop/cop/style/safe_navigation.rb +22 -16
  346. data/lib/rubocop/cop/style/sample.rb +12 -14
  347. data/lib/rubocop/cop/style/self_assignment.rb +26 -22
  348. data/lib/rubocop/cop/style/semicolon.rb +6 -9
  349. data/lib/rubocop/cop/style/send.rb +4 -5
  350. data/lib/rubocop/cop/style/signal_exception.rb +23 -19
  351. data/lib/rubocop/cop/style/single_argument_dig.rb +1 -0
  352. data/lib/rubocop/cop/style/single_line_block_params.rb +4 -2
  353. data/lib/rubocop/cop/style/single_line_methods.rb +18 -17
  354. data/lib/rubocop/cop/style/slicing_with_range.rb +6 -8
  355. data/lib/rubocop/cop/style/sole_nested_conditional.rb +66 -0
  356. data/lib/rubocop/cop/style/special_global_vars.rb +10 -15
  357. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +17 -21
  358. data/lib/rubocop/cop/style/stderr_puts.rb +5 -6
  359. data/lib/rubocop/cop/style/string_concatenation.rb +16 -2
  360. data/lib/rubocop/cop/style/string_hash_keys.rb +6 -7
  361. data/lib/rubocop/cop/style/string_methods.rb +7 -17
  362. data/lib/rubocop/cop/style/strip.rb +9 -14
  363. data/lib/rubocop/cop/style/struct_inheritance.rb +3 -6
  364. data/lib/rubocop/cop/style/symbol_array.rb +5 -16
  365. data/lib/rubocop/cop/style/symbol_literal.rb +4 -6
  366. data/lib/rubocop/cop/style/symbol_proc.rb +14 -18
  367. data/lib/rubocop/cop/style/ternary_parentheses.rb +22 -22
  368. data/lib/rubocop/cop/style/trailing_body_on_class.rb +3 -6
  369. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +4 -7
  370. data/lib/rubocop/cop/style/trailing_body_on_module.rb +3 -6
  371. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +2 -5
  372. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +2 -5
  373. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +11 -9
  374. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +2 -5
  375. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +8 -17
  376. data/lib/rubocop/cop/style/trivial_accessors.rb +26 -30
  377. data/lib/rubocop/cop/style/unless_else.rb +5 -8
  378. data/lib/rubocop/cop/style/unpack_first.rb +5 -8
  379. data/lib/rubocop/cop/style/variable_interpolation.rb +7 -10
  380. data/lib/rubocop/cop/style/when_then.rb +4 -6
  381. data/lib/rubocop/cop/style/while_until_do.rb +6 -16
  382. data/lib/rubocop/cop/style/while_until_modifier.rb +6 -20
  383. data/lib/rubocop/cop/style/word_array.rb +5 -23
  384. data/lib/rubocop/cop/style/yoda_condition.rb +4 -15
  385. data/lib/rubocop/cop/style/zero_length_predicate.rb +12 -18
  386. data/lib/rubocop/cop/team.rb +1 -0
  387. data/lib/rubocop/cop/util.rb +2 -1
  388. data/lib/rubocop/cop/utils/format_string.rb +3 -5
  389. data/lib/rubocop/cop/variable_force.rb +2 -0
  390. data/lib/rubocop/cops_documentation_generator.rb +5 -3
  391. data/lib/rubocop/core_ext/string.rb +2 -2
  392. data/lib/rubocop/directive_comment.rb +32 -0
  393. data/lib/rubocop/ext/regexp_node.rb +46 -0
  394. data/lib/rubocop/file_finder.rb +1 -0
  395. data/lib/rubocop/formatter/auto_gen_config_formatter.rb +2 -1
  396. data/lib/rubocop/formatter/disabled_config_formatter.rb +13 -6
  397. data/lib/rubocop/formatter/html_formatter.rb +2 -0
  398. data/lib/rubocop/formatter/junit_formatter.rb +1 -1
  399. data/lib/rubocop/formatter/progress_formatter.rb +2 -1
  400. data/lib/rubocop/formatter/quiet_formatter.rb +1 -1
  401. data/lib/rubocop/formatter/simple_text_formatter.rb +36 -6
  402. data/lib/rubocop/name_similarity.rb +1 -0
  403. data/lib/rubocop/options.rb +43 -20
  404. data/lib/rubocop/remote_config.rb +1 -0
  405. data/lib/rubocop/result_cache.rb +31 -13
  406. data/lib/rubocop/rspec/cop_helper.rb +4 -1
  407. data/lib/rubocop/rspec/expect_offense.rb +14 -9
  408. data/lib/rubocop/rspec/shared_contexts.rb +13 -5
  409. data/lib/rubocop/runner.rb +35 -15
  410. data/lib/rubocop/string_interpreter.rb +3 -0
  411. data/lib/rubocop/target_finder.rb +5 -1
  412. data/lib/rubocop/target_ruby.rb +7 -1
  413. data/lib/rubocop/version.rb +7 -1
  414. data/lib/rubocop/yaml_duplication_checker.rb +1 -0
  415. metadata +26 -14
  416. data/lib/rubocop/cop/tokens_util.rb +0 -84
@@ -45,23 +45,18 @@ module RuboCop
45
45
  # end
46
46
  # end
47
47
  #
48
- class ClassVars < Cop
49
- MSG = 'Replace class var %<class_var>s with a class ' \
50
- 'instance var.'
48
+ class ClassVars < Base
49
+ MSG = 'Replace class var %<class_var>s with a class instance var.'
50
+ RESTRICT_ON_SEND = %i[class_variable_set].freeze
51
51
 
52
52
  def on_cvasgn(node)
53
- add_offense(node, location: :name)
53
+ add_offense(node.loc.name, message: format(MSG, class_var: node.children.first))
54
54
  end
55
55
 
56
56
  def on_send(node)
57
- return unless node.method?(:class_variable_set)
58
-
59
- add_offense(node.first_argument)
60
- end
61
-
62
- def message(node)
63
- class_var, = *node
64
- format(MSG, class_var: class_var)
57
+ add_offense(
58
+ node.first_argument, message: format(MSG, class_var: node.first_argument.source)
59
+ )
65
60
  end
66
61
  end
67
62
  end
@@ -37,8 +37,9 @@ module RuboCop
37
37
  # items.select
38
38
  # items.include?
39
39
  #
40
- class CollectionMethods < Cop
40
+ class CollectionMethods < Base
41
41
  include MethodPreference
42
+ extend AutoCorrector
42
43
 
43
44
  MSG = 'Prefer `%<prefer>s` over `%<current>s`.'
44
45
 
@@ -47,31 +48,24 @@ module RuboCop
47
48
  end
48
49
 
49
50
  def on_send(node)
50
- return unless node.arguments.one? &&
51
- node.first_argument.block_pass_type?
51
+ return unless node.arguments.one? && node.first_argument.block_pass_type?
52
52
 
53
53
  check_method_node(node)
54
54
  end
55
55
 
56
- def autocorrect(node)
57
- lambda do |corrector|
58
- corrector.replace(node.loc.selector,
59
- preferred_method(node.loc.selector.source))
60
- end
61
- end
62
-
63
56
  private
64
57
 
65
- def message(node)
66
- format(MSG,
67
- prefer: preferred_method(node.method_name),
68
- current: node.method_name)
69
- end
70
-
71
58
  def check_method_node(node)
72
59
  return unless preferred_methods[node.method_name]
73
60
 
74
- add_offense(node, location: :selector)
61
+ message = message(node)
62
+ add_offense(node.loc.selector, message: message) do |corrector|
63
+ corrector.replace(node.loc.selector, preferred_method(node.loc.selector.source))
64
+ end
65
+ end
66
+
67
+ def message(node)
68
+ format(MSG, prefer: preferred_method(node.method_name), current: node.method_name)
75
69
  end
76
70
  end
77
71
  end
@@ -17,7 +17,9 @@ module RuboCop
17
17
  # FileUtils.rmdir(dir)
18
18
  # Marshal.dump(obj)
19
19
  #
20
- class ColonMethodCall < Cop
20
+ class ColonMethodCall < Base
21
+ extend AutoCorrector
22
+
21
23
  MSG = 'Do not use `::` for method calls.'
22
24
 
23
25
  def_node_matcher :java_type_node?, <<~PATTERN
@@ -32,15 +34,12 @@ module RuboCop
32
34
  def on_send(node)
33
35
  return unless node.receiver && node.double_colon?
34
36
  return if node.camel_case_method?
35
-
36
37
  # ignore Java interop code like Java::int
37
38
  return if java_type_node?(node)
38
39
 
39
- add_offense(node, location: :dot)
40
- end
41
-
42
- def autocorrect(node)
43
- ->(corrector) { corrector.replace(node.loc.dot, '.') }
40
+ add_offense(node.loc.dot) do |corrector|
41
+ corrector.replace(node.loc.dot, '.')
42
+ end
44
43
  end
45
44
  end
46
45
  end
@@ -19,17 +19,17 @@ module RuboCop
19
19
  # end
20
20
  # end
21
21
  #
22
- class ColonMethodDefinition < Cop
22
+ class ColonMethodDefinition < Base
23
+ extend AutoCorrector
24
+
23
25
  MSG = 'Do not use `::` for defining class methods.'
24
26
 
25
27
  def on_defs(node)
26
28
  return unless node.loc.operator.source == '::'
27
29
 
28
- add_offense(node, location: :operator)
29
- end
30
-
31
- def autocorrect(node)
32
- ->(corrector) { corrector.replace(node.loc.operator, '.') }
30
+ add_offense(node.loc.operator) do |corrector|
31
+ corrector.replace(node.loc.operator, '.')
32
+ end
33
33
  end
34
34
  end
35
35
  end
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop checks for places where multiple consecutive loops over the same data
7
+ # can be combined into a single loop. It is very likely that combining them
8
+ # will make the code more efficient and more concise.
9
+ #
10
+ # It is marked as unsafe, because the first loop might modify
11
+ # a state that the second loop depends on; these two aren't combinable.
12
+ #
13
+ # @example
14
+ # # bad
15
+ # def method
16
+ # items.each do |item|
17
+ # do_something(item)
18
+ # end
19
+ #
20
+ # items.each do |item|
21
+ # do_something_else(item)
22
+ # end
23
+ # end
24
+ #
25
+ # # good
26
+ # def method
27
+ # items.each do |item|
28
+ # do_something(item)
29
+ # do_something_else(item)
30
+ # end
31
+ # end
32
+ #
33
+ # # bad
34
+ # def method
35
+ # for item in items do
36
+ # do_something(item)
37
+ # end
38
+ #
39
+ # for item in items do
40
+ # do_something_else(item)
41
+ # end
42
+ # end
43
+ #
44
+ # # good
45
+ # def method
46
+ # for item in items do
47
+ # do_something(item)
48
+ # do_something_else(item)
49
+ # end
50
+ # end
51
+ #
52
+ class CombinableLoops < Base
53
+ MSG = 'Combine this loop with the previous loop.'
54
+
55
+ def on_block(node)
56
+ return unless node.parent&.begin_type?
57
+ return unless collection_looping_method?(node)
58
+
59
+ add_offense(node) if same_collection_looping?(node, node.left_sibling)
60
+ end
61
+
62
+ def on_for(node)
63
+ return unless node.parent&.begin_type?
64
+
65
+ sibling = node.left_sibling
66
+ add_offense(node) if sibling&.for_type? && node.collection == sibling.collection
67
+ end
68
+
69
+ private
70
+
71
+ def collection_looping_method?(node)
72
+ method_name = node.send_node.method_name
73
+ method_name.match?(/^each/) || method_name.match?(/_each$/)
74
+ end
75
+
76
+ def same_collection_looping?(node, sibling)
77
+ sibling&.block_type? &&
78
+ sibling.send_node.method?(node.method_name) &&
79
+ sibling.send_node.receiver == node.send_node.receiver
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -75,8 +75,9 @@ module RuboCop
75
75
  # @example AllowInnerBackticks: true
76
76
  # # good
77
77
  # `echo \`ls\``
78
- class CommandLiteral < Cop
78
+ class CommandLiteral < Base
79
79
  include ConfigurableEnforcedStyle
80
+ extend AutoCorrector
80
81
 
81
82
  MSG_USE_BACKTICKS = 'Use backticks around command string.'
82
83
  MSG_USE_PERCENT_X = 'Use `%x` around command string.'
@@ -85,43 +86,41 @@ module RuboCop
85
86
  return if node.heredoc?
86
87
 
87
88
  if backtick_literal?(node)
88
- check_backtick_literal(node)
89
+ check_backtick_literal(node, MSG_USE_PERCENT_X)
89
90
  else
90
- check_percent_x_literal(node)
91
- end
92
- end
93
-
94
- def autocorrect(node)
95
- return if contains_backtick?(node)
96
-
97
- replacement = if backtick_literal?(node)
98
- ['%x', ''].zip(preferred_delimiter).map(&:join)
99
- else
100
- %w[` `]
101
- end
102
-
103
- lambda do |corrector|
104
- corrector.replace(node.loc.begin, replacement.first)
105
- corrector.replace(node.loc.end, replacement.last)
91
+ check_percent_x_literal(node, MSG_USE_BACKTICKS)
106
92
  end
107
93
  end
108
94
 
109
95
  private
110
96
 
111
- def check_backtick_literal(node)
97
+ def check_backtick_literal(node, message)
112
98
  return if allowed_backtick_literal?(node)
113
99
 
114
- add_offense(node)
100
+ add_offense(node, message: message) do |corrector|
101
+ autocorrect(corrector, node)
102
+ end
115
103
  end
116
104
 
117
- def check_percent_x_literal(node)
105
+ def check_percent_x_literal(node, message)
118
106
  return if allowed_percent_x_literal?(node)
119
107
 
120
- add_offense(node)
108
+ add_offense(node, message: message) do |corrector|
109
+ autocorrect(corrector, node)
110
+ end
121
111
  end
122
112
 
123
- def message(node)
124
- backtick_literal?(node) ? MSG_USE_PERCENT_X : MSG_USE_BACKTICKS
113
+ def autocorrect(corrector, node)
114
+ return if contains_backtick?(node)
115
+
116
+ replacement = if backtick_literal?(node)
117
+ ['%x', ''].zip(preferred_delimiter).map(&:join)
118
+ else
119
+ %w[` `]
120
+ end
121
+
122
+ corrector.replace(node.loc.begin, replacement.first)
123
+ corrector.replace(node.loc.end, replacement.last)
125
124
  end
126
125
 
127
126
  def allowed_backtick_literal?(node)
@@ -30,9 +30,10 @@ module RuboCop
30
30
  #
31
31
  # # good
32
32
  # # OPTIMIZE: does not work
33
- class CommentAnnotation < Cop
33
+ class CommentAnnotation < Base
34
34
  include AnnotationComment
35
35
  include RangeHelp
36
+ extend AutoCorrector
36
37
 
37
38
  MSG = 'Annotation keywords like `%<keyword>s` should be all ' \
38
39
  'upper case, followed by a colon, and a space, ' \
@@ -40,7 +41,7 @@ module RuboCop
40
41
  MISSING_NOTE = 'Annotation comment, with keyword `%<keyword>s`, ' \
41
42
  'is missing a note.'
42
43
 
43
- def investigate(processed_source)
44
+ def on_new_investigation
44
45
  processed_source.comments.each_with_index do |comment, index|
45
46
  next unless first_comment_line?(processed_source.comments, index) ||
46
47
  inline_comment?(comment)
@@ -49,26 +50,25 @@ module RuboCop
49
50
  next unless annotation?(comment) &&
50
51
  !correct_annotation?(first_word, colon, space, note)
51
52
 
52
- add_offense(
53
- comment,
54
- location: annotation_range(comment, margin,
55
- first_word, colon, space),
56
- message: format(note ? MSG : MISSING_NOTE, keyword: first_word)
57
- )
53
+ range = annotation_range(comment, margin, first_word, colon, space)
54
+
55
+ register_offense(range, note, first_word)
58
56
  end
59
57
  end
60
58
 
61
- def autocorrect(comment)
62
- margin, first_word, colon, space, note = split_comment(comment)
63
- return if note.nil?
59
+ private
64
60
 
65
- range = annotation_range(comment, margin, first_word, colon, space)
61
+ def register_offense(range, note, first_word)
62
+ add_offense(
63
+ range,
64
+ message: format(note ? MSG : MISSING_NOTE, keyword: first_word)
65
+ ) do |corrector|
66
+ next if note.nil?
66
67
 
67
- ->(corrector) { corrector.replace(range, "#{first_word.upcase}: ") }
68
+ corrector.replace(range, "#{first_word.upcase}: ")
69
+ end
68
70
  end
69
71
 
70
- private
71
-
72
72
  def first_comment_line?(comments, index)
73
73
  index.zero? ||
74
74
  comments[index - 1].loc.line < comments[index].loc.line - 1
@@ -33,13 +33,17 @@ module RuboCop
33
33
  # class X # :nodoc:
34
34
  # y
35
35
  # end
36
- class CommentedKeyword < Cop
36
+ class CommentedKeyword < Base
37
37
  MSG = 'Do not place comments on the same line as the ' \
38
38
  '`%<keyword>s` keyword.'
39
39
 
40
- def investigate(processed_source)
41
- processed_source.each_comment do |comment|
42
- add_offense(comment) if offensive?(comment)
40
+ def on_new_investigation
41
+ processed_source.comments.each do |comment|
42
+ next unless (match = line(comment).match(/(?<keyword>\S+).*#/))
43
+
44
+ if offensive?(comment)
45
+ add_offense(comment, message: format(MSG, keyword: match[:keyword]))
46
+ end
43
47
  end
44
48
  end
45
49
 
@@ -62,11 +66,6 @@ module RuboCop
62
66
  ALLOWED_COMMENT_REGEXES.none? { |r| r.match?(line) }
63
67
  end
64
68
 
65
- def message(comment)
66
- keyword = line(comment).match(/(\S+).*#/)[1]
67
- format(MSG, keyword: keyword)
68
- end
69
-
70
69
  def line(comment)
71
70
  comment.location.expression.source_line
72
71
  end
@@ -208,10 +208,11 @@ module RuboCop
208
208
  # some_other_method
209
209
  # bar = 2
210
210
  # end
211
- class ConditionalAssignment < Cop
211
+ class ConditionalAssignment < Base
212
212
  include ConditionalAssignmentHelper
213
213
  include ConfigurableEnforcedStyle
214
214
  include IgnoredNode
215
+ extend AutoCorrector
215
216
 
216
217
  MSG = 'Use the return of the conditional for variable assignment ' \
217
218
  'and comparison.'
@@ -233,7 +234,7 @@ module RuboCop
233
234
  def_node_matcher :assignment_type?, <<~PATTERN
234
235
  {
235
236
  #{ASSIGNMENT_TYPES.join(' ')}
236
- (send _recv {:[]= :<< :=~ :!~ :<=> #end_with_eq?} ...)
237
+ (send _recv {:[]= :<< :=~ :!~ :<=> #end_with_eq? :< :>} ...)
237
238
  }
238
239
  PATTERN
239
240
 
@@ -275,14 +276,6 @@ module RuboCop
275
276
  check_node(node, branches)
276
277
  end
277
278
 
278
- def autocorrect(node)
279
- if assignment_type?(node)
280
- move_assignment_inside_condition(node)
281
- else
282
- move_assignment_outside_condition(node)
283
- end
284
- end
285
-
286
279
  private
287
280
 
288
281
  def check_assignment_to_condition(node)
@@ -298,7 +291,9 @@ module RuboCop
298
291
  return unless else_branch
299
292
  return if allowed_single_line?([*branches, else_branch])
300
293
 
301
- add_offense(node, message: ASSIGN_TO_CONDITION_MSG)
294
+ add_offense(node, message: ASSIGN_TO_CONDITION_MSG) do |corrector|
295
+ autocorrect(corrector, node)
296
+ end
302
297
  end
303
298
 
304
299
  def candidate_node?(node)
@@ -326,25 +321,25 @@ module RuboCop
326
321
  assignment
327
322
  end
328
323
 
329
- def move_assignment_outside_condition(node)
324
+ def move_assignment_outside_condition(corrector, node)
330
325
  if node.case_type?
331
- CaseCorrector.correct(self, node)
326
+ CaseCorrector.correct(corrector, self, node)
332
327
  elsif node.ternary?
333
- TernaryCorrector.correct(node)
328
+ TernaryCorrector.correct(corrector, node)
334
329
  elsif node.if? || node.unless?
335
- IfCorrector.correct(self, node)
330
+ IfCorrector.correct(corrector, self, node)
336
331
  end
337
332
  end
338
333
 
339
- def move_assignment_inside_condition(node)
334
+ def move_assignment_inside_condition(corrector, node)
340
335
  *_assignment, condition = *node
341
336
 
342
337
  if ternary_condition?(condition)
343
- TernaryCorrector.move_assignment_inside_condition(node)
338
+ TernaryCorrector.move_assignment_inside_condition(corrector, node)
344
339
  elsif condition.case_type?
345
- CaseCorrector.move_assignment_inside_condition(node)
340
+ CaseCorrector.move_assignment_inside_condition(corrector, node)
346
341
  elsif condition.if_type?
347
- IfCorrector.move_assignment_inside_condition(node)
342
+ IfCorrector.move_assignment_inside_condition(corrector, node)
348
343
  end
349
344
  end
350
345
 
@@ -371,7 +366,17 @@ module RuboCop
371
366
  return if allowed_single_line?(branches)
372
367
  return if correction_exceeds_line_limit?(node, branches)
373
368
 
374
- add_offense(node)
369
+ add_offense(node) do |corrector|
370
+ autocorrect(corrector, node)
371
+ end
372
+ end
373
+
374
+ def autocorrect(corrector, node)
375
+ if assignment_type?(node)
376
+ move_assignment_inside_condition(corrector, node)
377
+ else
378
+ move_assignment_outside_condition(corrector, node)
379
+ end
375
380
  end
376
381
 
377
382
  def allowed_statements?(branches)
@@ -499,24 +504,20 @@ module RuboCop
499
504
  include ConditionalAssignmentHelper
500
505
  include ConditionalCorrectorHelper
501
506
 
502
- def correct(node)
503
- lambda do |corrector|
504
- corrector.replace(node, correction(node))
505
- end
507
+ def correct(corrector, node)
508
+ corrector.replace(node, correction(node))
506
509
  end
507
510
 
508
- def move_assignment_inside_condition(node)
511
+ def move_assignment_inside_condition(corrector, node)
509
512
  *_var, rhs = *node
510
513
  if_branch, else_branch = extract_branches(node)
511
514
  assignment = assignment(node)
512
515
 
513
- lambda do |corrector|
514
- remove_parentheses(corrector, rhs) if Util.parentheses?(rhs)
515
- corrector.remove(assignment)
516
+ remove_parentheses(corrector, rhs) if Util.parentheses?(rhs)
517
+ corrector.remove(assignment)
516
518
 
517
- move_branch_inside_condition(corrector, if_branch, assignment)
518
- move_branch_inside_condition(corrector, else_branch, assignment)
519
- end
519
+ move_branch_inside_condition(corrector, if_branch, assignment)
520
+ move_branch_inside_condition(corrector, else_branch, assignment)
520
521
  end
521
522
 
522
523
  private
@@ -565,22 +566,19 @@ module RuboCop
565
566
  include ConditionalAssignmentHelper
566
567
  include ConditionalCorrectorHelper
567
568
 
568
- def correct(cop, node)
569
- ->(corrector) { correct_if_branches(corrector, cop, node) }
569
+ def correct(corrector, cop, node)
570
+ correct_if_branches(corrector, cop, node)
570
571
  end
571
572
 
572
- def move_assignment_inside_condition(node)
573
+ def move_assignment_inside_condition(corrector, node)
573
574
  column = node.loc.expression.column
574
575
  *_var, condition = *node
575
576
  assignment = assignment(node)
576
577
 
577
- lambda do |corrector|
578
- corrector.remove(assignment)
578
+ corrector.remove(assignment)
579
579
 
580
- condition.branches.flatten.each do |branch|
581
- move_branch_inside_condition(corrector, branch, condition,
582
- assignment, column)
583
- end
580
+ condition.branches.flatten.each do |branch|
581
+ move_branch_inside_condition(corrector, branch, condition, assignment, column)
584
582
  end
585
583
  end
586
584
 
@@ -614,31 +612,25 @@ module RuboCop
614
612
  include ConditionalAssignmentHelper
615
613
  include ConditionalCorrectorHelper
616
614
 
617
- def correct(cop, node)
615
+ def correct(corrector, cop, node)
618
616
  when_branches, else_branch = extract_tail_branches(node)
619
617
 
620
- lambda do |corrector|
621
- corrector.insert_before(node, lhs(else_branch))
622
- correct_branches(corrector, when_branches)
623
- replace_branch_assignment(corrector, else_branch)
618
+ corrector.insert_before(node, lhs(else_branch))
619
+ correct_branches(corrector, when_branches)
620
+ replace_branch_assignment(corrector, else_branch)
624
621
 
625
- corrector.insert_before(node.loc.end,
626
- indent(cop, lhs(else_branch)))
627
- end
622
+ corrector.insert_before(node.loc.end, indent(cop, lhs(else_branch)))
628
623
  end
629
624
 
630
- def move_assignment_inside_condition(node)
625
+ def move_assignment_inside_condition(corrector, node)
631
626
  column = node.loc.expression.column
632
627
  *_var, condition = *node
633
628
  assignment = assignment(node)
634
629
 
635
- lambda do |corrector|
636
- corrector.remove(assignment)
630
+ corrector.remove(assignment)
637
631
 
638
- extract_branches(condition).flatten.each do |branch|
639
- move_branch_inside_condition(corrector, branch, condition,
640
- assignment, column)
641
- end
632
+ extract_branches(condition).flatten.each do |branch|
633
+ move_branch_inside_condition(corrector, branch, condition, assignment, column)
642
634
  end
643
635
  end
644
636
 
@@ -656,17 +648,14 @@ module RuboCop
656
648
  [when_branches, case_node.else_branch]
657
649
  end
658
650
 
659
- def move_branch_inside_condition(corrector, branch, condition,
660
- assignment, column)
651
+ def move_branch_inside_condition(corrector, branch, condition, assignment, column)
661
652
  branch_assignment = tail(branch)
662
- corrector.insert_before(branch_assignment,
663
- assignment.source)
653
+ corrector.insert_before(branch_assignment, assignment.source)
664
654
 
665
655
  remove_whitespace_in_branches(corrector, branch, condition, column)
666
656
 
667
657
  parent_keyword = branch.parent.loc.keyword
668
- corrector.remove_preceding(parent_keyword,
669
- parent_keyword.column - column)
658
+ corrector.remove_preceding(parent_keyword, parent_keyword.column - column)
670
659
  end
671
660
  end
672
661
  end