rubocop 1.71.1 → 1.92.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 (712) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +23 -19
  4. data/config/default.yml +886 -168
  5. data/config/internal_affairs.yml +20 -0
  6. data/config/obsoletion.yml +47 -4
  7. data/exe/rubocop +2 -9
  8. data/lib/rubocop/cache_config.rb +29 -0
  9. data/lib/rubocop/cached_data.rb +50 -5
  10. data/lib/rubocop/changed_files.rb +134 -0
  11. data/lib/rubocop/cli/command/auto_generate_config.rb +36 -4
  12. data/lib/rubocop/cli/command/cop_names.rb +57 -0
  13. data/lib/rubocop/cli/command/execute_runner.rb +54 -3
  14. data/lib/rubocop/cli/command/explain.rb +34 -0
  15. data/lib/rubocop/cli/command/list_enabled_cops_for.rb +40 -0
  16. data/lib/rubocop/cli/command/lsp.rb +1 -1
  17. data/lib/rubocop/cli/command/mcp.rb +19 -0
  18. data/lib/rubocop/cli/command/show_cops.rb +8 -2
  19. data/lib/rubocop/cli/command/show_docs_url.rb +8 -10
  20. data/lib/rubocop/cli/command/suggest_extensions.rb +8 -2
  21. data/lib/rubocop/cli.rb +59 -17
  22. data/lib/rubocop/comment_config/directive_range.rb +34 -0
  23. data/lib/rubocop/comment_config/disable_next.rb +143 -0
  24. data/lib/rubocop/comment_config/push_pop.rb +55 -0
  25. data/lib/rubocop/comment_config.rb +98 -45
  26. data/lib/rubocop/config.rb +137 -19
  27. data/lib/rubocop/config_finder.rb +1 -1
  28. data/lib/rubocop/config_loader.rb +75 -49
  29. data/lib/rubocop/config_loader_resolver.rb +124 -33
  30. data/lib/rubocop/config_obsoletion/cop_rule.rb +2 -1
  31. data/lib/rubocop/config_obsoletion/extracted_cop.rb +6 -3
  32. data/lib/rubocop/config_obsoletion/removed_cop.rb +9 -1
  33. data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
  34. data/lib/rubocop/config_obsoletion.rb +47 -3
  35. data/lib/rubocop/config_store.rb +7 -2
  36. data/lib/rubocop/config_validator.rb +75 -12
  37. data/lib/rubocop/cop/autocorrect_logic.rb +43 -17
  38. data/lib/rubocop/cop/badge.rb +10 -2
  39. data/lib/rubocop/cop/base.rb +128 -35
  40. data/lib/rubocop/cop/bundler/gem_comment.rb +5 -4
  41. data/lib/rubocop/cop/bundler/gem_version.rb +28 -28
  42. data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -11
  43. data/lib/rubocop/cop/bundler.rb +19 -0
  44. data/lib/rubocop/cop/commissioner.rb +13 -11
  45. data/lib/rubocop/cop/cop_documentation.rb +81 -0
  46. data/lib/rubocop/cop/cop_explanation.rb +140 -0
  47. data/lib/rubocop/cop/corrector.rb +4 -4
  48. data/lib/rubocop/cop/correctors/alignment_corrector.rb +92 -11
  49. data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -1
  50. data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +37 -7
  51. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +1 -1
  52. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +7 -2
  53. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +31 -4
  54. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +35 -5
  55. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +8 -1
  56. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +73 -2
  57. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
  58. data/lib/rubocop/cop/correctors.rb +28 -0
  59. data/lib/rubocop/cop/documentation.rb +3 -4
  60. data/lib/rubocop/cop/exclude_limit.rb +31 -5
  61. data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
  62. data/lib/rubocop/cop/gemspec/dependency_version.rb +0 -6
  63. data/lib/rubocop/cop/gemspec/development_dependencies.rb +1 -1
  64. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +49 -17
  65. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +2 -9
  66. data/lib/rubocop/cop/gemspec/require_mfa.rb +22 -5
  67. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +12 -7
  68. data/lib/rubocop/cop/gemspec.rb +22 -0
  69. data/lib/rubocop/cop/generator/registration_injector.rb +188 -0
  70. data/lib/rubocop/cop/generator.rb +5 -1
  71. data/lib/rubocop/cop/internal_affairs/example_description.rb +9 -5
  72. data/lib/rubocop/cop/internal_affairs/example_heredoc_delimiter.rb +8 -8
  73. data/lib/rubocop/cop/internal_affairs/itblock_handler.rb +69 -0
  74. data/lib/rubocop/cop/internal_affairs/location_exists.rb +142 -0
  75. data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +1 -0
  76. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +16 -20
  77. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +1 -1
  78. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +1 -2
  79. data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +6 -2
  80. data/lib/rubocop/cop/internal_affairs/node_type_group.rb +85 -0
  81. data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +2 -2
  82. data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
  83. data/lib/rubocop/cop/internal_affairs/redundant_context_config_parameter.rb +1 -7
  84. data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +6 -5
  85. data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +5 -3
  86. data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +1 -7
  87. data/lib/rubocop/cop/internal_affairs/undefined_config.rb +13 -2
  88. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +4 -4
  89. data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
  90. data/lib/rubocop/cop/internal_affairs.rb +3 -16
  91. data/lib/rubocop/cop/layout/argument_alignment.rb +9 -3
  92. data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
  93. data/lib/rubocop/cop/layout/begin_end_alignment.rb +1 -1
  94. data/lib/rubocop/cop/layout/block_alignment.rb +86 -4
  95. data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
  96. data/lib/rubocop/cop/layout/case_indentation.rb +28 -10
  97. data/lib/rubocop/cop/layout/class_structure.rb +191 -41
  98. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
  99. data/lib/rubocop/cop/layout/comment_indentation.rb +17 -7
  100. data/lib/rubocop/cop/layout/condition_position.rb +13 -3
  101. data/lib/rubocop/cop/layout/def_end_alignment.rb +5 -1
  102. data/lib/rubocop/cop/layout/dot_position.rb +27 -17
  103. data/lib/rubocop/cop/layout/else_alignment.rb +3 -15
  104. data/lib/rubocop/cop/layout/empty_comment.rb +8 -10
  105. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +27 -9
  106. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +63 -5
  107. data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +21 -8
  108. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +46 -21
  109. data/lib/rubocop/cop/layout/empty_lines.rb +5 -2
  110. data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +101 -0
  111. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +34 -4
  112. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +8 -29
  113. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +2 -0
  114. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +22 -5
  115. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +17 -3
  116. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +23 -1
  117. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +22 -2
  118. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +16 -2
  119. data/lib/rubocop/cop/layout/end_alignment.rb +23 -15
  120. data/lib/rubocop/cop/layout/extra_spacing.rb +109 -3
  121. data/lib/rubocop/cop/layout/first_argument_indentation.rb +82 -3
  122. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +18 -5
  123. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +41 -0
  124. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +36 -23
  125. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +25 -25
  126. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +6 -0
  127. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +4 -0
  128. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +11 -0
  129. data/lib/rubocop/cop/layout/hash_alignment.rb +20 -18
  130. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +9 -5
  131. data/lib/rubocop/cop/layout/heredoc_indentation.rb +48 -3
  132. data/lib/rubocop/cop/layout/indentation_consistency.rb +22 -5
  133. data/lib/rubocop/cop/layout/indentation_style.rb +5 -2
  134. data/lib/rubocop/cop/layout/indentation_width.rb +159 -12
  135. data/lib/rubocop/cop/layout/leading_comment_space.rb +40 -1
  136. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +10 -4
  137. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +25 -9
  138. data/lib/rubocop/cop/layout/line_length.rb +300 -31
  139. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +69 -57
  140. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +8 -2
  141. data/lib/rubocop/cop/layout/multiline_block_layout.rb +11 -1
  142. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +65 -56
  143. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +7 -1
  144. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +270 -40
  145. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +4 -0
  146. data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
  147. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +9 -5
  148. data/lib/rubocop/cop/layout/parameter_alignment.rb +1 -1
  149. data/lib/rubocop/cop/layout/redundant_line_break.rb +111 -7
  150. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +29 -9
  151. data/lib/rubocop/cop/layout/single_line_block_chain.rb +10 -2
  152. data/lib/rubocop/cop/layout/space_after_comma.rb +2 -10
  153. data/lib/rubocop/cop/layout/space_after_not.rb +5 -0
  154. data/lib/rubocop/cop/layout/space_after_semicolon.rb +11 -1
  155. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +10 -4
  156. data/lib/rubocop/cop/layout/space_around_keyword.rb +20 -3
  157. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
  158. data/lib/rubocop/cop/layout/space_around_operators.rb +30 -4
  159. data/lib/rubocop/cop/layout/space_before_block_braces.rb +5 -1
  160. data/lib/rubocop/cop/layout/space_before_brackets.rb +6 -39
  161. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -8
  162. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +55 -36
  163. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +32 -8
  164. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +3 -0
  165. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +2 -12
  166. data/lib/rubocop/cop/layout/trailing_whitespace.rb +1 -1
  167. data/lib/rubocop/cop/layout.rb +114 -0
  168. data/lib/rubocop/cop/lazy_loader.rb +41 -0
  169. data/lib/rubocop/cop/lint/ambiguous_assignment.rb +9 -17
  170. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +72 -1
  171. data/lib/rubocop/cop/lint/ambiguous_operator.rb +1 -1
  172. data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +3 -11
  173. data/lib/rubocop/cop/lint/ambiguous_range.rb +6 -2
  174. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +6 -1
  175. data/lib/rubocop/cop/lint/argument_mismatch.rb +99 -0
  176. data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +2 -3
  177. data/lib/rubocop/cop/lint/assignment_in_condition.rb +15 -1
  178. data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
  179. data/lib/rubocop/cop/lint/circular_argument_reference.rb +47 -8
  180. data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +4 -3
  181. data/lib/rubocop/cop/lint/constant_reassignment.rb +94 -15
  182. data/lib/rubocop/cop/lint/constant_resolution.rb +31 -6
  183. data/lib/rubocop/cop/lint/cop_directive_syntax.rb +240 -0
  184. data/lib/rubocop/cop/lint/data_define_override.rb +63 -0
  185. data/lib/rubocop/cop/lint/debugger.rb +13 -4
  186. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -1
  187. data/lib/rubocop/cop/lint/deprecated_constants.rb +2 -8
  188. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +5 -2
  189. data/lib/rubocop/cop/lint/deprecated_reference.rb +194 -0
  190. data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +4 -4
  191. data/lib/rubocop/cop/lint/duplicate_methods.rb +506 -41
  192. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +5 -42
  193. data/lib/rubocop/cop/lint/else_layout.rb +19 -0
  194. data/lib/rubocop/cop/lint/empty_block.rb +4 -4
  195. data/lib/rubocop/cop/lint/empty_conditional_body.rb +22 -65
  196. data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
  197. data/lib/rubocop/cop/lint/empty_in_pattern.rb +8 -1
  198. data/lib/rubocop/cop/lint/empty_interpolation.rb +14 -1
  199. data/lib/rubocop/cop/lint/empty_when.rb +8 -1
  200. data/lib/rubocop/cop/lint/ensure_return.rb +19 -1
  201. data/lib/rubocop/cop/lint/erb_new_arguments.rb +4 -8
  202. data/lib/rubocop/cop/lint/float_comparison.rb +33 -10
  203. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +1 -1
  204. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +4 -0
  205. data/lib/rubocop/cop/lint/identity_comparison.rb +19 -15
  206. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -2
  207. data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +5 -1
  208. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -2
  209. data/lib/rubocop/cop/lint/inherit_exception.rb +53 -7
  210. data/lib/rubocop/cop/lint/interpolation_check.rb +25 -6
  211. data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +1 -1
  212. data/lib/rubocop/cop/lint/literal_as_condition.rb +152 -11
  213. data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +11 -1
  214. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +75 -37
  215. data/lib/rubocop/cop/lint/loop.rb +24 -2
  216. data/lib/rubocop/cop/lint/misplaced_magic_comment.rb +245 -0
  217. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +60 -23
  218. data/lib/rubocop/cop/lint/missing_super.rb +31 -1
  219. data/lib/rubocop/cop/lint/mixed_case_range.rb +2 -2
  220. data/lib/rubocop/cop/lint/multiple_comparison.rb +2 -2
  221. data/lib/rubocop/cop/lint/name_typo.rb +270 -0
  222. data/lib/rubocop/cop/lint/nested_method_definition.rb +2 -2
  223. data/lib/rubocop/cop/lint/next_without_accumulator.rb +2 -0
  224. data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +20 -0
  225. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +4 -2
  226. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +4 -4
  227. data/lib/rubocop/cop/lint/number_conversion.rb +22 -11
  228. data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -1
  229. data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +11 -0
  230. data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +1 -1
  231. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +7 -7
  232. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +15 -4
  233. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +20 -14
  234. data/lib/rubocop/cop/lint/raise_exception.rb +30 -11
  235. data/lib/rubocop/cop/lint/rand_one.rb +1 -1
  236. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +160 -39
  237. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +53 -19
  238. data/lib/rubocop/cop/lint/redundant_dir_glob_sort.rb +28 -6
  239. data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
  240. data/lib/rubocop/cop/lint/redundant_require_statement.rb +5 -25
  241. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +134 -12
  242. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +13 -4
  243. data/lib/rubocop/cop/lint/redundant_type_conversion.rb +267 -0
  244. data/lib/rubocop/cop/lint/redundant_with_index.rb +5 -3
  245. data/lib/rubocop/cop/lint/redundant_with_object.rb +8 -0
  246. data/lib/rubocop/cop/lint/refinement_import_methods.rb +8 -1
  247. data/lib/rubocop/cop/lint/regexp_as_condition.rb +9 -1
  248. data/lib/rubocop/cop/lint/require_parentheses.rb +13 -4
  249. data/lib/rubocop/cop/lint/require_range_parentheses.rb +3 -2
  250. data/lib/rubocop/cop/lint/require_relative_self_path.rb +7 -5
  251. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -4
  252. data/lib/rubocop/cop/lint/rescue_type.rb +2 -2
  253. data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -11
  254. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +28 -4
  255. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +56 -6
  256. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -1
  257. data/lib/rubocop/cop/lint/script_permission.rb +5 -1
  258. data/lib/rubocop/cop/lint/self_assignment.rb +63 -6
  259. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +1 -1
  260. data/lib/rubocop/cop/lint/shadowed_argument.rb +7 -7
  261. data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
  262. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +27 -1
  263. data/lib/rubocop/cop/lint/shared_mutable_default.rb +14 -1
  264. data/lib/rubocop/cop/lint/struct_new_override.rb +17 -1
  265. data/lib/rubocop/cop/lint/super_argument_mismatch.rb +179 -0
  266. data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
  267. data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +122 -0
  268. data/lib/rubocop/cop/lint/symbol_conversion.rb +22 -4
  269. data/lib/rubocop/cop/lint/syntax.rb +25 -1
  270. data/lib/rubocop/cop/lint/to_enum_arguments.rb +73 -5
  271. data/lib/rubocop/cop/lint/to_json.rb +20 -17
  272. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
  273. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +5 -1
  274. data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +54 -11
  275. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +2 -0
  276. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +2 -1
  277. data/lib/rubocop/cop/lint/unreachable_code.rb +16 -9
  278. data/lib/rubocop/cop/lint/unreachable_loop.rb +5 -5
  279. data/lib/rubocop/cop/lint/unreachable_pattern_branch.rb +113 -0
  280. data/lib/rubocop/cop/lint/unused_method_argument.rb +10 -0
  281. data/lib/rubocop/cop/lint/unused_private_method.rb +234 -0
  282. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +2 -0
  283. data/lib/rubocop/cop/lint/useless_access_modifier.rb +31 -6
  284. data/lib/rubocop/cop/lint/useless_assignment.rb +63 -27
  285. data/lib/rubocop/cop/lint/useless_constant_scoping.rb +107 -0
  286. data/lib/rubocop/cop/lint/useless_default_value_argument.rb +92 -0
  287. data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
  288. data/lib/rubocop/cop/lint/useless_numeric_operation.rb +11 -10
  289. data/lib/rubocop/cop/lint/useless_or.rb +111 -0
  290. data/lib/rubocop/cop/lint/useless_rescue.rb +2 -3
  291. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +13 -7
  292. data/lib/rubocop/cop/lint/useless_setter_call.rb +11 -5
  293. data/lib/rubocop/cop/lint/useless_times.rb +22 -1
  294. data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +201 -0
  295. data/lib/rubocop/cop/lint/void.rb +68 -22
  296. data/lib/rubocop/cop/lint.rb +179 -0
  297. data/lib/rubocop/cop/message_annotator.rb +7 -3
  298. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  299. data/lib/rubocop/cop/metrics/block_length.rb +2 -1
  300. data/lib/rubocop/cop/metrics/block_nesting.rb +23 -0
  301. data/lib/rubocop/cop/metrics/class_length.rb +4 -2
  302. data/lib/rubocop/cop/metrics/collection_literal_length.rb +1 -1
  303. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +0 -4
  304. data/lib/rubocop/cop/metrics/method_length.rb +3 -2
  305. data/lib/rubocop/cop/metrics/module_length.rb +4 -2
  306. data/lib/rubocop/cop/metrics/perceived_complexity.rb +37 -7
  307. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +4 -3
  308. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +2 -2
  309. data/lib/rubocop/cop/metrics/utils/iterating_block.rb +1 -1
  310. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
  311. data/lib/rubocop/cop/metrics.rb +31 -0
  312. data/lib/rubocop/cop/migration/department_name.rb +11 -5
  313. data/lib/rubocop/cop/migration.rb +13 -0
  314. data/lib/rubocop/cop/mixin/alignment.rb +7 -3
  315. data/lib/rubocop/cop/mixin/allowed_methods.rb +5 -5
  316. data/lib/rubocop/cop/mixin/allowed_pattern.rb +9 -5
  317. data/lib/rubocop/cop/mixin/annotation_comment.rb +1 -1
  318. data/lib/rubocop/cop/mixin/check_line_breakable.rb +50 -28
  319. data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +13 -9
  320. data/lib/rubocop/cop/mixin/code_length.rb +10 -2
  321. data/lib/rubocop/cop/mixin/comments_help.rb +2 -3
  322. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +1 -2
  323. data/lib/rubocop/cop/mixin/configurable_max.rb +6 -5
  324. data/lib/rubocop/cop/mixin/def_node.rb +1 -1
  325. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +13 -2
  326. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -7
  327. data/lib/rubocop/cop/mixin/endless_method_body_help.rb +105 -0
  328. data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +13 -5
  329. data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
  330. data/lib/rubocop/cop/mixin/forbidden_pattern.rb +20 -0
  331. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -2
  332. data/lib/rubocop/cop/mixin/gemspec_help.rb +22 -0
  333. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +68 -21
  334. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +52 -25
  335. data/lib/rubocop/cop/mixin/hash_subset.rb +28 -6
  336. data/lib/rubocop/cop/mixin/hash_transform_method/autocorrection.rb +63 -0
  337. data/lib/rubocop/cop/mixin/hash_transform_method.rb +32 -78
  338. data/lib/rubocop/cop/mixin/indexed_method_arity.rb +94 -0
  339. data/lib/rubocop/cop/mixin/line_length_help.rb +52 -11
  340. data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
  341. data/lib/rubocop/cop/mixin/min_branches_count.rb +3 -1
  342. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +11 -1
  343. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +3 -1
  344. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +10 -1
  345. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +2 -2
  346. data/lib/rubocop/cop/mixin/pattern_matching_help.rb +35 -0
  347. data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
  348. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +79 -8
  349. data/lib/rubocop/cop/mixin/project_index_help.rb +203 -0
  350. data/lib/rubocop/cop/mixin/range_help.rb +16 -5
  351. data/lib/rubocop/cop/mixin/reparsed_equivalence.rb +181 -0
  352. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +5 -4
  353. data/lib/rubocop/cop/mixin/statement_modifier.rb +69 -12
  354. data/lib/rubocop/cop/mixin/string_help.rb +1 -1
  355. data/lib/rubocop/cop/mixin/target_ruby_version.rb +1 -1
  356. data/lib/rubocop/cop/mixin/trailing_comma.rb +23 -6
  357. data/lib/rubocop/cop/mixin/visibility_help.rb +2 -1
  358. data/lib/rubocop/cop/mixin.rb +93 -0
  359. data/lib/rubocop/cop/naming/accessor_method_name.rb +8 -0
  360. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +17 -1
  361. data/lib/rubocop/cop/naming/block_forwarding.rb +7 -4
  362. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  363. data/lib/rubocop/cop/naming/file_name.rb +6 -5
  364. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +9 -2
  365. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +5 -3
  366. data/lib/rubocop/cop/naming/inclusive_language.rb +8 -2
  367. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +13 -6
  368. data/lib/rubocop/cop/naming/method_name.rb +190 -15
  369. data/lib/rubocop/cop/naming/predicate_method.rb +330 -0
  370. data/lib/rubocop/cop/naming/{predicate_name.rb → predicate_prefix.rb} +65 -8
  371. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -7
  372. data/lib/rubocop/cop/naming/variable_name.rb +51 -6
  373. data/lib/rubocop/cop/naming/variable_number.rb +3 -1
  374. data/lib/rubocop/cop/naming.rb +31 -0
  375. data/lib/rubocop/cop/offense.rb +108 -9
  376. data/lib/rubocop/cop/registry.rb +234 -65
  377. data/lib/rubocop/cop/security/eval.rb +17 -3
  378. data/lib/rubocop/cop/security/io_methods.rb +2 -2
  379. data/lib/rubocop/cop/security/json_load.rb +45 -11
  380. data/lib/rubocop/cop/security/marshal_load.rb +1 -1
  381. data/lib/rubocop/cop/security/open.rb +1 -0
  382. data/lib/rubocop/cop/security.rb +19 -0
  383. data/lib/rubocop/cop/severity.rb +12 -0
  384. data/lib/rubocop/cop/style/access_modifier_declarations.rb +83 -14
  385. data/lib/rubocop/cop/style/accessor_grouping.rb +47 -10
  386. data/lib/rubocop/cop/style/alias.rb +33 -8
  387. data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +4 -3
  388. data/lib/rubocop/cop/style/and_or.rb +8 -3
  389. data/lib/rubocop/cop/style/arguments_forwarding.rb +80 -39
  390. data/lib/rubocop/cop/style/array_first_last.rb +13 -3
  391. data/lib/rubocop/cop/style/array_intersect.rb +136 -38
  392. data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +50 -0
  393. data/lib/rubocop/cop/style/array_join.rb +4 -2
  394. data/lib/rubocop/cop/style/ascii_comments.rb +6 -3
  395. data/lib/rubocop/cop/style/attr.rb +8 -6
  396. data/lib/rubocop/cop/style/bare_percent_literals.rb +4 -3
  397. data/lib/rubocop/cop/style/begin_block.rb +3 -1
  398. data/lib/rubocop/cop/style/bitwise_predicate.rb +13 -5
  399. data/lib/rubocop/cop/style/block_delimiters.rb +77 -40
  400. data/lib/rubocop/cop/style/case_equality.rb +29 -15
  401. data/lib/rubocop/cop/style/case_like_if.rb +12 -11
  402. data/lib/rubocop/cop/style/character_literal.rb +2 -2
  403. data/lib/rubocop/cop/style/class_and_module_children.rb +181 -27
  404. data/lib/rubocop/cop/style/class_equality_comparison.rb +22 -14
  405. data/lib/rubocop/cop/style/class_methods_definitions.rb +26 -5
  406. data/lib/rubocop/cop/style/collection_compact.rb +37 -17
  407. data/lib/rubocop/cop/style/collection_methods.rb +1 -0
  408. data/lib/rubocop/cop/style/collection_querying.rb +200 -0
  409. data/lib/rubocop/cop/style/colon_method_call.rb +16 -7
  410. data/lib/rubocop/cop/style/combinable_loops.rb +92 -9
  411. data/lib/rubocop/cop/style/command_literal.rb +1 -1
  412. data/lib/rubocop/cop/style/commented_keyword.rb +12 -5
  413. data/lib/rubocop/cop/style/comparable_between.rb +78 -0
  414. data/lib/rubocop/cop/style/comparable_clamp.rb +12 -1
  415. data/lib/rubocop/cop/style/concat_array_literals.rb +65 -9
  416. data/lib/rubocop/cop/style/conditional_assignment.rb +58 -24
  417. data/lib/rubocop/cop/style/constant_visibility.rb +23 -12
  418. data/lib/rubocop/cop/style/copyright.rb +27 -12
  419. data/lib/rubocop/cop/style/data_inheritance.rb +25 -0
  420. data/lib/rubocop/cop/style/date_time.rb +4 -4
  421. data/lib/rubocop/cop/style/def_with_parentheses.rb +22 -5
  422. data/lib/rubocop/cop/style/dig_chain.rb +6 -1
  423. data/lib/rubocop/cop/style/dir_empty.rb +4 -0
  424. data/lib/rubocop/cop/style/directive_scope.rb +304 -0
  425. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +184 -20
  426. data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +6 -1
  427. data/lib/rubocop/cop/style/documentation.rb +53 -6
  428. data/lib/rubocop/cop/style/documentation_method.rb +8 -12
  429. data/lib/rubocop/cop/style/double_negation.rb +14 -3
  430. data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
  431. data/lib/rubocop/cop/style/each_with_object.rb +4 -3
  432. data/lib/rubocop/cop/style/empty_block_parameter.rb +1 -1
  433. data/lib/rubocop/cop/style/empty_case_condition.rb +13 -4
  434. data/lib/rubocop/cop/style/empty_class_definition.rb +126 -0
  435. data/lib/rubocop/cop/style/empty_heredoc.rb +4 -0
  436. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +1 -1
  437. data/lib/rubocop/cop/style/empty_literal.rb +12 -3
  438. data/lib/rubocop/cop/style/empty_method.rb +15 -9
  439. data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +152 -0
  440. data/lib/rubocop/cop/style/encoding.rb +7 -1
  441. data/lib/rubocop/cop/style/end_block.rb +3 -1
  442. data/lib/rubocop/cop/style/endless_method.rb +256 -19
  443. data/lib/rubocop/cop/style/env_home.rb +4 -0
  444. data/lib/rubocop/cop/style/eval_with_location.rb +3 -3
  445. data/lib/rubocop/cop/style/even_odd.rb +11 -1
  446. data/lib/rubocop/cop/style/exact_regexp_match.rb +52 -8
  447. data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
  448. data/lib/rubocop/cop/style/explicit_block_argument.rb +62 -9
  449. data/lib/rubocop/cop/style/exponential_notation.rb +5 -4
  450. data/lib/rubocop/cop/style/fetch_env_var.rb +33 -7
  451. data/lib/rubocop/cop/style/file_null.rb +6 -4
  452. data/lib/rubocop/cop/style/file_open.rb +84 -0
  453. data/lib/rubocop/cop/style/file_write.rb +21 -16
  454. data/lib/rubocop/cop/style/float_division.rb +43 -15
  455. data/lib/rubocop/cop/style/for.rb +61 -1
  456. data/lib/rubocop/cop/style/format_string.rb +44 -9
  457. data/lib/rubocop/cop/style/format_string_token.rb +86 -16
  458. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +5 -3
  459. data/lib/rubocop/cop/style/global_std_stream.rb +3 -0
  460. data/lib/rubocop/cop/style/global_vars.rb +5 -2
  461. data/lib/rubocop/cop/style/guard_clause.rb +58 -40
  462. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +31 -9
  463. data/lib/rubocop/cop/style/hash_conversion.rb +52 -16
  464. data/lib/rubocop/cop/style/hash_each_methods.rb +4 -4
  465. data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
  466. data/lib/rubocop/cop/style/hash_lookup_method.rb +128 -0
  467. data/lib/rubocop/cop/style/hash_slice.rb +16 -0
  468. data/lib/rubocop/cop/style/hash_syntax.rb +23 -6
  469. data/lib/rubocop/cop/style/hash_transform_keys.rb +19 -9
  470. data/lib/rubocop/cop/style/hash_transform_values.rb +19 -9
  471. data/lib/rubocop/cop/style/identical_conditional_branches.rb +39 -11
  472. data/lib/rubocop/cop/style/if_inside_else.rb +46 -21
  473. data/lib/rubocop/cop/style/if_unless_modifier.rb +101 -70
  474. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +19 -19
  475. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +5 -2
  476. data/lib/rubocop/cop/style/if_with_semicolon.rb +61 -8
  477. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  478. data/lib/rubocop/cop/style/inline_comment.rb +5 -2
  479. data/lib/rubocop/cop/style/inverse_methods.rb +34 -8
  480. data/lib/rubocop/cop/style/invertible_unless_condition.rb +27 -7
  481. data/lib/rubocop/cop/style/ip_addresses.rb +3 -4
  482. data/lib/rubocop/cop/style/it_assignment.rb +69 -12
  483. data/lib/rubocop/cop/style/it_block_parameter.rb +211 -0
  484. data/lib/rubocop/cop/style/keyword_arguments_merging.rb +4 -0
  485. data/lib/rubocop/cop/style/keyword_parameters_order.rb +23 -11
  486. data/lib/rubocop/cop/style/lambda.rb +46 -2
  487. data/lib/rubocop/cop/style/lambda_call.rb +31 -10
  488. data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
  489. data/lib/rubocop/cop/style/magic_comment_format.rb +4 -4
  490. data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +11 -0
  491. data/lib/rubocop/cop/style/map_into_array.rb +6 -4
  492. data/lib/rubocop/cop/style/map_join.rb +123 -0
  493. data/lib/rubocop/cop/style/map_to_hash.rb +13 -5
  494. data/lib/rubocop/cop/style/map_to_set.rb +1 -3
  495. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +110 -27
  496. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +15 -2
  497. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +58 -6
  498. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +36 -8
  499. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -1
  500. data/lib/rubocop/cop/style/method_def_parentheses.rb +36 -8
  501. data/lib/rubocop/cop/style/min_max_comparison.rb +17 -6
  502. data/lib/rubocop/cop/style/missing_else.rb +7 -1
  503. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +40 -7
  504. data/lib/rubocop/cop/style/mixin_grouping.rb +12 -3
  505. data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
  506. data/lib/rubocop/cop/style/module_function.rb +4 -2
  507. data/lib/rubocop/cop/style/module_member_existence_check.rb +110 -0
  508. data/lib/rubocop/cop/style/multiline_block_chain.rb +2 -1
  509. data/lib/rubocop/cop/style/multiline_if_modifier.rb +47 -5
  510. data/lib/rubocop/cop/style/multiline_if_then.rb +10 -4
  511. data/lib/rubocop/cop/style/multiline_in_pattern_then.rb +7 -0
  512. data/lib/rubocop/cop/style/multiline_memoization.rb +7 -1
  513. data/lib/rubocop/cop/style/multiline_method_signature.rb +15 -22
  514. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +7 -3
  515. data/lib/rubocop/cop/style/multiline_when_then.rb +7 -0
  516. data/lib/rubocop/cop/style/multiple_comparison.rb +33 -22
  517. data/lib/rubocop/cop/style/mutable_constant.rb +158 -14
  518. data/lib/rubocop/cop/style/negated_if_else_condition.rb +3 -3
  519. data/lib/rubocop/cop/style/negative_array_index.rb +228 -0
  520. data/lib/rubocop/cop/style/nested_modifier.rb +36 -12
  521. data/lib/rubocop/cop/style/nested_ternary_operator.rb +26 -8
  522. data/lib/rubocop/cop/style/next.rb +68 -10
  523. data/lib/rubocop/cop/style/nil_comparison.rb +53 -13
  524. data/lib/rubocop/cop/style/nil_lambda.rb +9 -1
  525. data/lib/rubocop/cop/style/non_nil_check.rb +21 -11
  526. data/lib/rubocop/cop/style/not.rb +12 -3
  527. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +11 -1
  528. data/lib/rubocop/cop/style/numeric_literals.rb +3 -2
  529. data/lib/rubocop/cop/style/numeric_predicate.rb +22 -6
  530. data/lib/rubocop/cop/style/object_then.rb +1 -0
  531. data/lib/rubocop/cop/style/one_class_per_file.rb +115 -0
  532. data/lib/rubocop/cop/style/one_line_conditional.rb +35 -15
  533. data/lib/rubocop/cop/style/open_struct_use.rb +1 -1
  534. data/lib/rubocop/cop/style/operator_method_call.rb +10 -2
  535. data/lib/rubocop/cop/style/option_hash.rb +1 -1
  536. data/lib/rubocop/cop/style/optional_arguments.rb +1 -0
  537. data/lib/rubocop/cop/style/parallel_assignment.rb +58 -27
  538. data/lib/rubocop/cop/style/parentheses_around_condition.rb +7 -2
  539. data/lib/rubocop/cop/style/partition_instead_of_double_select.rb +270 -0
  540. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +18 -3
  541. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
  542. data/lib/rubocop/cop/style/perl_backrefs.rb +5 -3
  543. data/lib/rubocop/cop/style/predicate_with_kind.rb +84 -0
  544. data/lib/rubocop/cop/style/preferred_hash_methods.rb +12 -12
  545. data/lib/rubocop/cop/style/proc.rb +4 -2
  546. data/lib/rubocop/cop/style/raise_args.rb +28 -18
  547. data/lib/rubocop/cop/style/reduce_to_hash.rb +216 -0
  548. data/lib/rubocop/cop/style/redundant_argument.rb +2 -0
  549. data/lib/rubocop/cop/style/redundant_array_constructor.rb +2 -2
  550. data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
  551. data/lib/rubocop/cop/style/redundant_assignment.rb +12 -2
  552. data/lib/rubocop/cop/style/redundant_begin.rb +60 -7
  553. data/lib/rubocop/cop/style/redundant_condition.rb +93 -18
  554. data/lib/rubocop/cop/style/redundant_constant_base.rb +42 -6
  555. data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +26 -4
  556. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +17 -3
  557. data/lib/rubocop/cop/style/redundant_each.rb +4 -5
  558. data/lib/rubocop/cop/style/redundant_exception.rb +22 -4
  559. data/lib/rubocop/cop/style/redundant_fetch_block.rb +11 -11
  560. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +9 -0
  561. data/lib/rubocop/cop/style/redundant_filter_chain.rb +1 -1
  562. data/lib/rubocop/cop/style/redundant_format.rb +319 -0
  563. data/lib/rubocop/cop/style/redundant_freeze.rb +13 -5
  564. data/lib/rubocop/cop/style/redundant_heredoc_delimiter_quotes.rb +6 -1
  565. data/lib/rubocop/cop/style/redundant_interpolation.rb +12 -3
  566. data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +49 -10
  567. data/lib/rubocop/cop/style/redundant_line_continuation.rb +83 -119
  568. data/lib/rubocop/cop/style/redundant_min_max_by.rb +93 -0
  569. data/lib/rubocop/cop/style/redundant_parentheses.rb +176 -83
  570. data/lib/rubocop/cop/style/redundant_percent_q.rb +5 -3
  571. data/lib/rubocop/cop/style/redundant_regexp_argument.rb +15 -0
  572. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +6 -5
  573. data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +27 -7
  574. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +16 -0
  575. data/lib/rubocop/cop/style/redundant_return.rb +4 -3
  576. data/lib/rubocop/cop/style/redundant_self.rb +20 -7
  577. data/lib/rubocop/cop/style/redundant_self_assignment.rb +2 -3
  578. data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +27 -4
  579. data/lib/rubocop/cop/style/redundant_sort.rb +45 -11
  580. data/lib/rubocop/cop/style/redundant_sort_by.rb +17 -1
  581. data/lib/rubocop/cop/style/redundant_string_escape.rb +1 -2
  582. data/lib/rubocop/cop/style/redundant_struct_keyword_init.rb +133 -0
  583. data/lib/rubocop/cop/style/regexp_literal.rb +107 -29
  584. data/lib/rubocop/cop/style/require_order.rb +25 -8
  585. data/lib/rubocop/cop/style/rescue_modifier.rb +16 -12
  586. data/lib/rubocop/cop/style/return_nil.rb +19 -4
  587. data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +11 -1
  588. data/lib/rubocop/cop/style/reverse_find.rb +51 -0
  589. data/lib/rubocop/cop/style/safe_navigation.rb +76 -20
  590. data/lib/rubocop/cop/style/sample.rb +19 -13
  591. data/lib/rubocop/cop/style/select_by_kind.rb +158 -0
  592. data/lib/rubocop/cop/style/select_by_range.rb +197 -0
  593. data/lib/rubocop/cop/style/select_by_regexp.rb +54 -22
  594. data/lib/rubocop/cop/style/self_assignment.rb +13 -16
  595. data/lib/rubocop/cop/style/semicolon.rb +56 -14
  596. data/lib/rubocop/cop/style/send_with_literal_method_name.rb +4 -0
  597. data/lib/rubocop/cop/style/single_line_block_params.rb +2 -2
  598. data/lib/rubocop/cop/style/single_line_do_end_block.rb +22 -8
  599. data/lib/rubocop/cop/style/single_line_methods.rb +33 -11
  600. data/lib/rubocop/cop/style/sole_nested_conditional.rb +96 -104
  601. data/lib/rubocop/cop/style/special_global_vars.rb +7 -2
  602. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +32 -6
  603. data/lib/rubocop/cop/style/static_class.rb +21 -0
  604. data/lib/rubocop/cop/style/string_concatenation.rb +38 -16
  605. data/lib/rubocop/cop/style/string_hash_keys.rb +1 -0
  606. data/lib/rubocop/cop/style/struct_inheritance.rb +44 -2
  607. data/lib/rubocop/cop/style/super_arguments.rb +7 -6
  608. data/lib/rubocop/cop/style/symbol_array.rb +1 -1
  609. data/lib/rubocop/cop/style/symbol_proc.rb +35 -15
  610. data/lib/rubocop/cop/style/tally_method.rb +181 -0
  611. data/lib/rubocop/cop/style/ternary_parentheses.rb +34 -1
  612. data/lib/rubocop/cop/style/time_now.rb +41 -0
  613. data/lib/rubocop/cop/style/top_level_method_definition.rb +3 -2
  614. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +52 -1
  615. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
  616. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +2 -2
  617. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
  618. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -0
  619. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +35 -32
  620. data/lib/rubocop/cop/style/trivial_accessors.rb +2 -2
  621. data/lib/rubocop/cop/style/unless_else.rb +10 -9
  622. data/lib/rubocop/cop/style/unless_logical_operators.rb +3 -3
  623. data/lib/rubocop/cop/style/while_until_do.rb +7 -0
  624. data/lib/rubocop/cop/style/while_until_modifier.rb +16 -1
  625. data/lib/rubocop/cop/style/word_array.rb +1 -0
  626. data/lib/rubocop/cop/style/yoda_condition.rb +26 -12
  627. data/lib/rubocop/cop/style/yoda_expression.rb +11 -2
  628. data/lib/rubocop/cop/style/zero_length_predicate.rb +6 -3
  629. data/lib/rubocop/cop/style.rb +311 -0
  630. data/lib/rubocop/cop/team.rb +172 -49
  631. data/lib/rubocop/cop/util.rb +7 -10
  632. data/lib/rubocop/cop/utils/format_string.rb +20 -5
  633. data/lib/rubocop/cop/variable_force/assignment.rb +8 -4
  634. data/lib/rubocop/cop/variable_force/branch.rb +30 -6
  635. data/lib/rubocop/cop/variable_force/scope.rb +1 -1
  636. data/lib/rubocop/cop/variable_force/variable.rb +42 -11
  637. data/lib/rubocop/cop/variable_force.rb +26 -9
  638. data/lib/rubocop/cops_documentation_generator.rb +49 -15
  639. data/lib/rubocop/directive_comment.rb +147 -5
  640. data/lib/rubocop/ext/regexp_node.rb +0 -1
  641. data/lib/rubocop/feature_loader.rb +0 -6
  642. data/lib/rubocop/file_patterns.rb +9 -1
  643. data/lib/rubocop/formatter/base_formatter.rb +22 -0
  644. data/lib/rubocop/formatter/clang_style_formatter.rb +5 -2
  645. data/lib/rubocop/formatter/disabled_config_formatter.rb +57 -14
  646. data/lib/rubocop/formatter/emacs_style_formatter.rb +3 -1
  647. data/lib/rubocop/formatter/formatter_set.rb +7 -2
  648. data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
  649. data/lib/rubocop/formatter/github_actions_formatter.rb +6 -5
  650. data/lib/rubocop/formatter/html_formatter.rb +3 -5
  651. data/lib/rubocop/formatter/json_formatter.rb +82 -7
  652. data/lib/rubocop/formatter/junit_formatter.rb +27 -10
  653. data/lib/rubocop/formatter/markdown_formatter.rb +1 -0
  654. data/lib/rubocop/formatter/offense_count_formatter.rb +5 -4
  655. data/lib/rubocop/formatter/pacman_formatter.rb +5 -2
  656. data/lib/rubocop/formatter/sarif_formatter.rb +186 -0
  657. data/lib/rubocop/formatter/simple_text_formatter.rb +4 -5
  658. data/lib/rubocop/formatter/tap_formatter.rb +8 -3
  659. data/lib/rubocop/formatter/worst_offenders_formatter.rb +5 -4
  660. data/lib/rubocop/formatter.rb +23 -21
  661. data/lib/rubocop/lockfile.rb +18 -0
  662. data/lib/rubocop/lsp/diagnostic.rb +22 -41
  663. data/lib/rubocop/lsp/disable_comment_edits.rb +135 -0
  664. data/lib/rubocop/lsp/routes.rb +158 -55
  665. data/lib/rubocop/lsp/runtime.rb +66 -15
  666. data/lib/rubocop/lsp/server.rb +4 -2
  667. data/lib/rubocop/lsp/stdin_runner.rb +38 -19
  668. data/lib/rubocop/lsp.rb +5 -2
  669. data/lib/rubocop/magic_comment.rb +55 -0
  670. data/lib/rubocop/mcp/autocorrection_request.rb +52 -0
  671. data/lib/rubocop/mcp/explain_tool.rb +68 -0
  672. data/lib/rubocop/mcp/scope.rb +65 -0
  673. data/lib/rubocop/mcp/server.rb +307 -0
  674. data/lib/rubocop/mcp/source_files.rb +35 -0
  675. data/lib/rubocop/offense_limit.rb +30 -0
  676. data/lib/rubocop/options.rb +166 -23
  677. data/lib/rubocop/path_util.rb +20 -5
  678. data/lib/rubocop/pending_cops_reporter.rb +51 -0
  679. data/lib/rubocop/plugin/configuration_integrator.rb +153 -0
  680. data/lib/rubocop/plugin/load_error.rb +26 -0
  681. data/lib/rubocop/plugin/loader.rb +100 -0
  682. data/lib/rubocop/plugin/not_supported_error.rb +29 -0
  683. data/lib/rubocop/plugin.rb +46 -0
  684. data/lib/rubocop/project_index_loader.rb +82 -0
  685. data/lib/rubocop/rake_task.rb +6 -4
  686. data/lib/rubocop/remote_config.rb +18 -13
  687. data/lib/rubocop/result_cache.rb +110 -65
  688. data/lib/rubocop/rspec/cop_helper.rb +21 -1
  689. data/lib/rubocop/rspec/expect_offense.rb +11 -7
  690. data/lib/rubocop/rspec/shared_contexts.rb +85 -3
  691. data/lib/rubocop/rspec/support.rb +4 -0
  692. data/lib/rubocop/runner.rb +368 -106
  693. data/lib/rubocop/server/cache.rb +67 -48
  694. data/lib/rubocop/server/cli.rb +2 -4
  695. data/lib/rubocop/server/client_command/base.rb +10 -0
  696. data/lib/rubocop/server/client_command/exec.rb +2 -1
  697. data/lib/rubocop/server/client_command/start.rb +11 -1
  698. data/lib/rubocop/server/core.rb +8 -0
  699. data/lib/rubocop/server.rb +14 -0
  700. data/lib/rubocop/target_finder.rb +25 -11
  701. data/lib/rubocop/target_ruby.rb +52 -23
  702. data/lib/rubocop/todo_audit.rb +111 -0
  703. data/lib/rubocop/unified_diff.rb +257 -0
  704. data/lib/rubocop/util.rb +69 -0
  705. data/lib/rubocop/version.rb +48 -10
  706. data/lib/rubocop.rb +35 -682
  707. data/lib/ruby_lsp/rubocop/addon.rb +28 -17
  708. data/lib/ruby_lsp/rubocop/runtime_adapter.rb +99 -0
  709. metadata +129 -21
  710. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +0 -46
  711. data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
  712. data/lib/ruby_lsp/rubocop/wraps_built_in_lsp_runtime.rb +0 -50
@@ -35,15 +35,13 @@ module RuboCop
35
35
  ASSIGNMENT_TYPES = %i[lvasgn ivasgn cvasgn gvasgn].freeze
36
36
 
37
37
  def on_def(node)
38
- return unless node.body
38
+ return if !node.body || node.void_context?
39
39
 
40
40
  last_expr = last_expression(node.body)
41
41
  return unless setter_call_to_local_variable?(last_expr)
42
42
 
43
- tracker = MethodVariableTracker.new(node.body)
44
43
  receiver, = *last_expr
45
- variable_name, = *receiver
46
- return unless tracker.contain_local_object?(variable_name)
44
+ return unless contain_local_object?(node.body, receiver)
47
45
 
48
46
  loc_name = receiver.loc.name
49
47
 
@@ -66,6 +64,11 @@ module RuboCop
66
64
  expression.is_a?(Array) ? expression.last : expression
67
65
  end
68
66
 
67
+ def contain_local_object?(body, receiver)
68
+ variable_name, = *receiver
69
+ MethodVariableTracker.new(body).contain_local_object?(variable_name)
70
+ end
71
+
69
72
  # This class tracks variable assignments in a method body
70
73
  # and if a variable contains object passed as argument at the end of
71
74
  # the method.
@@ -107,7 +110,10 @@ module RuboCop
107
110
  end
108
111
 
109
112
  def process_multiple_assignment(masgn_node)
110
- masgn_node.assignments.each_with_index do |lhs_node, index|
113
+ # Iterate the top-level destructuring slots so each maps to the right-hand side
114
+ # element at the same position. Using the flattened `assignments` would misalign
115
+ # the index when a slot is itself a nested destructuring (e.g. `(a, b), c = x, y`).
116
+ masgn_node.lhs.children.each_with_index do |lhs_node, index|
111
117
  next unless ASSIGNMENT_TYPES.include?(lhs_node.type)
112
118
 
113
119
  if masgn_node.rhs.array_type? && (rhs_node = masgn_node.rhs.children[index])
@@ -83,7 +83,7 @@ module RuboCop
83
83
 
84
84
  def autocorrect_block(corrector, node)
85
85
  block_arg = block_arg(node)
86
- return if block_reassigns_arg?(node, block_arg)
86
+ return unless reducible_to_body?(node, block_arg)
87
87
 
88
88
  source = node.body.source
89
89
  source.gsub!(/\b#{block_arg}\b/, '0') if block_arg
@@ -91,6 +91,27 @@ module RuboCop
91
91
  corrector.replace(node, fix_indentation(source, node.loc.column...node.body.loc.column))
92
92
  end
93
93
 
94
+ def reducible_to_body?(node, block_arg)
95
+ # A block with multiple arguments can't be reduced to its body (the extra arguments
96
+ # would become undefined references), and `next`/`break`/`redo` bound to the block
97
+ # become orphaned (a syntax error) once the block is removed.
98
+ return false if node.arguments.size > 1 || orphans_loop_control_keyword?(node)
99
+
100
+ # A lone non-simple argument (destructuring `|(a, b)|` or a splat `|*a|`) can't be
101
+ # substituted either, so reducing to the body would leave it referencing an
102
+ # undefined variable.
103
+ return false if node.arguments.one? && block_arg.nil?
104
+
105
+ !block_reassigns_arg?(node, block_arg)
106
+ end
107
+
108
+ def orphans_loop_control_keyword?(node)
109
+ node.body&.each_node(:next, :break, :redo)&.any? do |control|
110
+ inner = control.each_ancestor.take_while { |ancestor| !ancestor.equal?(node) }
111
+ inner.none? { |ancestor| ancestor.type?(:any_block, :while, :until, :for) }
112
+ end
113
+ end
114
+
94
115
  def fix_indentation(source, range)
95
116
  # Cleanup indentation in a multiline block
96
117
  source_lines = source.split("\n")
@@ -0,0 +1,201 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ module Utils
7
+ # Utility class that checks if the receiver can't be nil.
8
+ class NilReceiverChecker
9
+ NIL_METHODS = (nil.methods + %i[!]).to_set.freeze
10
+
11
+ def initialize(receiver, additional_nil_methods)
12
+ @receiver = receiver
13
+ @additional_nil_methods = additional_nil_methods
14
+ @checked_nodes = {}.compare_by_identity
15
+ @receiver_binding_name = binding_name(receiver)
16
+ @receiver_binding_scope = binding_scope(receiver) if @receiver_binding_name
17
+ end
18
+
19
+ def cant_be_nil?
20
+ sole_condition_of_parent_if?(@receiver) || _cant_be_nil?(@receiver.parent, @receiver)
21
+ end
22
+
23
+ private
24
+
25
+ # rubocop:disable-next Metrics
26
+ def _cant_be_nil?(node, receiver)
27
+ return false unless node
28
+
29
+ # For some nodes, we check their parent and then some children for these parents.
30
+ # This is added to avoid infinite loops.
31
+ return false if @checked_nodes.key?(node)
32
+
33
+ @checked_nodes[node] = true
34
+
35
+ case node.type
36
+ when :def, :defs, :class, :module, :sclass
37
+ return false
38
+ when :send
39
+ if node.receiver == receiver && same_binding_as_receiver?(node.receiver)
40
+ return non_nil_method?(node.method_name)
41
+ end
42
+
43
+ node.arguments.each do |argument|
44
+ return true if _cant_be_nil?(argument, receiver)
45
+ end
46
+
47
+ return true if _cant_be_nil?(node.receiver, receiver)
48
+ when :begin
49
+ return true if _cant_be_nil?(node.children.first, receiver)
50
+ when :if, :case
51
+ return true if _cant_be_nil?(node.condition, receiver)
52
+ when :and, :or
53
+ return true if _cant_be_nil?(node.lhs, receiver)
54
+ when :pair
55
+ if _cant_be_nil?(node.key, receiver) ||
56
+ _cant_be_nil?(node.value, receiver)
57
+ return true
58
+ end
59
+ when :when
60
+ node.conditions.each do |condition|
61
+ return true if _cant_be_nil?(condition, receiver)
62
+ end
63
+ when :lvasgn, :ivasgn, :cvasgn, :gvasgn, :casgn
64
+ return true if _cant_be_nil?(node.expression, receiver)
65
+ end
66
+
67
+ if sequentially_reached?(node)
68
+ node.left_siblings.reverse_each do |sibling|
69
+ next unless sibling.is_a?(AST::Node)
70
+
71
+ return true if _cant_be_nil?(sibling, receiver)
72
+ end
73
+ end
74
+
75
+ if node.parent
76
+ _cant_be_nil?(node.parent, receiver)
77
+ else
78
+ false
79
+ end
80
+ end
81
+
82
+ def non_nil_method?(method_name)
83
+ !NIL_METHODS.include?(method_name) && !@additional_nil_methods.include?(method_name)
84
+ end
85
+
86
+ # rubocop:disable-next Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
87
+ def sole_condition_of_parent_if?(node)
88
+ child = node
89
+ parent = node.parent
90
+
91
+ while parent
92
+ if parent.if_type?
93
+ unless parent.unless?
94
+ condition = parent.condition
95
+ return true if !child.equal?(condition) && non_nil_condition?(condition, node)
96
+ end
97
+
98
+ parent = find_top_if(parent) if parent.elsif?
99
+ elsif else_branch?(parent)
100
+ # Find the top `if` for `else`.
101
+ parent = parent.parent
102
+ end
103
+
104
+ child = parent
105
+ parent = parent&.parent
106
+ end
107
+
108
+ false
109
+ end
110
+
111
+ def non_nil_condition?(condition, node)
112
+ return true if condition == node && same_binding_as_receiver?(condition)
113
+ return false unless condition.csend_type?
114
+
115
+ root_receiver = csend_root_receiver(condition)
116
+
117
+ root_receiver == node && same_binding_as_receiver?(root_receiver)
118
+ end
119
+
120
+ # Structurally equal occurrences can be different variables: `it` binds to
121
+ # its innermost block, and a block parameter can shadow an outer variable of
122
+ # the same name. Evidence about such a receiver only holds when both occurrences
123
+ # resolve to the same binding.
124
+ def same_binding_as_receiver?(occurrence)
125
+ return true unless @receiver_binding_name
126
+
127
+ binding_scope(occurrence).equal?(@receiver_binding_scope)
128
+ end
129
+
130
+ # The name whose binding can differ between structurally equal occurrences:
131
+ # a local variable (block parameters included), or a bare `it` call, which is
132
+ # how `it` parses when the target Ruby version is below 3.4 even though the code
133
+ # may run on 3.4+ where `it` is the implicit block parameter.
134
+ def binding_name(node)
135
+ if node.lvar_type?
136
+ node.children.first
137
+ elsif node.send_type? && !node.receiver && node.method?(:it) && node.arguments.empty?
138
+ :it
139
+ end
140
+ end
141
+
142
+ def binding_scope(occurrence)
143
+ node = occurrence
144
+
145
+ while (parent = node.parent)
146
+ case parent.type
147
+ when :block, :numblock, :itblock
148
+ # Only the body is inside the block's scope; the send node and the arguments of
149
+ # the block node evaluate in the outer scope.
150
+ return parent if parent.body.equal?(node) && block_binds_name?(parent)
151
+ when :def, :defs, :class, :module, :sclass
152
+ return parent
153
+ end
154
+
155
+ node = parent
156
+ end
157
+
158
+ nil
159
+ end
160
+
161
+ def block_binds_name?(block_node)
162
+ name = @receiver_binding_name
163
+
164
+ return true if block_node.argument_list.any? { |argument| argument.name == name }
165
+
166
+ name == :it && block_node.arguments.empty?
167
+ end
168
+
169
+ # Whether control reaches `node` by falling through its left siblings rather than by
170
+ # a non-sequential entry. A `resbody` is entered via an exception, the `ensure` branch
171
+ # runs even after a partway raise, and the `else` arm of an `if/elsif` chain is reached by
172
+ # branching (its `if/case` siblings are walked via parent recursion instead).
173
+ def sequentially_reached?(node)
174
+ return false if node.resbody_type?
175
+ return false if node.parent&.ensure_type? && node.parent.branch.equal?(node)
176
+
177
+ !else_branch?(node) || (node.if_type? && !node.elsif?)
178
+ end
179
+
180
+ def else_branch?(node)
181
+ node.parent&.if_type? && node.parent.else_branch == node
182
+ end
183
+
184
+ def find_top_if(node)
185
+ node = node.parent while node.elsif?
186
+
187
+ node
188
+ end
189
+
190
+ def csend_root_receiver(node)
191
+ return unless (receiver = node.receiver)
192
+
193
+ receiver = receiver.receiver while receiver.call_type? && receiver.receiver
194
+
195
+ receiver
196
+ end
197
+ end
198
+ end
199
+ end
200
+ end
201
+ end
@@ -16,6 +16,15 @@ module RuboCop
16
16
  # enumerator.each { |item| item >= 2 } #=> [2, 3]
17
17
  # ----
18
18
  #
19
+ # NOTE: The last expression in an assignment method definition such as `def foo=(arg)`
20
+ # is not flagged. Ruby discards it (the method returns its argument), but the method can
21
+ # still be called directly and its return value relied upon, so flagging it would be a
22
+ # false positive for this lint.
23
+ #
24
+ # NOTE: A constant used in a void context is flagged but not autocorrected, since
25
+ # referencing a constant can trigger autoloading side effects (e.g. forcing a file to
26
+ # load before a monkey-patch), so removing it may change behavior.
27
+ #
19
28
  # @example CheckForMethodsWithNoSideEffects: false (default)
20
29
  # # bad
21
30
  # def some_method
@@ -81,11 +90,13 @@ module RuboCop
81
90
  def on_block(node)
82
91
  return unless node.body && !node.body.begin_type?
83
92
  return unless in_void_context?(node.body)
93
+ return if node.method?(:each)
84
94
 
85
- check_void_op(node.body) { node.method?(:each) }
95
+ check_void_op(node.body)
86
96
  check_expression(node.body)
87
97
  end
88
98
  alias on_numblock on_block
99
+ alias on_itblock on_block
89
100
 
90
101
  def on_begin(node)
91
102
  check_begin(node)
@@ -100,22 +111,23 @@ module RuboCop
100
111
 
101
112
  def check_begin(node)
102
113
  expressions = *node
103
- expressions.pop unless in_void_context?(node)
114
+ inside_each_block = node.each_ancestor(:any_block).first&.method?(:each)
115
+ expressions.pop if !in_void_context?(node) || inside_each_block || setter_method?(node)
104
116
  expressions.each do |expr|
105
- check_void_op(expr) do
106
- block_node = node.each_ancestor(:block).first
107
-
108
- block_node&.method?(:each)
109
- end
110
-
117
+ check_void_op(expr) { inside_each_block }
111
118
  check_expression(expr)
112
119
  end
113
120
  end
114
121
 
115
122
  def check_expression(expr)
116
- expr = expr.body if expr.if_type?
117
- return unless expr
123
+ return check_if_expression(expr) if expr.if_type?
124
+ return check_case_expression(expr) if expr.case_type?
125
+ return check_case_match_expression(expr) if expr.case_match_type?
126
+
127
+ check_void_expression_nodes(expr)
128
+ end
118
129
 
130
+ def check_void_expression_nodes(expr)
119
131
  check_literal(expr)
120
132
  check_var(expr)
121
133
  check_self(expr)
@@ -125,9 +137,30 @@ module RuboCop
125
137
  check_nonmutating(expr)
126
138
  end
127
139
 
140
+ def check_if_expression(if_node)
141
+ check_void_expression_nodes(if_node.body) if if_node.body
142
+ end
143
+
144
+ def check_case_expression(case_node)
145
+ case_node.each_when { |when_node| check_expression(when_node.body) if when_node.body }
146
+ check_expression(case_node.else_branch) if case_node.else_branch
147
+ end
148
+
149
+ def check_case_match_expression(case_node)
150
+ case_node.each_in_pattern do |in_pattern_node|
151
+ check_expression(in_pattern_node.body) if in_pattern_node.body
152
+ end
153
+ check_expression(case_node.else_branch) if case_node.else_branch
154
+ end
155
+
156
+ # rubocop:disable-next Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
128
157
  def check_void_op(node, &block)
129
- node = node.children.first while node.begin_type?
130
- return unless node.call_type? && OPERATORS.include?(node.method_name)
158
+ node = node.children.first while node&.begin_type?
159
+ return unless node&.call_type? && OPERATORS.include?(node.method_name)
160
+ if !UNARY_OPERATORS.include?(node.method_name) && node.loc.dot && node.arguments.none?
161
+ return
162
+ end
163
+
131
164
  return if block && yield(node)
132
165
 
133
166
  add_offense(node.loc.selector,
@@ -155,7 +188,9 @@ module RuboCop
155
188
  end
156
189
 
157
190
  def check_literal(node)
158
- return if !entirely_literal?(node) || node.xstr_type? || node.range_type?
191
+ if !entirely_literal?(node) || node.xstr_type? || node.range_type? || node.nil_type?
192
+ return
193
+ end
159
194
 
160
195
  add_offense(node, message: format(LIT_MSG, lit: node.source)) do |corrector|
161
196
  autocorrect_void_expression(corrector, node)
@@ -179,7 +214,7 @@ module RuboCop
179
214
  end
180
215
 
181
216
  def check_nonmutating(node)
182
- return unless node.type?(:send, :any_block)
217
+ return unless node.type?(:call, :any_block)
183
218
 
184
219
  method_name = node.method_name
185
220
  return unless NONMUTATING_METHODS.include?(method_name)
@@ -201,11 +236,6 @@ module RuboCop
201
236
  # NOTE: the `begin` node case is already handled via `on_begin`
202
237
  return if body.begin_type?
203
238
 
204
- check_void_op(body) do
205
- block_node = node.each_ancestor(:block).first
206
- block_node&.method?(:each)
207
- end
208
-
209
239
  check_expression(body)
210
240
  end
211
241
 
@@ -216,6 +246,10 @@ module RuboCop
216
246
  parent.respond_to?(:void_context?) && parent.void_context?
217
247
  end
218
248
 
249
+ def setter_method?(node)
250
+ node.parent&.any_def_type? && node.parent.assignment_method?
251
+ end
252
+
219
253
  def autocorrect_void_op(corrector, node)
220
254
  if node.arguments.empty?
221
255
  corrector.replace(node, node.receiver.source)
@@ -230,13 +264,25 @@ module RuboCop
230
264
  end
231
265
 
232
266
  def autocorrect_void_expression(corrector, node)
233
- return if node.parent.if_type?
267
+ # Referencing a constant can trigger autoloading side effects (e.g. forcing a file
268
+ # to load before a monkey-patch), so removing it may change behavior. Flag but don't
269
+ # autocorrect, leaving it to the user.
270
+ return if node.const_type? && !node.special_keyword?
271
+ return if node.parent.type?(:if, :case, :when, :case_match, :in_pattern)
272
+ return if (def_node = node.each_ancestor(:any_def).first) && def_node.assignment_method?
273
+
274
+ range = range_with_surrounding_space(range: void_expression_range(node), side: :left)
275
+ corrector.remove(range)
276
+ end
277
+
278
+ def void_expression_range(node)
279
+ return node.source_range unless node.respond_to?(:heredoc?) && node.heredoc?
234
280
 
235
- corrector.remove(range_with_surrounding_space(range: node.source_range, side: :left))
281
+ node.source_range.join(node.loc.heredoc_end)
236
282
  end
237
283
 
238
284
  def autocorrect_nonmutating_send(corrector, node, suggestion)
239
- send_node = if node.send_type?
285
+ send_node = if node.call_type?
240
286
  node
241
287
  else
242
288
  node.send_node
@@ -0,0 +1,179 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ # Cops for the `Lint` department. The department's cops are registered for lazy loading
6
+ # and their files are loaded on demand.
7
+ module Lint
8
+ extend LazyLoader
9
+
10
+ register_cop :AmbiguousAssignment, "#{__dir__}/lint/ambiguous_assignment"
11
+ register_cop :AmbiguousBlockAssociation, "#{__dir__}/lint/ambiguous_block_association"
12
+ register_cop :AmbiguousOperator, "#{__dir__}/lint/ambiguous_operator"
13
+ register_cop :AmbiguousOperatorPrecedence, "#{__dir__}/lint/ambiguous_operator_precedence"
14
+ register_cop :AmbiguousRange, "#{__dir__}/lint/ambiguous_range"
15
+ register_cop :AmbiguousRegexpLiteral, "#{__dir__}/lint/ambiguous_regexp_literal"
16
+ register_cop :ArgumentMismatch, "#{__dir__}/lint/argument_mismatch"
17
+ register_cop :ArrayLiteralInRegexp, "#{__dir__}/lint/array_literal_in_regexp"
18
+ register_cop :AssignmentInCondition, "#{__dir__}/lint/assignment_in_condition"
19
+ register_cop :BigDecimalNew, "#{__dir__}/lint/big_decimal_new"
20
+ register_cop :BinaryOperatorWithIdenticalOperands, "#{__dir__}/lint/binary_operator_with_identical_operands"
21
+ register_cop :BooleanSymbol, "#{__dir__}/lint/boolean_symbol"
22
+ register_cop :CircularArgumentReference, "#{__dir__}/lint/circular_argument_reference"
23
+ register_cop :ConstantDefinitionInBlock, "#{__dir__}/lint/constant_definition_in_block"
24
+ register_cop :ConstantOverwrittenInRescue, "#{__dir__}/lint/constant_overwritten_in_rescue"
25
+ register_cop :ConstantReassignment, "#{__dir__}/lint/constant_reassignment"
26
+ register_cop :ConstantResolution, "#{__dir__}/lint/constant_resolution"
27
+ register_cop :CopDirectiveSyntax, "#{__dir__}/lint/cop_directive_syntax"
28
+ register_cop :DataDefineOverride, "#{__dir__}/lint/data_define_override"
29
+ register_cop :Debugger, "#{__dir__}/lint/debugger"
30
+ register_cop :DeprecatedClassMethods, "#{__dir__}/lint/deprecated_class_methods"
31
+ register_cop :DeprecatedConstants, "#{__dir__}/lint/deprecated_constants"
32
+ register_cop :DeprecatedOpenSSLConstant, "#{__dir__}/lint/deprecated_open_ssl_constant"
33
+ register_cop :DeprecatedReference, "#{__dir__}/lint/deprecated_reference"
34
+ register_cop :DisjunctiveAssignmentInConstructor, "#{__dir__}/lint/disjunctive_assignment_in_constructor"
35
+ register_cop :DuplicateBranch, "#{__dir__}/lint/duplicate_branch"
36
+ register_cop :DuplicateCaseCondition, "#{__dir__}/lint/duplicate_case_condition"
37
+ register_cop :DuplicateElsifCondition, "#{__dir__}/lint/duplicate_elsif_condition"
38
+ register_cop :DuplicateHashKey, "#{__dir__}/lint/duplicate_hash_key"
39
+ register_cop :DuplicateMagicComment, "#{__dir__}/lint/duplicate_magic_comment"
40
+ register_cop :DuplicateMatchPattern, "#{__dir__}/lint/duplicate_match_pattern"
41
+ register_cop :DuplicateMethods, "#{__dir__}/lint/duplicate_methods"
42
+ register_cop :DuplicateRegexpCharacterClassElement, "#{__dir__}/lint/duplicate_regexp_character_class_element"
43
+ register_cop :DuplicateRequire, "#{__dir__}/lint/duplicate_require"
44
+ register_cop :DuplicateRescueException, "#{__dir__}/lint/duplicate_rescue_exception"
45
+ register_cop :DuplicateSetElement, "#{__dir__}/lint/duplicate_set_element"
46
+ register_cop :EachWithObjectArgument, "#{__dir__}/lint/each_with_object_argument"
47
+ register_cop :ElseLayout, "#{__dir__}/lint/else_layout"
48
+ register_cop :EmptyBlock, "#{__dir__}/lint/empty_block"
49
+ register_cop :EmptyClass, "#{__dir__}/lint/empty_class"
50
+ register_cop :EmptyConditionalBody, "#{__dir__}/lint/empty_conditional_body"
51
+ register_cop :EmptyEnsure, "#{__dir__}/lint/empty_ensure"
52
+ register_cop :EmptyExpression, "#{__dir__}/lint/empty_expression"
53
+ register_cop :EmptyFile, "#{__dir__}/lint/empty_file"
54
+ register_cop :EmptyInPattern, "#{__dir__}/lint/empty_in_pattern"
55
+ register_cop :EmptyInterpolation, "#{__dir__}/lint/empty_interpolation"
56
+ register_cop :EmptyWhen, "#{__dir__}/lint/empty_when"
57
+ register_cop :EnsureReturn, "#{__dir__}/lint/ensure_return"
58
+ register_cop :SharedMutableDefault, "#{__dir__}/lint/shared_mutable_default"
59
+ register_cop :ErbNewArguments, "#{__dir__}/lint/erb_new_arguments"
60
+ register_cop :FlipFlop, "#{__dir__}/lint/flip_flop"
61
+ register_cop :FloatComparison, "#{__dir__}/lint/float_comparison"
62
+ register_cop :FloatOutOfRange, "#{__dir__}/lint/float_out_of_range"
63
+ register_cop :FormatParameterMismatch, "#{__dir__}/lint/format_parameter_mismatch"
64
+ register_cop :HashCompareByIdentity, "#{__dir__}/lint/hash_compare_by_identity"
65
+ register_cop :HashNewWithKeywordArgumentsAsDefault, "#{__dir__}/lint/hash_new_with_keyword_arguments_as_default"
66
+ register_cop :HeredocMethodCallPosition, "#{__dir__}/lint/heredoc_method_call_position"
67
+ register_cop :IdentityComparison, "#{__dir__}/lint/identity_comparison"
68
+ register_cop :ImplicitStringConcatenation, "#{__dir__}/lint/implicit_string_concatenation"
69
+ register_cop :IncompatibleIoSelectWithFiberScheduler, "#{__dir__}/lint/incompatible_io_select_with_fiber_scheduler"
70
+ register_cop :IneffectiveAccessModifier, "#{__dir__}/lint/ineffective_access_modifier"
71
+ register_cop :InheritException, "#{__dir__}/lint/inherit_exception"
72
+ register_cop :InterpolationCheck, "#{__dir__}/lint/interpolation_check"
73
+ register_cop :ItWithoutArgumentsInBlock, "#{__dir__}/lint/it_without_arguments_in_block"
74
+ register_cop :LambdaWithoutLiteralBlock, "#{__dir__}/lint/lambda_without_literal_block"
75
+ register_cop :LiteralAsCondition, "#{__dir__}/lint/literal_as_condition"
76
+ register_cop :LiteralAssignmentInCondition, "#{__dir__}/lint/literal_assignment_in_condition"
77
+ register_cop :LiteralInInterpolation, "#{__dir__}/lint/literal_in_interpolation"
78
+ register_cop :Loop, "#{__dir__}/lint/loop"
79
+ register_cop :MisplacedMagicComment, "#{__dir__}/lint/misplaced_magic_comment"
80
+ register_cop :MissingCopEnableDirective, "#{__dir__}/lint/missing_cop_enable_directive"
81
+ register_cop :MissingSuper, "#{__dir__}/lint/missing_super"
82
+ register_cop :MixedCaseRange, "#{__dir__}/lint/mixed_case_range"
83
+ register_cop :MixedRegexpCaptureTypes, "#{__dir__}/lint/mixed_regexp_capture_types"
84
+ register_cop :MultipleComparison, "#{__dir__}/lint/multiple_comparison"
85
+ register_cop :NameTypo, "#{__dir__}/lint/name_typo"
86
+ register_cop :NestedMethodDefinition, "#{__dir__}/lint/nested_method_definition"
87
+ register_cop :NestedPercentLiteral, "#{__dir__}/lint/nested_percent_literal"
88
+ register_cop :NextWithoutAccumulator, "#{__dir__}/lint/next_without_accumulator"
89
+ register_cop :NoReturnInBeginEndBlocks, "#{__dir__}/lint/no_return_in_begin_end_blocks"
90
+ register_cop :NonAtomicFileOperation, "#{__dir__}/lint/non_atomic_file_operation"
91
+ register_cop :NonDeterministicRequireOrder, "#{__dir__}/lint/non_deterministic_require_order"
92
+ register_cop :NonLocalExitFromIterator, "#{__dir__}/lint/non_local_exit_from_iterator"
93
+ register_cop :NumberConversion, "#{__dir__}/lint/number_conversion"
94
+ register_cop :NumberedParameterAssignment, "#{__dir__}/lint/numbered_parameter_assignment"
95
+ register_cop :NumericOperationWithConstantResult, "#{__dir__}/lint/numeric_operation_with_constant_result"
96
+ register_cop :OrAssignmentToConstant, "#{__dir__}/lint/or_assignment_to_constant"
97
+ register_cop :OrderedMagicComments, "#{__dir__}/lint/ordered_magic_comments"
98
+ register_cop :OutOfRangeRegexpRef, "#{__dir__}/lint/out_of_range_regexp_ref"
99
+ register_cop :ParenthesesAsGroupedExpression, "#{__dir__}/lint/parentheses_as_grouped_expression"
100
+ register_cop :PercentStringArray, "#{__dir__}/lint/percent_string_array"
101
+ register_cop :PercentSymbolArray, "#{__dir__}/lint/percent_symbol_array"
102
+ register_cop :RaiseException, "#{__dir__}/lint/raise_exception"
103
+ register_cop :RandOne, "#{__dir__}/lint/rand_one"
104
+ register_cop :RedundantCopDisableDirective, "#{__dir__}/lint/redundant_cop_disable_directive"
105
+ register_cop :RedundantCopEnableDirective, "#{__dir__}/lint/redundant_cop_enable_directive"
106
+ register_cop :RedundantDirGlobSort, "#{__dir__}/lint/redundant_dir_glob_sort"
107
+ register_cop :RedundantRegexpQuantifiers, "#{__dir__}/lint/redundant_regexp_quantifiers"
108
+ register_cop :RedundantRequireStatement, "#{__dir__}/lint/redundant_require_statement"
109
+ register_cop :RedundantSafeNavigation, "#{__dir__}/lint/redundant_safe_navigation"
110
+ register_cop :RedundantSplatExpansion, "#{__dir__}/lint/redundant_splat_expansion"
111
+ register_cop :RedundantStringCoercion, "#{__dir__}/lint/redundant_string_coercion"
112
+ register_cop :RedundantTypeConversion, "#{__dir__}/lint/redundant_type_conversion"
113
+ register_cop :RedundantWithIndex, "#{__dir__}/lint/redundant_with_index"
114
+ register_cop :RedundantWithObject, "#{__dir__}/lint/redundant_with_object"
115
+ register_cop :RefinementImportMethods, "#{__dir__}/lint/refinement_import_methods"
116
+ register_cop :RegexpAsCondition, "#{__dir__}/lint/regexp_as_condition"
117
+ register_cop :RequireParentheses, "#{__dir__}/lint/require_parentheses"
118
+ register_cop :RequireRangeParentheses, "#{__dir__}/lint/require_range_parentheses"
119
+ register_cop :RequireRelativeSelfPath, "#{__dir__}/lint/require_relative_self_path"
120
+ register_cop :RescueException, "#{__dir__}/lint/rescue_exception"
121
+ register_cop :RescueType, "#{__dir__}/lint/rescue_type"
122
+ register_cop :ReturnInVoidContext, "#{__dir__}/lint/return_in_void_context"
123
+ register_cop :SafeNavigationConsistency, "#{__dir__}/lint/safe_navigation_consistency"
124
+ register_cop :SafeNavigationChain, "#{__dir__}/lint/safe_navigation_chain"
125
+ register_cop :SafeNavigationWithEmpty, "#{__dir__}/lint/safe_navigation_with_empty"
126
+ register_cop :ScriptPermission, "#{__dir__}/lint/script_permission"
127
+ register_cop :SelfAssignment, "#{__dir__}/lint/self_assignment"
128
+ register_cop :SendWithMixinArgument, "#{__dir__}/lint/send_with_mixin_argument"
129
+ register_cop :ShadowedArgument, "#{__dir__}/lint/shadowed_argument"
130
+ register_cop :ShadowedException, "#{__dir__}/lint/shadowed_exception"
131
+ register_cop :ShadowingOuterLocalVariable, "#{__dir__}/lint/shadowing_outer_local_variable"
132
+ register_cop :StructNewOverride, "#{__dir__}/lint/struct_new_override"
133
+ register_cop :SuperArgumentMismatch, "#{__dir__}/lint/super_argument_mismatch"
134
+ register_cop :SuppressedException, "#{__dir__}/lint/suppressed_exception"
135
+ register_cop :SuppressedExceptionInNumberConversion, "#{__dir__}/lint/suppressed_exception_in_number_conversion"
136
+ register_cop :SymbolConversion, "#{__dir__}/lint/symbol_conversion"
137
+ register_cop :Syntax, "#{__dir__}/lint/syntax"
138
+ register_cop :ToEnumArguments, "#{__dir__}/lint/to_enum_arguments"
139
+ register_cop :ToJSON, "#{__dir__}/lint/to_json"
140
+ register_cop :TopLevelReturnWithArgument, "#{__dir__}/lint/top_level_return_with_argument"
141
+ register_cop :TrailingCommaInAttributeDeclaration, "#{__dir__}/lint/trailing_comma_in_attribute_declaration"
142
+ register_cop :TripleQuotes, "#{__dir__}/lint/triple_quotes"
143
+ register_cop :UnderscorePrefixedVariableName, "#{__dir__}/lint/underscore_prefixed_variable_name"
144
+ register_cop :UnescapedBracketInRegexp, "#{__dir__}/lint/unescaped_bracket_in_regexp"
145
+ register_cop :UnexpectedBlockArity, "#{__dir__}/lint/unexpected_block_arity"
146
+ register_cop :UnifiedInteger, "#{__dir__}/lint/unified_integer"
147
+ register_cop :UnmodifiedReduceAccumulator, "#{__dir__}/lint/unmodified_reduce_accumulator"
148
+ register_cop :UnreachableCode, "#{__dir__}/lint/unreachable_code"
149
+ register_cop :UnreachableLoop, "#{__dir__}/lint/unreachable_loop"
150
+ register_cop :UnreachablePatternBranch, "#{__dir__}/lint/unreachable_pattern_branch"
151
+ register_cop :UnusedBlockArgument, "#{__dir__}/lint/unused_block_argument"
152
+ register_cop :UnusedMethodArgument, "#{__dir__}/lint/unused_method_argument"
153
+ register_cop :UnusedPrivateMethod, "#{__dir__}/lint/unused_private_method"
154
+ register_cop :UriEscapeUnescape, "#{__dir__}/lint/uri_escape_unescape"
155
+ register_cop :UriRegexp, "#{__dir__}/lint/uri_regexp"
156
+ register_cop :UselessAccessModifier, "#{__dir__}/lint/useless_access_modifier"
157
+ register_cop :UselessAssignment, "#{__dir__}/lint/useless_assignment"
158
+ register_cop :UselessConstantScoping, "#{__dir__}/lint/useless_constant_scoping"
159
+ register_cop :UselessDefaultValueArgument, "#{__dir__}/lint/useless_default_value_argument"
160
+ register_cop :UselessDefined, "#{__dir__}/lint/useless_defined"
161
+ register_cop :UselessElseWithoutRescue, "#{__dir__}/lint/useless_else_without_rescue"
162
+ register_cop :UselessMethodDefinition, "#{__dir__}/lint/useless_method_definition"
163
+ register_cop :UselessNumericOperation, "#{__dir__}/lint/useless_numeric_operation"
164
+ register_cop :UselessOr, "#{__dir__}/lint/useless_or"
165
+ register_cop :UselessRescue, "#{__dir__}/lint/useless_rescue"
166
+ register_cop :UselessRuby2Keywords, "#{__dir__}/lint/useless_ruby2_keywords"
167
+ register_cop :UselessSetterCall, "#{__dir__}/lint/useless_setter_call"
168
+ register_cop :UselessTimes, "#{__dir__}/lint/useless_times"
169
+ register_cop :Void, "#{__dir__}/lint/void"
170
+
171
+ autoload :UnusedArgument, "#{__dir__}/mixin/unused_argument"
172
+
173
+ # Utility classes for `Lint` department cops.
174
+ module Utils
175
+ autoload :NilReceiverChecker, "#{__dir__}/lint/utils/nil_receiver_checker"
176
+ end
177
+ end
178
+ end
179
+ end
@@ -32,7 +32,7 @@ module RuboCop
32
32
  # @param [String] cop_name for specific cop name
33
33
  # @param [Hash] cop_config configs for specific cop, from config#for_cop
34
34
  # @option cop_config [String] :StyleGuide Extension of base styleguide URL
35
- # @option cop_config [String] :Reference Full reference URL
35
+ # @option cop_config [String] :References Full reference URLs
36
36
  # @option cop_config [String] :Details
37
37
  #
38
38
  # @param [Hash, nil] options optional
@@ -100,8 +100,12 @@ module RuboCop
100
100
  end
101
101
 
102
102
  def reference_urls
103
- urls = Array(cop_config['Reference'])
104
- urls.nil? || urls.empty? ? nil : urls.reject(&:empty?)
103
+ urls = cop_config
104
+ .values_at('References', 'Reference') # Support legacy Reference key
105
+ .flat_map { |url| Array(url) }
106
+ .reject(&:empty?)
107
+
108
+ urls unless urls.empty?
105
109
  end
106
110
 
107
111
  def extra_details?
@@ -39,7 +39,7 @@ module RuboCop
39
39
  class AbcSize < Base
40
40
  include MethodComplexity
41
41
 
42
- MSG = 'Assignment Branch Condition size for %<method>s is too high. ' \
42
+ MSG = 'Assignment Branch Condition size for `%<method>s` is too high. ' \
43
43
  '[%<abc_vector>s %<complexity>.4g/%<max>.4g]'
44
44
 
45
45
  private