rubocop 0.88.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 (320) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/bin/rubocop-profile +1 -0
  4. data/config/default.yml +96 -16
  5. data/lib/rubocop.rb +16 -4
  6. data/lib/rubocop/cli/command/auto_genenerate_config.rb +1 -1
  7. data/lib/rubocop/cli/command/base.rb +1 -0
  8. data/lib/rubocop/cli/command/execute_runner.rb +1 -1
  9. data/lib/rubocop/cli/command/show_cops.rb +2 -2
  10. data/lib/rubocop/cli/command/version.rb +2 -2
  11. data/lib/rubocop/comment_config.rb +5 -7
  12. data/lib/rubocop/config.rb +20 -3
  13. data/lib/rubocop/config_loader.rb +2 -2
  14. data/lib/rubocop/config_loader_resolver.rb +3 -3
  15. data/lib/rubocop/config_obsoletion.rb +6 -1
  16. data/lib/rubocop/config_validator.rb +2 -4
  17. data/lib/rubocop/cop/base.rb +2 -2
  18. data/lib/rubocop/cop/commissioner.rb +0 -1
  19. data/lib/rubocop/cop/correctors/line_break_corrector.rb +4 -4
  20. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
  21. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +1 -1
  22. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +15 -18
  23. data/lib/rubocop/cop/force.rb +1 -0
  24. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +32 -11
  25. data/lib/rubocop/cop/generator/configuration_injector.rb +2 -2
  26. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +4 -12
  27. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -1
  28. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +8 -8
  29. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +10 -7
  30. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +7 -8
  31. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
  32. data/lib/rubocop/cop/layout/block_alignment.rb +1 -1
  33. data/lib/rubocop/cop/layout/class_structure.rb +3 -7
  34. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  35. data/lib/rubocop/cop/layout/empty_lines.rb +0 -2
  36. data/lib/rubocop/cop/layout/extra_spacing.rb +22 -36
  37. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -1
  38. data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
  39. data/lib/rubocop/cop/layout/indentation_style.rb +0 -2
  40. data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
  41. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
  42. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +0 -2
  43. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +9 -1
  44. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +7 -4
  45. data/lib/rubocop/cop/lint/ambiguous_operator.rb +15 -10
  46. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +11 -13
  47. data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
  48. data/lib/rubocop/cop/lint/big_decimal_new.rb +10 -10
  49. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +50 -0
  50. data/lib/rubocop/cop/lint/boolean_symbol.rb +16 -11
  51. data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
  52. data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
  53. data/lib/rubocop/cop/lint/debugger.rb +7 -1
  54. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +9 -10
  55. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +17 -13
  56. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
  57. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
  58. data/lib/rubocop/cop/lint/duplicate_methods.rb +7 -4
  59. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +60 -0
  60. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  61. data/lib/rubocop/cop/lint/else_layout.rb +1 -1
  62. data/lib/rubocop/cop/lint/empty_conditional_body.rb +67 -0
  63. data/lib/rubocop/cop/lint/empty_ensure.rb +5 -5
  64. data/lib/rubocop/cop/lint/empty_expression.rb +2 -2
  65. data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -6
  66. data/lib/rubocop/cop/lint/empty_when.rb +2 -2
  67. data/lib/rubocop/cop/lint/ensure_return.rb +27 -29
  68. data/lib/rubocop/cop/lint/erb_new_arguments.rb +11 -10
  69. data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
  70. data/lib/rubocop/cop/lint/float_comparison.rb +93 -0
  71. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  72. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +5 -4
  73. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +13 -14
  74. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +2 -2
  75. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +8 -8
  76. data/lib/rubocop/cop/lint/inherit_exception.rb +12 -7
  77. data/lib/rubocop/cop/lint/interpolation_check.rb +18 -15
  78. data/lib/rubocop/cop/lint/literal_as_condition.rb +4 -2
  79. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -7
  80. data/lib/rubocop/cop/lint/loop.rb +23 -2
  81. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +6 -5
  82. data/lib/rubocop/cop/lint/missing_super.rb +99 -0
  83. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  84. data/lib/rubocop/cop/lint/multiple_comparison.rb +6 -9
  85. data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -1
  86. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  87. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  88. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +27 -23
  89. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
  90. data/lib/rubocop/cop/lint/number_conversion.rb +6 -9
  91. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +11 -13
  92. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +90 -0
  93. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +4 -10
  94. data/lib/rubocop/cop/lint/percent_string_array.rb +13 -12
  95. data/lib/rubocop/cop/lint/percent_symbol_array.rb +13 -12
  96. data/lib/rubocop/cop/lint/raise_exception.rb +12 -10
  97. data/lib/rubocop/cop/lint/rand_one.rb +2 -2
  98. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +16 -19
  99. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +7 -11
  100. data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -7
  101. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +13 -9
  102. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +6 -13
  103. data/lib/rubocop/cop/lint/redundant_with_index.rb +11 -14
  104. data/lib/rubocop/cop/lint/redundant_with_object.rb +11 -14
  105. data/lib/rubocop/cop/lint/regexp_as_condition.rb +4 -6
  106. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -2
  107. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  108. data/lib/rubocop/cop/lint/rescue_type.rb +8 -8
  109. data/lib/rubocop/cop/lint/return_in_void_context.rb +2 -4
  110. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +3 -6
  111. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +14 -10
  112. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +7 -7
  113. data/lib/rubocop/cop/lint/script_permission.rb +10 -7
  114. data/lib/rubocop/cop/lint/self_assignment.rb +78 -0
  115. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +5 -11
  116. data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
  117. data/lib/rubocop/cop/lint/shadowed_exception.rb +2 -2
  118. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +3 -3
  119. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -1
  120. data/lib/rubocop/cop/lint/suppressed_exception.rb +4 -7
  121. data/lib/rubocop/cop/lint/to_json.rb +4 -6
  122. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +34 -0
  123. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +4 -4
  124. data/lib/rubocop/cop/lint/unified_integer.rb +4 -6
  125. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  126. data/lib/rubocop/cop/lint/unreachable_loop.rb +174 -0
  127. data/lib/rubocop/cop/lint/unused_block_argument.rb +8 -3
  128. data/lib/rubocop/cop/lint/unused_method_argument.rb +8 -3
  129. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
  130. data/lib/rubocop/cop/lint/uri_regexp.rb +11 -47
  131. data/lib/rubocop/cop/lint/useless_access_modifier.rb +25 -15
  132. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -4
  133. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -15
  134. data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -6
  135. data/lib/rubocop/cop/lint/void.rb +3 -7
  136. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  137. data/lib/rubocop/cop/metrics/block_length.rb +2 -2
  138. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
  139. data/lib/rubocop/cop/metrics/class_length.rb +2 -2
  140. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
  141. data/lib/rubocop/cop/metrics/method_length.rb +2 -2
  142. data/lib/rubocop/cop/metrics/module_length.rb +2 -2
  143. data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -6
  144. data/lib/rubocop/cop/metrics/perceived_complexity.rb +7 -8
  145. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +48 -5
  146. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +52 -24
  147. data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +37 -0
  148. data/lib/rubocop/cop/migration/department_name.rb +14 -16
  149. data/lib/rubocop/cop/mixin/alignment.rb +2 -1
  150. data/lib/rubocop/cop/mixin/array_min_size.rb +1 -1
  151. data/lib/rubocop/cop/mixin/check_line_breakable.rb +2 -2
  152. data/lib/rubocop/cop/mixin/code_length.rb +22 -5
  153. data/lib/rubocop/cop/mixin/hash_transform_method.rb +5 -11
  154. data/lib/rubocop/cop/mixin/line_length_help.rb +1 -3
  155. data/lib/rubocop/cop/mixin/method_complexity.rb +10 -2
  156. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -2
  157. data/lib/rubocop/cop/mixin/percent_array.rb +2 -6
  158. data/lib/rubocop/cop/mixin/range_help.rb +18 -4
  159. data/lib/rubocop/cop/mixin/statement_modifier.rb +37 -8
  160. data/lib/rubocop/cop/mixin/surrounding_space.rb +0 -25
  161. data/lib/rubocop/cop/mixin/trailing_comma.rb +2 -4
  162. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +6 -13
  163. data/lib/rubocop/cop/mixin/unused_argument.rb +4 -6
  164. data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
  165. data/lib/rubocop/cop/naming/ascii_identifiers.rb +3 -3
  166. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
  167. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  168. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +2 -2
  169. data/lib/rubocop/cop/naming/constant_name.rb +2 -2
  170. data/lib/rubocop/cop/naming/file_name.rb +3 -3
  171. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +2 -2
  172. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +2 -2
  173. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -2
  174. data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
  175. data/lib/rubocop/cop/naming/predicate_name.rb +3 -5
  176. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -11
  177. data/lib/rubocop/cop/registry.rb +3 -3
  178. data/lib/rubocop/cop/security/eval.rb +2 -2
  179. data/lib/rubocop/cop/security/json_load.rb +6 -8
  180. data/lib/rubocop/cop/security/marshal_load.rb +2 -4
  181. data/lib/rubocop/cop/security/open.rb +2 -2
  182. data/lib/rubocop/cop/security/yaml_load.rb +6 -6
  183. data/lib/rubocop/cop/style/access_modifier_declarations.rb +16 -9
  184. data/lib/rubocop/cop/style/accessor_grouping.rb +23 -21
  185. data/lib/rubocop/cop/style/alias.rb +41 -36
  186. data/lib/rubocop/cop/style/and_or.rb +9 -11
  187. data/lib/rubocop/cop/style/array_join.rb +6 -8
  188. data/lib/rubocop/cop/style/ascii_comments.rb +4 -4
  189. data/lib/rubocop/cop/style/attr.rb +11 -9
  190. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +2 -5
  191. data/lib/rubocop/cop/style/bare_percent_literals.rb +10 -12
  192. data/lib/rubocop/cop/style/begin_block.rb +2 -2
  193. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +9 -14
  194. data/lib/rubocop/cop/style/block_comments.rb +14 -18
  195. data/lib/rubocop/cop/style/block_delimiters.rb +23 -23
  196. data/lib/rubocop/cop/style/case_equality.rb +22 -3
  197. data/lib/rubocop/cop/style/case_like_if.rb +19 -16
  198. data/lib/rubocop/cop/style/class_and_module_children.rb +14 -11
  199. data/lib/rubocop/cop/style/class_check.rb +7 -9
  200. data/lib/rubocop/cop/style/class_methods.rb +7 -11
  201. data/lib/rubocop/cop/style/class_vars.rb +6 -10
  202. data/lib/rubocop/cop/style/collection_methods.rb +11 -17
  203. data/lib/rubocop/cop/style/colon_method_call.rb +8 -9
  204. data/lib/rubocop/cop/style/colon_method_definition.rb +6 -6
  205. data/lib/rubocop/cop/style/command_literal.rb +23 -24
  206. data/lib/rubocop/cop/style/comment_annotation.rb +15 -15
  207. data/lib/rubocop/cop/style/commented_keyword.rb +1 -1
  208. data/lib/rubocop/cop/style/conditional_assignment.rb +12 -3
  209. data/lib/rubocop/cop/style/constant_visibility.rb +3 -2
  210. data/lib/rubocop/cop/style/copyright.rb +12 -12
  211. data/lib/rubocop/cop/style/date_time.rb +1 -1
  212. data/lib/rubocop/cop/style/def_with_parentheses.rb +8 -10
  213. data/lib/rubocop/cop/style/dir.rb +7 -10
  214. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +7 -9
  215. data/lib/rubocop/cop/style/documentation.rb +6 -8
  216. data/lib/rubocop/cop/style/documentation_method.rb +1 -1
  217. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +12 -15
  218. data/lib/rubocop/cop/style/double_negation.rb +2 -2
  219. data/lib/rubocop/cop/style/each_for_simple_loop.rb +5 -8
  220. data/lib/rubocop/cop/style/each_with_object.rb +16 -19
  221. data/lib/rubocop/cop/style/empty_case_condition.rb +19 -20
  222. data/lib/rubocop/cop/style/empty_else.rb +17 -19
  223. data/lib/rubocop/cop/style/empty_literal.rb +15 -16
  224. data/lib/rubocop/cop/style/empty_method.rb +10 -13
  225. data/lib/rubocop/cop/style/encoding.rb +5 -9
  226. data/lib/rubocop/cop/style/end_block.rb +4 -6
  227. data/lib/rubocop/cop/style/eval_with_location.rb +9 -7
  228. data/lib/rubocop/cop/style/even_odd.rb +7 -11
  229. data/lib/rubocop/cop/style/expand_path_arguments.rb +21 -20
  230. data/lib/rubocop/cop/style/explicit_block_argument.rb +102 -0
  231. data/lib/rubocop/cop/style/exponential_notation.rb +1 -1
  232. data/lib/rubocop/cop/style/float_division.rb +1 -1
  233. data/lib/rubocop/cop/style/for.rb +11 -15
  234. data/lib/rubocop/cop/style/format_string.rb +21 -19
  235. data/lib/rubocop/cop/style/format_string_token.rb +5 -7
  236. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +19 -41
  237. data/lib/rubocop/cop/style/global_std_stream.rb +65 -0
  238. data/lib/rubocop/cop/style/global_vars.rb +2 -2
  239. data/lib/rubocop/cop/style/guard_clause.rb +5 -6
  240. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +8 -1
  241. data/lib/rubocop/cop/style/hash_each_methods.rb +5 -8
  242. data/lib/rubocop/cop/style/hash_syntax.rb +4 -3
  243. data/lib/rubocop/cop/style/hash_transform_keys.rb +3 -2
  244. data/lib/rubocop/cop/style/hash_transform_values.rb +2 -1
  245. data/lib/rubocop/cop/style/identical_conditional_branches.rb +2 -2
  246. data/lib/rubocop/cop/style/if_inside_else.rb +3 -3
  247. data/lib/rubocop/cop/style/if_unless_modifier.rb +10 -32
  248. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +3 -7
  249. data/lib/rubocop/cop/style/if_with_semicolon.rb +3 -6
  250. data/lib/rubocop/cop/style/implicit_runtime_error.rb +1 -1
  251. data/lib/rubocop/cop/style/infinite_loop.rb +24 -24
  252. data/lib/rubocop/cop/style/inline_comment.rb +3 -3
  253. data/lib/rubocop/cop/style/inverse_methods.rb +22 -32
  254. data/lib/rubocop/cop/style/lambda.rb +7 -12
  255. data/lib/rubocop/cop/style/lambda_call.rb +14 -13
  256. data/lib/rubocop/cop/style/line_end_concatenation.rb +19 -16
  257. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -1
  258. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +16 -11
  259. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +4 -8
  260. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -7
  261. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -2
  262. data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -16
  263. data/lib/rubocop/cop/style/min_max.rb +8 -12
  264. data/lib/rubocop/cop/style/missing_else.rb +13 -13
  265. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +10 -3
  266. data/lib/rubocop/cop/style/mixin_grouping.rb +24 -27
  267. data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
  268. data/lib/rubocop/cop/style/module_function.rb +10 -13
  269. data/lib/rubocop/cop/style/multiline_if_modifier.rb +3 -10
  270. data/lib/rubocop/cop/style/multiline_if_then.rb +4 -10
  271. data/lib/rubocop/cop/style/multiline_memoization.rb +14 -12
  272. data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -2
  273. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +4 -6
  274. data/lib/rubocop/cop/style/multiline_when_then.rb +7 -9
  275. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  276. data/lib/rubocop/cop/style/mutable_constant.rb +23 -20
  277. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +3 -1
  278. data/lib/rubocop/cop/style/numeric_predicate.rb +4 -0
  279. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +42 -0
  280. data/lib/rubocop/cop/style/parallel_assignment.rb +2 -2
  281. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +2 -2
  282. data/lib/rubocop/cop/style/random_with_offset.rb +1 -0
  283. data/lib/rubocop/cop/style/redundant_condition.rb +15 -3
  284. data/lib/rubocop/cop/style/redundant_exception.rb +4 -0
  285. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +9 -9
  286. data/lib/rubocop/cop/style/redundant_sort.rb +23 -10
  287. data/lib/rubocop/cop/style/safe_navigation.rb +4 -4
  288. data/lib/rubocop/cop/style/signal_exception.rb +2 -0
  289. data/lib/rubocop/cop/style/single_argument_dig.rb +54 -0
  290. data/lib/rubocop/cop/style/single_line_methods.rb +1 -1
  291. data/lib/rubocop/cop/style/string_concatenation.rb +92 -0
  292. data/lib/rubocop/cop/style/struct_inheritance.rb +1 -1
  293. data/lib/rubocop/cop/style/symbol_array.rb +1 -1
  294. data/lib/rubocop/cop/style/symbol_proc.rb +1 -1
  295. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -1
  296. data/lib/rubocop/cop/style/zero_length_predicate.rb +10 -6
  297. data/lib/rubocop/cop/team.rb +1 -1
  298. data/lib/rubocop/cop/tokens_util.rb +84 -0
  299. data/lib/rubocop/cop/util.rb +3 -13
  300. data/lib/rubocop/cop/variable_force.rb +0 -2
  301. data/lib/rubocop/cop/variable_force/branch.rb +1 -0
  302. data/lib/rubocop/cop/variable_force/variable.rb +2 -2
  303. data/lib/rubocop/cops_documentation_generator.rb +282 -0
  304. data/lib/rubocop/error.rb +1 -0
  305. data/lib/rubocop/formatter/disabled_config_formatter.rb +1 -1
  306. data/lib/rubocop/formatter/formatter_set.rb +1 -0
  307. data/lib/rubocop/formatter/junit_formatter.rb +1 -1
  308. data/lib/rubocop/options.rb +3 -3
  309. data/lib/rubocop/path_util.rb +19 -4
  310. data/lib/rubocop/rake_task.rb +1 -0
  311. data/lib/rubocop/rspec/expect_offense.rb +1 -1
  312. data/lib/rubocop/rspec/shared_contexts.rb +1 -5
  313. data/lib/rubocop/runner.rb +1 -1
  314. data/lib/rubocop/target_finder.rb +12 -9
  315. data/lib/rubocop/version.rb +2 -2
  316. metadata +21 -8
  317. data/lib/rubocop/cop/lint/useless_comparison.rb +0 -28
  318. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +0 -37
  319. data/lib/rubocop/cop/mixin/too_many_lines.rb +0 -25
  320. data/lib/rubocop/cop/style/method_missing_super.rb +0 -34
@@ -62,9 +62,11 @@ module RuboCop
62
62
  # private :bar, :baz
63
63
  #
64
64
  # end
65
- class AccessModifierDeclarations < Cop
65
+ class AccessModifierDeclarations < Base
66
66
  include ConfigurableEnforcedStyle
67
67
 
68
+ ACCESS_MODIFIERS = %i[private protected public module_function].to_set.freeze
69
+
68
70
  GROUP_STYLE_MESSAGE = [
69
71
  '`%<access_modifier>s` should not be',
70
72
  'inlined in method definitions.'
@@ -80,15 +82,12 @@ module RuboCop
80
82
  PATTERN
81
83
 
82
84
  def on_send(node)
83
- return unless node.access_modifier?
85
+ return unless access_modifier?(node)
84
86
  return if node.parent.pair_type?
85
- return if cop_config['AllowModifiersOnSymbols'] &&
86
- access_modifier_with_symbol?(node)
87
+ return if cop_config['AllowModifiersOnSymbols'] && access_modifier_with_symbol?(node)
87
88
 
88
89
  if offense?(node)
89
- add_offense(node, location: :selector) do
90
- opposite_style_detected
91
- end
90
+ add_offense(node.loc.selector) if opposite_style_detected
92
91
  else
93
92
  correct_style_detected
94
93
  end
@@ -96,6 +95,14 @@ module RuboCop
96
95
 
97
96
  private
98
97
 
98
+ def access_modifier?(node)
99
+ maybe_access_modifier?(node) && node.access_modifier?
100
+ end
101
+
102
+ def maybe_access_modifier?(node)
103
+ !node.receiver && ACCESS_MODIFIERS.include?(node.method_name)
104
+ end
105
+
99
106
  def offense?(node)
100
107
  (group_style? && access_modifier_is_inlined?(node)) ||
101
108
  (inline_style? && access_modifier_is_not_inlined?(node))
@@ -117,8 +124,8 @@ module RuboCop
117
124
  !access_modifier_is_inlined?(node)
118
125
  end
119
126
 
120
- def message(node)
121
- access_modifier = node.loc.selector.source
127
+ def message(range)
128
+ access_modifier = range.source
122
129
 
123
130
  if group_style?
124
131
  format(GROUP_STYLE_MESSAGE, access_modifier: access_modifier)
@@ -31,9 +31,11 @@ module RuboCop
31
31
  # attr_reader :baz
32
32
  # end
33
33
  #
34
- class AccessorGrouping < Cop
34
+ class AccessorGrouping < Base
35
35
  include ConfigurableEnforcedStyle
36
+ include RangeHelp
36
37
  include VisibilityHelp
38
+ extend AutoCorrector
37
39
 
38
40
  GROUPED_MSG = 'Group together all `%<accessor>s` attributes.'
39
41
  SEPARATED_MSG = 'Use one attribute per `%<accessor>s`.'
@@ -50,13 +52,27 @@ module RuboCop
50
52
  alias on_sclass on_class
51
53
  alias on_module on_class
52
54
 
53
- def autocorrect(node)
54
- lambda do |corrector|
55
- corrector.replace(node, correction(node))
55
+ private
56
+
57
+ def check(send_node)
58
+ return if previous_line_comment?(send_node)
59
+ return unless grouped_style? && sibling_accessors(send_node).size > 1 ||
60
+ separated_style? && send_node.arguments.size > 1
61
+
62
+ message = message(send_node)
63
+ add_offense(send_node, message: message) do |corrector|
64
+ autocorrect(corrector, send_node)
56
65
  end
57
66
  end
58
67
 
59
- private
68
+ def autocorrect(corrector, node)
69
+ if (preferred_accessors = preferred_accessors(node))
70
+ corrector.replace(node, preferred_accessors)
71
+ else
72
+ range = range_with_surrounding_space(range: node.loc.expression, side: :left)
73
+ corrector.remove(range)
74
+ end
75
+ end
60
76
 
61
77
  def previous_line_comment?(node)
62
78
  comment_line?(processed_source[node.first_line - 2])
@@ -78,16 +94,6 @@ module RuboCop
78
94
  send_node.macro? && ACCESSOR_METHODS.include?(send_node.method_name)
79
95
  end
80
96
 
81
- def check(send_node)
82
- return if previous_line_comment?(send_node)
83
-
84
- if grouped_style? && sibling_accessors(send_node).size > 1
85
- add_offense(send_node)
86
- elsif separated_style? && send_node.arguments.size > 1
87
- add_offense(send_node)
88
- end
89
- end
90
-
91
97
  def grouped_style?
92
98
  style == :grouped
93
99
  end
@@ -110,14 +116,10 @@ module RuboCop
110
116
  format(msg, accessor: send_node.method_name)
111
117
  end
112
118
 
113
- def correction(node)
119
+ def preferred_accessors(node)
114
120
  if grouped_style?
115
121
  accessors = sibling_accessors(node)
116
- if node == accessors.first
117
- group_accessors(node, accessors)
118
- else
119
- ''
120
- end
122
+ group_accessors(node, accessors) if node == accessors.first
121
123
  else
122
124
  separate_accessors(node)
123
125
  end
@@ -22,8 +22,9 @@ module RuboCop
22
22
  #
23
23
  # # good
24
24
  # alias_method :bar, :foo
25
- class Alias < Cop
25
+ class Alias < Base
26
26
  include ConfigurableEnforcedStyle
27
+ extend AutoCorrector
27
28
 
28
29
  MSG_ALIAS = 'Use `alias_method` instead of `alias`.'
29
30
  MSG_ALIAS_METHOD = 'Use `alias` instead of `alias_method` ' \
@@ -36,31 +37,37 @@ module RuboCop
36
37
  return unless style == :prefer_alias && alias_keyword_possible?(node)
37
38
 
38
39
  msg = format(MSG_ALIAS_METHOD, current: lexical_scope_type(node))
39
- add_offense(node, location: :selector, message: msg)
40
+ add_offense(node.loc.selector, message: msg) do |corrector|
41
+ autocorrect(corrector, node)
42
+ end
40
43
  end
41
44
 
42
45
  def on_alias(node)
43
46
  return unless alias_method_possible?(node)
44
47
 
45
48
  if scope_type(node) == :dynamic || style == :prefer_alias_method
46
- add_offense(node, location: :keyword, message: MSG_ALIAS)
49
+ add_offense(node.loc.keyword, message: MSG_ALIAS) do |corrector|
50
+ autocorrect(corrector, node)
51
+ end
47
52
  elsif node.children.none? { |arg| bareword?(arg) }
48
- add_offense_for_args(node)
53
+ add_offense_for_args(node) do |corrector|
54
+ autocorrect(corrector, node)
55
+ end
49
56
  end
50
57
  end
51
58
 
52
- def autocorrect(node)
59
+ private
60
+
61
+ def autocorrect(corrector, node)
53
62
  if node.send_type?
54
- correct_alias_method_to_alias(node)
63
+ correct_alias_method_to_alias(corrector, node)
55
64
  elsif scope_type(node) == :dynamic || style == :prefer_alias_method
56
- correct_alias_to_alias_method(node)
65
+ correct_alias_to_alias_method(corrector, node)
57
66
  else
58
- correct_alias_with_symbol_args(node)
67
+ correct_alias_with_symbol_args(corrector, node)
59
68
  end
60
69
  end
61
70
 
62
- private
63
-
64
71
  def alias_keyword_possible?(node)
65
72
  scope_type(node) != :dynamic && node.arguments.all?(&:sym_type?)
66
73
  end
@@ -70,14 +77,14 @@ module RuboCop
70
77
  node.children.none?(&:gvar_type?)
71
78
  end
72
79
 
73
- def add_offense_for_args(node)
80
+ def add_offense_for_args(node, &block)
74
81
  existing_args = node.children.map(&:source).join(' ')
75
82
  preferred_args = node.children.map { |a| a.source[1..-1] }.join(' ')
76
83
  arg_ranges = node.children.map(&:source_range)
77
84
  msg = format(MSG_SYMBOL_ARGS,
78
85
  prefer: preferred_args,
79
86
  current: existing_args)
80
- add_offense(node, location: arg_ranges.reduce(&:join), message: msg)
87
+ add_offense(arg_ranges.reduce(&:join), message: msg, &block)
81
88
  end
82
89
 
83
90
  # In this expression, will `self` be the same as the innermost enclosing
@@ -101,41 +108,39 @@ module RuboCop
101
108
  end
102
109
 
103
110
  def lexical_scope_type(node)
104
- node.each_ancestor(:class, :module) do |ancestor|
105
- return ancestor.class_type? ? 'in a class body' : 'in a module body'
111
+ ancestor = node.each_ancestor(:class, :module).first
112
+ if ancestor.nil?
113
+ 'at the top level'
114
+ elsif ancestor.class_type?
115
+ 'in a class body'
116
+ else
117
+ 'in a module body'
106
118
  end
107
- 'at the top level'
108
119
  end
109
120
 
110
121
  def bareword?(sym_node)
111
122
  !sym_node.source.start_with?(':')
112
123
  end
113
124
 
114
- def correct_alias_method_to_alias(send_node)
115
- lambda do |corrector|
116
- new, old = *send_node.arguments
117
- replacement = "alias #{identifier(new)} #{identifier(old)}"
118
- corrector.replace(send_node, replacement)
119
- end
125
+ def correct_alias_method_to_alias(corrector, send_node)
126
+ new, old = *send_node.arguments
127
+ replacement = "alias #{identifier(new)} #{identifier(old)}"
128
+
129
+ corrector.replace(send_node, replacement)
120
130
  end
121
131
 
122
- def correct_alias_to_alias_method(node)
123
- lambda do |corrector|
124
- replacement =
125
- 'alias_method ' \
126
- ":#{identifier(node.new_identifier)}, " \
127
- ":#{identifier(node.old_identifier)}"
128
- corrector.replace(node, replacement)
129
- end
132
+ def correct_alias_to_alias_method(corrector, node)
133
+ replacement =
134
+ 'alias_method ' \
135
+ ":#{identifier(node.new_identifier)}, " \
136
+ ":#{identifier(node.old_identifier)}"
137
+
138
+ corrector.replace(node, replacement)
130
139
  end
131
140
 
132
- def correct_alias_with_symbol_args(node)
133
- lambda do |corrector|
134
- corrector.replace(node.new_identifier,
135
- node.new_identifier.source[1..-1])
136
- corrector.replace(node.old_identifier,
137
- node.old_identifier.source[1..-1])
138
- end
141
+ def correct_alias_with_symbol_args(corrector, node)
142
+ corrector.replace(node.new_identifier, node.new_identifier.source[1..-1])
143
+ corrector.replace(node.old_identifier, node.old_identifier.source[1..-1])
139
144
  end
140
145
 
141
146
  def_node_matcher :identifier, <<~PATTERN
@@ -36,9 +36,10 @@ module RuboCop
36
36
  # # good
37
37
  # if foo && bar
38
38
  # end
39
- class AndOr < Cop
39
+ class AndOr < Base
40
40
  include ConfigurableEnforcedStyle
41
41
  include RangeHelp
42
+ extend AutoCorrector
42
43
 
43
44
  MSG = 'Use `%<prefer>s` instead of `%<current>s`.'
44
45
 
@@ -55,8 +56,13 @@ module RuboCop
55
56
  alias on_until on_if
56
57
  alias on_until_post on_if
57
58
 
58
- def autocorrect(node)
59
- lambda do |corrector|
59
+ private
60
+
61
+ def process_logical_operator(node)
62
+ return if node.logical_operator?
63
+
64
+ message = message(node)
65
+ add_offense(node.loc.operator, message: message) do |corrector|
60
66
  node.each_child_node do |expr|
61
67
  if expr.send_type?
62
68
  correct_send(expr, corrector)
@@ -71,20 +77,12 @@ module RuboCop
71
77
  end
72
78
  end
73
79
 
74
- private
75
-
76
80
  def on_conditionals(node)
77
81
  node.condition.each_node(*AST::Node::OPERATOR_KEYWORDS) do |operator|
78
82
  process_logical_operator(operator)
79
83
  end
80
84
  end
81
85
 
82
- def process_logical_operator(node)
83
- return if node.logical_operator?
84
-
85
- add_offense(node, location: :operator)
86
- end
87
-
88
86
  def message(node)
89
87
  format(MSG, prefer: node.alternate_operator, current: node.operator)
90
88
  end
@@ -17,20 +17,18 @@ module RuboCop
17
17
  # # good
18
18
  # %w(foo bar baz).join(",")
19
19
  #
20
- class ArrayJoin < Cop
20
+ class ArrayJoin < Base
21
+ extend AutoCorrector
22
+
21
23
  MSG = 'Favor `Array#join` over `Array#*`.'
22
24
 
23
25
  def_node_matcher :join_candidate?, '(send $array :* $str)'
24
26
 
25
27
  def on_send(node)
26
- join_candidate?(node) { add_offense(node, location: :selector) }
27
- end
28
-
29
- def autocorrect(node)
30
- array, join_arg = join_candidate?(node).map(&:source)
28
+ return unless (array, join_arg = join_candidate?(node))
31
29
 
32
- lambda do |corrector|
33
- corrector.replace(node, "#{array}.join(#{join_arg})")
30
+ add_offense(node.loc.selector) do |corrector|
31
+ corrector.replace(node, "#{array.source}.join(#{join_arg.source})")
34
32
  end
35
33
  end
36
34
  end
@@ -15,17 +15,17 @@ module RuboCop
15
15
  #
16
16
  # # good
17
17
  # # Translates from English to Japanese
18
- class AsciiComments < Cop
18
+ class AsciiComments < Base
19
19
  include RangeHelp
20
20
 
21
21
  MSG = 'Use only ascii symbols in 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.text.ascii_only?
26
26
  next if only_allowed_non_ascii_chars?(comment.text)
27
27
 
28
- add_offense(comment, location: first_offense_range(comment))
28
+ add_offense(first_offense_range(comment))
29
29
  end
30
30
  end
31
31
 
@@ -14,8 +14,9 @@ module RuboCop
14
14
  # attr_accessor :something
15
15
  # attr_reader :one, :two, :three
16
16
  #
17
- class Attr < Cop
17
+ class Attr < Base
18
18
  include RangeHelp
19
+ extend AutoCorrector
19
20
 
20
21
  MSG = 'Do not use `attr`. Use `%<replacement>s` instead.'
21
22
 
@@ -26,10 +27,15 @@ module RuboCop
26
27
  !node.parent.class_type? &&
27
28
  !class_eval?(node.parent)
28
29
 
29
- add_offense(node, location: :selector)
30
+ message = message(node)
31
+ add_offense(node.loc.selector, message: message) do |corrector|
32
+ autocorrect(corrector, node)
33
+ end
30
34
  end
31
35
 
32
- def autocorrect(node)
36
+ private
37
+
38
+ def autocorrect(corrector, node)
33
39
  attr_name, setter = *node.arguments
34
40
 
35
41
  node_expr = node.source_range
@@ -37,14 +43,10 @@ module RuboCop
37
43
 
38
44
  remove = range_between(attr_expr.end_pos, node_expr.end_pos) if setter&.boolean_type?
39
45
 
40
- lambda do |corrector|
41
- corrector.replace(node.loc.selector, replacement_method(node))
42
- corrector.remove(remove) if remove
43
- end
46
+ corrector.replace(node.loc.selector, replacement_method(node))
47
+ corrector.remove(remove) if remove
44
48
  end
45
49
 
46
- private
47
-
48
50
  def message(node)
49
51
  format(MSG, replacement: replacement_method(node))
50
52
  end
@@ -16,7 +16,7 @@ module RuboCop
16
16
  # File.open('file') do |f|
17
17
  # # ...
18
18
  # end
19
- class AutoResourceCleanup < Cop
19
+ class AutoResourceCleanup < Base
20
20
  MSG = 'Use the block version of `%<class>s.%<method>s`.'
21
21
 
22
22
  TARGET_METHODS = {
@@ -32,10 +32,7 @@ module RuboCop
32
32
 
33
33
  next if cleanup?(node)
34
34
 
35
- add_offense(node,
36
- message: format(MSG,
37
- class: target_class,
38
- method: target_method))
35
+ add_offense(node, message: format(MSG, class: target_class, method: target_method))
39
36
  end
40
37
  end
41
38
 
@@ -23,8 +23,9 @@ module RuboCop
23
23
  # %Q|He said: "#{greeting}"|
24
24
  # %q/She said: 'Hi'/
25
25
  #
26
- class BarePercentLiterals < Cop
26
+ class BarePercentLiterals < Base
27
27
  include ConfigurableEnforcedStyle
28
+ extend AutoCorrector
28
29
 
29
30
  MSG = 'Use `%%%<good>s` instead of `%%%<bad>s`.'
30
31
 
@@ -36,14 +37,6 @@ module RuboCop
36
37
  check(node)
37
38
  end
38
39
 
39
- def autocorrect(node)
40
- src = node.loc.begin.source
41
- replacement = src.start_with?('%Q') ? '%' : '%Q'
42
- lambda do |corrector|
43
- corrector.replace(node.loc.begin, src.sub(/%Q?/, replacement))
44
- end
45
- end
46
-
47
40
  private
48
41
 
49
42
  def check(node)
@@ -68,9 +61,14 @@ module RuboCop
68
61
  end
69
62
 
70
63
  def add_offense_for_wrong_style(node, good, bad)
71
- add_offense(node, location: :begin, message: format(MSG,
72
- good: good,
73
- bad: bad))
64
+ location = node.loc.begin
65
+
66
+ add_offense(location, message: format(MSG, good: good, bad: bad)) do |corrector|
67
+ source = location.source
68
+ replacement = source.start_with?('%Q') ? '%' : '%Q'
69
+
70
+ corrector.replace(location, source.sub(/%Q?/, replacement))
71
+ end
74
72
  end
75
73
  end
76
74
  end