rubocop 0.86.0 → 0.89.1

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 (377) 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 +198 -25
  5. data/lib/rubocop.rb +30 -5
  6. data/lib/rubocop/cli.rb +2 -4
  7. data/lib/rubocop/cli/command/auto_genenerate_config.rb +42 -7
  8. data/lib/rubocop/cli/command/base.rb +1 -0
  9. data/lib/rubocop/cli/command/execute_runner.rb +1 -1
  10. data/lib/rubocop/cli/command/show_cops.rb +3 -3
  11. data/lib/rubocop/cli/command/version.rb +2 -2
  12. data/lib/rubocop/comment_config.rb +5 -7
  13. data/lib/rubocop/config.rb +20 -3
  14. data/lib/rubocop/config_loader.rb +41 -69
  15. data/lib/rubocop/config_loader_resolver.rb +3 -3
  16. data/lib/rubocop/config_obsoletion.rb +6 -2
  17. data/lib/rubocop/config_store.rb +4 -0
  18. data/lib/rubocop/config_validator.rb +2 -4
  19. data/lib/rubocop/cop/autocorrect_logic.rb +14 -24
  20. data/lib/rubocop/cop/badge.rb +1 -1
  21. data/lib/rubocop/cop/base.rb +407 -0
  22. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +10 -20
  23. data/lib/rubocop/cop/commissioner.rb +47 -50
  24. data/lib/rubocop/cop/cop.rb +85 -236
  25. data/lib/rubocop/cop/corrector.rb +38 -115
  26. data/lib/rubocop/cop/correctors/line_break_corrector.rb +4 -4
  27. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +26 -0
  28. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
  29. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +1 -1
  30. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +15 -18
  31. data/lib/rubocop/cop/force.rb +1 -0
  32. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +38 -12
  33. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +1 -1
  34. data/lib/rubocop/cop/generator.rb +1 -1
  35. data/lib/rubocop/cop/generator/configuration_injector.rb +2 -2
  36. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +4 -12
  37. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -1
  38. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +11 -14
  39. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +8 -8
  40. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +10 -7
  41. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +7 -8
  42. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
  43. data/lib/rubocop/cop/layout/block_alignment.rb +1 -1
  44. data/lib/rubocop/cop/layout/case_indentation.rb +18 -19
  45. data/lib/rubocop/cop/layout/class_structure.rb +5 -44
  46. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  47. data/lib/rubocop/cop/layout/empty_lines.rb +0 -2
  48. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +1 -0
  49. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +1 -8
  50. data/lib/rubocop/cop/layout/end_alignment.rb +3 -2
  51. data/lib/rubocop/cop/layout/extra_spacing.rb +22 -36
  52. data/lib/rubocop/cop/layout/first_argument_indentation.rb +4 -0
  53. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -1
  54. data/lib/rubocop/cop/layout/hash_alignment.rb +1 -2
  55. data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
  56. data/lib/rubocop/cop/layout/indentation_style.rb +0 -2
  57. data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
  58. data/lib/rubocop/cop/layout/multiline_block_layout.rb +16 -6
  59. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
  60. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +0 -2
  61. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +22 -27
  62. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +33 -66
  63. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +3 -2
  64. data/lib/rubocop/cop/legacy/corrections_proxy.rb +49 -0
  65. data/lib/rubocop/cop/legacy/corrector.rb +29 -0
  66. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +7 -4
  67. data/lib/rubocop/cop/lint/ambiguous_operator.rb +15 -10
  68. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +11 -13
  69. data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
  70. data/lib/rubocop/cop/lint/big_decimal_new.rb +10 -10
  71. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +50 -0
  72. data/lib/rubocop/cop/lint/boolean_symbol.rb +16 -11
  73. data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
  74. data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
  75. data/lib/rubocop/cop/lint/debugger.rb +7 -1
  76. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +9 -10
  77. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +21 -17
  78. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +8 -2
  79. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
  80. data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +39 -0
  81. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
  82. data/lib/rubocop/cop/lint/duplicate_methods.rb +9 -6
  83. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +60 -0
  84. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  85. data/lib/rubocop/cop/lint/else_layout.rb +1 -1
  86. data/lib/rubocop/cop/lint/empty_conditional_body.rb +67 -0
  87. data/lib/rubocop/cop/lint/empty_ensure.rb +5 -5
  88. data/lib/rubocop/cop/lint/empty_expression.rb +2 -2
  89. data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -6
  90. data/lib/rubocop/cop/lint/empty_when.rb +2 -2
  91. data/lib/rubocop/cop/lint/ensure_return.rb +27 -29
  92. data/lib/rubocop/cop/lint/erb_new_arguments.rb +11 -10
  93. data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
  94. data/lib/rubocop/cop/lint/float_comparison.rb +93 -0
  95. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  96. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +5 -4
  97. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +13 -14
  98. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +5 -4
  99. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +8 -8
  100. data/lib/rubocop/cop/lint/inherit_exception.rb +12 -7
  101. data/lib/rubocop/cop/lint/interpolation_check.rb +21 -5
  102. data/lib/rubocop/cop/lint/literal_as_condition.rb +14 -2
  103. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -7
  104. data/lib/rubocop/cop/lint/loop.rb +23 -2
  105. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +6 -5
  106. data/lib/rubocop/cop/lint/missing_super.rb +99 -0
  107. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  108. data/lib/rubocop/cop/lint/multiple_comparison.rb +6 -9
  109. data/lib/rubocop/cop/lint/nested_method_definition.rb +15 -21
  110. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  111. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  112. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +84 -13
  113. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
  114. data/lib/rubocop/cop/lint/number_conversion.rb +6 -9
  115. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +11 -13
  116. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +90 -0
  117. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +12 -13
  118. data/lib/rubocop/cop/lint/percent_string_array.rb +13 -12
  119. data/lib/rubocop/cop/lint/percent_symbol_array.rb +13 -12
  120. data/lib/rubocop/cop/lint/raise_exception.rb +12 -10
  121. data/lib/rubocop/cop/lint/rand_one.rb +3 -3
  122. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +41 -40
  123. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +7 -11
  124. data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -7
  125. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +15 -11
  126. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +6 -13
  127. data/lib/rubocop/cop/lint/redundant_with_index.rb +11 -14
  128. data/lib/rubocop/cop/lint/redundant_with_object.rb +11 -14
  129. data/lib/rubocop/cop/lint/regexp_as_condition.rb +4 -6
  130. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -2
  131. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  132. data/lib/rubocop/cop/lint/rescue_type.rb +8 -8
  133. data/lib/rubocop/cop/lint/return_in_void_context.rb +2 -4
  134. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +3 -6
  135. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +14 -10
  136. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +10 -2
  137. data/lib/rubocop/cop/lint/script_permission.rb +10 -7
  138. data/lib/rubocop/cop/lint/self_assignment.rb +78 -0
  139. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +5 -11
  140. data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
  141. data/lib/rubocop/cop/lint/shadowed_exception.rb +2 -2
  142. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +3 -3
  143. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -1
  144. data/lib/rubocop/cop/lint/suppressed_exception.rb +4 -7
  145. data/lib/rubocop/cop/lint/syntax.rb +11 -26
  146. data/lib/rubocop/cop/lint/to_json.rb +4 -6
  147. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +34 -0
  148. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +4 -4
  149. data/lib/rubocop/cop/lint/unified_integer.rb +4 -6
  150. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  151. data/lib/rubocop/cop/lint/unreachable_loop.rb +174 -0
  152. data/lib/rubocop/cop/lint/unused_block_argument.rb +8 -3
  153. data/lib/rubocop/cop/lint/unused_method_argument.rb +9 -4
  154. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
  155. data/lib/rubocop/cop/lint/uri_regexp.rb +11 -47
  156. data/lib/rubocop/cop/lint/useless_access_modifier.rb +26 -16
  157. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -4
  158. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -15
  159. data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -6
  160. data/lib/rubocop/cop/lint/void.rb +3 -7
  161. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  162. data/lib/rubocop/cop/metrics/block_length.rb +24 -2
  163. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
  164. data/lib/rubocop/cop/metrics/class_length.rb +26 -3
  165. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
  166. data/lib/rubocop/cop/metrics/method_length.rb +25 -2
  167. data/lib/rubocop/cop/metrics/module_length.rb +26 -3
  168. data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -6
  169. data/lib/rubocop/cop/metrics/perceived_complexity.rb +7 -8
  170. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +48 -5
  171. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +157 -0
  172. data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +37 -0
  173. data/lib/rubocop/cop/migration/department_name.rb +14 -16
  174. data/lib/rubocop/cop/mixin/alignment.rb +2 -1
  175. data/lib/rubocop/cop/mixin/allowed_methods.rb +19 -0
  176. data/lib/rubocop/cop/mixin/array_min_size.rb +1 -1
  177. data/lib/rubocop/cop/mixin/auto_corrector.rb +12 -0
  178. data/lib/rubocop/cop/mixin/check_line_breakable.rb +2 -2
  179. data/lib/rubocop/cop/mixin/code_length.rb +26 -5
  180. data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -1
  181. data/lib/rubocop/cop/mixin/enforce_superclass.rb +3 -1
  182. data/lib/rubocop/cop/mixin/hash_transform_method.rb +5 -11
  183. data/lib/rubocop/cop/mixin/line_length_help.rb +1 -3
  184. data/lib/rubocop/cop/mixin/method_complexity.rb +10 -2
  185. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -2
  186. data/lib/rubocop/cop/mixin/nil_methods.rb +3 -5
  187. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +6 -1
  188. data/lib/rubocop/cop/mixin/percent_array.rb +2 -6
  189. data/lib/rubocop/cop/mixin/range_help.rb +18 -4
  190. data/lib/rubocop/cop/mixin/statement_modifier.rb +39 -10
  191. data/lib/rubocop/cop/mixin/surrounding_space.rb +4 -24
  192. data/lib/rubocop/cop/mixin/trailing_comma.rb +2 -4
  193. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +10 -15
  194. data/lib/rubocop/cop/mixin/unused_argument.rb +4 -6
  195. data/lib/rubocop/cop/mixin/visibility_help.rb +50 -0
  196. data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
  197. data/lib/rubocop/cop/naming/ascii_identifiers.rb +29 -6
  198. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +3 -3
  199. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  200. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +2 -2
  201. data/lib/rubocop/cop/naming/constant_name.rb +2 -2
  202. data/lib/rubocop/cop/naming/file_name.rb +3 -3
  203. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +2 -2
  204. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +2 -2
  205. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -2
  206. data/lib/rubocop/cop/naming/method_name.rb +1 -1
  207. data/lib/rubocop/cop/naming/method_parameter_name.rb +2 -2
  208. data/lib/rubocop/cop/naming/predicate_name.rb +6 -10
  209. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -11
  210. data/lib/rubocop/cop/naming/variable_name.rb +1 -1
  211. data/lib/rubocop/cop/naming/variable_number.rb +1 -1
  212. data/lib/rubocop/cop/offense.rb +16 -2
  213. data/lib/rubocop/cop/registry.rb +3 -3
  214. data/lib/rubocop/cop/security/eval.rb +2 -2
  215. data/lib/rubocop/cop/security/json_load.rb +6 -8
  216. data/lib/rubocop/cop/security/marshal_load.rb +2 -4
  217. data/lib/rubocop/cop/security/open.rb +2 -2
  218. data/lib/rubocop/cop/security/yaml_load.rb +6 -6
  219. data/lib/rubocop/cop/style/access_modifier_declarations.rb +16 -9
  220. data/lib/rubocop/cop/style/accessor_grouping.rb +149 -0
  221. data/lib/rubocop/cop/style/alias.rb +41 -36
  222. data/lib/rubocop/cop/style/and_or.rb +9 -11
  223. data/lib/rubocop/cop/style/array_coercion.rb +63 -0
  224. data/lib/rubocop/cop/style/array_join.rb +6 -8
  225. data/lib/rubocop/cop/style/ascii_comments.rb +4 -4
  226. data/lib/rubocop/cop/style/attr.rb +11 -9
  227. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +5 -7
  228. data/lib/rubocop/cop/style/bare_percent_literals.rb +10 -12
  229. data/lib/rubocop/cop/style/begin_block.rb +2 -2
  230. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +141 -0
  231. data/lib/rubocop/cop/style/block_comments.rb +14 -18
  232. data/lib/rubocop/cop/style/block_delimiters.rb +23 -23
  233. data/lib/rubocop/cop/style/case_equality.rb +22 -3
  234. data/lib/rubocop/cop/style/case_like_if.rb +220 -0
  235. data/lib/rubocop/cop/style/class_and_module_children.rb +14 -11
  236. data/lib/rubocop/cop/style/class_check.rb +7 -9
  237. data/lib/rubocop/cop/style/class_methods.rb +7 -11
  238. data/lib/rubocop/cop/style/class_vars.rb +24 -7
  239. data/lib/rubocop/cop/style/collection_methods.rb +11 -17
  240. data/lib/rubocop/cop/style/colon_method_call.rb +8 -9
  241. data/lib/rubocop/cop/style/colon_method_definition.rb +6 -6
  242. data/lib/rubocop/cop/style/command_literal.rb +23 -24
  243. data/lib/rubocop/cop/style/comment_annotation.rb +15 -15
  244. data/lib/rubocop/cop/style/commented_keyword.rb +6 -3
  245. data/lib/rubocop/cop/style/conditional_assignment.rb +13 -4
  246. data/lib/rubocop/cop/style/constant_visibility.rb +3 -2
  247. data/lib/rubocop/cop/style/copyright.rb +12 -12
  248. data/lib/rubocop/cop/style/date_time.rb +2 -2
  249. data/lib/rubocop/cop/style/def_with_parentheses.rb +8 -10
  250. data/lib/rubocop/cop/style/dir.rb +9 -12
  251. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +7 -9
  252. data/lib/rubocop/cop/style/documentation.rb +6 -8
  253. data/lib/rubocop/cop/style/documentation_method.rb +1 -1
  254. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +12 -15
  255. data/lib/rubocop/cop/style/double_negation.rb +2 -2
  256. data/lib/rubocop/cop/style/each_for_simple_loop.rb +5 -8
  257. data/lib/rubocop/cop/style/each_with_object.rb +16 -19
  258. data/lib/rubocop/cop/style/empty_case_condition.rb +19 -20
  259. data/lib/rubocop/cop/style/empty_else.rb +17 -19
  260. data/lib/rubocop/cop/style/empty_literal.rb +20 -21
  261. data/lib/rubocop/cop/style/empty_method.rb +10 -13
  262. data/lib/rubocop/cop/style/encoding.rb +5 -9
  263. data/lib/rubocop/cop/style/end_block.rb +4 -6
  264. data/lib/rubocop/cop/style/eval_with_location.rb +9 -7
  265. data/lib/rubocop/cop/style/even_odd.rb +7 -11
  266. data/lib/rubocop/cop/style/expand_path_arguments.rb +23 -22
  267. data/lib/rubocop/cop/style/explicit_block_argument.rb +102 -0
  268. data/lib/rubocop/cop/style/exponential_notation.rb +7 -9
  269. data/lib/rubocop/cop/style/float_division.rb +8 -11
  270. data/lib/rubocop/cop/style/for.rb +11 -15
  271. data/lib/rubocop/cop/style/format_string.rb +21 -19
  272. data/lib/rubocop/cop/style/format_string_token.rb +10 -12
  273. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +19 -41
  274. data/lib/rubocop/cop/style/global_std_stream.rb +65 -0
  275. data/lib/rubocop/cop/style/global_vars.rb +2 -2
  276. data/lib/rubocop/cop/style/guard_clause.rb +5 -6
  277. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +69 -0
  278. data/lib/rubocop/cop/style/hash_each_methods.rb +5 -8
  279. data/lib/rubocop/cop/style/hash_like_case.rb +76 -0
  280. data/lib/rubocop/cop/style/hash_syntax.rb +4 -3
  281. data/lib/rubocop/cop/style/hash_transform_keys.rb +3 -2
  282. data/lib/rubocop/cop/style/hash_transform_values.rb +2 -1
  283. data/lib/rubocop/cop/style/identical_conditional_branches.rb +2 -2
  284. data/lib/rubocop/cop/style/if_inside_else.rb +3 -3
  285. data/lib/rubocop/cop/style/if_unless_modifier.rb +18 -40
  286. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +11 -3
  287. data/lib/rubocop/cop/style/if_with_semicolon.rb +3 -6
  288. data/lib/rubocop/cop/style/implicit_runtime_error.rb +1 -1
  289. data/lib/rubocop/cop/style/infinite_loop.rb +24 -24
  290. data/lib/rubocop/cop/style/inline_comment.rb +3 -3
  291. data/lib/rubocop/cop/style/inverse_methods.rb +22 -32
  292. data/lib/rubocop/cop/style/lambda.rb +7 -12
  293. data/lib/rubocop/cop/style/lambda_call.rb +14 -13
  294. data/lib/rubocop/cop/style/line_end_concatenation.rb +19 -16
  295. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -1
  296. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +16 -11
  297. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +4 -8
  298. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -7
  299. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -2
  300. data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -16
  301. data/lib/rubocop/cop/style/min_max.rb +8 -12
  302. data/lib/rubocop/cop/style/missing_else.rb +11 -21
  303. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +10 -3
  304. data/lib/rubocop/cop/style/mixin_grouping.rb +24 -27
  305. data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
  306. data/lib/rubocop/cop/style/module_function.rb +10 -13
  307. data/lib/rubocop/cop/style/multiline_block_chain.rb +10 -1
  308. data/lib/rubocop/cop/style/multiline_if_modifier.rb +3 -10
  309. data/lib/rubocop/cop/style/multiline_if_then.rb +4 -10
  310. data/lib/rubocop/cop/style/multiline_memoization.rb +14 -12
  311. data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -2
  312. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +4 -6
  313. data/lib/rubocop/cop/style/multiline_when_then.rb +7 -9
  314. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  315. data/lib/rubocop/cop/style/mutable_constant.rb +27 -24
  316. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +5 -6
  317. data/lib/rubocop/cop/style/numeric_predicate.rb +7 -4
  318. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +42 -0
  319. data/lib/rubocop/cop/style/parallel_assignment.rb +5 -5
  320. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  321. data/lib/rubocop/cop/style/proc.rb +1 -1
  322. data/lib/rubocop/cop/style/random_with_offset.rb +5 -10
  323. data/lib/rubocop/cop/style/redundant_assignment.rb +117 -0
  324. data/lib/rubocop/cop/style/redundant_condition.rb +15 -3
  325. data/lib/rubocop/cop/style/redundant_exception.rb +18 -10
  326. data/lib/rubocop/cop/style/redundant_fetch_block.rb +26 -7
  327. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +50 -0
  328. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
  329. data/lib/rubocop/cop/style/redundant_parentheses.rb +7 -1
  330. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +2 -1
  331. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +11 -11
  332. data/lib/rubocop/cop/style/redundant_sort.rb +26 -12
  333. data/lib/rubocop/cop/style/rescue_standard_error.rb +1 -1
  334. data/lib/rubocop/cop/style/safe_navigation.rb +4 -4
  335. data/lib/rubocop/cop/style/signal_exception.rb +3 -1
  336. data/lib/rubocop/cop/style/single_argument_dig.rb +54 -0
  337. data/lib/rubocop/cop/style/single_line_methods.rb +1 -1
  338. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +3 -2
  339. data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
  340. data/lib/rubocop/cop/style/string_concatenation.rb +92 -0
  341. data/lib/rubocop/cop/style/struct_inheritance.rb +3 -3
  342. data/lib/rubocop/cop/style/symbol_array.rb +1 -1
  343. data/lib/rubocop/cop/style/symbol_proc.rb +2 -2
  344. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +9 -32
  345. data/lib/rubocop/cop/style/trivial_accessors.rb +8 -7
  346. data/lib/rubocop/cop/style/zero_length_predicate.rb +12 -8
  347. data/lib/rubocop/cop/team.rb +98 -82
  348. data/lib/rubocop/cop/tokens_util.rb +84 -0
  349. data/lib/rubocop/cop/util.rb +3 -13
  350. data/lib/rubocop/cop/utils/format_string.rb +1 -2
  351. data/lib/rubocop/cop/variable_force.rb +0 -2
  352. data/lib/rubocop/cop/variable_force/branch.rb +1 -0
  353. data/lib/rubocop/cop/variable_force/variable.rb +7 -5
  354. data/lib/rubocop/cops_documentation_generator.rb +282 -0
  355. data/lib/rubocop/error.rb +1 -0
  356. data/lib/rubocop/file_finder.rb +12 -12
  357. data/lib/rubocop/formatter/disabled_config_formatter.rb +2 -2
  358. data/lib/rubocop/formatter/formatter_set.rb +1 -0
  359. data/lib/rubocop/formatter/junit_formatter.rb +1 -1
  360. data/lib/rubocop/name_similarity.rb +1 -3
  361. data/lib/rubocop/options.rb +18 -11
  362. data/lib/rubocop/path_util.rb +17 -17
  363. data/lib/rubocop/rake_task.rb +7 -9
  364. data/lib/rubocop/result_cache.rb +12 -8
  365. data/lib/rubocop/rspec/cop_helper.rb +4 -4
  366. data/lib/rubocop/rspec/expect_offense.rb +53 -22
  367. data/lib/rubocop/rspec/shared_contexts.rb +16 -17
  368. data/lib/rubocop/runner.rb +35 -34
  369. data/lib/rubocop/target_finder.rb +13 -10
  370. data/lib/rubocop/target_ruby.rb +1 -1
  371. data/lib/rubocop/version.rb +2 -2
  372. metadata +40 -11
  373. data/lib/rubocop/cop/lint/useless_comparison.rb +0 -28
  374. data/lib/rubocop/cop/mixin/classish_length.rb +0 -37
  375. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +0 -37
  376. data/lib/rubocop/cop/mixin/too_many_lines.rb +0 -35
  377. data/lib/rubocop/cop/style/method_missing_super.rb +0 -34
@@ -34,28 +34,24 @@ module RuboCop
34
34
  # foo = "1"
35
35
  # # rubocop:enable all
36
36
  # baz
37
- class RedundantCopEnableDirective < Cop
37
+ class RedundantCopEnableDirective < Base
38
38
  include RangeHelp
39
39
  include SurroundingSpace
40
+ extend AutoCorrector
40
41
 
41
42
  MSG = 'Unnecessary enabling of %<cop>s.'
42
43
 
43
- def investigate(processed_source)
44
+ def on_new_investigation
44
45
  return if processed_source.blank?
45
46
 
46
47
  offenses = processed_source.comment_config.extra_enabled_comments
47
48
  offenses.each do |comment, name|
48
49
  add_offense(
49
- [comment, name],
50
- location: range_of_offense(comment, name),
50
+ range_of_offense(comment, name),
51
51
  message: format(MSG, cop: all_or_name(name))
52
- )
53
- end
54
- end
55
-
56
- def autocorrect(comment_and_name)
57
- lambda do |corrector|
58
- corrector.remove(range_with_comma(*comment_and_name))
52
+ ) do |corrector|
53
+ corrector.remove(range_with_comma(comment, name))
54
+ end
59
55
  end
60
56
  end
61
57
 
@@ -21,8 +21,9 @@ module RuboCop
21
21
  #
22
22
  # # good
23
23
  # require 'unloaded_feature'
24
- class RedundantRequireStatement < Cop
24
+ class RedundantRequireStatement < Base
25
25
  include RangeHelp
26
+ extend AutoCorrector
26
27
 
27
28
  MSG = 'Remove unnecessary `require` statement.'
28
29
 
@@ -34,13 +35,9 @@ module RuboCop
34
35
  def on_send(node)
35
36
  return unless unnecessary_require_statement?(node)
36
37
 
37
- add_offense(node)
38
- end
38
+ add_offense(node) do |corrector|
39
+ range = range_with_surrounding_space(range: node.loc.expression, side: :right)
39
40
 
40
- def autocorrect(node)
41
- lambda do |corrector|
42
- range = range_with_surrounding_space(range: node.loc.expression,
43
- side: :right)
44
41
  corrector.remove(range)
45
42
  end
46
43
  end
@@ -49,7 +49,9 @@ module RuboCop
49
49
  # else
50
50
  # baz
51
51
  # end
52
- class RedundantSplatExpansion < Cop
52
+ class RedundantSplatExpansion < Base
53
+ extend AutoCorrector
54
+
53
55
  MSG = 'Replace splat expansion with comma separated values.'
54
56
  ARRAY_PARAM_MSG = 'Pass array contents as separate arguments.'
55
57
  PERCENT_W = '%w'
@@ -60,8 +62,8 @@ module RuboCop
60
62
 
61
63
  def_node_matcher :array_new?, <<~PATTERN
62
64
  {
63
- $(send (const nil? :Array) :new ...)
64
- $(block (send (const nil? :Array) :new ...) ...)
65
+ $(send (const {nil? cbase} :Array) :new ...)
66
+ $(block (send (const {nil? cbase} :Array) :new ...) ...)
65
67
  }
66
68
  PATTERN
67
69
 
@@ -73,23 +75,25 @@ module RuboCop
73
75
  redundant_splat_expansion(node) do
74
76
  if array_splat?(node) &&
75
77
  (method_argument?(node) || part_of_an_array?(node))
76
- add_offense(node, message: ARRAY_PARAM_MSG)
78
+ add_offense(node, message: ARRAY_PARAM_MSG) do |corrector|
79
+ autocorrect(corrector, node)
80
+ end
77
81
  else
78
- add_offense(node)
82
+ add_offense(node) do |corrector|
83
+ autocorrect(corrector, node)
84
+ end
79
85
  end
80
86
  end
81
87
  end
82
88
 
83
- def autocorrect(node)
89
+ private
90
+
91
+ def autocorrect(corrector, node)
84
92
  range, content = replacement_range_and_content(node)
85
93
 
86
- lambda do |corrector|
87
- corrector.replace(range, content)
88
- end
94
+ corrector.replace(range, content)
89
95
  end
90
96
 
91
- private
92
-
93
97
  def redundant_splat_expansion(node)
94
98
  literal_expansion(node) do |expanded_item|
95
99
  if expanded_item.send_type?
@@ -17,8 +17,9 @@ module RuboCop
17
17
  # # good
18
18
  #
19
19
  # "result is #{something}"
20
- class RedundantStringCoercion < Cop
20
+ class RedundantStringCoercion < Base
21
21
  include Interpolation
22
+ extend AutoCorrector
22
23
 
23
24
  MSG_DEFAULT = 'Redundant use of `Object#to_s` in interpolation.'
24
25
  MSG_SELF = 'Use `self` instead of `Object#to_s` in ' \
@@ -31,14 +32,12 @@ module RuboCop
31
32
 
32
33
  return unless to_s_without_args?(final_node)
33
34
 
34
- add_offense(final_node, location: :selector)
35
- end
35
+ message = final_node.receiver ? MSG_DEFAULT : MSG_SELF
36
36
 
37
- def autocorrect(node)
38
- lambda do |corrector|
39
- receiver = node.receiver
37
+ add_offense(final_node.loc.selector, message: message) do |corrector|
38
+ receiver = final_node.receiver
40
39
  corrector.replace(
41
- node,
40
+ final_node,
42
41
  if receiver
43
42
  receiver.source
44
43
  else
@@ -47,12 +46,6 @@ module RuboCop
47
46
  )
48
47
  end
49
48
  end
50
-
51
- private
52
-
53
- def message(node)
54
- node.receiver ? MSG_DEFAULT : MSG_SELF
55
- end
56
49
  end
57
50
  end
58
51
  end
@@ -26,8 +26,9 @@ module RuboCop
26
26
  # v
27
27
  # end
28
28
  #
29
- class RedundantWithIndex < Cop
29
+ class RedundantWithIndex < Base
30
30
  include RangeHelp
31
+ extend AutoCorrector
31
32
 
32
33
  MSG_EACH_WITH_INDEX = 'Use `each` instead of `each_with_index`.'
33
34
  MSG_WITH_INDEX = 'Remove redundant `with_index`.'
@@ -42,20 +43,16 @@ module RuboCop
42
43
  PATTERN
43
44
 
44
45
  def on_block(node)
45
- redundant_with_index?(node) do |send|
46
- add_offense(node, location: with_index_range(send))
47
- end
48
- end
46
+ return unless (send = redundant_with_index?(node))
47
+
48
+ range = with_index_range(send)
49
49
 
50
- def autocorrect(node)
51
- lambda do |corrector|
52
- redundant_with_index?(node) do |send|
53
- if send.method?(:each_with_index)
54
- corrector.replace(send.loc.selector, 'each')
55
- else
56
- corrector.remove(with_index_range(send))
57
- corrector.remove(send.loc.dot)
58
- end
50
+ add_offense(range, message: message(send)) do |corrector|
51
+ if send.method?(:each_with_index)
52
+ corrector.replace(send.loc.selector, 'each')
53
+ else
54
+ corrector.remove(range)
55
+ corrector.remove(send.loc.dot)
59
56
  end
60
57
  end
61
58
  end
@@ -26,8 +26,9 @@ module RuboCop
26
26
  # v
27
27
  # end
28
28
  #
29
- class RedundantWithObject < Cop
29
+ class RedundantWithObject < Base
30
30
  include RangeHelp
31
+ extend AutoCorrector
31
32
 
32
33
  MSG_EACH_WITH_OBJECT = 'Use `each` instead of `each_with_object`.'
33
34
 
@@ -43,20 +44,16 @@ module RuboCop
43
44
  PATTERN
44
45
 
45
46
  def on_block(node)
46
- redundant_with_object?(node) do |send|
47
- add_offense(node, location: with_object_range(send))
48
- end
49
- end
47
+ return unless (send = redundant_with_object?(node))
48
+
49
+ range = with_object_range(send)
50
50
 
51
- def autocorrect(node)
52
- lambda do |corrector|
53
- redundant_with_object?(node) do |send|
54
- if send.method?(:each_with_object)
55
- corrector.replace(with_object_range(send), 'each')
56
- else
57
- corrector.remove(with_object_range(send))
58
- corrector.remove(send.loc.dot)
59
- end
51
+ add_offense(range, message: message(send)) do |corrector|
52
+ if send.method?(:each_with_object)
53
+ corrector.replace(range, 'each')
54
+ else
55
+ corrector.remove(range)
56
+ corrector.remove(send.loc.dot)
60
57
  end
61
58
  end
62
59
  end
@@ -16,16 +16,14 @@ module RuboCop
16
16
  # if /foo/ =~ $_
17
17
  # do_something
18
18
  # end
19
- class RegexpAsCondition < Cop
19
+ class RegexpAsCondition < Base
20
+ extend AutoCorrector
21
+
20
22
  MSG = 'Do not use regexp literal as a condition.' \
21
23
  ' The regexp literal matches `$_` implicitly.'
22
24
 
23
25
  def on_match_current_line(node)
24
- add_offense(node)
25
- end
26
-
27
- def autocorrect(node)
28
- lambda do |corrector|
26
+ add_offense(node) do |corrector|
29
27
  corrector.replace(node, "#{node.source} =~ $_")
30
28
  end
31
29
  end
@@ -27,7 +27,7 @@ module RuboCop
27
27
  # if day.is?(:tuesday) && month == :jan
28
28
  # # ...
29
29
  # end
30
- class RequireParentheses < Cop
30
+ class RequireParentheses < Base
31
31
  include RangeHelp
32
32
 
33
33
  MSG = 'Use parentheses in the method call to avoid confusion about ' \
@@ -52,7 +52,7 @@ module RuboCop
52
52
  range = range_between(node.source_range.begin_pos,
53
53
  ternary.condition.source_range.end_pos)
54
54
 
55
- add_offense(range, location: range)
55
+ add_offense(range)
56
56
  end
57
57
 
58
58
  def check_predicate(predicate, node)
@@ -24,7 +24,7 @@ module RuboCop
24
24
  # rescue ArgumentError
25
25
  # handle_exception
26
26
  # end
27
- class RescueException < Cop
27
+ class RescueException < Base
28
28
  MSG = 'Avoid rescuing the `Exception` class. ' \
29
29
  'Perhaps you meant to rescue `StandardError`?'
30
30
 
@@ -34,8 +34,9 @@ module RuboCop
34
34
  # rescue NameError
35
35
  # baz
36
36
  # end
37
- class RescueType < Cop
37
+ class RescueType < Base
38
38
  include RescueNode
39
+ extend AutoCorrector
39
40
 
40
41
  MSG = 'Rescuing from `%<invalid_exceptions>s` will raise a ' \
41
42
  '`TypeError` instead of catching the actual exception.'
@@ -50,24 +51,23 @@ module RuboCop
50
51
  return if invalid_exceptions.empty?
51
52
 
52
53
  add_offense(
53
- node,
54
- location: node.loc.keyword.join(rescued.loc.expression),
54
+ node.loc.keyword.join(rescued.loc.expression),
55
55
  message: format(
56
56
  MSG, invalid_exceptions: invalid_exceptions.map(&:source)
57
57
  .join(', ')
58
58
  )
59
- )
59
+ ) do |corrector|
60
+ autocorrect(corrector, node)
61
+ end
60
62
  end
61
63
 
62
- def autocorrect(node)
64
+ def autocorrect(corrector, node)
63
65
  rescued, _, _body = *node
64
66
  range = Parser::Source::Range.new(node.loc.expression.source_buffer,
65
67
  node.loc.keyword.end_pos,
66
68
  rescued.loc.expression.end_pos)
67
69
 
68
- lambda do |corrector|
69
- corrector.replace(range, correction(*rescued))
70
- end
70
+ corrector.replace(range, correction(*rescued))
71
71
  end
72
72
 
73
73
  private
@@ -31,7 +31,7 @@ module RuboCop
31
31
  # def foo=(bar)
32
32
  # return
33
33
  # end
34
- class ReturnInVoidContext < Cop
34
+ class ReturnInVoidContext < Base
35
35
  MSG = 'Do not return a value in `%<method>s`.'
36
36
 
37
37
  def on_return(return_node)
@@ -45,9 +45,7 @@ module RuboCop
45
45
 
46
46
  return unless method_name && void_context_method?(method_name)
47
47
 
48
- add_offense(return_node,
49
- location: :keyword,
50
- message: format(message, method: method_name))
48
+ add_offense(return_node.loc.keyword, message: format(message, method: method_name))
51
49
  end
52
50
 
53
51
  private
@@ -23,7 +23,7 @@ module RuboCop
23
23
  #
24
24
  # x&.foo&.bar
25
25
  # x&.foo || bar
26
- class SafeNavigationChain < Cop
26
+ class SafeNavigationChain < Base
27
27
  include NilMethods
28
28
 
29
29
  MSG = 'Do not chain ordinary method call' \
@@ -45,7 +45,7 @@ module RuboCop
45
45
  Parser::Source::Range.new(node.source_range.source_buffer,
46
46
  safe_nav.source_range.end_pos,
47
47
  method_chain.source_range.end_pos)
48
- add_offense(node, location: location)
48
+ add_offense(location)
49
49
  end
50
50
  end
51
51
 
@@ -53,10 +53,7 @@ module RuboCop
53
53
 
54
54
  def method_chain(node)
55
55
  chain = node
56
- while chain.send_type?
57
- chain = chain.parent if chain.parent&.call_type?
58
- break # FIXME: Unconditional break. Why while "loop" then?
59
- end
56
+ chain = chain.parent if chain.send_type? && chain.parent&.call_type?
60
57
  chain
61
58
  end
62
59
  end
@@ -26,9 +26,10 @@ module RuboCop
26
26
  # # good
27
27
  # foo&.bar && (foobar.baz || foo&.baz)
28
28
  #
29
- class SafeNavigationConsistency < Cop
29
+ class SafeNavigationConsistency < Base
30
30
  include IgnoredNode
31
31
  include NilMethods
32
+ extend AutoCorrector
32
33
 
33
34
  MSG = 'Ensure that safe navigation is used consistently ' \
34
35
  'inside of `&&` and `||`.'
@@ -49,24 +50,27 @@ module RuboCop
49
50
  unsafe_method_calls(method_calls, safe_nav_receiver)
50
51
 
51
52
  unsafe_method_calls.each do |unsafe_method_call|
52
- location =
53
- node.loc.expression.join(unsafe_method_call.loc.expression)
54
- add_offense(unsafe_method_call,
55
- location: location)
53
+ location = location(node, unsafe_method_call)
54
+
55
+ add_offense(location) do |corrector|
56
+ autocorrect(corrector, unsafe_method_call)
57
+ end
56
58
 
57
59
  ignore_node(unsafe_method_call)
58
60
  end
59
61
  end
60
62
 
61
- def autocorrect(node)
63
+ private
64
+
65
+ def autocorrect(corrector, node)
62
66
  return unless node.dot?
63
67
 
64
- lambda do |corrector|
65
- corrector.insert_before(node.loc.dot, '&')
66
- end
68
+ corrector.insert_before(node.loc.dot, '&')
67
69
  end
68
70
 
69
- private
71
+ def location(node, unsafe_method_call)
72
+ node.loc.expression.join(unsafe_method_call.loc.expression)
73
+ end
70
74
 
71
75
  def top_conditional_ancestor(node)
72
76
  parent = node.parent
@@ -19,7 +19,9 @@ module RuboCop
19
19
  # return if foo && foo.empty?
20
20
  # return unless foo && foo.empty?
21
21
  #
22
- class SafeNavigationWithEmpty < Cop
22
+ class SafeNavigationWithEmpty < Base
23
+ extend AutoCorrector
24
+
23
25
  MSG = 'Avoid calling `empty?` with the safe navigation operator ' \
24
26
  'in conditionals.'
25
27
 
@@ -30,7 +32,13 @@ module RuboCop
30
32
  def on_if(node)
31
33
  return unless safe_navigation_empty_in_conditional?(node)
32
34
 
33
- add_offense(node.condition)
35
+ condition = node.condition
36
+
37
+ add_offense(condition) do |corrector|
38
+ receiver = condition.receiver.source
39
+
40
+ corrector.replace(condition, "#{receiver} && #{receiver}.#{condition.method_name}")
41
+ end
34
42
  end
35
43
  end
36
44
  end