rubocop 0.87.0 → 0.90.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 (508) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/bin/rubocop-profile +32 -0
  4. data/config/default.yml +232 -33
  5. data/lib/rubocop.rb +36 -4
  6. data/lib/rubocop/cached_data.rb +1 -0
  7. data/lib/rubocop/cli.rb +2 -2
  8. data/lib/rubocop/cli/command.rb +1 -0
  9. data/lib/rubocop/cli/command/auto_genenerate_config.rb +4 -3
  10. data/lib/rubocop/cli/command/base.rb +2 -0
  11. data/lib/rubocop/cli/command/execute_runner.rb +2 -1
  12. data/lib/rubocop/cli/command/init_dotfile.rb +1 -0
  13. data/lib/rubocop/cli/command/show_cops.rb +3 -2
  14. data/lib/rubocop/cli/command/version.rb +3 -2
  15. data/lib/rubocop/cli/environment.rb +1 -0
  16. data/lib/rubocop/comment_config.rb +10 -7
  17. data/lib/rubocop/config.rb +20 -3
  18. data/lib/rubocop/config_loader.rb +39 -16
  19. data/lib/rubocop/config_loader_resolver.rb +4 -3
  20. data/lib/rubocop/config_obsoletion.rb +7 -1
  21. data/lib/rubocop/config_store.rb +4 -0
  22. data/lib/rubocop/config_validator.rb +5 -4
  23. data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
  24. data/lib/rubocop/cop/badge.rb +1 -1
  25. data/lib/rubocop/cop/base.rb +37 -6
  26. data/lib/rubocop/cop/bundler/gem_comment.rb +7 -3
  27. data/lib/rubocop/cop/commissioner.rb +47 -8
  28. data/lib/rubocop/cop/cop.rb +1 -1
  29. data/lib/rubocop/cop/correctors/alignment_corrector.rb +4 -4
  30. data/lib/rubocop/cop/correctors/condition_corrector.rb +3 -5
  31. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +9 -10
  32. data/lib/rubocop/cop/correctors/line_break_corrector.rb +6 -6
  33. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +34 -3
  34. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -8
  35. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +6 -11
  36. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +8 -10
  37. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +15 -18
  38. data/lib/rubocop/cop/documentation.rb +22 -0
  39. data/lib/rubocop/cop/force.rb +1 -0
  40. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +38 -12
  41. data/lib/rubocop/cop/generator.rb +1 -0
  42. data/lib/rubocop/cop/generator/configuration_injector.rb +2 -2
  43. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +4 -12
  44. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -1
  45. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +8 -8
  46. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +10 -7
  47. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +7 -8
  48. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
  49. data/lib/rubocop/cop/layout/block_alignment.rb +24 -20
  50. data/lib/rubocop/cop/layout/class_structure.rb +15 -53
  51. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +4 -6
  52. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  53. data/lib/rubocop/cop/layout/condition_position.rb +13 -15
  54. data/lib/rubocop/cop/layout/def_end_alignment.rb +7 -4
  55. data/lib/rubocop/cop/layout/dot_position.rb +21 -17
  56. data/lib/rubocop/cop/layout/empty_comment.rb +30 -23
  57. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +19 -16
  58. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +13 -13
  59. data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +144 -0
  60. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +21 -23
  61. data/lib/rubocop/cop/layout/empty_lines.rb +6 -9
  62. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +5 -6
  63. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +7 -8
  64. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +3 -6
  65. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -5
  66. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +2 -5
  67. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -5
  68. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +2 -5
  69. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +2 -5
  70. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +2 -5
  71. data/lib/rubocop/cop/layout/end_alignment.rb +9 -9
  72. data/lib/rubocop/cop/layout/extra_spacing.rb +22 -36
  73. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +2 -5
  74. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +2 -5
  75. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +5 -9
  76. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +2 -5
  77. data/lib/rubocop/cop/layout/hash_alignment.rb +17 -20
  78. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +15 -14
  79. data/lib/rubocop/cop/layout/heredoc_indentation.rb +16 -13
  80. data/lib/rubocop/cop/layout/indentation_style.rb +0 -2
  81. data/lib/rubocop/cop/layout/initial_indentation.rb +6 -7
  82. data/lib/rubocop/cop/layout/leading_comment_space.rb +12 -10
  83. data/lib/rubocop/cop/layout/leading_empty_lines.rb +6 -11
  84. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +2 -5
  85. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +2 -5
  86. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +10 -14
  87. data/lib/rubocop/cop/layout/multiline_block_layout.rb +37 -24
  88. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +2 -5
  89. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +2 -5
  90. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +5 -9
  91. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -5
  92. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +2 -5
  93. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +18 -23
  94. data/lib/rubocop/cop/layout/space_after_colon.rb +11 -7
  95. data/lib/rubocop/cop/layout/space_after_comma.rb +2 -5
  96. data/lib/rubocop/cop/layout/space_after_method_name.rb +5 -6
  97. data/lib/rubocop/cop/layout/space_after_not.rb +9 -11
  98. data/lib/rubocop/cop/layout/space_after_semicolon.rb +2 -5
  99. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +3 -2
  100. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +20 -15
  101. data/lib/rubocop/cop/layout/space_around_keyword.rb +17 -18
  102. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +33 -66
  103. data/lib/rubocop/cop/layout/space_around_operators.rb +17 -16
  104. data/lib/rubocop/cop/layout/space_before_block_braces.rb +23 -22
  105. data/lib/rubocop/cop/layout/space_before_comma.rb +3 -5
  106. data/lib/rubocop/cop/layout/space_before_comment.rb +10 -7
  107. data/lib/rubocop/cop/layout/space_before_first_arg.rb +7 -7
  108. data/lib/rubocop/cop/layout/space_before_semicolon.rb +2 -5
  109. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -17
  110. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +16 -18
  111. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +3 -8
  112. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +17 -16
  113. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +16 -19
  114. data/lib/rubocop/cop/layout/space_inside_parens.rb +9 -14
  115. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +5 -10
  116. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +8 -17
  117. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +13 -16
  118. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +10 -11
  119. data/lib/rubocop/cop/layout/trailing_empty_lines.rb +10 -15
  120. data/lib/rubocop/cop/layout/trailing_whitespace.rb +11 -11
  121. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +7 -4
  122. data/lib/rubocop/cop/lint/ambiguous_operator.rb +15 -10
  123. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +11 -13
  124. data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
  125. data/lib/rubocop/cop/lint/big_decimal_new.rb +10 -10
  126. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +50 -0
  127. data/lib/rubocop/cop/lint/boolean_symbol.rb +16 -11
  128. data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
  129. data/lib/rubocop/cop/lint/constant_resolution.rb +2 -2
  130. data/lib/rubocop/cop/lint/debugger.rb +7 -1
  131. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +9 -10
  132. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +21 -17
  133. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +8 -2
  134. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
  135. data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +39 -0
  136. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
  137. data/lib/rubocop/cop/lint/duplicate_methods.rb +9 -6
  138. data/lib/rubocop/cop/lint/duplicate_require.rb +41 -0
  139. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +49 -0
  140. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  141. data/lib/rubocop/cop/lint/else_layout.rb +1 -1
  142. data/lib/rubocop/cop/lint/empty_conditional_body.rb +67 -0
  143. data/lib/rubocop/cop/lint/empty_ensure.rb +5 -5
  144. data/lib/rubocop/cop/lint/empty_expression.rb +2 -2
  145. data/lib/rubocop/cop/lint/empty_file.rb +53 -0
  146. data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -6
  147. data/lib/rubocop/cop/lint/empty_when.rb +2 -2
  148. data/lib/rubocop/cop/lint/ensure_return.rb +27 -29
  149. data/lib/rubocop/cop/lint/erb_new_arguments.rb +11 -10
  150. data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
  151. data/lib/rubocop/cop/lint/float_comparison.rb +93 -0
  152. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  153. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +5 -4
  154. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +13 -14
  155. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +5 -4
  156. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +8 -8
  157. data/lib/rubocop/cop/lint/inherit_exception.rb +12 -7
  158. data/lib/rubocop/cop/lint/interpolation_check.rb +18 -15
  159. data/lib/rubocop/cop/lint/literal_as_condition.rb +14 -2
  160. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -7
  161. data/lib/rubocop/cop/lint/loop.rb +23 -2
  162. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +6 -5
  163. data/lib/rubocop/cop/lint/missing_super.rb +99 -0
  164. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +3 -36
  165. data/lib/rubocop/cop/lint/multiple_comparison.rb +6 -9
  166. data/lib/rubocop/cop/lint/nested_method_definition.rb +14 -20
  167. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  168. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  169. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +82 -11
  170. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
  171. data/lib/rubocop/cop/lint/number_conversion.rb +6 -9
  172. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +11 -13
  173. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +80 -0
  174. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +4 -10
  175. data/lib/rubocop/cop/lint/percent_string_array.rb +3 -6
  176. data/lib/rubocop/cop/lint/percent_symbol_array.rb +13 -12
  177. data/lib/rubocop/cop/lint/raise_exception.rb +12 -10
  178. data/lib/rubocop/cop/lint/rand_one.rb +2 -2
  179. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +16 -19
  180. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +7 -11
  181. data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -7
  182. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +13 -9
  183. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +6 -13
  184. data/lib/rubocop/cop/lint/redundant_with_index.rb +11 -14
  185. data/lib/rubocop/cop/lint/redundant_with_object.rb +11 -14
  186. data/lib/rubocop/cop/lint/regexp_as_condition.rb +4 -6
  187. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -2
  188. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  189. data/lib/rubocop/cop/lint/rescue_type.rb +8 -8
  190. data/lib/rubocop/cop/lint/return_in_void_context.rb +2 -4
  191. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +3 -6
  192. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +14 -10
  193. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +7 -7
  194. data/lib/rubocop/cop/lint/script_permission.rb +10 -7
  195. data/lib/rubocop/cop/lint/self_assignment.rb +78 -0
  196. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +5 -11
  197. data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
  198. data/lib/rubocop/cop/lint/shadowed_exception.rb +2 -2
  199. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +7 -7
  200. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -1
  201. data/lib/rubocop/cop/lint/suppressed_exception.rb +4 -7
  202. data/lib/rubocop/cop/lint/to_json.rb +4 -6
  203. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +34 -0
  204. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +57 -0
  205. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +4 -4
  206. data/lib/rubocop/cop/lint/unified_integer.rb +4 -6
  207. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  208. data/lib/rubocop/cop/lint/unreachable_loop.rb +174 -0
  209. data/lib/rubocop/cop/lint/unused_block_argument.rb +8 -3
  210. data/lib/rubocop/cop/lint/unused_method_argument.rb +8 -3
  211. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
  212. data/lib/rubocop/cop/lint/uri_regexp.rb +11 -47
  213. data/lib/rubocop/cop/lint/useless_access_modifier.rb +25 -15
  214. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -4
  215. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -15
  216. data/lib/rubocop/cop/lint/useless_method_definition.rb +77 -0
  217. data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -6
  218. data/lib/rubocop/cop/lint/void.rb +3 -7
  219. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  220. data/lib/rubocop/cop/metrics/block_length.rb +2 -2
  221. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
  222. data/lib/rubocop/cop/metrics/class_length.rb +2 -2
  223. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
  224. data/lib/rubocop/cop/metrics/method_length.rb +2 -2
  225. data/lib/rubocop/cop/metrics/module_length.rb +2 -2
  226. data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -6
  227. data/lib/rubocop/cop/metrics/perceived_complexity.rb +7 -8
  228. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +50 -5
  229. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +53 -24
  230. data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +37 -0
  231. data/lib/rubocop/cop/migration/department_name.rb +14 -16
  232. data/lib/rubocop/cop/mixin/alignment.rb +5 -1
  233. data/lib/rubocop/cop/mixin/allowed_methods.rb +2 -0
  234. data/lib/rubocop/cop/mixin/annotation_comment.rb +5 -0
  235. data/lib/rubocop/cop/mixin/array_min_size.rb +1 -1
  236. data/lib/rubocop/cop/mixin/check_line_breakable.rb +17 -8
  237. data/lib/rubocop/cop/mixin/code_length.rb +22 -5
  238. data/lib/rubocop/cop/mixin/comments_help.rb +54 -0
  239. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +8 -7
  240. data/lib/rubocop/cop/mixin/empty_parameter.rb +3 -1
  241. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +3 -1
  242. data/lib/rubocop/cop/mixin/first_element_line_break.rb +3 -1
  243. data/lib/rubocop/cop/mixin/hash_transform_method.rb +22 -11
  244. data/lib/rubocop/cop/mixin/line_length_help.rb +1 -3
  245. data/lib/rubocop/cop/mixin/method_complexity.rb +10 -2
  246. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +3 -1
  247. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +13 -12
  248. data/lib/rubocop/cop/mixin/negative_conditional.rb +2 -2
  249. data/lib/rubocop/cop/mixin/percent_array.rb +16 -9
  250. data/lib/rubocop/cop/mixin/range_help.rb +18 -4
  251. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +1 -1
  252. data/lib/rubocop/cop/mixin/rescue_node.rb +10 -1
  253. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +4 -3
  254. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +4 -3
  255. data/lib/rubocop/cop/mixin/statement_modifier.rb +39 -10
  256. data/lib/rubocop/cop/mixin/surrounding_space.rb +8 -29
  257. data/lib/rubocop/cop/mixin/trailing_comma.rb +9 -11
  258. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +6 -13
  259. data/lib/rubocop/cop/mixin/unused_argument.rb +4 -6
  260. data/lib/rubocop/cop/mixin/visibility_help.rb +50 -0
  261. data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
  262. data/lib/rubocop/cop/naming/ascii_identifiers.rb +3 -3
  263. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
  264. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  265. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +2 -2
  266. data/lib/rubocop/cop/naming/constant_name.rb +2 -2
  267. data/lib/rubocop/cop/naming/file_name.rb +3 -3
  268. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +2 -2
  269. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +2 -2
  270. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -2
  271. data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
  272. data/lib/rubocop/cop/naming/predicate_name.rb +3 -5
  273. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -11
  274. data/lib/rubocop/cop/offense.rb +1 -0
  275. data/lib/rubocop/cop/registry.rb +3 -3
  276. data/lib/rubocop/cop/security/eval.rb +2 -2
  277. data/lib/rubocop/cop/security/json_load.rb +6 -8
  278. data/lib/rubocop/cop/security/marshal_load.rb +2 -4
  279. data/lib/rubocop/cop/security/open.rb +2 -2
  280. data/lib/rubocop/cop/security/yaml_load.rb +6 -6
  281. data/lib/rubocop/cop/severity.rb +0 -8
  282. data/lib/rubocop/cop/style/access_modifier_declarations.rb +16 -9
  283. data/lib/rubocop/cop/style/accessor_grouping.rb +33 -20
  284. data/lib/rubocop/cop/style/alias.rb +41 -36
  285. data/lib/rubocop/cop/style/and_or.rb +9 -11
  286. data/lib/rubocop/cop/style/array_coercion.rb +63 -0
  287. data/lib/rubocop/cop/style/array_join.rb +6 -8
  288. data/lib/rubocop/cop/style/ascii_comments.rb +4 -4
  289. data/lib/rubocop/cop/style/attr.rb +11 -9
  290. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +5 -7
  291. data/lib/rubocop/cop/style/bare_percent_literals.rb +10 -12
  292. data/lib/rubocop/cop/style/begin_block.rb +2 -2
  293. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +58 -38
  294. data/lib/rubocop/cop/style/block_comments.rb +14 -18
  295. data/lib/rubocop/cop/style/block_delimiters.rb +23 -23
  296. data/lib/rubocop/cop/style/case_equality.rb +29 -5
  297. data/lib/rubocop/cop/style/case_like_if.rb +236 -0
  298. data/lib/rubocop/cop/style/class_and_module_children.rb +14 -11
  299. data/lib/rubocop/cop/style/class_check.rb +7 -9
  300. data/lib/rubocop/cop/style/class_methods.rb +7 -11
  301. data/lib/rubocop/cop/style/class_methods_definitions.rb +131 -0
  302. data/lib/rubocop/cop/style/class_vars.rb +6 -10
  303. data/lib/rubocop/cop/style/collection_methods.rb +11 -17
  304. data/lib/rubocop/cop/style/colon_method_call.rb +8 -9
  305. data/lib/rubocop/cop/style/colon_method_definition.rb +6 -6
  306. data/lib/rubocop/cop/style/combinable_loops.rb +89 -0
  307. data/lib/rubocop/cop/style/command_literal.rb +23 -24
  308. data/lib/rubocop/cop/style/comment_annotation.rb +15 -15
  309. data/lib/rubocop/cop/style/commented_keyword.rb +6 -3
  310. data/lib/rubocop/cop/style/conditional_assignment.rb +13 -4
  311. data/lib/rubocop/cop/style/constant_visibility.rb +3 -2
  312. data/lib/rubocop/cop/style/copyright.rb +12 -12
  313. data/lib/rubocop/cop/style/date_time.rb +1 -1
  314. data/lib/rubocop/cop/style/def_with_parentheses.rb +8 -10
  315. data/lib/rubocop/cop/style/dir.rb +7 -10
  316. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +7 -9
  317. data/lib/rubocop/cop/style/documentation.rb +6 -8
  318. data/lib/rubocop/cop/style/documentation_method.rb +1 -1
  319. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +12 -15
  320. data/lib/rubocop/cop/style/double_negation.rb +2 -2
  321. data/lib/rubocop/cop/style/each_for_simple_loop.rb +5 -8
  322. data/lib/rubocop/cop/style/each_with_object.rb +16 -19
  323. data/lib/rubocop/cop/style/empty_block_parameter.rb +9 -10
  324. data/lib/rubocop/cop/style/empty_case_condition.rb +19 -20
  325. data/lib/rubocop/cop/style/empty_else.rb +17 -19
  326. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +9 -10
  327. data/lib/rubocop/cop/style/empty_literal.rb +15 -16
  328. data/lib/rubocop/cop/style/empty_method.rb +10 -13
  329. data/lib/rubocop/cop/style/encoding.rb +5 -9
  330. data/lib/rubocop/cop/style/end_block.rb +4 -6
  331. data/lib/rubocop/cop/style/eval_with_location.rb +9 -7
  332. data/lib/rubocop/cop/style/even_odd.rb +7 -11
  333. data/lib/rubocop/cop/style/expand_path_arguments.rb +21 -20
  334. data/lib/rubocop/cop/style/explicit_block_argument.rb +102 -0
  335. data/lib/rubocop/cop/style/exponential_notation.rb +7 -9
  336. data/lib/rubocop/cop/style/float_division.rb +8 -11
  337. data/lib/rubocop/cop/style/for.rb +11 -15
  338. data/lib/rubocop/cop/style/format_string.rb +21 -19
  339. data/lib/rubocop/cop/style/format_string_token.rb +10 -12
  340. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +19 -41
  341. data/lib/rubocop/cop/style/global_std_stream.rb +65 -0
  342. data/lib/rubocop/cop/style/global_vars.rb +2 -2
  343. data/lib/rubocop/cop/style/guard_clause.rb +6 -6
  344. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +69 -0
  345. data/lib/rubocop/cop/style/hash_each_methods.rb +5 -8
  346. data/lib/rubocop/cop/style/hash_like_case.rb +76 -0
  347. data/lib/rubocop/cop/style/hash_syntax.rb +10 -8
  348. data/lib/rubocop/cop/style/hash_transform_keys.rb +17 -3
  349. data/lib/rubocop/cop/style/hash_transform_values.rb +16 -2
  350. data/lib/rubocop/cop/style/identical_conditional_branches.rb +2 -2
  351. data/lib/rubocop/cop/style/if_inside_else.rb +3 -3
  352. data/lib/rubocop/cop/style/if_unless_modifier.rb +19 -41
  353. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +3 -7
  354. data/lib/rubocop/cop/style/if_with_semicolon.rb +3 -6
  355. data/lib/rubocop/cop/style/implicit_runtime_error.rb +1 -1
  356. data/lib/rubocop/cop/style/infinite_loop.rb +24 -24
  357. data/lib/rubocop/cop/style/inline_comment.rb +3 -3
  358. data/lib/rubocop/cop/style/inverse_methods.rb +22 -32
  359. data/lib/rubocop/cop/style/keyword_parameters_order.rb +58 -0
  360. data/lib/rubocop/cop/style/lambda.rb +7 -12
  361. data/lib/rubocop/cop/style/lambda_call.rb +14 -13
  362. data/lib/rubocop/cop/style/line_end_concatenation.rb +19 -16
  363. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -1
  364. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +16 -11
  365. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +4 -8
  366. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -7
  367. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +12 -3
  368. data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -16
  369. data/lib/rubocop/cop/style/min_max.rb +8 -12
  370. data/lib/rubocop/cop/style/missing_else.rb +11 -21
  371. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +10 -3
  372. data/lib/rubocop/cop/style/mixin_grouping.rb +24 -27
  373. data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
  374. data/lib/rubocop/cop/style/module_function.rb +10 -13
  375. data/lib/rubocop/cop/style/multiline_if_modifier.rb +3 -10
  376. data/lib/rubocop/cop/style/multiline_if_then.rb +4 -10
  377. data/lib/rubocop/cop/style/multiline_memoization.rb +14 -12
  378. data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -2
  379. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +4 -6
  380. data/lib/rubocop/cop/style/multiline_when_then.rb +9 -11
  381. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  382. data/lib/rubocop/cop/style/mutable_constant.rb +23 -20
  383. data/lib/rubocop/cop/style/negated_if.rb +6 -6
  384. data/lib/rubocop/cop/style/negated_unless.rb +6 -6
  385. data/lib/rubocop/cop/style/negated_while.rb +7 -15
  386. data/lib/rubocop/cop/style/nested_modifier.rb +10 -13
  387. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +14 -12
  388. data/lib/rubocop/cop/style/nested_ternary_operator.rb +14 -16
  389. data/lib/rubocop/cop/style/next.rb +10 -14
  390. data/lib/rubocop/cop/style/nil_comparison.rb +11 -11
  391. data/lib/rubocop/cop/style/non_nil_check.rb +32 -26
  392. data/lib/rubocop/cop/style/not.rb +19 -26
  393. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +4 -9
  394. data/lib/rubocop/cop/style/numeric_predicate.rb +11 -15
  395. data/lib/rubocop/cop/style/one_line_conditional.rb +71 -23
  396. data/lib/rubocop/cop/style/option_hash.rb +1 -1
  397. data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
  398. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +42 -0
  399. data/lib/rubocop/cop/style/or_assignment.rb +13 -10
  400. data/lib/rubocop/cop/style/parallel_assignment.rb +18 -18
  401. data/lib/rubocop/cop/style/parentheses_around_condition.rb +6 -6
  402. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +14 -20
  403. data/lib/rubocop/cop/style/percent_q_literals.rb +8 -10
  404. data/lib/rubocop/cop/style/perl_backrefs.rb +8 -10
  405. data/lib/rubocop/cop/style/preferred_hash_methods.rb +9 -14
  406. data/lib/rubocop/cop/style/proc.rb +6 -6
  407. data/lib/rubocop/cop/style/raise_args.rb +13 -24
  408. data/lib/rubocop/cop/style/random_with_offset.rb +16 -16
  409. data/lib/rubocop/cop/style/redundant_assignment.rb +8 -10
  410. data/lib/rubocop/cop/style/redundant_begin.rb +7 -9
  411. data/lib/rubocop/cop/style/redundant_capital_w.rb +6 -9
  412. data/lib/rubocop/cop/style/redundant_condition.rb +20 -9
  413. data/lib/rubocop/cop/style/redundant_exception.rb +4 -0
  414. data/lib/rubocop/cop/style/redundant_fetch_block.rb +3 -12
  415. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +50 -0
  416. data/lib/rubocop/cop/style/redundant_freeze.rb +3 -6
  417. data/lib/rubocop/cop/style/redundant_interpolation.rb +25 -24
  418. data/lib/rubocop/cop/style/redundant_parentheses.rb +7 -9
  419. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +6 -13
  420. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +16 -25
  421. data/lib/rubocop/cop/style/redundant_self.rb +2 -2
  422. data/lib/rubocop/cop/style/redundant_self_assignment.rb +116 -0
  423. data/lib/rubocop/cop/style/redundant_sort.rb +26 -12
  424. data/lib/rubocop/cop/style/regexp_literal.rb +10 -21
  425. data/lib/rubocop/cop/style/rescue_modifier.rb +29 -9
  426. data/lib/rubocop/cop/style/return_nil.rb +5 -5
  427. data/lib/rubocop/cop/style/safe_navigation.rb +17 -16
  428. data/lib/rubocop/cop/style/sample.rb +10 -13
  429. data/lib/rubocop/cop/style/self_assignment.rb +26 -22
  430. data/lib/rubocop/cop/style/semicolon.rb +6 -9
  431. data/lib/rubocop/cop/style/send.rb +2 -2
  432. data/lib/rubocop/cop/style/signal_exception.rb +23 -19
  433. data/lib/rubocop/cop/style/single_argument_dig.rb +54 -0
  434. data/lib/rubocop/cop/style/single_line_block_params.rb +4 -2
  435. data/lib/rubocop/cop/style/single_line_methods.rb +18 -17
  436. data/lib/rubocop/cop/style/slicing_with_range.rb +4 -7
  437. data/lib/rubocop/cop/style/sole_nested_conditional.rb +66 -0
  438. data/lib/rubocop/cop/style/special_global_vars.rb +10 -15
  439. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +17 -20
  440. data/lib/rubocop/cop/style/stderr_puts.rb +4 -6
  441. data/lib/rubocop/cop/style/string_concatenation.rb +92 -0
  442. data/lib/rubocop/cop/style/string_hash_keys.rb +6 -7
  443. data/lib/rubocop/cop/style/string_methods.rb +7 -17
  444. data/lib/rubocop/cop/style/strip.rb +8 -14
  445. data/lib/rubocop/cop/style/struct_inheritance.rb +4 -7
  446. data/lib/rubocop/cop/style/symbol_array.rb +6 -17
  447. data/lib/rubocop/cop/style/symbol_literal.rb +4 -6
  448. data/lib/rubocop/cop/style/symbol_proc.rb +15 -19
  449. data/lib/rubocop/cop/style/ternary_parentheses.rb +21 -20
  450. data/lib/rubocop/cop/style/trailing_body_on_class.rb +3 -6
  451. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +4 -7
  452. data/lib/rubocop/cop/style/trailing_body_on_module.rb +3 -6
  453. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +2 -5
  454. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +2 -5
  455. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +7 -6
  456. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +2 -5
  457. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +9 -32
  458. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +8 -17
  459. data/lib/rubocop/cop/style/trivial_accessors.rb +26 -30
  460. data/lib/rubocop/cop/style/unless_else.rb +5 -8
  461. data/lib/rubocop/cop/style/unpack_first.rb +4 -8
  462. data/lib/rubocop/cop/style/variable_interpolation.rb +7 -10
  463. data/lib/rubocop/cop/style/when_then.rb +4 -6
  464. data/lib/rubocop/cop/style/while_until_do.rb +6 -16
  465. data/lib/rubocop/cop/style/while_until_modifier.rb +6 -20
  466. data/lib/rubocop/cop/style/word_array.rb +5 -23
  467. data/lib/rubocop/cop/style/yoda_condition.rb +4 -15
  468. data/lib/rubocop/cop/style/zero_length_predicate.rb +19 -17
  469. data/lib/rubocop/cop/team.rb +2 -1
  470. data/lib/rubocop/cop/tokens_util.rb +84 -0
  471. data/lib/rubocop/cop/util.rb +3 -13
  472. data/lib/rubocop/cop/utils/format_string.rb +3 -5
  473. data/lib/rubocop/cop/variable_force.rb +2 -2
  474. data/lib/rubocop/cop/variable_force/branch.rb +1 -0
  475. data/lib/rubocop/cop/variable_force/variable.rb +7 -5
  476. data/lib/rubocop/cops_documentation_generator.rb +284 -0
  477. data/lib/rubocop/core_ext/string.rb +1 -1
  478. data/lib/rubocop/error.rb +1 -0
  479. data/lib/rubocop/ext/regexp_node.rb +46 -0
  480. data/lib/rubocop/file_finder.rb +13 -12
  481. data/lib/rubocop/formatter/auto_gen_config_formatter.rb +2 -1
  482. data/lib/rubocop/formatter/disabled_config_formatter.rb +2 -2
  483. data/lib/rubocop/formatter/formatter_set.rb +1 -0
  484. data/lib/rubocop/formatter/html_formatter.rb +2 -0
  485. data/lib/rubocop/formatter/junit_formatter.rb +1 -1
  486. data/lib/rubocop/formatter/progress_formatter.rb +2 -1
  487. data/lib/rubocop/formatter/quiet_formatter.rb +1 -1
  488. data/lib/rubocop/formatter/simple_text_formatter.rb +36 -6
  489. data/lib/rubocop/name_similarity.rb +1 -0
  490. data/lib/rubocop/options.rb +9 -6
  491. data/lib/rubocop/path_util.rb +17 -17
  492. data/lib/rubocop/rake_task.rb +1 -0
  493. data/lib/rubocop/remote_config.rb +1 -0
  494. data/lib/rubocop/result_cache.rb +13 -8
  495. data/lib/rubocop/rspec/cop_helper.rb +4 -1
  496. data/lib/rubocop/rspec/expect_offense.rb +49 -7
  497. data/lib/rubocop/rspec/shared_contexts.rb +25 -14
  498. data/lib/rubocop/runner.rb +7 -7
  499. data/lib/rubocop/string_interpreter.rb +3 -0
  500. data/lib/rubocop/target_finder.rb +14 -10
  501. data/lib/rubocop/target_ruby.rb +6 -0
  502. data/lib/rubocop/version.rb +3 -2
  503. data/lib/rubocop/yaml_duplication_checker.rb +1 -0
  504. metadata +42 -8
  505. data/lib/rubocop/cop/lint/useless_comparison.rb +0 -28
  506. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +0 -37
  507. data/lib/rubocop/cop/mixin/too_many_lines.rb +0 -25
  508. data/lib/rubocop/cop/style/method_missing_super.rb +0 -34
@@ -18,14 +18,17 @@ module RuboCop
18
18
  # @example
19
19
  # # bad
20
20
  # {a: 1, b: 2}.each_with_object({}) { |(k, v), h| h[foo(k)] = v }
21
- # {a: 1, b: 2}.map { |k, v| [k.to_s, v] }
21
+ # Hash[{a: 1, b: 2}.collect { |k, v| [foo(k), v] }]
22
+ # {a: 1, b: 2}.map { |k, v| [k.to_s, v] }.to_h
23
+ # {a: 1, b: 2}.to_h { |k, v| [k.to_s, v] }
22
24
  #
23
25
  # # good
24
26
  # {a: 1, b: 2}.transform_keys { |k| foo(k) }
25
27
  # {a: 1, b: 2}.transform_keys { |k| k.to_s }
26
- class HashTransformKeys < Cop
27
- extend TargetRubyVersion
28
+ class HashTransformKeys < Base
28
29
  include HashTransformMethod
30
+ extend TargetRubyVersion
31
+ extend AutoCorrector
29
32
 
30
33
  minimum_target_ruby_version 2.5
31
34
 
@@ -67,6 +70,17 @@ module RuboCop
67
70
  :to_h)
68
71
  PATTERN
69
72
 
73
+ def_node_matcher :on_bad_to_h, <<~PATTERN
74
+ (block
75
+ ({send csend}
76
+ !{(send _ :each_with_index) (array ...)}
77
+ :to_h)
78
+ (args
79
+ (arg $_)
80
+ (arg _val))
81
+ (array $_ $(lvar _val)))
82
+ PATTERN
83
+
70
84
  private
71
85
 
72
86
  def extract_captures(match)
@@ -18,13 +18,16 @@ module RuboCop
18
18
  # @example
19
19
  # # bad
20
20
  # {a: 1, b: 2}.each_with_object({}) { |(k, v), h| h[k] = foo(v) }
21
- # {a: 1, b: 2}.map { |k, v| [k, v * v] }
21
+ # Hash[{a: 1, b: 2}.collect { |k, v| [k, foo(v)] }]
22
+ # {a: 1, b: 2}.map { |k, v| [k, v * v] }.to_h
23
+ # {a: 1, b: 2}.to_h { |k, v| [k, v * v] }
22
24
  #
23
25
  # # good
24
26
  # {a: 1, b: 2}.transform_values { |v| foo(v) }
25
27
  # {a: 1, b: 2}.transform_values { |v| v * v }
26
- class HashTransformValues < Cop
28
+ class HashTransformValues < Base
27
29
  include HashTransformMethod
30
+ extend AutoCorrector
28
31
 
29
32
  def_node_matcher :on_bad_each_with_object, <<~PATTERN
30
33
  (block
@@ -64,6 +67,17 @@ module RuboCop
64
67
  :to_h)
65
68
  PATTERN
66
69
 
70
+ def_node_matcher :on_bad_to_h, <<~PATTERN
71
+ (block
72
+ ({send csend}
73
+ !{(send _ :each_with_index) (array ...)}
74
+ :to_h)
75
+ (args
76
+ (arg _key)
77
+ (arg $_))
78
+ (array $(lvar _key) $_))
79
+ PATTERN
80
+
67
81
  private
68
82
 
69
83
  def extract_captures(match)
@@ -62,7 +62,7 @@ module RuboCop
62
62
  # do_x
63
63
  # do_z
64
64
  # end
65
- class IdenticalConditionalBranches < Cop
65
+ class IdenticalConditionalBranches < Base
66
66
  MSG = 'Move `%<source>s` out of the conditional.'
67
67
 
68
68
  def on_if(node)
@@ -81,7 +81,7 @@ module RuboCop
81
81
 
82
82
  private
83
83
 
84
- def check_branches(branches) # rubocop:todo Metrics/CyclomaticComplexity
84
+ def check_branches(branches) # rubocop:todo Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
85
85
  # return if any branch is empty. An empty branch can be an `if`
86
86
  # without an `else` or a branch that contains only comments.
87
87
  return if branches.any?(&:nil?)
@@ -58,10 +58,10 @@ module RuboCop
58
58
  # action_b
59
59
  # end
60
60
  #
61
- class IfInsideElse < Cop
61
+ class IfInsideElse < Base
62
62
  MSG = 'Convert `if` nested inside `else` to `elsif`.'
63
63
 
64
- def on_if(node) # rubocop:todo Metrics/CyclomaticComplexity
64
+ def on_if(node)
65
65
  return if node.ternary? || node.unless?
66
66
 
67
67
  else_branch = node.else_branch
@@ -69,7 +69,7 @@ module RuboCop
69
69
  return unless else_branch&.if_type? && else_branch&.if?
70
70
  return if allow_if_modifier_in_else_branch?(else_branch)
71
71
 
72
- add_offense(else_branch, location: :keyword)
72
+ add_offense(else_branch.loc.keyword)
73
73
  end
74
74
 
75
75
  private
@@ -30,10 +30,11 @@ module RuboCop
30
30
  # if long_condition
31
31
  # do_something_in_a_method_with_a_long_name(arg)
32
32
  # end
33
- class IfUnlessModifier < Cop
33
+ class IfUnlessModifier < Base
34
34
  include StatementModifier
35
35
  include LineLengthHelp
36
36
  include IgnoredPattern
37
+ extend AutoCorrector
37
38
 
38
39
  MSG_USE_MODIFIER = 'Favor modifier `%<keyword>s` usage when having a ' \
39
40
  'single-line body. Another good alternative is ' \
@@ -41,33 +42,30 @@ module RuboCop
41
42
  MSG_USE_NORMAL =
42
43
  'Modifier form of `%<keyword>s` makes the line too long.'
43
44
 
44
- ASSIGNMENT_TYPES = %i[lvasgn casgn cvasgn
45
- gvasgn ivasgn masgn].freeze
46
-
47
45
  def on_if(node)
48
- msg = if eligible_node?(node)
49
- MSG_USE_MODIFIER unless named_capture_in_condition?(node)
46
+ msg = if single_line_as_modifier?(node) && !named_capture_in_condition?(node)
47
+ MSG_USE_MODIFIER
50
48
  elsif too_long_due_to_modifier?(node)
51
49
  MSG_USE_NORMAL
52
50
  end
53
51
  return unless msg
54
52
 
55
- add_offense(node,
56
- location: :keyword,
57
- message: format(msg, keyword: node.keyword))
53
+ add_offense(node.loc.keyword, message: format(msg, keyword: node.keyword)) do |corrector|
54
+ autocorrect(corrector, node)
55
+ end
58
56
  end
59
57
 
60
- def autocorrect(node)
58
+ private
59
+
60
+ def autocorrect(corrector, node)
61
61
  replacement = if node.modifier_form?
62
62
  to_normal_form(node)
63
63
  else
64
64
  to_modifier_form(node)
65
65
  end
66
- ->(corrector) { corrector.replace(node, replacement) }
66
+ corrector.replace(node, replacement)
67
67
  end
68
68
 
69
- private
70
-
71
69
  def too_long_due_to_modifier?(node)
72
70
  node.modifier_form? && too_long_single_line?(node) &&
73
71
  !another_statement_on_same_line?(node)
@@ -125,13 +123,15 @@ module RuboCop
125
123
  node.condition.match_with_lvasgn_type?
126
124
  end
127
125
 
128
- def eligible_node?(node)
129
- !non_eligible_if?(node) && !node.chained? &&
130
- !node.nested_conditional? && single_line_as_modifier?(node)
126
+ def non_eligible_node?(node)
127
+ non_simple_if_unless?(node) ||
128
+ node.chained? ||
129
+ node.nested_conditional? ||
130
+ super
131
131
  end
132
132
 
133
- def non_eligible_if?(node)
134
- node.ternary? || node.modifier_form? || node.elsif? || node.else?
133
+ def non_simple_if_unless?(node)
134
+ node.ternary? || node.elsif? || node.else?
135
135
  end
136
136
 
137
137
  def another_statement_on_same_line?(node)
@@ -149,25 +149,6 @@ module RuboCop
149
149
  sibling.source_range.first_line == line_no
150
150
  end
151
151
 
152
- def parenthesize?(node)
153
- # Parenthesize corrected expression if changing to modifier-if form
154
- # would change the meaning of the parent expression
155
- # (due to the low operator precedence of modifier-if)
156
- return false if node.parent.nil?
157
- return true if ASSIGNMENT_TYPES.include?(node.parent.type)
158
-
159
- node.parent.send_type? && !node.parent.parenthesized?
160
- end
161
-
162
- def to_modifier_form(node)
163
- expression = [node.body.source,
164
- node.keyword,
165
- node.condition.source,
166
- first_line_comment(node)].compact.join(' ')
167
-
168
- parenthesize?(node) ? "(#{expression})" : expression
169
- end
170
-
171
152
  def to_normal_form(node)
172
153
  indentation = ' ' * node.source_range.column
173
154
  <<~RUBY.chomp
@@ -178,10 +159,7 @@ module RuboCop
178
159
  end
179
160
 
180
161
  def first_line_comment(node)
181
- comment =
182
- processed_source.find_comment { |c| c.loc.line == node.loc.line }
183
-
184
- comment ? comment.loc.expression.source : nil
162
+ processed_source.comment_at_line(node.loc.line)&.text
185
163
  end
186
164
  end
187
165
  end
@@ -22,20 +22,16 @@ module RuboCop
22
22
  # if running?
23
23
  # tired? ? 'stop' : 'go faster'
24
24
  # end
25
- class IfUnlessModifierOfIfUnless < Cop
25
+ class IfUnlessModifierOfIfUnless < Base
26
26
  include StatementModifier
27
+ extend AutoCorrector
27
28
 
28
29
  MSG = 'Avoid modifier `%<keyword>s` after another conditional.'
29
30
 
30
31
  def on_if(node)
31
32
  return unless node.modifier_form? && node.body.if_type?
32
33
 
33
- add_offense(node, location: :keyword,
34
- message: format(MSG, keyword: node.keyword))
35
- end
36
-
37
- def autocorrect(node)
38
- lambda do |corrector|
34
+ add_offense(node.loc.keyword, message: format(MSG, keyword: node.keyword)) do |corrector|
39
35
  keyword = node.if? ? 'if' : 'unless'
40
36
 
41
37
  corrector.replace(node, <<~RUBY.chop)
@@ -13,8 +13,9 @@ module RuboCop
13
13
  # # good
14
14
  # result = some_condition ? something : another_thing
15
15
  #
16
- class IfWithSemicolon < Cop
16
+ class IfWithSemicolon < Base
17
17
  include OnNormalIfUnless
18
+ extend AutoCorrector
18
19
 
19
20
  MSG = 'Do not use if x; Use the ternary operator instead.'
20
21
 
@@ -24,11 +25,7 @@ module RuboCop
24
25
  beginning = node.loc.begin
25
26
  return unless beginning&.is?(';')
26
27
 
27
- add_offense(node)
28
- end
29
-
30
- def autocorrect(node)
31
- lambda do |corrector|
28
+ add_offense(node) do |corrector|
32
29
  corrector.replace(node, correct_to_ternary(node))
33
30
  end
34
31
  end
@@ -14,7 +14,7 @@ module RuboCop
14
14
  #
15
15
  # # good
16
16
  # raise ArgumentError, 'Error message here'
17
- class ImplicitRuntimeError < Cop
17
+ class ImplicitRuntimeError < Base
18
18
  MSG = 'Use `%<method>s` with an explicit exception class and message,' \
19
19
  ' rather than just a message.'
20
20
 
@@ -15,13 +15,15 @@ module RuboCop
15
15
  # loop do
16
16
  # work
17
17
  # end
18
- class InfiniteLoop < Cop
18
+ class InfiniteLoop < Base
19
+ extend AutoCorrector
20
+
19
21
  LEADING_SPACE = /\A(\s*)/.freeze
20
22
 
21
23
  MSG = 'Use `Kernel#loop` for infinite loops.'
22
24
 
23
- def join_force?(force_class)
24
- force_class == VariableForce
25
+ def self.joining_forces
26
+ VariableForce
25
27
  end
26
28
 
27
29
  def after_leaving_scope(scope, _variable_table)
@@ -40,16 +42,6 @@ module RuboCop
40
42
  alias on_while_post on_while
41
43
  alias on_until_post on_until
42
44
 
43
- def autocorrect(node)
44
- if node.while_post_type? || node.until_post_type?
45
- replace_begin_end_with_modifier(node)
46
- elsif node.modifier_form?
47
- replace_source(node.source_range, modifier_replacement(node))
48
- else
49
- replace_source(non_modifier_range(node), 'loop do')
50
- end
51
- end
52
-
53
45
  private
54
46
 
55
47
  def while_or_until(node)
@@ -66,7 +58,19 @@ module RuboCop
66
58
  referenced_after_loop?(var, range)
67
59
  end
68
60
 
69
- add_offense(node, location: :keyword)
61
+ add_offense(node.loc.keyword) do |corrector|
62
+ autocorrect(corrector, node)
63
+ end
64
+ end
65
+
66
+ def autocorrect(corrector, node)
67
+ if node.while_post_type? || node.until_post_type?
68
+ replace_begin_end_with_modifier(corrector, node)
69
+ elsif node.modifier_form?
70
+ replace_source(corrector, node.source_range, modifier_replacement(node))
71
+ else
72
+ replace_source(corrector, non_modifier_range(node), 'loop do')
73
+ end
70
74
  end
71
75
 
72
76
  def assigned_inside_loop?(var, range)
@@ -83,23 +87,19 @@ module RuboCop
83
87
  var.references.any? { |r| r.node.source_range.begin_pos > e }
84
88
  end
85
89
 
86
- def replace_begin_end_with_modifier(node)
87
- lambda do |corrector|
88
- corrector.replace(node.body.loc.begin, 'loop do')
89
- corrector.remove(node.body.loc.end.end.join(node.source_range.end))
90
- end
90
+ def replace_begin_end_with_modifier(corrector, node)
91
+ corrector.replace(node.body.loc.begin, 'loop do')
92
+ corrector.remove(node.body.loc.end.end.join(node.source_range.end))
91
93
  end
92
94
 
93
- def replace_source(range, replacement)
94
- lambda do |corrector|
95
- corrector.replace(range, replacement)
96
- end
95
+ def replace_source(corrector, range, replacement)
96
+ corrector.replace(range, replacement)
97
97
  end
98
98
 
99
99
  def modifier_replacement(node)
100
100
  body = node.body
101
101
  if node.single_line?
102
- 'loop { ' + body.source + ' }'
102
+ "loop { #{body.source} }"
103
103
  else
104
104
  indentation = body.source_range.source_line[LEADING_SPACE]
105
105
 
@@ -17,11 +17,11 @@ module RuboCop
17
17
  # foo.each do |f|
18
18
  # f.bar # Trailing inline comment
19
19
  # end
20
- class InlineComment < Cop
20
+ class InlineComment < Base
21
21
  MSG = 'Avoid trailing inline comments.'
22
22
 
23
- def investigate(processed_source)
24
- processed_source.each_comment do |comment|
23
+ def on_new_investigation
24
+ processed_source.comments.each do |comment|
25
25
  next if comment_line?(processed_source[comment.loc.line - 1]) ||
26
26
  comment.text.match?(/\A# rubocop:(enable|disable)/)
27
27
 
@@ -33,9 +33,10 @@ module RuboCop
33
33
  # next if f.zero?
34
34
  # f != 1
35
35
  # end
36
- class InverseMethods < Cop
36
+ class InverseMethods < Base
37
37
  include IgnoredNode
38
38
  include RangeHelp
39
+ extend AutoCorrector
39
40
 
40
41
  MSG = 'Use `%<inverse>s` instead of inverting `%<method>s`.'
41
42
  CLASS_COMPARISON_METHODS = %i[<= >= < >].freeze
@@ -64,16 +65,15 @@ module RuboCop
64
65
  PATTERN
65
66
 
66
67
  def on_send(node)
67
- return if part_of_ignored_node?(node)
68
-
69
68
  inverse_candidate?(node) do |_method_call, lhs, method, rhs|
70
69
  return unless inverse_methods.key?(method)
71
- return if possible_class_hierarchy_check?(lhs, rhs, method)
72
70
  return if negated?(node)
71
+ return if part_of_ignored_node?(node)
72
+ return if possible_class_hierarchy_check?(lhs, rhs, method)
73
73
 
74
- add_offense(node,
75
- message: format(MSG, method: method,
76
- inverse: inverse_methods[method]))
74
+ add_offense(node, message: message(method, inverse_methods[method])) do |corrector|
75
+ correct_inverse_method(corrector, node)
76
+ end
77
77
  end
78
78
  end
79
79
 
@@ -87,40 +87,28 @@ module RuboCop
87
87
  # offense, such as `y.reject { |key, _value| !(key =~ /c\d/) }`,
88
88
  # can cause auto-correction to apply improper corrections.
89
89
  ignore_node(block)
90
- add_offense(node,
91
- message: format(MSG, method: method,
92
- inverse: inverse_blocks[method]))
90
+ add_offense(node, message: message(method, inverse_blocks[method])) do |corrector|
91
+ correct_inverse_block(corrector, node)
92
+ end
93
93
  end
94
94
  end
95
95
 
96
- def autocorrect(node)
97
- if node.block_type?
98
- correct_inverse_block(node)
99
- elsif node.send_type?
100
- correct_inverse_method(node)
101
- end
102
- end
96
+ private
103
97
 
104
- def correct_inverse_method(node)
98
+ def correct_inverse_method(corrector, node)
105
99
  method_call, _lhs, method, _rhs = inverse_candidate?(node)
106
100
  return unless method_call && method
107
101
 
108
- lambda do |corrector|
109
- corrector.remove(not_to_receiver(node, method_call))
110
- corrector.replace(method_call.loc.selector,
111
- inverse_methods[method].to_s)
112
- remove_end_parenthesis(corrector, node, method, method_call)
113
- end
102
+ corrector.remove(not_to_receiver(node, method_call))
103
+ corrector.replace(method_call.loc.selector, inverse_methods[method].to_s)
104
+ remove_end_parenthesis(corrector, node, method, method_call)
114
105
  end
115
106
 
116
- def correct_inverse_block(node)
107
+ def correct_inverse_block(corrector, node)
117
108
  method_call, method, block = inverse_block?(node)
118
109
 
119
- lambda do |corrector|
120
- corrector.replace(method_call.loc.selector,
121
- inverse_blocks[method].to_s)
122
- correct_inverse_selector(block, corrector)
123
- end
110
+ corrector.replace(method_call.loc.selector, inverse_blocks[method].to_s)
111
+ correct_inverse_selector(block, corrector)
124
112
  end
125
113
 
126
114
  def correct_inverse_selector(block, corrector)
@@ -140,8 +128,6 @@ module RuboCop
140
128
  end
141
129
  end
142
130
 
143
- private
144
-
145
131
  def inverse_methods
146
132
  @inverse_methods ||= cop_config['InverseMethods']
147
133
  .merge(cop_config['InverseMethods'].invert)
@@ -191,6 +177,10 @@ module RuboCop
191
177
 
192
178
  corrector.remove(end_parentheses(node, method_call))
193
179
  end
180
+
181
+ def message(method, inverse)
182
+ format(MSG, method: method, inverse: inverse)
183
+ end
194
184
  end
195
185
  end
196
186
  end