rubocop 1.9.1 → 1.22.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (560) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +17 -14
  3. data/assets/output.html.erb +1 -1
  4. data/config/default.yml +326 -73
  5. data/config/obsoletion.yml +4 -0
  6. data/exe/rubocop +1 -3
  7. data/lib/rubocop/cached_data.rb +1 -3
  8. data/lib/rubocop/cli/command/auto_genenerate_config.rb +9 -19
  9. data/lib/rubocop/cli/command/execute_runner.rb +1 -1
  10. data/lib/rubocop/cli/command/init_dotfile.rb +1 -3
  11. data/lib/rubocop/cli/command/show_cops.rb +1 -4
  12. data/lib/rubocop/cli/command/suggest_extensions.rb +6 -5
  13. data/lib/rubocop/cli.rb +21 -5
  14. data/lib/rubocop/comment_config.rb +45 -101
  15. data/lib/rubocop/config.rb +16 -26
  16. data/lib/rubocop/config_loader.rb +11 -15
  17. data/lib/rubocop/config_loader_resolver.rb +44 -21
  18. data/lib/rubocop/config_obsoletion/cop_rule.rb +1 -2
  19. data/lib/rubocop/config_store.rb +1 -2
  20. data/lib/rubocop/config_validator.rb +37 -21
  21. data/lib/rubocop/cop/autocorrect_logic.rb +3 -8
  22. data/lib/rubocop/cop/badge.rb +1 -2
  23. data/lib/rubocop/cop/base.rb +13 -11
  24. data/lib/rubocop/cop/bundler/duplicated_gem.rb +4 -4
  25. data/lib/rubocop/cop/bundler/gem_comment.rb +43 -10
  26. data/lib/rubocop/cop/bundler/gem_filename.rb +103 -0
  27. data/lib/rubocop/cop/bundler/gem_version.rb +133 -0
  28. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +46 -21
  29. data/lib/rubocop/cop/bundler/ordered_gems.rb +5 -16
  30. data/lib/rubocop/cop/commissioner.rb +2 -8
  31. data/lib/rubocop/cop/cop.rb +4 -18
  32. data/lib/rubocop/cop/corrector.rb +5 -8
  33. data/lib/rubocop/cop/correctors/alignment_corrector.rb +6 -12
  34. data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +2 -4
  35. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +1 -2
  36. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +2 -2
  37. data/lib/rubocop/cop/correctors/line_break_corrector.rb +3 -6
  38. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +1 -3
  39. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +11 -12
  40. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -8
  41. data/lib/rubocop/cop/correctors/require_library_corrector.rb +23 -0
  42. data/lib/rubocop/cop/documentation.rb +1 -1
  43. data/lib/rubocop/cop/gemspec/date_assignment.rb +57 -0
  44. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +3 -2
  45. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +5 -16
  46. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +32 -23
  47. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +2 -0
  48. data/lib/rubocop/cop/generator/configuration_injector.rb +1 -2
  49. data/lib/rubocop/cop/generator/require_file_injector.rb +2 -5
  50. data/lib/rubocop/cop/generator.rb +18 -15
  51. data/lib/rubocop/cop/internal_affairs/example_description.rb +8 -5
  52. data/lib/rubocop/cop/internal_affairs/inherit_deprecated_cop_class.rb +34 -0
  53. data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +60 -0
  54. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +3 -5
  55. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +3 -3
  56. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +151 -0
  57. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +2 -3
  58. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +3 -2
  59. data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +1 -0
  60. data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +1 -0
  61. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -0
  62. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +3 -0
  63. data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +5 -2
  64. data/lib/rubocop/cop/internal_affairs/undefined_config.rb +71 -0
  65. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +3 -3
  66. data/lib/rubocop/cop/internal_affairs.rb +4 -0
  67. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +12 -10
  68. data/lib/rubocop/cop/layout/argument_alignment.rb +36 -19
  69. data/lib/rubocop/cop/layout/array_alignment.rb +9 -8
  70. data/lib/rubocop/cop/layout/assignment_indentation.rb +9 -8
  71. data/lib/rubocop/cop/layout/begin_end_alignment.rb +1 -4
  72. data/lib/rubocop/cop/layout/block_alignment.rb +12 -23
  73. data/lib/rubocop/cop/layout/block_end_newline.rb +4 -8
  74. data/lib/rubocop/cop/layout/case_indentation.rb +57 -11
  75. data/lib/rubocop/cop/layout/class_structure.rb +12 -12
  76. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +24 -30
  77. data/lib/rubocop/cop/layout/comment_indentation.rb +18 -22
  78. data/lib/rubocop/cop/layout/def_end_alignment.rb +2 -6
  79. data/lib/rubocop/cop/layout/dot_position.rb +42 -9
  80. data/lib/rubocop/cop/layout/else_alignment.rb +10 -9
  81. data/lib/rubocop/cop/layout/empty_comment.rb +6 -13
  82. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +44 -23
  83. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +2 -6
  84. data/lib/rubocop/cop/layout/empty_lines.rb +1 -3
  85. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +8 -18
  86. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +9 -12
  87. data/lib/rubocop/cop/layout/end_alignment.rb +10 -4
  88. data/lib/rubocop/cop/layout/end_of_line.rb +1 -1
  89. data/lib/rubocop/cop/layout/extra_spacing.rb +5 -9
  90. data/lib/rubocop/cop/layout/first_argument_indentation.rb +12 -6
  91. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +13 -11
  92. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -2
  93. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +37 -21
  94. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -2
  95. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -2
  96. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +1 -2
  97. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +8 -7
  98. data/lib/rubocop/cop/layout/hash_alignment.rb +58 -31
  99. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +4 -11
  100. data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -13
  101. data/lib/rubocop/cop/layout/indentation_consistency.rb +9 -6
  102. data/lib/rubocop/cop/layout/indentation_style.rb +25 -30
  103. data/lib/rubocop/cop/layout/indentation_width.rb +34 -13
  104. data/lib/rubocop/cop/layout/initial_indentation.rb +1 -4
  105. data/lib/rubocop/cop/layout/leading_comment_space.rb +2 -2
  106. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +141 -0
  107. data/lib/rubocop/cop/layout/line_length.rb +13 -22
  108. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +6 -6
  109. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +1 -2
  110. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +29 -3
  111. data/lib/rubocop/cop/layout/multiline_block_layout.rb +10 -18
  112. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +6 -6
  113. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -2
  114. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +4 -2
  115. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +6 -6
  116. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +22 -15
  117. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +6 -6
  118. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +13 -8
  119. data/lib/rubocop/cop/layout/parameter_alignment.rb +8 -7
  120. data/lib/rubocop/cop/layout/redundant_line_break.rb +140 -0
  121. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +26 -16
  122. data/lib/rubocop/cop/layout/single_line_block_chain.rb +64 -0
  123. data/lib/rubocop/cop/layout/space_after_colon.rb +1 -3
  124. data/lib/rubocop/cop/layout/space_after_method_name.rb +2 -4
  125. data/lib/rubocop/cop/layout/space_after_not.rb +1 -0
  126. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +6 -14
  127. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +2 -2
  128. data/lib/rubocop/cop/layout/space_around_keyword.rb +33 -8
  129. data/lib/rubocop/cop/layout/space_around_operators.rb +23 -11
  130. data/lib/rubocop/cop/layout/space_before_block_braces.rb +2 -3
  131. data/lib/rubocop/cop/layout/space_before_brackets.rb +3 -4
  132. data/lib/rubocop/cop/layout/space_before_comment.rb +3 -5
  133. data/lib/rubocop/cop/layout/space_before_first_arg.rb +5 -11
  134. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +2 -4
  135. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +5 -10
  136. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +2 -7
  137. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +6 -11
  138. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +1 -2
  139. data/lib/rubocop/cop/layout/space_inside_parens.rb +78 -32
  140. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +1 -2
  141. data/lib/rubocop/cop/layout/trailing_whitespace.rb +24 -1
  142. data/lib/rubocop/cop/legacy/corrections_proxy.rb +2 -8
  143. data/lib/rubocop/cop/legacy/corrector.rb +1 -3
  144. data/lib/rubocop/cop/lint/ambiguous_assignment.rb +1 -6
  145. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +14 -7
  146. data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +111 -0
  147. data/lib/rubocop/cop/lint/ambiguous_range.rb +105 -0
  148. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +5 -2
  149. data/lib/rubocop/cop/lint/assignment_in_condition.rb +7 -5
  150. data/lib/rubocop/cop/lint/big_decimal_new.rb +1 -0
  151. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +18 -5
  152. data/lib/rubocop/cop/lint/boolean_symbol.rb +7 -2
  153. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +2 -0
  154. data/lib/rubocop/cop/lint/constant_resolution.rb +2 -2
  155. data/lib/rubocop/cop/lint/debugger.rb +59 -15
  156. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +83 -41
  157. data/lib/rubocop/cop/lint/deprecated_constants.rb +5 -4
  158. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +16 -9
  159. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +24 -1
  160. data/lib/rubocop/cop/lint/duplicate_branch.rb +4 -4
  161. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -3
  162. data/lib/rubocop/cop/lint/duplicate_methods.rb +14 -12
  163. data/lib/rubocop/cop/lint/duplicate_require.rb +3 -2
  164. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -0
  165. data/lib/rubocop/cop/lint/else_layout.rb +12 -10
  166. data/lib/rubocop/cop/lint/empty_block.rb +18 -2
  167. data/lib/rubocop/cop/lint/empty_ensure.rb +1 -3
  168. data/lib/rubocop/cop/lint/empty_file.rb +1 -3
  169. data/lib/rubocop/cop/lint/empty_in_pattern.rb +62 -0
  170. data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -3
  171. data/lib/rubocop/cop/lint/ensure_return.rb +1 -3
  172. data/lib/rubocop/cop/lint/erb_new_arguments.rb +4 -7
  173. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -2
  174. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +4 -6
  175. data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +13 -3
  176. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +1 -2
  177. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -2
  178. data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +67 -0
  179. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +4 -7
  180. data/lib/rubocop/cop/lint/inherit_exception.rb +2 -2
  181. data/lib/rubocop/cop/lint/interpolation_check.rb +8 -11
  182. data/lib/rubocop/cop/lint/literal_as_condition.rb +13 -1
  183. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +3 -6
  184. data/lib/rubocop/cop/lint/loop.rb +5 -5
  185. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +32 -21
  186. data/lib/rubocop/cop/lint/missing_super.rb +1 -2
  187. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -2
  188. data/lib/rubocop/cop/lint/multiple_comparison.rb +5 -4
  189. data/lib/rubocop/cop/lint/nested_method_definition.rb +4 -2
  190. data/lib/rubocop/cop/lint/nested_percent_literal.rb +2 -4
  191. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -0
  192. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +13 -4
  193. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -0
  194. data/lib/rubocop/cop/lint/number_conversion.rb +25 -6
  195. data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -1
  196. data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +4 -2
  197. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +1 -2
  198. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +18 -3
  199. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -3
  200. data/lib/rubocop/cop/lint/percent_string_array.rb +11 -1
  201. data/lib/rubocop/cop/lint/percent_symbol_array.rb +2 -4
  202. data/lib/rubocop/cop/lint/raise_exception.rb +7 -2
  203. data/lib/rubocop/cop/lint/rand_one.rb +2 -2
  204. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +108 -90
  205. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +5 -0
  206. data/lib/rubocop/cop/lint/redundant_require_statement.rb +1 -0
  207. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +7 -7
  208. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +10 -10
  209. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
  210. data/lib/rubocop/cop/lint/redundant_with_index.rb +2 -4
  211. data/lib/rubocop/cop/lint/redundant_with_object.rb +2 -4
  212. data/lib/rubocop/cop/lint/regexp_as_condition.rb +1 -3
  213. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -4
  214. data/lib/rubocop/cop/lint/require_relative_self_path.rb +50 -0
  215. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -2
  216. data/lib/rubocop/cop/lint/rescue_type.rb +2 -7
  217. data/lib/rubocop/cop/lint/return_in_void_context.rb +1 -2
  218. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +2 -2
  219. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +4 -10
  220. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +2 -2
  221. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +3 -7
  222. data/lib/rubocop/cop/lint/shadowed_argument.rb +6 -12
  223. data/lib/rubocop/cop/lint/shadowed_exception.rb +7 -8
  224. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +2 -1
  225. data/lib/rubocop/cop/lint/struct_new_override.rb +2 -2
  226. data/lib/rubocop/cop/lint/suppressed_exception.rb +44 -1
  227. data/lib/rubocop/cop/lint/symbol_conversion.rb +86 -11
  228. data/lib/rubocop/cop/lint/syntax.rb +1 -3
  229. data/lib/rubocop/cop/lint/to_enum_arguments.rb +3 -0
  230. data/lib/rubocop/cop/lint/to_json.rb +1 -2
  231. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1 -3
  232. data/lib/rubocop/cop/lint/triple_quotes.rb +1 -1
  233. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +1 -3
  234. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +8 -3
  235. data/lib/rubocop/cop/lint/unified_integer.rb +1 -0
  236. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +5 -0
  237. data/lib/rubocop/cop/lint/unreachable_code.rb +3 -5
  238. data/lib/rubocop/cop/lint/unreachable_loop.rb +15 -7
  239. data/lib/rubocop/cop/lint/unused_block_argument.rb +10 -8
  240. data/lib/rubocop/cop/lint/unused_method_argument.rb +4 -5
  241. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -0
  242. data/lib/rubocop/cop/lint/useless_access_modifier.rb +6 -4
  243. data/lib/rubocop/cop/lint/useless_assignment.rb +5 -10
  244. data/lib/rubocop/cop/lint/useless_method_definition.rb +3 -2
  245. data/lib/rubocop/cop/lint/useless_setter_call.rb +9 -7
  246. data/lib/rubocop/cop/lint/useless_times.rb +8 -4
  247. data/lib/rubocop/cop/lint/void.rb +5 -12
  248. data/lib/rubocop/cop/message_annotator.rb +1 -3
  249. data/lib/rubocop/cop/metrics/abc_size.rb +6 -0
  250. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -7
  251. data/lib/rubocop/cop/metrics/class_length.rb +1 -3
  252. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -2
  253. data/lib/rubocop/cop/metrics/module_length.rb +3 -6
  254. data/lib/rubocop/cop/metrics/parameter_lists.rb +8 -7
  255. data/lib/rubocop/cop/metrics/perceived_complexity.rb +2 -3
  256. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +5 -8
  257. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +8 -6
  258. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +4 -7
  259. data/lib/rubocop/cop/migration/department_name.rb +4 -6
  260. data/lib/rubocop/cop/mixin/alignment.rb +12 -7
  261. data/lib/rubocop/cop/mixin/annotation_comment.rb +57 -34
  262. data/lib/rubocop/cop/mixin/check_line_breakable.rb +29 -4
  263. data/lib/rubocop/cop/mixin/code_length.rb +2 -4
  264. data/lib/rubocop/cop/mixin/comments_help.rb +5 -1
  265. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +2 -2
  266. data/lib/rubocop/cop/mixin/configurable_formatting.rb +3 -8
  267. data/lib/rubocop/cop/mixin/def_node.rb +3 -5
  268. data/lib/rubocop/cop/mixin/documentation_comment.rb +8 -8
  269. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +6 -7
  270. data/lib/rubocop/cop/mixin/empty_parameter.rb +2 -3
  271. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +2 -5
  272. data/lib/rubocop/cop/mixin/enforce_superclass.rb +4 -6
  273. data/lib/rubocop/cop/mixin/first_element_line_break.rb +1 -3
  274. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +30 -8
  275. data/lib/rubocop/cop/mixin/gem_declaration.rb +13 -0
  276. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +17 -9
  277. data/lib/rubocop/cop/mixin/hash_transform_method.rb +16 -25
  278. data/lib/rubocop/cop/mixin/heredoc.rb +5 -0
  279. data/lib/rubocop/cop/mixin/interpolation.rb +1 -3
  280. data/lib/rubocop/cop/mixin/line_length_help.rb +13 -10
  281. data/lib/rubocop/cop/mixin/match_range.rb +2 -5
  282. data/lib/rubocop/cop/mixin/method_complexity.rb +2 -3
  283. data/lib/rubocop/cop/mixin/method_preference.rb +1 -2
  284. data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +5 -4
  285. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +1 -3
  286. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +13 -42
  287. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +2 -3
  288. data/lib/rubocop/cop/mixin/negative_conditional.rb +4 -2
  289. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +10 -5
  290. data/lib/rubocop/cop/mixin/percent_array.rb +17 -8
  291. data/lib/rubocop/cop/mixin/percent_literal.rb +0 -6
  292. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +14 -12
  293. data/lib/rubocop/cop/mixin/preferred_delimiters.rb +6 -9
  294. data/lib/rubocop/cop/mixin/range_help.rb +10 -13
  295. data/lib/rubocop/cop/mixin/rational_literal.rb +1 -0
  296. data/lib/rubocop/cop/mixin/require_library.rb +59 -0
  297. data/lib/rubocop/cop/mixin/rescue_node.rb +2 -6
  298. data/lib/rubocop/cop/mixin/safe_assignment.rb +6 -2
  299. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +2 -4
  300. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +3 -4
  301. data/lib/rubocop/cop/mixin/statement_modifier.rb +2 -4
  302. data/lib/rubocop/cop/mixin/string_literals_help.rb +7 -5
  303. data/lib/rubocop/cop/mixin/symbol_help.rb +13 -0
  304. data/lib/rubocop/cop/mixin/trailing_body.rb +2 -3
  305. data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -2
  306. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +7 -13
  307. data/lib/rubocop/cop/mixin/unused_argument.rb +1 -3
  308. data/lib/rubocop/cop/mixin/visibility_help.rb +1 -0
  309. data/lib/rubocop/cop/naming/ascii_identifiers.rb +2 -7
  310. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +2 -2
  311. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  312. data/lib/rubocop/cop/naming/constant_name.rb +3 -1
  313. data/lib/rubocop/cop/naming/file_name.rb +7 -16
  314. data/lib/rubocop/cop/naming/inclusive_language.rb +266 -0
  315. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +11 -5
  316. data/lib/rubocop/cop/naming/method_name.rb +4 -2
  317. data/lib/rubocop/cop/naming/predicate_name.rb +2 -2
  318. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +17 -0
  319. data/lib/rubocop/cop/offense.rb +3 -8
  320. data/lib/rubocop/cop/registry.rb +13 -12
  321. data/lib/rubocop/cop/security/eval.rb +1 -0
  322. data/lib/rubocop/cop/security/io_methods.rb +49 -0
  323. data/lib/rubocop/cop/security/json_load.rb +9 -7
  324. data/lib/rubocop/cop/security/marshal_load.rb +1 -0
  325. data/lib/rubocop/cop/security/open.rb +5 -0
  326. data/lib/rubocop/cop/security/yaml_load.rb +5 -0
  327. data/lib/rubocop/cop/style/access_modifier_declarations.rb +4 -5
  328. data/lib/rubocop/cop/style/accessor_grouping.rb +3 -5
  329. data/lib/rubocop/cop/style/alias.rb +6 -12
  330. data/lib/rubocop/cop/style/and_or.rb +8 -1
  331. data/lib/rubocop/cop/style/arguments_forwarding.rb +17 -5
  332. data/lib/rubocop/cop/style/array_coercion.rb +23 -3
  333. data/lib/rubocop/cop/style/array_join.rb +1 -0
  334. data/lib/rubocop/cop/style/ascii_comments.rb +1 -5
  335. data/lib/rubocop/cop/style/attr.rb +2 -3
  336. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +2 -5
  337. data/lib/rubocop/cop/style/bisected_attr_accessor/macro.rb +60 -0
  338. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +59 -71
  339. data/lib/rubocop/cop/style/block_delimiters.rb +50 -2
  340. data/lib/rubocop/cop/style/case_equality.rb +8 -10
  341. data/lib/rubocop/cop/style/case_like_if.rb +21 -6
  342. data/lib/rubocop/cop/style/character_literal.rb +2 -4
  343. data/lib/rubocop/cop/style/class_and_module_children.rb +42 -10
  344. data/lib/rubocop/cop/style/class_equality_comparison.rb +3 -0
  345. data/lib/rubocop/cop/style/class_methods.rb +1 -3
  346. data/lib/rubocop/cop/style/collection_compact.rb +10 -8
  347. data/lib/rubocop/cop/style/collection_methods.rb +8 -6
  348. data/lib/rubocop/cop/style/colon_method_call.rb +2 -3
  349. data/lib/rubocop/cop/style/combinable_loops.rb +6 -4
  350. data/lib/rubocop/cop/style/command_literal.rb +4 -9
  351. data/lib/rubocop/cop/style/comment_annotation.rb +57 -30
  352. data/lib/rubocop/cop/style/commented_keyword.rb +16 -16
  353. data/lib/rubocop/cop/style/conditional_assignment.rb +31 -29
  354. data/lib/rubocop/cop/style/constant_visibility.rb +28 -0
  355. data/lib/rubocop/cop/style/copyright.rb +3 -6
  356. data/lib/rubocop/cop/style/date_time.rb +10 -5
  357. data/lib/rubocop/cop/style/def_with_parentheses.rb +1 -2
  358. data/lib/rubocop/cop/style/dir.rb +1 -0
  359. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +2 -2
  360. data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +1 -1
  361. data/lib/rubocop/cop/style/documentation.rb +52 -10
  362. data/lib/rubocop/cop/style/documentation_method.rb +1 -0
  363. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +1 -7
  364. data/lib/rubocop/cop/style/double_negation.rb +30 -8
  365. data/lib/rubocop/cop/style/each_for_simple_loop.rb +2 -2
  366. data/lib/rubocop/cop/style/each_with_object.rb +1 -0
  367. data/lib/rubocop/cop/style/empty_case_condition.rb +2 -7
  368. data/lib/rubocop/cop/style/empty_else.rb +3 -9
  369. data/lib/rubocop/cop/style/empty_literal.rb +21 -9
  370. data/lib/rubocop/cop/style/empty_method.rb +3 -7
  371. data/lib/rubocop/cop/style/encoding.rb +26 -15
  372. data/lib/rubocop/cop/style/end_block.rb +1 -2
  373. data/lib/rubocop/cop/style/endless_method.rb +2 -3
  374. data/lib/rubocop/cop/style/eval_with_location.rb +91 -31
  375. data/lib/rubocop/cop/style/even_odd.rb +1 -0
  376. data/lib/rubocop/cop/style/expand_path_arguments.rb +4 -3
  377. data/lib/rubocop/cop/style/explicit_block_argument.rb +48 -15
  378. data/lib/rubocop/cop/style/exponential_notation.rb +6 -7
  379. data/lib/rubocop/cop/style/float_division.rb +14 -2
  380. data/lib/rubocop/cop/style/format_string.rb +2 -0
  381. data/lib/rubocop/cop/style/format_string_token.rb +2 -4
  382. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +15 -12
  383. data/lib/rubocop/cop/style/global_std_stream.rb +5 -0
  384. data/lib/rubocop/cop/style/guard_clause.rb +3 -7
  385. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +11 -0
  386. data/lib/rubocop/cop/style/hash_conversion.rb +133 -0
  387. data/lib/rubocop/cop/style/hash_each_methods.rb +25 -3
  388. data/lib/rubocop/cop/style/hash_except.rb +5 -3
  389. data/lib/rubocop/cop/style/hash_like_case.rb +2 -2
  390. data/lib/rubocop/cop/style/hash_syntax.rb +21 -25
  391. data/lib/rubocop/cop/style/hash_transform_keys.rb +8 -9
  392. data/lib/rubocop/cop/style/hash_transform_values.rb +8 -6
  393. data/lib/rubocop/cop/style/identical_conditional_branches.rb +83 -8
  394. data/lib/rubocop/cop/style/if_unless_modifier.rb +40 -13
  395. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +20 -4
  396. data/lib/rubocop/cop/style/implicit_runtime_error.rb +1 -0
  397. data/lib/rubocop/cop/style/in_pattern_then.rb +56 -0
  398. data/lib/rubocop/cop/style/infinite_loop.rb +6 -8
  399. data/lib/rubocop/cop/style/inverse_methods.rb +14 -9
  400. data/lib/rubocop/cop/style/ip_addresses.rb +1 -2
  401. data/lib/rubocop/cop/style/lambda.rb +2 -4
  402. data/lib/rubocop/cop/style/lambda_call.rb +1 -2
  403. data/lib/rubocop/cop/style/line_end_concatenation.rb +19 -13
  404. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +32 -21
  405. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +47 -3
  406. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +1 -2
  407. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -4
  408. data/lib/rubocop/cop/style/method_def_parentheses.rb +14 -9
  409. data/lib/rubocop/cop/style/min_max.rb +2 -2
  410. data/lib/rubocop/cop/style/missing_else.rb +9 -4
  411. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +1 -2
  412. data/lib/rubocop/cop/style/mixin_grouping.rb +4 -10
  413. data/lib/rubocop/cop/style/mixin_usage.rb +3 -2
  414. data/lib/rubocop/cop/style/module_function.rb +16 -15
  415. data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -2
  416. data/lib/rubocop/cop/style/multiline_in_pattern_then.rb +62 -0
  417. data/lib/rubocop/cop/style/multiline_method_signature.rb +11 -6
  418. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +1 -2
  419. data/lib/rubocop/cop/style/multiline_when_then.rb +3 -12
  420. data/lib/rubocop/cop/style/multiple_comparison.rb +23 -6
  421. data/lib/rubocop/cop/style/mutable_constant.rb +85 -23
  422. data/lib/rubocop/cop/style/negated_if.rb +1 -2
  423. data/lib/rubocop/cop/style/negated_if_else_condition.rb +24 -2
  424. data/lib/rubocop/cop/style/negated_unless.rb +1 -2
  425. data/lib/rubocop/cop/style/nested_modifier.rb +3 -7
  426. data/lib/rubocop/cop/style/nested_ternary_operator.rb +2 -3
  427. data/lib/rubocop/cop/style/next.rb +4 -9
  428. data/lib/rubocop/cop/style/nil_comparison.rb +3 -0
  429. data/lib/rubocop/cop/style/nil_lambda.rb +30 -12
  430. data/lib/rubocop/cop/style/non_nil_check.rb +11 -7
  431. data/lib/rubocop/cop/style/not.rb +2 -2
  432. data/lib/rubocop/cop/style/numbered_parameters.rb +46 -0
  433. data/lib/rubocop/cop/style/numbered_parameters_limit.rb +50 -0
  434. data/lib/rubocop/cop/style/numeric_literals.rb +6 -15
  435. data/lib/rubocop/cop/style/numeric_predicate.rb +10 -7
  436. data/lib/rubocop/cop/style/one_line_conditional.rb +1 -2
  437. data/lib/rubocop/cop/style/option_hash.rb +2 -3
  438. data/lib/rubocop/cop/style/optional_arguments.rb +6 -5
  439. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +14 -4
  440. data/lib/rubocop/cop/style/or_assignment.rb +4 -6
  441. data/lib/rubocop/cop/style/parallel_assignment.rb +13 -10
  442. data/lib/rubocop/cop/style/parentheses_around_condition.rb +1 -0
  443. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +2 -4
  444. data/lib/rubocop/cop/style/percent_q_literals.rb +3 -4
  445. data/lib/rubocop/cop/style/perl_backrefs.rb +2 -9
  446. data/lib/rubocop/cop/style/preferred_hash_methods.rb +10 -8
  447. data/lib/rubocop/cop/style/proc.rb +2 -2
  448. data/lib/rubocop/cop/style/quoted_symbols.rb +114 -0
  449. data/lib/rubocop/cop/style/raise_args.rb +6 -8
  450. data/lib/rubocop/cop/style/random_with_offset.rb +8 -8
  451. data/lib/rubocop/cop/style/redundant_argument.rb +21 -20
  452. data/lib/rubocop/cop/style/redundant_assignment.rb +2 -3
  453. data/lib/rubocop/cop/style/redundant_begin.rb +72 -7
  454. data/lib/rubocop/cop/style/redundant_capital_w.rb +1 -2
  455. data/lib/rubocop/cop/style/redundant_condition.rb +4 -8
  456. data/lib/rubocop/cop/style/redundant_conditional.rb +5 -6
  457. data/lib/rubocop/cop/style/redundant_exception.rb +5 -6
  458. data/lib/rubocop/cop/style/redundant_fetch_block.rb +6 -0
  459. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +13 -3
  460. data/lib/rubocop/cop/style/redundant_freeze.rb +6 -6
  461. data/lib/rubocop/cop/style/redundant_interpolation.rb +2 -3
  462. data/lib/rubocop/cop/style/redundant_parentheses.rb +21 -20
  463. data/lib/rubocop/cop/style/redundant_percent_q.rb +3 -5
  464. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
  465. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -4
  466. data/lib/rubocop/cop/style/redundant_return.rb +6 -4
  467. data/lib/rubocop/cop/style/redundant_self.rb +42 -10
  468. data/lib/rubocop/cop/style/redundant_self_assignment.rb +8 -5
  469. data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +83 -0
  470. data/lib/rubocop/cop/style/redundant_sort.rb +56 -25
  471. data/lib/rubocop/cop/style/redundant_sort_by.rb +1 -0
  472. data/lib/rubocop/cop/style/regexp_literal.rb +15 -10
  473. data/lib/rubocop/cop/style/rescue_modifier.rb +21 -14
  474. data/lib/rubocop/cop/style/rescue_standard_error.rb +5 -7
  475. data/lib/rubocop/cop/style/return_nil.rb +8 -2
  476. data/lib/rubocop/cop/style/safe_navigation.rb +25 -23
  477. data/lib/rubocop/cop/style/sample.rb +1 -0
  478. data/lib/rubocop/cop/style/select_by_regexp.rb +139 -0
  479. data/lib/rubocop/cop/style/semicolon.rb +32 -24
  480. data/lib/rubocop/cop/style/send.rb +1 -2
  481. data/lib/rubocop/cop/style/signal_exception.rb +6 -7
  482. data/lib/rubocop/cop/style/single_argument_dig.rb +7 -2
  483. data/lib/rubocop/cop/style/single_line_block_params.rb +5 -6
  484. data/lib/rubocop/cop/style/single_line_methods.rb +45 -18
  485. data/lib/rubocop/cop/style/slicing_with_range.rb +14 -0
  486. data/lib/rubocop/cop/style/sole_nested_conditional.rb +35 -7
  487. data/lib/rubocop/cop/style/special_global_vars.rb +33 -20
  488. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -2
  489. data/lib/rubocop/cop/style/static_class.rb +5 -5
  490. data/lib/rubocop/cop/style/stderr_puts.rb +3 -6
  491. data/lib/rubocop/cop/style/string_chars.rb +41 -0
  492. data/lib/rubocop/cop/style/string_concatenation.rb +45 -15
  493. data/lib/rubocop/cop/style/string_hash_keys.rb +6 -0
  494. data/lib/rubocop/cop/style/string_literals.rb +5 -7
  495. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +1 -0
  496. data/lib/rubocop/cop/style/strip.rb +1 -0
  497. data/lib/rubocop/cop/style/struct_inheritance.rb +15 -0
  498. data/lib/rubocop/cop/style/swap_values.rb +5 -3
  499. data/lib/rubocop/cop/style/symbol_array.rb +3 -3
  500. data/lib/rubocop/cop/style/symbol_literal.rb +1 -3
  501. data/lib/rubocop/cop/style/symbol_proc.rb +55 -10
  502. data/lib/rubocop/cop/style/ternary_parentheses.rb +4 -6
  503. data/lib/rubocop/cop/style/top_level_method_definition.rb +83 -0
  504. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +6 -2
  505. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +21 -6
  506. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +3 -6
  507. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -10
  508. data/lib/rubocop/cop/style/trivial_accessors.rb +69 -5
  509. data/lib/rubocop/cop/style/unless_else.rb +1 -2
  510. data/lib/rubocop/cop/style/unless_logical_operators.rb +105 -0
  511. data/lib/rubocop/cop/style/unpack_first.rb +2 -1
  512. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -1
  513. data/lib/rubocop/cop/style/when_then.rb +4 -2
  514. data/lib/rubocop/cop/style/while_until_modifier.rb +1 -2
  515. data/lib/rubocop/cop/style/word_array.rb +22 -5
  516. data/lib/rubocop/cop/style/yoda_condition.rb +28 -18
  517. data/lib/rubocop/cop/style/zero_length_predicate.rb +12 -2
  518. data/lib/rubocop/cop/team.rb +2 -5
  519. data/lib/rubocop/cop/util.rb +29 -16
  520. data/lib/rubocop/cop/utils/format_string.rb +1 -3
  521. data/lib/rubocop/cop/variable_force/assignment.rb +1 -2
  522. data/lib/rubocop/cop/variable_force/branch.rb +16 -2
  523. data/lib/rubocop/cop/variable_force/reference.rb +1 -3
  524. data/lib/rubocop/cop/variable_force/scope.rb +4 -8
  525. data/lib/rubocop/cop/variable_force/variable.rb +2 -4
  526. data/lib/rubocop/cop/variable_force/variable_table.rb +1 -1
  527. data/lib/rubocop/cop/variable_force.rb +6 -15
  528. data/lib/rubocop/cops_documentation_generator.rb +24 -26
  529. data/lib/rubocop/directive_comment.rb +123 -11
  530. data/lib/rubocop/ext/regexp_parser.rb +3 -6
  531. data/lib/rubocop/file_finder.rb +1 -3
  532. data/lib/rubocop/formatter/clang_style_formatter.rb +4 -2
  533. data/lib/rubocop/formatter/disabled_config_formatter.rb +3 -8
  534. data/lib/rubocop/formatter/git_hub_actions_formatter.rb +2 -6
  535. data/lib/rubocop/formatter/html_formatter.rb +4 -10
  536. data/lib/rubocop/formatter/json_formatter.rb +1 -5
  537. data/lib/rubocop/formatter/junit_formatter.rb +23 -14
  538. data/lib/rubocop/formatter/offense_count_formatter.rb +1 -1
  539. data/lib/rubocop/formatter/progress_formatter.rb +1 -3
  540. data/lib/rubocop/formatter/tap_formatter.rb +4 -2
  541. data/lib/rubocop/formatter/worst_offenders_formatter.rb +1 -1
  542. data/lib/rubocop/magic_comment.rb +45 -16
  543. data/lib/rubocop/name_similarity.rb +1 -1
  544. data/lib/rubocop/options.rb +153 -159
  545. data/lib/rubocop/path_util.rb +1 -3
  546. data/lib/rubocop/rake_task.rb +4 -1
  547. data/lib/rubocop/remote_config.rb +13 -8
  548. data/lib/rubocop/result_cache.rb +8 -15
  549. data/lib/rubocop/rspec/cop_helper.rb +3 -3
  550. data/lib/rubocop/rspec/expect_offense.rb +11 -12
  551. data/lib/rubocop/rspec/parallel_formatter.rb +90 -0
  552. data/lib/rubocop/rspec/shared_contexts.rb +8 -15
  553. data/lib/rubocop/rspec/support.rb +1 -0
  554. data/lib/rubocop/runner.rb +9 -17
  555. data/lib/rubocop/target_finder.rb +20 -17
  556. data/lib/rubocop/target_ruby.rb +25 -21
  557. data/lib/rubocop/version.rb +1 -1
  558. data/lib/rubocop.rb +30 -3
  559. metadata +44 -11
  560. data/lib/rubocop/core_ext/hash.rb +0 -20
@@ -59,8 +59,8 @@ module RuboCop
59
59
 
60
60
  def check(send_node)
61
61
  return if previous_line_comment?(send_node)
62
- return unless grouped_style? && sibling_accessors(send_node).size > 1 ||
63
- separated_style? && send_node.arguments.size > 1
62
+ return unless (grouped_style? && sibling_accessors(send_node).size > 1) ||
63
+ (separated_style? && send_node.arguments.size > 1)
64
64
 
65
65
  message = message(send_node)
66
66
  add_offense(send_node, message: message) do |corrector|
@@ -129,9 +129,7 @@ module RuboCop
129
129
  end
130
130
 
131
131
  def group_accessors(node, accessors)
132
- accessor_names = accessors.flat_map do |accessor|
133
- accessor.arguments.map(&:source)
134
- end
132
+ accessor_names = accessors.flat_map { |accessor| accessor.arguments.map(&:source) }
135
133
 
136
134
  "#{node.method_name} #{accessor_names.join(', ')}"
137
135
  end
@@ -27,10 +27,8 @@ module RuboCop
27
27
  extend AutoCorrector
28
28
 
29
29
  MSG_ALIAS = 'Use `alias_method` instead of `alias`.'
30
- MSG_ALIAS_METHOD = 'Use `alias` instead of `alias_method` ' \
31
- '%<current>s.'
32
- MSG_SYMBOL_ARGS = 'Use `alias %<prefer>s` instead of ' \
33
- '`alias %<current>s`.'
30
+ MSG_ALIAS_METHOD = 'Use `alias` instead of `alias_method` %<current>s.'
31
+ MSG_SYMBOL_ARGS = 'Use `alias %<prefer>s` instead of `alias %<current>s`.'
34
32
 
35
33
  RESTRICT_ON_SEND = %i[alias_method].freeze
36
34
 
@@ -52,9 +50,7 @@ module RuboCop
52
50
  autocorrect(corrector, node)
53
51
  end
54
52
  elsif node.children.none? { |arg| bareword?(arg) }
55
- add_offense_for_args(node) do |corrector|
56
- autocorrect(corrector, node)
57
- end
53
+ add_offense_for_args(node) { |corrector| autocorrect(corrector, node) }
58
54
  end
59
55
  end
60
56
 
@@ -75,17 +71,14 @@ module RuboCop
75
71
  end
76
72
 
77
73
  def alias_method_possible?(node)
78
- scope_type(node) != :instance_eval &&
79
- node.children.none?(&:gvar_type?)
74
+ scope_type(node) != :instance_eval && node.children.none?(&:gvar_type?)
80
75
  end
81
76
 
82
77
  def add_offense_for_args(node, &block)
83
78
  existing_args = node.children.map(&:source).join(' ')
84
79
  preferred_args = node.children.map { |a| a.source[1..-1] }.join(' ')
85
80
  arg_ranges = node.children.map(&:source_range)
86
- msg = format(MSG_SYMBOL_ARGS,
87
- prefer: preferred_args,
88
- current: existing_args)
81
+ msg = format(MSG_SYMBOL_ARGS, prefer: preferred_args, current: existing_args)
89
82
  add_offense(arg_ranges.reduce(&:join), message: msg, &block)
90
83
  end
91
84
 
@@ -145,6 +138,7 @@ module RuboCop
145
138
  corrector.replace(node.old_identifier, node.old_identifier.source[1..-1])
146
139
  end
147
140
 
141
+ # @!method identifier(node)
148
142
  def_node_matcher :identifier, <<~PATTERN
149
143
  (sym $_)
150
144
  PATTERN
@@ -7,6 +7,11 @@ module RuboCop
7
7
  # `||` instead. It can be configured to check only in conditions or in
8
8
  # all contexts.
9
9
  #
10
+ # @safety
11
+ # Auto-correction is unsafe because there is a different operator precedence
12
+ # between logical operators (`&&` and `||`) and semantic operators (`and` and `or`),
13
+ # and that might change the behaviour.
14
+ #
10
15
  # @example EnforcedStyle: always
11
16
  # # bad
12
17
  # foo.save and return
@@ -94,7 +99,9 @@ module RuboCop
94
99
 
95
100
  return unless correctable_send?(node)
96
101
 
97
- corrector.replace(whitespace_before_arg(node), '(')
102
+ whitespace_before_arg_range = whitespace_before_arg(node)
103
+ corrector.remove(whitespace_before_arg_range)
104
+ corrector.insert_before(whitespace_before_arg_range, '(')
98
105
  corrector.insert_after(node.last_argument, ')')
99
106
  end
100
107
 
@@ -30,6 +30,10 @@ module RuboCop
30
30
  # bar(*args)
31
31
  # end
32
32
  #
33
+ # def foo(**kwargs)
34
+ # bar(**kwargs)
35
+ # end
36
+ #
33
37
  # @example AllowOnlyRestArgument: false
34
38
  # # bad
35
39
  # # The following code can replace the arguments with `...`,
@@ -38,6 +42,10 @@ module RuboCop
38
42
  # bar(*args)
39
43
  # end
40
44
  #
45
+ # def foo(**kwargs)
46
+ # bar(**kwargs)
47
+ # end
48
+ #
41
49
  class ArgumentsForwarding < Base
42
50
  include RangeHelp
43
51
  extend AutoCorrector
@@ -47,14 +55,20 @@ module RuboCop
47
55
 
48
56
  MSG = 'Use arguments forwarding.'
49
57
 
58
+ # @!method use_rest_arguments?(node)
50
59
  def_node_matcher :use_rest_arguments?, <<~PATTERN
51
- (args (restarg $_) $...)
60
+ (args ({restarg kwrestarg} $_) $...)
52
61
  PATTERN
53
62
 
63
+ # @!method only_rest_arguments?(node, name)
54
64
  def_node_matcher :only_rest_arguments?, <<~PATTERN
55
- (send _ _ (splat (lvar %1)))
65
+ {
66
+ (send _ _ (splat (lvar %1)))
67
+ (send _ _ (hash (kwsplat (lvar %1))))
68
+ }
56
69
  PATTERN
57
70
 
71
+ # @!method forwarding_method_arguments?(node, rest_name, block_name, kwargs_name)
58
72
  def_node_matcher :forwarding_method_arguments?, <<~PATTERN
59
73
  {
60
74
  (send _ _
@@ -104,9 +118,7 @@ module RuboCop
104
118
  begin_pos = forwarding_method.source_range.begin_pos
105
119
  end_pos = forwarding_method.source_range.end_pos
106
120
 
107
- lvars.all? do |lvar|
108
- lvar.source_range.begin_pos.between?(begin_pos, end_pos)
109
- end
121
+ lvars.all? { |lvar| lvar.source_range.begin_pos.between?(begin_pos, end_pos) }
110
122
  end
111
123
 
112
124
  def register_offense_to_forwarding_method_arguments(forwarding_method)
@@ -5,9 +5,27 @@ module RuboCop
5
5
  module Style
6
6
  # This cop enforces the use of `Array()` instead of explicit `Array` check or `[*var]`.
7
7
  #
8
- # This cop is disabled by default because false positive will occur if
9
- # the argument of `Array()` is not an array (e.g. Hash, Set),
10
- # an array will be returned as an incompatibility result.
8
+ # The cop is disabled by default due to safety concerns.
9
+ #
10
+ # @safety
11
+ # This cop is unsafe because a false positive may occur if
12
+ # the argument of `Array()` is (or could be) nil or depending
13
+ # on how the argument is handled by `Array()` (which can be
14
+ # different than just wrapping the argument in an array).
15
+ #
16
+ # For example:
17
+ #
18
+ # [source,ruby]
19
+ # ----
20
+ # [nil] #=> [nil]
21
+ # Array(nil) #=> []
22
+ #
23
+ # [{a: 'b'}] #= [{a: 'b'}]
24
+ # Array({a: 'b'}) #=> [[:a, 'b']]
25
+ #
26
+ # [Time.now] #=> [#<Time ...>]
27
+ # Array(Time.now) #=> [14, 16, 14, 16, 9, 2021, 4, 259, true, "EDT"]
28
+ # ----
11
29
  #
12
30
  # @example
13
31
  # # bad
@@ -26,10 +44,12 @@ module RuboCop
26
44
  SPLAT_MSG = 'Use `Array(%<arg>s)` instead of `[*%<arg>s]`.'
27
45
  CHECK_MSG = 'Use `Array(%<arg>s)` instead of explicit `Array` check.'
28
46
 
47
+ # @!method array_splat?(node)
29
48
  def_node_matcher :array_splat?, <<~PATTERN
30
49
  (array (splat $_))
31
50
  PATTERN
32
51
 
52
+ # @!method unless_array?(node)
33
53
  def_node_matcher :unless_array?, <<~PATTERN
34
54
  (if
35
55
  (send
@@ -23,6 +23,7 @@ module RuboCop
23
23
  MSG = 'Favor `Array#join` over `Array#*`.'
24
24
  RESTRICT_ON_SEND = %i[*].freeze
25
25
 
26
+ # @!method join_candidate?(node)
26
27
  def_node_matcher :join_candidate?, '(send $array :* $str)'
27
28
 
28
29
  def on_send(node)
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # rubocop:disable Style/AsciiComments
4
-
5
3
  module RuboCop
6
4
  module Cop
7
5
  module Style
@@ -35,8 +33,7 @@ module RuboCop
35
33
  expression = comment.loc.expression
36
34
  first_offense = first_non_ascii_chars(comment.text)
37
35
 
38
- start_position = expression.begin_pos +
39
- comment.text.index(first_offense)
36
+ start_position = expression.begin_pos + comment.text.index(first_offense)
40
37
  end_position = start_position + first_offense.length
41
38
 
42
39
  range_between(start_position, end_position)
@@ -58,4 +55,3 @@ module RuboCop
58
55
  end
59
56
  end
60
57
  end
61
- # rubocop:enable Style/AsciiComments
@@ -24,9 +24,7 @@ module RuboCop
24
24
  def on_send(node)
25
25
  return unless node.command?(:attr) && node.arguments?
26
26
  # check only for method definitions in class/module body
27
- return if node.parent &&
28
- !node.parent.class_type? &&
29
- !class_eval?(node.parent)
27
+ return if node.parent && !node.parent.class_type? && !class_eval?(node.parent)
30
28
 
31
29
  message = message(node)
32
30
  add_offense(node.loc.selector, message: message) do |corrector|
@@ -62,6 +60,7 @@ module RuboCop
62
60
  end
63
61
  end
64
62
 
63
+ # @!method class_eval?(node)
65
64
  def_node_matcher :class_eval?, <<~PATTERN
66
65
  (block (send _ {:class_eval :module_eval}) ...)
67
66
  PATTERN
@@ -19,9 +19,7 @@ module RuboCop
19
19
  class AutoResourceCleanup < Base
20
20
  MSG = 'Use the block version of `%<class>s.%<method>s`.'
21
21
 
22
- TARGET_METHODS = {
23
- File: :open
24
- }.freeze
22
+ TARGET_METHODS = { File: :open }.freeze
25
23
 
26
24
  RESTRICT_ON_SEND = TARGET_METHODS.values.freeze
27
25
 
@@ -42,8 +40,7 @@ module RuboCop
42
40
 
43
41
  def cleanup?(node)
44
42
  parent = node.parent
45
- node.block_argument? ||
46
- (parent && (parent.block_type? || !parent.lvasgn_type?))
43
+ node.block_argument? || (parent && (parent.block_type? || !parent.lvasgn_type?))
47
44
  end
48
45
  end
49
46
  end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ class BisectedAttrAccessor
7
+ # Representation of an `attr_reader`, `attr_writer` or `attr` macro
8
+ # for use by `Style/BisectedAttrAccessor`.
9
+ # @api private
10
+ class Macro
11
+ include VisibilityHelp
12
+
13
+ attr_reader :node, :attrs, :bisection
14
+
15
+ def self.macro?(node)
16
+ node.method?(:attr_reader) || node.method?(:attr_writer) || node.method?(:attr)
17
+ end
18
+
19
+ def initialize(node)
20
+ @node = node
21
+ @attrs = node.arguments.map { |attr| [attr.source, attr] }.to_h
22
+ @bisection = []
23
+ end
24
+
25
+ def bisect(*names)
26
+ @bisection = attrs.slice(*names).values
27
+ end
28
+
29
+ def attr_names
30
+ @attr_names ||= attrs.keys
31
+ end
32
+
33
+ def bisected_names
34
+ bisection.map(&:source)
35
+ end
36
+
37
+ def visibility
38
+ @visibility ||= node_visibility(node)
39
+ end
40
+
41
+ def reader?
42
+ node.method?(:attr_reader) || node.method?(:attr)
43
+ end
44
+
45
+ def writer?
46
+ node.method?(:attr_writer)
47
+ end
48
+
49
+ def all_bisected?
50
+ rest.none?
51
+ end
52
+
53
+ def rest
54
+ @rest ||= attr_names - bisected_names
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -19,47 +19,61 @@ module RuboCop
19
19
  # end
20
20
  #
21
21
  class BisectedAttrAccessor < Base
22
- include VisibilityHelp
22
+ require_relative 'bisected_attr_accessor/macro'
23
+
24
+ include RangeHelp
23
25
  extend AutoCorrector
24
26
 
25
27
  MSG = 'Combine both accessors into `attr_accessor %<name>s`.'
26
28
 
29
+ def on_new_investigation
30
+ @macros_to_rewrite = {}
31
+ end
32
+
27
33
  def on_class(class_node)
28
- VISIBILITY_SCOPES.each do |visibility|
29
- reader_names, writer_names = accessor_names(class_node, visibility)
30
- next unless reader_names && writer_names
34
+ @macros_to_rewrite[class_node] = Set.new
35
+
36
+ find_macros(class_node.body).each do |_visibility, macros|
37
+ bisected = find_bisection(macros)
38
+ next unless bisected.any?
31
39
 
32
- accessor_macroses(class_node, visibility).each do |macro|
33
- check(macro, reader_names, writer_names)
40
+ macros.each do |macro|
41
+ attrs = macro.bisect(*bisected)
42
+ next if attrs.none?
43
+
44
+ @macros_to_rewrite[class_node] << macro
45
+ attrs.each { |attr| register_offense(attr) }
34
46
  end
35
47
  end
36
48
  end
37
49
  alias on_sclass on_class
38
50
  alias on_module on_class
39
51
 
40
- private
41
-
42
- def accessor_names(class_node, visibility)
43
- reader_names = nil
44
- writer_names = nil
45
-
46
- accessor_macroses(class_node, visibility).each do |macro|
47
- names = macro.arguments.map(&:source)
48
-
49
- names.each do |name|
50
- if attr_reader?(macro)
51
- (reader_names ||= Set.new).add(name)
52
+ # Each offending macro is captured and registered in `on_class` but correction
53
+ # happens in `after_class` because a macro might have multiple attributes
54
+ # rewritten from it
55
+ def after_class(class_node)
56
+ @macros_to_rewrite[class_node].each do |macro|
57
+ node = macro.node
58
+ range = range_by_whole_lines(node.loc.expression, include_final_newline: true)
59
+
60
+ correct(range) do |corrector|
61
+ if macro.writer?
62
+ correct_writer(corrector, macro, node, range)
52
63
  else
53
- (writer_names ||= Set.new).add(name)
64
+ correct_reader(corrector, macro, node, range)
54
65
  end
55
66
  end
56
67
  end
57
-
58
- [reader_names, writer_names]
59
68
  end
69
+ alias after_sclass after_class
70
+ alias after_module after_class
60
71
 
61
- def accessor_macroses(class_node, visibility)
62
- class_def = class_node.body
72
+ private
73
+
74
+ def find_macros(class_def)
75
+ # Find all the macros (`attr_reader`, `attr_writer`, etc.) in the class body
76
+ # and turn them into `Macro` objects so that they can be processed.
63
77
  return [] if !class_def || class_def.def_type?
64
78
 
65
79
  send_nodes =
@@ -69,66 +83,40 @@ module RuboCop
69
83
  class_def.each_child_node(:send)
70
84
  end
71
85
 
72
- send_nodes.select { |node| attr_within_visibility_scope?(node, visibility) }
86
+ send_nodes.each_with_object([]) do |node, macros|
87
+ macros << Macro.new(node) if Macro.macro?(node)
88
+ end.group_by(&:visibility)
73
89
  end
74
90
 
75
- def attr_within_visibility_scope?(node, visibility)
76
- node.macro? &&
77
- (attr_reader?(node) || attr_writer?(node)) &&
78
- node_visibility(node) == visibility
91
+ def find_bisection(macros)
92
+ # Find which attributes are defined in both readers and writers so that they
93
+ # can be replaced with accessors.
94
+ readers, writers = macros.partition(&:reader?)
95
+ readers.flat_map(&:attr_names) & writers.flat_map(&:attr_names)
79
96
  end
80
97
 
81
- def attr_reader?(send_node)
82
- send_node.method?(:attr_reader) || send_node.method?(:attr)
98
+ def register_offense(attr)
99
+ add_offense(attr, message: format(MSG, name: attr.source))
83
100
  end
84
101
 
85
- def attr_writer?(send_node)
86
- send_node.method?(:attr_writer)
87
- end
102
+ def correct_reader(corrector, macro, node, range)
103
+ attr_accessor = "attr_accessor #{macro.bisected_names.join(', ')}\n"
88
104
 
89
- def check(macro, reader_names, writer_names)
90
- macro.arguments.each do |arg_node|
91
- name = arg_node.source
92
-
93
- next unless (attr_reader?(macro) && writer_names.include?(name)) ||
94
- (attr_writer?(macro) && reader_names.include?(name))
95
-
96
- add_offense(arg_node, message: format(MSG, name: name)) do |corrector|
97
- macro = arg_node.parent
98
-
99
- corrector.replace(macro, replacement(macro, arg_node))
100
- end
101
- end
102
- end
103
-
104
- def replacement(macro, node)
105
- class_node = macro.each_ancestor(:class, :sclass, :module).first
106
- reader_names, writer_names = accessor_names(class_node, node_visibility(macro))
107
-
108
- rest_args = rest_args(macro.arguments, reader_names, writer_names)
109
-
110
- if attr_reader?(macro)
111
- attr_reader_replacement(macro, node, rest_args)
112
- elsif rest_args.empty?
113
- ''
105
+ if macro.all_bisected?
106
+ corrector.replace(range, "#{indent(node)}#{attr_accessor}")
114
107
  else
115
- "#{macro.method_name} #{rest_args.map(&:source).join(', ')}"
116
- end
117
- end
118
-
119
- def rest_args(args, reader_names, writer_names)
120
- args.reject do |arg|
121
- name = arg.source
122
- reader_names.include?(name) && writer_names.include?(name)
108
+ correction = "#{indent(node)}attr_reader #{macro.rest.join(', ')}"
109
+ corrector.insert_before(node, attr_accessor)
110
+ corrector.replace(node, correction)
123
111
  end
124
112
  end
125
113
 
126
- def attr_reader_replacement(macro, node, rest_args)
127
- if rest_args.empty?
128
- "attr_accessor #{node.source}"
114
+ def correct_writer(corrector, macro, node, range)
115
+ if macro.all_bisected?
116
+ corrector.remove(range)
129
117
  else
130
- "attr_accessor #{node.source}\n"\
131
- "#{indent(macro)}#{macro.method_name} #{rest_args.map(&:source).join(', ')}"
118
+ correction = "attr_writer #{macro.rest.join(', ')}"
119
+ corrector.replace(node, correction)
132
120
  end
133
121
  end
134
122
  end
@@ -1,11 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # rubocop:disable Metrics/ClassLength
3
4
  module RuboCop
4
5
  module Cop
5
6
  module Style
6
7
  # Check for uses of braces or do/end around single line or
7
8
  # multi-line blocks.
8
9
  #
10
+ # Methods that can be either procedural or functional and cannot be
11
+ # categorised from their usage alone is ignored.
12
+ # `lambda`, `proc`, and `it` are their defaults.
13
+ # Additional methods can be added to the `IgnoredMethods`.
14
+ #
9
15
  # @example EnforcedStyle: line_count_based (default)
10
16
  # # bad - single line block
11
17
  # items.each do |item| item / 5 end
@@ -132,9 +138,21 @@ module RuboCop
132
138
  # puts foo
133
139
  # end
134
140
  #
141
+ # @example IgnoredMethods: ['lambda', 'proc', 'it' ] (default)
142
+ #
143
+ # # good
144
+ # foo = lambda do |x|
145
+ # puts "Hello, #{x}"
146
+ # end
147
+ #
148
+ # foo = lambda do |x|
149
+ # x * 100
150
+ # end
151
+ #
135
152
  class BlockDelimiters < Base
136
153
  include ConfigurableEnforcedStyle
137
154
  include IgnoredMethods
155
+ include RangeHelp
138
156
  extend AutoCorrector
139
157
 
140
158
  ALWAYS_BRACES_MESSAGE = 'Prefer `{...}` over `do...end` for blocks.'
@@ -174,7 +192,7 @@ module RuboCop
174
192
  if node.braces?
175
193
  replace_braces_with_do_end(corrector, node.loc)
176
194
  else
177
- replace_do_end_with_braces(corrector, node.loc)
195
+ replace_do_end_with_braces(corrector, node)
178
196
  end
179
197
  end
180
198
 
@@ -231,10 +249,16 @@ module RuboCop
231
249
  corrector.insert_before(e, ' ') unless whitespace_before?(e)
232
250
  corrector.insert_after(b, ' ') unless whitespace_after?(b)
233
251
  corrector.replace(b, 'do')
252
+
253
+ if (comment = processed_source.comment_at_line(e.line))
254
+ move_comment_before_block(corrector, comment, loc.node, e)
255
+ end
256
+
234
257
  corrector.replace(e, 'end')
235
258
  end
236
259
 
237
- def replace_do_end_with_braces(corrector, loc)
260
+ def replace_do_end_with_braces(corrector, node)
261
+ loc = node.loc
238
262
  b = loc.begin
239
263
  e = loc.end
240
264
 
@@ -242,6 +266,8 @@ module RuboCop
242
266
 
243
267
  corrector.replace(b, '{')
244
268
  corrector.replace(e, '}')
269
+
270
+ corrector.wrap(node.body, "begin\n", "\nend") if begin_required?(node)
245
271
  end
246
272
 
247
273
  def whitespace_before?(range)
@@ -252,6 +278,21 @@ module RuboCop
252
278
  /\s/.match?(range.source_buffer.source[range.begin_pos + length, 1])
253
279
  end
254
280
 
281
+ def move_comment_before_block(corrector, comment, block_node, closing_brace)
282
+ range = block_node.chained? ? end_of_chain(block_node.parent).source_range : closing_brace
283
+ comment_range = range_between(range.end_pos, comment.loc.expression.end_pos)
284
+ corrector.remove(range_with_surrounding_space(range: comment_range, side: :right))
285
+ corrector.insert_after(range, "\n")
286
+
287
+ corrector.insert_before(block_node, "#{comment.text}\n")
288
+ end
289
+
290
+ def end_of_chain(node)
291
+ return node unless node.chained?
292
+
293
+ end_of_chain(node.parent)
294
+ end
295
+
255
296
  def get_blocks(node, &block)
256
297
  case node.type
257
298
  when :block
@@ -376,7 +417,14 @@ module RuboCop
376
417
  def array_or_range?(node)
377
418
  node.array_type? || node.range_type?
378
419
  end
420
+
421
+ def begin_required?(block_node)
422
+ # If the block contains `rescue` or `ensure`, it needs to be wrapped in
423
+ # `begin`...`end` when changing `do-end` to `{}`.
424
+ block_node.each_child_node(:rescue, :ensure).any? && !block_node.single_line?
425
+ end
379
426
  end
380
427
  end
381
428
  end
382
429
  end
430
+ # rubocop:enable Metrics/ClassLength
@@ -5,9 +5,11 @@ module RuboCop
5
5
  module Style
6
6
  # This cop checks for uses of the case equality operator(===).
7
7
  #
8
+ # If `AllowOnConstant` option is enabled, the cop will ignore violations when the receiver of
9
+ # the case equality operator is a constant.
10
+ #
8
11
  # @example
9
12
  # # bad
10
- # Array === something
11
13
  # (1..100) === 7
12
14
  # /something/ === some_string
13
15
  #
@@ -16,18 +18,13 @@ module RuboCop
16
18
  # (1..100).include?(7)
17
19
  # /something/.match?(some_string)
18
20
  #
19
- # @example AllowOnConstant
20
- # # Style/CaseEquality:
21
- # # AllowOnConstant: true
22
- #
21
+ # @example AllowOnConstant: false (default)
23
22
  # # bad
24
- # (1..100) === 7
25
- # /something/ === some_string
23
+ # Array === something
26
24
  #
25
+ # @example AllowOnConstant: true
27
26
  # # good
28
27
  # Array === something
29
- # (1..100).include?(7)
30
- # /something/.match?(some_string)
31
28
  #
32
29
  class CaseEquality < Base
33
30
  extend AutoCorrector
@@ -35,6 +32,7 @@ module RuboCop
35
32
  MSG = 'Avoid the use of the case equality operator `===`.'
36
33
  RESTRICT_ON_SEND = %i[===].freeze
37
34
 
35
+ # @!method case_equality?(node)
38
36
  def_node_matcher :case_equality?, '(send $#const? :=== $_)'
39
37
 
40
38
  def on_send(node)
@@ -64,7 +62,7 @@ module RuboCop
64
62
  # The automatic correction from `a === b` to `a.match?(b)` needs to
65
63
  # consider `Regexp.last_match?`, `$~`, `$1`, and etc.
66
64
  # This correction is expected to be supported by `Performance/Regexp` cop.
67
- # See: https://github.com/rubocop-hq/rubocop-performance/issues/152
65
+ # See: https://github.com/rubocop/rubocop-performance/issues/152
68
66
  #
69
67
  # So here is noop.
70
68
  when :begin