rubocop 1.57.1 → 1.81.7

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 (638) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +92 -89
  4. data/assets/output.css.erb +159 -0
  5. data/assets/output.html.erb +1 -160
  6. data/config/default.yml +540 -86
  7. data/config/internal_affairs.yml +31 -0
  8. data/config/obsoletion.yml +8 -3
  9. data/exe/rubocop +1 -7
  10. data/lib/rubocop/cached_data.rb +21 -5
  11. data/lib/rubocop/cli/command/auto_generate_config.rb +30 -17
  12. data/lib/rubocop/cli/command/execute_runner.rb +4 -4
  13. data/lib/rubocop/cli/command/lsp.rb +4 -4
  14. data/lib/rubocop/cli/command/show_cops.rb +24 -2
  15. data/lib/rubocop/cli/command/show_docs_url.rb +2 -2
  16. data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
  17. data/lib/rubocop/cli/command/version.rb +2 -2
  18. data/lib/rubocop/cli.rb +28 -4
  19. data/lib/rubocop/comment_config.rb +3 -3
  20. data/lib/rubocop/config.rb +92 -22
  21. data/lib/rubocop/config_finder.rb +12 -2
  22. data/lib/rubocop/config_loader.rb +71 -58
  23. data/lib/rubocop/config_loader_resolver.rb +49 -17
  24. data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -3
  25. data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
  26. data/lib/rubocop/config_obsoletion.rb +56 -9
  27. data/lib/rubocop/config_store.rb +5 -0
  28. data/lib/rubocop/config_validator.rb +39 -20
  29. data/lib/rubocop/cop/autocorrect_logic.rb +57 -27
  30. data/lib/rubocop/cop/base.rb +79 -18
  31. data/lib/rubocop/cop/bundler/duplicated_gem.rb +2 -2
  32. data/lib/rubocop/cop/bundler/gem_comment.rb +2 -2
  33. data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
  34. data/lib/rubocop/cop/bundler/gem_version.rb +4 -5
  35. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
  36. data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -1
  37. data/lib/rubocop/cop/cop.rb +30 -4
  38. data/lib/rubocop/cop/correctors/alignment_corrector.rb +8 -16
  39. data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +4 -8
  40. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +13 -16
  41. data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -0
  42. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +6 -3
  43. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +10 -0
  44. data/lib/rubocop/cop/documentation.rb +32 -5
  45. data/lib/rubocop/cop/exclude_limit.rb +1 -1
  46. data/lib/rubocop/cop/force.rb +12 -0
  47. data/lib/rubocop/cop/gemspec/add_runtime_dependency.rb +38 -0
  48. data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
  49. data/lib/rubocop/cop/gemspec/dependency_version.rb +3 -5
  50. data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +3 -4
  51. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +39 -17
  52. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
  53. data/lib/rubocop/cop/gemspec/require_mfa.rb +15 -1
  54. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +5 -3
  55. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +3 -3
  56. data/lib/rubocop/cop/generator.rb +6 -0
  57. data/lib/rubocop/cop/internal_affairs/cop_description.rb +0 -4
  58. data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
  59. data/lib/rubocop/cop/internal_affairs/empty_line_between_expect_offense_and_correction.rb +2 -1
  60. data/lib/rubocop/cop/internal_affairs/example_description.rb +13 -8
  61. data/lib/rubocop/cop/internal_affairs/location_exists.rb +116 -0
  62. data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
  63. data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +3 -4
  64. data/lib/rubocop/cop/internal_affairs/method_name_end_with.rb +8 -6
  65. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +19 -20
  66. data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +54 -0
  67. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +124 -30
  68. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
  69. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
  70. data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +233 -0
  71. data/lib/rubocop/cop/internal_affairs/node_type_group.rb +92 -0
  72. data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
  73. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
  74. data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +1 -1
  75. data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
  76. data/lib/rubocop/cop/internal_affairs/operator_keyword.rb +48 -0
  77. data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
  78. data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +6 -5
  79. data/lib/rubocop/cop/internal_affairs/redundant_expect_offense_arguments.rb +34 -0
  80. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +6 -21
  81. data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +11 -2
  82. data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
  83. data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +0 -2
  84. data/lib/rubocop/cop/internal_affairs/undefined_config.rb +23 -2
  85. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +0 -5
  86. data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
  87. data/lib/rubocop/cop/internal_affairs.rb +9 -0
  88. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +6 -2
  89. data/lib/rubocop/cop/layout/argument_alignment.rb +3 -10
  90. data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
  91. data/lib/rubocop/cop/layout/assignment_indentation.rb +3 -2
  92. data/lib/rubocop/cop/layout/begin_end_alignment.rb +0 -1
  93. data/lib/rubocop/cop/layout/block_alignment.rb +32 -13
  94. data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
  95. data/lib/rubocop/cop/layout/case_indentation.rb +1 -1
  96. data/lib/rubocop/cop/layout/class_structure.rb +45 -10
  97. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
  98. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  99. data/lib/rubocop/cop/layout/condition_position.rb +0 -4
  100. data/lib/rubocop/cop/layout/def_end_alignment.rb +2 -2
  101. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  102. data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
  103. data/lib/rubocop/cop/layout/empty_comment.rb +3 -1
  104. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +4 -4
  105. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +14 -7
  106. data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +1 -1
  107. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +36 -21
  108. data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +101 -0
  109. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +37 -7
  110. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +8 -29
  111. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
  112. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +1 -0
  113. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +1 -1
  114. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +12 -8
  115. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +23 -1
  116. data/lib/rubocop/cop/layout/end_alignment.rb +16 -4
  117. data/lib/rubocop/cop/layout/extra_spacing.rb +5 -11
  118. data/lib/rubocop/cop/layout/first_argument_indentation.rb +6 -11
  119. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +19 -10
  120. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
  121. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
  122. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +8 -0
  123. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +3 -3
  124. data/lib/rubocop/cop/layout/hash_alignment.rb +10 -11
  125. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +4 -3
  126. data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
  127. data/lib/rubocop/cop/layout/indentation_width.rb +13 -13
  128. data/lib/rubocop/cop/layout/leading_comment_space.rb +83 -1
  129. data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +12 -3
  130. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +7 -1
  131. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
  132. data/lib/rubocop/cop/layout/line_length.rb +177 -29
  133. data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -0
  134. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
  135. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
  136. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -1
  137. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
  138. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
  139. data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
  140. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +11 -8
  141. data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
  142. data/lib/rubocop/cop/layout/redundant_line_break.rb +32 -46
  143. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +16 -9
  144. data/lib/rubocop/cop/layout/single_line_block_chain.rb +6 -1
  145. data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
  146. data/lib/rubocop/cop/layout/space_after_comma.rb +1 -1
  147. data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
  148. data/lib/rubocop/cop/layout/space_after_semicolon.rb +11 -1
  149. data/lib/rubocop/cop/layout/space_around_keyword.rb +8 -2
  150. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
  151. data/lib/rubocop/cop/layout/space_around_operators.rb +80 -37
  152. data/lib/rubocop/cop/layout/space_before_block_braces.rb +20 -10
  153. data/lib/rubocop/cop/layout/space_before_brackets.rb +7 -40
  154. data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
  155. data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
  156. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +18 -3
  157. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +5 -0
  158. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +8 -1
  159. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +3 -5
  160. data/lib/rubocop/cop/layout/trailing_whitespace.rb +6 -4
  161. data/lib/rubocop/cop/legacy/corrector.rb +12 -2
  162. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -3
  163. data/lib/rubocop/cop/lint/ambiguous_operator.rb +0 -2
  164. data/lib/rubocop/cop/lint/ambiguous_range.rb +9 -1
  165. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +0 -2
  166. data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +118 -0
  167. data/lib/rubocop/cop/lint/assignment_in_condition.rb +7 -9
  168. data/lib/rubocop/cop/lint/big_decimal_new.rb +4 -7
  169. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +11 -13
  170. data/lib/rubocop/cop/lint/boolean_symbol.rb +2 -4
  171. data/lib/rubocop/cop/lint/circular_argument_reference.rb +4 -14
  172. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
  173. data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +4 -3
  174. data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
  175. data/lib/rubocop/cop/lint/cop_directive_syntax.rb +90 -0
  176. data/lib/rubocop/cop/lint/debugger.rb +30 -10
  177. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +2 -2
  178. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +7 -13
  179. data/lib/rubocop/cop/lint/duplicate_branch.rb +39 -4
  180. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -5
  181. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +0 -4
  182. data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
  183. data/lib/rubocop/cop/lint/duplicate_methods.rb +110 -32
  184. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +6 -43
  185. data/lib/rubocop/cop/lint/duplicate_set_element.rb +87 -0
  186. data/lib/rubocop/cop/lint/each_with_object_argument.rb +0 -4
  187. data/lib/rubocop/cop/lint/else_layout.rb +0 -2
  188. data/lib/rubocop/cop/lint/empty_conditional_body.rb +29 -58
  189. data/lib/rubocop/cop/lint/empty_ensure.rb +2 -12
  190. data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
  191. data/lib/rubocop/cop/lint/empty_file.rb +0 -2
  192. data/lib/rubocop/cop/lint/empty_interpolation.rb +14 -5
  193. data/lib/rubocop/cop/lint/empty_when.rb +1 -3
  194. data/lib/rubocop/cop/lint/ensure_return.rb +2 -10
  195. data/lib/rubocop/cop/lint/erb_new_arguments.rb +24 -23
  196. data/lib/rubocop/cop/lint/float_comparison.rb +58 -15
  197. data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -8
  198. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -12
  199. data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +2 -1
  200. data/lib/rubocop/cop/lint/hash_new_with_keyword_arguments_as_default.rb +55 -0
  201. data/lib/rubocop/cop/lint/identity_comparison.rb +19 -15
  202. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +23 -12
  203. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +0 -7
  204. data/lib/rubocop/cop/lint/interpolation_check.rb +9 -4
  205. data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +50 -0
  206. data/lib/rubocop/cop/lint/literal_as_condition.rb +126 -11
  207. data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +85 -0
  208. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +49 -12
  209. data/lib/rubocop/cop/lint/loop.rb +6 -12
  210. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +17 -8
  211. data/lib/rubocop/cop/lint/missing_super.rb +2 -2
  212. data/lib/rubocop/cop/lint/mixed_case_range.rb +14 -12
  213. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  214. data/lib/rubocop/cop/lint/nested_method_definition.rb +10 -12
  215. data/lib/rubocop/cop/lint/next_without_accumulator.rb +6 -25
  216. data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +2 -7
  217. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +12 -3
  218. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +6 -8
  219. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
  220. data/lib/rubocop/cop/lint/number_conversion.rb +9 -5
  221. data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -2
  222. data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +94 -0
  223. data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -3
  224. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +3 -2
  225. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +6 -11
  226. data/lib/rubocop/cop/lint/percent_string_array.rb +0 -4
  227. data/lib/rubocop/cop/lint/percent_symbol_array.rb +0 -4
  228. data/lib/rubocop/cop/lint/raise_exception.rb +29 -10
  229. data/lib/rubocop/cop/lint/rand_one.rb +0 -4
  230. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +4 -2
  231. data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +2 -2
  232. data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -21
  233. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +164 -12
  234. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +9 -8
  235. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -6
  236. data/lib/rubocop/cop/lint/redundant_type_conversion.rb +261 -0
  237. data/lib/rubocop/cop/lint/redundant_with_index.rb +9 -2
  238. data/lib/rubocop/cop/lint/redundant_with_object.rb +5 -2
  239. data/lib/rubocop/cop/lint/refinement_import_methods.rb +1 -1
  240. data/lib/rubocop/cop/lint/regexp_as_condition.rb +0 -1
  241. data/lib/rubocop/cop/lint/require_parentheses.rb +0 -4
  242. data/lib/rubocop/cop/lint/require_range_parentheses.rb +1 -1
  243. data/lib/rubocop/cop/lint/rescue_exception.rb +2 -9
  244. data/lib/rubocop/cop/lint/rescue_type.rb +5 -11
  245. data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -13
  246. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +20 -9
  247. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +109 -41
  248. data/lib/rubocop/cop/lint/script_permission.rb +3 -3
  249. data/lib/rubocop/cop/lint/self_assignment.rb +72 -10
  250. data/lib/rubocop/cop/lint/shadowed_argument.rb +8 -7
  251. data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
  252. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +19 -11
  253. data/lib/rubocop/cop/lint/shared_mutable_default.rb +76 -0
  254. data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
  255. data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
  256. data/lib/rubocop/cop/lint/symbol_conversion.rb +8 -3
  257. data/lib/rubocop/cop/lint/syntax.rb +10 -4
  258. data/lib/rubocop/cop/lint/to_enum_arguments.rb +2 -4
  259. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
  260. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1 -1
  261. data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +88 -0
  262. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +3 -1
  263. data/lib/rubocop/cop/lint/unified_integer.rb +0 -4
  264. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +4 -3
  265. data/lib/rubocop/cop/lint/unreachable_code.rb +56 -9
  266. data/lib/rubocop/cop/lint/unreachable_loop.rb +14 -8
  267. data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
  268. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +2 -0
  269. data/lib/rubocop/cop/lint/uri_regexp.rb +25 -7
  270. data/lib/rubocop/cop/lint/useless_access_modifier.rb +36 -10
  271. data/lib/rubocop/cop/lint/useless_assignment.rb +21 -16
  272. data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
  273. data/lib/rubocop/cop/lint/useless_default_value_argument.rb +90 -0
  274. data/lib/rubocop/cop/lint/useless_defined.rb +55 -0
  275. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +4 -4
  276. data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
  277. data/lib/rubocop/cop/lint/useless_numeric_operation.rb +79 -0
  278. data/lib/rubocop/cop/lint/useless_or.rb +98 -0
  279. data/lib/rubocop/cop/lint/useless_rescue.rb +2 -2
  280. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +5 -5
  281. data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -29
  282. data/lib/rubocop/cop/lint/useless_times.rb +2 -2
  283. data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +121 -0
  284. data/lib/rubocop/cop/lint/void.rb +92 -18
  285. data/lib/rubocop/cop/message_annotator.rb +7 -3
  286. data/lib/rubocop/cop/metrics/abc_size.rb +4 -4
  287. data/lib/rubocop/cop/metrics/block_length.rb +7 -5
  288. data/lib/rubocop/cop/metrics/block_nesting.rb +20 -8
  289. data/lib/rubocop/cop/metrics/class_length.rb +21 -15
  290. data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
  291. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +5 -2
  292. data/lib/rubocop/cop/metrics/method_length.rb +15 -6
  293. data/lib/rubocop/cop/metrics/module_length.rb +7 -6
  294. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
  295. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
  296. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +8 -9
  297. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
  298. data/lib/rubocop/cop/mixin/alignment.rb +8 -4
  299. data/lib/rubocop/cop/mixin/allowed_methods.rb +7 -1
  300. data/lib/rubocop/cop/mixin/allowed_pattern.rb +15 -3
  301. data/lib/rubocop/cop/mixin/annotation_comment.rb +0 -2
  302. data/lib/rubocop/cop/mixin/check_assignment.rb +4 -12
  303. data/lib/rubocop/cop/mixin/check_line_breakable.rb +22 -12
  304. data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +49 -0
  305. data/lib/rubocop/cop/mixin/code_length.rb +12 -1
  306. data/lib/rubocop/cop/mixin/comments_help.rb +23 -14
  307. data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -0
  308. data/lib/rubocop/cop/mixin/configurable_max.rb +5 -1
  309. data/lib/rubocop/cop/mixin/def_node.rb +1 -1
  310. data/lib/rubocop/cop/mixin/dig_help.rb +27 -0
  311. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
  312. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -7
  313. data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +24 -0
  314. data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
  315. data/lib/rubocop/cop/mixin/forbidden_pattern.rb +16 -0
  316. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +23 -12
  317. data/lib/rubocop/cop/mixin/gemspec_help.rb +22 -0
  318. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +15 -14
  319. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +45 -35
  320. data/lib/rubocop/cop/mixin/hash_subset.rb +203 -0
  321. data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
  322. data/lib/rubocop/cop/mixin/line_length_help.rb +34 -12
  323. data/lib/rubocop/cop/mixin/method_complexity.rb +17 -7
  324. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +7 -9
  325. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
  326. data/lib/rubocop/cop/mixin/percent_array.rb +1 -1
  327. data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
  328. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +68 -30
  329. data/lib/rubocop/cop/mixin/range_help.rb +15 -4
  330. data/lib/rubocop/cop/mixin/rescue_node.rb +4 -0
  331. data/lib/rubocop/cop/mixin/safe_assignment.rb +1 -1
  332. data/lib/rubocop/cop/mixin/statement_modifier.rb +11 -5
  333. data/lib/rubocop/cop/mixin/string_help.rb +2 -2
  334. data/lib/rubocop/cop/mixin/string_literals_help.rb +12 -0
  335. data/lib/rubocop/cop/mixin/target_ruby_version.rb +17 -1
  336. data/lib/rubocop/cop/mixin/trailing_comma.rb +21 -5
  337. data/lib/rubocop/cop/naming/accessor_method_name.rb +11 -6
  338. data/lib/rubocop/cop/naming/block_forwarding.rb +39 -8
  339. data/lib/rubocop/cop/naming/constant_name.rb +7 -9
  340. data/lib/rubocop/cop/naming/file_name.rb +4 -6
  341. data/lib/rubocop/cop/naming/inclusive_language.rb +13 -5
  342. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +13 -14
  343. data/lib/rubocop/cop/naming/method_name.rb +187 -15
  344. data/lib/rubocop/cop/naming/predicate_method.rb +319 -0
  345. data/lib/rubocop/cop/naming/predicate_prefix.rb +204 -0
  346. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +14 -13
  347. data/lib/rubocop/cop/naming/variable_name.rb +50 -6
  348. data/lib/rubocop/cop/naming/variable_number.rb +2 -3
  349. data/lib/rubocop/cop/offense.rb +4 -5
  350. data/lib/rubocop/cop/registry.rb +9 -6
  351. data/lib/rubocop/cop/security/compound_hash.rb +4 -2
  352. data/lib/rubocop/cop/security/eval.rb +2 -1
  353. data/lib/rubocop/cop/security/json_load.rb +33 -11
  354. data/lib/rubocop/cop/security/open.rb +3 -2
  355. data/lib/rubocop/cop/security/yaml_load.rb +3 -2
  356. data/lib/rubocop/cop/style/access_modifier_declarations.rb +172 -32
  357. data/lib/rubocop/cop/style/accessor_grouping.rb +43 -9
  358. data/lib/rubocop/cop/style/alias.rb +2 -1
  359. data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +79 -0
  360. data/lib/rubocop/cop/style/and_or.rb +1 -1
  361. data/lib/rubocop/cop/style/arguments_forwarding.rb +228 -36
  362. data/lib/rubocop/cop/style/array_first_last.rb +80 -0
  363. data/lib/rubocop/cop/style/array_intersect.rb +115 -39
  364. data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +47 -0
  365. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +21 -14
  366. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +2 -2
  367. data/lib/rubocop/cop/style/bitwise_predicate.rb +107 -0
  368. data/lib/rubocop/cop/style/block_delimiters.rb +52 -21
  369. data/lib/rubocop/cop/style/case_like_if.rb +14 -17
  370. data/lib/rubocop/cop/style/class_and_module_children.rb +52 -11
  371. data/lib/rubocop/cop/style/class_check.rb +1 -0
  372. data/lib/rubocop/cop/style/class_equality_comparison.rb +1 -1
  373. data/lib/rubocop/cop/style/class_vars.rb +3 -3
  374. data/lib/rubocop/cop/style/collection_compact.rb +25 -15
  375. data/lib/rubocop/cop/style/collection_methods.rb +2 -1
  376. data/lib/rubocop/cop/style/collection_querying.rb +167 -0
  377. data/lib/rubocop/cop/style/combinable_defined.rb +115 -0
  378. data/lib/rubocop/cop/style/combinable_loops.rb +22 -8
  379. data/lib/rubocop/cop/style/command_literal.rb +1 -1
  380. data/lib/rubocop/cop/style/commented_keyword.rb +30 -4
  381. data/lib/rubocop/cop/style/comparable_between.rb +78 -0
  382. data/lib/rubocop/cop/style/concat_array_literals.rb +2 -1
  383. data/lib/rubocop/cop/style/conditional_assignment.rb +57 -40
  384. data/lib/rubocop/cop/style/constant_visibility.rb +16 -20
  385. data/lib/rubocop/cop/style/copyright.rb +31 -21
  386. data/lib/rubocop/cop/style/data_inheritance.rb +8 -1
  387. data/lib/rubocop/cop/style/date_time.rb +5 -4
  388. data/lib/rubocop/cop/style/def_with_parentheses.rb +18 -7
  389. data/lib/rubocop/cop/style/dig_chain.rb +89 -0
  390. data/lib/rubocop/cop/style/documentation.rb +25 -25
  391. data/lib/rubocop/cop/style/documentation_method.rb +20 -0
  392. data/lib/rubocop/cop/style/double_negation.rb +5 -5
  393. data/lib/rubocop/cop/style/each_for_simple_loop.rb +11 -15
  394. data/lib/rubocop/cop/style/each_with_object.rb +3 -4
  395. data/lib/rubocop/cop/style/empty_else.rb +10 -7
  396. data/lib/rubocop/cop/style/empty_heredoc.rb +1 -14
  397. data/lib/rubocop/cop/style/empty_literal.rb +36 -23
  398. data/lib/rubocop/cop/style/empty_method.rb +1 -1
  399. data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +100 -0
  400. data/lib/rubocop/cop/style/endless_method.rb +163 -18
  401. data/lib/rubocop/cop/style/eval_with_location.rb +23 -31
  402. data/lib/rubocop/cop/style/exact_regexp_match.rb +6 -5
  403. data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
  404. data/lib/rubocop/cop/style/explicit_block_argument.rb +19 -6
  405. data/lib/rubocop/cop/style/exponential_notation.rb +6 -5
  406. data/lib/rubocop/cop/style/fetch_env_var.rb +34 -7
  407. data/lib/rubocop/cop/style/file_null.rb +89 -0
  408. data/lib/rubocop/cop/style/file_read.rb +2 -5
  409. data/lib/rubocop/cop/style/file_touch.rb +75 -0
  410. data/lib/rubocop/cop/style/file_write.rb +2 -5
  411. data/lib/rubocop/cop/style/float_division.rb +23 -5
  412. data/lib/rubocop/cop/style/for.rb +3 -1
  413. data/lib/rubocop/cop/style/format_string.rb +9 -9
  414. data/lib/rubocop/cop/style/format_string_token.rb +38 -11
  415. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -2
  416. data/lib/rubocop/cop/style/global_std_stream.rb +10 -1
  417. data/lib/rubocop/cop/style/global_vars.rb +1 -3
  418. data/lib/rubocop/cop/style/guard_clause.rb +20 -4
  419. data/lib/rubocop/cop/style/hash_conversion.rb +16 -9
  420. data/lib/rubocop/cop/style/hash_each_methods.rb +110 -12
  421. data/lib/rubocop/cop/style/hash_except.rb +38 -146
  422. data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
  423. data/lib/rubocop/cop/style/hash_slice.rb +80 -0
  424. data/lib/rubocop/cop/style/hash_syntax.rb +35 -7
  425. data/lib/rubocop/cop/style/hash_transform_keys.rb +2 -2
  426. data/lib/rubocop/cop/style/hash_transform_values.rb +2 -2
  427. data/lib/rubocop/cop/style/identical_conditional_branches.rb +37 -7
  428. data/lib/rubocop/cop/style/if_inside_else.rb +11 -15
  429. data/lib/rubocop/cop/style/if_unless_modifier.rb +36 -9
  430. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +4 -7
  431. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +8 -8
  432. data/lib/rubocop/cop/style/if_with_semicolon.rb +60 -6
  433. data/lib/rubocop/cop/style/in_pattern_then.rb +6 -2
  434. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  435. data/lib/rubocop/cop/style/inverse_methods.rb +22 -18
  436. data/lib/rubocop/cop/style/invertible_unless_condition.rb +48 -6
  437. data/lib/rubocop/cop/style/ip_addresses.rb +2 -2
  438. data/lib/rubocop/cop/style/it_assignment.rb +93 -0
  439. data/lib/rubocop/cop/style/it_block_parameter.rb +121 -0
  440. data/lib/rubocop/cop/style/keyword_arguments_merging.rb +67 -0
  441. data/lib/rubocop/cop/style/keyword_parameters_order.rb +14 -8
  442. data/lib/rubocop/cop/style/lambda.rb +2 -1
  443. data/lib/rubocop/cop/style/lambda_call.rb +10 -4
  444. data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
  445. data/lib/rubocop/cop/style/magic_comment_format.rb +1 -1
  446. data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +82 -50
  447. data/lib/rubocop/cop/style/map_into_array.rb +236 -0
  448. data/lib/rubocop/cop/style/map_to_hash.rb +29 -10
  449. data/lib/rubocop/cop/style/map_to_set.rb +4 -5
  450. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +52 -25
  451. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +21 -5
  452. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +30 -13
  453. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -4
  454. data/lib/rubocop/cop/style/method_def_parentheses.rb +2 -2
  455. data/lib/rubocop/cop/style/min_max_comparison.rb +13 -5
  456. data/lib/rubocop/cop/style/missing_else.rb +2 -4
  457. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +35 -5
  458. data/lib/rubocop/cop/style/multiline_block_chain.rb +3 -2
  459. data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -0
  460. data/lib/rubocop/cop/style/multiline_memoization.rb +2 -2
  461. data/lib/rubocop/cop/style/multiline_method_signature.rb +10 -9
  462. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +5 -3
  463. data/lib/rubocop/cop/style/multiline_when_then.rb +0 -4
  464. data/lib/rubocop/cop/style/multiple_comparison.rb +53 -60
  465. data/lib/rubocop/cop/style/mutable_constant.rb +7 -8
  466. data/lib/rubocop/cop/style/negated_if_else_condition.rb +7 -5
  467. data/lib/rubocop/cop/style/nested_modifier.rb +1 -1
  468. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +2 -2
  469. data/lib/rubocop/cop/style/nested_ternary_operator.rb +5 -4
  470. data/lib/rubocop/cop/style/next.rb +45 -1
  471. data/lib/rubocop/cop/style/nil_comparison.rb +11 -7
  472. data/lib/rubocop/cop/style/not.rb +1 -1
  473. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
  474. data/lib/rubocop/cop/style/numeric_predicate.rb +12 -4
  475. data/lib/rubocop/cop/style/object_then.rb +16 -14
  476. data/lib/rubocop/cop/style/one_line_conditional.rb +48 -15
  477. data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
  478. data/lib/rubocop/cop/style/operator_method_call.rb +27 -9
  479. data/lib/rubocop/cop/style/or_assignment.rb +3 -6
  480. data/lib/rubocop/cop/style/parallel_assignment.rb +47 -45
  481. data/lib/rubocop/cop/style/parentheses_around_condition.rb +8 -0
  482. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  483. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
  484. data/lib/rubocop/cop/style/proc.rb +2 -2
  485. data/lib/rubocop/cop/style/quoted_symbols.rb +2 -4
  486. data/lib/rubocop/cop/style/raise_args.rb +19 -14
  487. data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
  488. data/lib/rubocop/cop/style/redundant_argument.rb +29 -3
  489. data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
  490. data/lib/rubocop/cop/style/redundant_assignment.rb +11 -3
  491. data/lib/rubocop/cop/style/redundant_begin.rb +41 -2
  492. data/lib/rubocop/cop/style/redundant_condition.rb +97 -25
  493. data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +19 -7
  494. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +17 -14
  495. data/lib/rubocop/cop/style/redundant_each.rb +7 -4
  496. data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
  497. data/lib/rubocop/cop/style/redundant_fetch_block.rb +4 -12
  498. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -1
  499. data/lib/rubocop/cop/style/redundant_filter_chain.rb +5 -4
  500. data/lib/rubocop/cop/style/redundant_format.rb +283 -0
  501. data/lib/rubocop/cop/style/redundant_freeze.rb +4 -4
  502. data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
  503. data/lib/rubocop/cop/style/redundant_interpolation.rb +12 -3
  504. data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +46 -0
  505. data/lib/rubocop/cop/style/redundant_line_continuation.rb +72 -19
  506. data/lib/rubocop/cop/style/redundant_parentheses.rb +149 -49
  507. data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -1
  508. data/lib/rubocop/cop/style/redundant_regexp_argument.rb +12 -1
  509. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
  510. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +16 -24
  511. data/lib/rubocop/cop/style/redundant_return.rb +9 -3
  512. data/lib/rubocop/cop/style/redundant_self.rb +32 -20
  513. data/lib/rubocop/cop/style/redundant_self_assignment.rb +20 -32
  514. data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +4 -4
  515. data/lib/rubocop/cop/style/redundant_sort.rb +10 -9
  516. data/lib/rubocop/cop/style/redundant_sort_by.rb +19 -3
  517. data/lib/rubocop/cop/style/redundant_string_escape.rb +3 -3
  518. data/lib/rubocop/cop/style/regexp_literal.rb +1 -1
  519. data/lib/rubocop/cop/style/require_order.rb +2 -2
  520. data/lib/rubocop/cop/style/rescue_modifier.rb +18 -4
  521. data/lib/rubocop/cop/style/return_nil.rb +2 -2
  522. data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +54 -12
  523. data/lib/rubocop/cop/style/safe_navigation.rb +163 -62
  524. data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
  525. data/lib/rubocop/cop/style/sample.rb +3 -4
  526. data/lib/rubocop/cop/style/select_by_regexp.rb +20 -13
  527. data/lib/rubocop/cop/style/self_assignment.rb +12 -18
  528. data/lib/rubocop/cop/style/semicolon.rb +33 -9
  529. data/lib/rubocop/cop/style/send.rb +4 -4
  530. data/lib/rubocop/cop/style/send_with_literal_method_name.rb +105 -0
  531. data/lib/rubocop/cop/style/signal_exception.rb +2 -3
  532. data/lib/rubocop/cop/style/single_argument_dig.rb +16 -8
  533. data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
  534. data/lib/rubocop/cop/style/single_line_do_end_block.rb +18 -5
  535. data/lib/rubocop/cop/style/single_line_methods.rb +13 -11
  536. data/lib/rubocop/cop/style/slicing_with_range.rb +105 -10
  537. data/lib/rubocop/cop/style/sole_nested_conditional.rb +79 -87
  538. data/lib/rubocop/cop/style/special_global_vars.rb +2 -3
  539. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -1
  540. data/lib/rubocop/cop/style/string_chars.rb +1 -0
  541. data/lib/rubocop/cop/style/string_concatenation.rb +21 -17
  542. data/lib/rubocop/cop/style/string_literals.rb +1 -1
  543. data/lib/rubocop/cop/style/string_methods.rb +1 -1
  544. data/lib/rubocop/cop/style/strip.rb +7 -4
  545. data/lib/rubocop/cop/style/struct_inheritance.rb +9 -2
  546. data/lib/rubocop/cop/style/super_arguments.rb +221 -0
  547. data/lib/rubocop/cop/style/super_with_args_parentheses.rb +35 -0
  548. data/lib/rubocop/cop/style/swap_values.rb +4 -15
  549. data/lib/rubocop/cop/style/symbol_array.rb +1 -1
  550. data/lib/rubocop/cop/style/symbol_proc.rb +78 -6
  551. data/lib/rubocop/cop/style/ternary_parentheses.rb +26 -5
  552. data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -1
  553. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +56 -2
  554. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
  555. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1 -1
  556. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
  557. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -4
  558. data/lib/rubocop/cop/style/trivial_accessors.rb +2 -2
  559. data/lib/rubocop/cop/style/unless_else.rb +10 -9
  560. data/lib/rubocop/cop/style/unpack_first.rb +11 -14
  561. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -2
  562. data/lib/rubocop/cop/style/while_until_do.rb +0 -2
  563. data/lib/rubocop/cop/style/while_until_modifier.rb +0 -2
  564. data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
  565. data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
  566. data/lib/rubocop/cop/style/zero_length_predicate.rb +32 -24
  567. data/lib/rubocop/cop/team.rb +28 -4
  568. data/lib/rubocop/cop/util.rb +19 -6
  569. data/lib/rubocop/cop/utils/format_string.rb +20 -5
  570. data/lib/rubocop/cop/variable_force/assignment.rb +24 -5
  571. data/lib/rubocop/cop/variable_force/branch.rb +1 -1
  572. data/lib/rubocop/cop/variable_force/scope.rb +1 -1
  573. data/lib/rubocop/cop/variable_force/variable.rb +14 -3
  574. data/lib/rubocop/cop/variable_force/variable_table.rb +5 -5
  575. data/lib/rubocop/cop/variable_force.rb +43 -20
  576. data/lib/rubocop/cops_documentation_generator.rb +135 -58
  577. data/lib/rubocop/core_ext/string.rb +2 -6
  578. data/lib/rubocop/directive_comment.rb +54 -18
  579. data/lib/rubocop/ext/regexp_node.rb +17 -35
  580. data/lib/rubocop/ext/regexp_parser.rb +4 -21
  581. data/lib/rubocop/file_finder.rb +9 -4
  582. data/lib/rubocop/formatter/clang_style_formatter.rb +3 -7
  583. data/lib/rubocop/formatter/disabled_config_formatter.rb +43 -14
  584. data/lib/rubocop/formatter/formatter_set.rb +8 -2
  585. data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
  586. data/lib/rubocop/formatter/html_formatter.rb +38 -15
  587. data/lib/rubocop/formatter/json_formatter.rb +0 -1
  588. data/lib/rubocop/formatter/junit_formatter.rb +70 -23
  589. data/lib/rubocop/formatter/markdown_formatter.rb +1 -0
  590. data/lib/rubocop/formatter/offense_count_formatter.rb +13 -3
  591. data/lib/rubocop/formatter/pacman_formatter.rb +2 -1
  592. data/lib/rubocop/formatter/tap_formatter.rb +3 -7
  593. data/lib/rubocop/formatter.rb +1 -1
  594. data/lib/rubocop/lockfile.rb +58 -7
  595. data/lib/rubocop/lsp/diagnostic.rb +190 -0
  596. data/lib/rubocop/lsp/logger.rb +3 -3
  597. data/lib/rubocop/lsp/routes.rb +77 -40
  598. data/lib/rubocop/lsp/runtime.rb +20 -50
  599. data/lib/rubocop/lsp/server.rb +6 -4
  600. data/lib/rubocop/lsp/severity.rb +1 -1
  601. data/lib/rubocop/lsp/stdin_runner.rb +69 -0
  602. data/lib/rubocop/lsp.rb +36 -0
  603. data/lib/rubocop/magic_comment.rb +12 -4
  604. data/lib/rubocop/options.rb +43 -22
  605. data/lib/rubocop/path_util.rb +21 -10
  606. data/lib/rubocop/pending_cops_reporter.rb +56 -0
  607. data/lib/rubocop/plugin/configuration_integrator.rb +143 -0
  608. data/lib/rubocop/plugin/load_error.rb +26 -0
  609. data/lib/rubocop/plugin/loader.rb +100 -0
  610. data/lib/rubocop/plugin/not_supported_error.rb +29 -0
  611. data/lib/rubocop/plugin.rb +46 -0
  612. data/lib/rubocop/rake_task.rb +5 -2
  613. data/lib/rubocop/remote_config.rb +5 -1
  614. data/lib/rubocop/result_cache.rb +29 -34
  615. data/lib/rubocop/rspec/cop_helper.rb +20 -2
  616. data/lib/rubocop/rspec/expect_offense.rb +31 -12
  617. data/lib/rubocop/rspec/shared_contexts.rb +112 -18
  618. data/lib/rubocop/rspec/support.rb +7 -2
  619. data/lib/rubocop/runner.rb +40 -13
  620. data/lib/rubocop/server/cache.rb +63 -11
  621. data/lib/rubocop/server/cli.rb +2 -2
  622. data/lib/rubocop/server/client_command/base.rb +10 -0
  623. data/lib/rubocop/server/client_command/exec.rb +3 -3
  624. data/lib/rubocop/server/client_command/start.rb +11 -1
  625. data/lib/rubocop/server/core.rb +5 -0
  626. data/lib/rubocop/server/server_command/exec.rb +0 -1
  627. data/lib/rubocop/target_finder.rb +93 -82
  628. data/lib/rubocop/target_ruby.rb +111 -81
  629. data/lib/rubocop/version.rb +67 -9
  630. data/lib/rubocop/yaml_duplication_checker.rb +20 -26
  631. data/lib/rubocop.rb +61 -3
  632. data/lib/ruby_lsp/rubocop/addon.rb +90 -0
  633. data/lib/ruby_lsp/rubocop/runtime_adapter.rb +99 -0
  634. metadata +103 -51
  635. data/lib/rubocop/cop/naming/predicate_name.rb +0 -134
  636. data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
  637. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
  638. /data/lib/rubocop/formatter/{git_hub_actions_formatter.rb → github_actions_formatter.rb} +0 -0
@@ -6,14 +6,31 @@ module RuboCop
6
6
  # Makes sure that all methods use the configured style,
7
7
  # snake_case or camelCase, for their names.
8
8
  #
9
- # This cop has `AllowedPatterns` configuration option.
9
+ # Method names matching patterns are always allowed.
10
10
  #
11
- # Naming/MethodName:
12
- # AllowedPatterns:
13
- # - '\AonSelectionBulkChange\z'
14
- # - '\AonSelectionCleared\z'
11
+ # The cop can be configured with `AllowedPatterns` to allow certain regexp patterns:
15
12
  #
16
- # Method names matching patterns are always allowed.
13
+ # [source,yaml]
14
+ # ----
15
+ # Naming/MethodName:
16
+ # AllowedPatterns:
17
+ # - '\AonSelectionBulkChange\z'
18
+ # - '\AonSelectionCleared\z'
19
+ # ----
20
+ #
21
+ # As well, you can also forbid specific method names or regexp patterns
22
+ # using `ForbiddenIdentifiers` or `ForbiddenPatterns`:
23
+ #
24
+ # [source,yaml]
25
+ # ----
26
+ # Naming/MethodName:
27
+ # ForbiddenIdentifiers:
28
+ # - 'def'
29
+ # - 'super'
30
+ # ForbiddenPatterns:
31
+ # - '_v1\z'
32
+ # - '_gen1\z'
33
+ # ----
17
34
  #
18
35
  # @example EnforcedStyle: snake_case (default)
19
36
  # # bad
@@ -22,18 +39,75 @@ module RuboCop
22
39
  # # good
23
40
  # def foo_bar; end
24
41
  #
42
+ # # bad
43
+ # define_method :fooBar do
44
+ # end
45
+ #
46
+ # # good
47
+ # define_method :foo_bar do
48
+ # end
49
+ #
50
+ # # bad
51
+ # Struct.new(:fooBar)
52
+ #
53
+ # # good
54
+ # Struct.new(:foo_bar)
55
+ #
56
+ # # bad
57
+ # alias_method :fooBar, :some_method
58
+ #
59
+ # # good
60
+ # alias_method :foo_bar, :some_method
61
+ #
25
62
  # @example EnforcedStyle: camelCase
26
63
  # # bad
27
64
  # def foo_bar; end
28
65
  #
29
66
  # # good
30
67
  # def fooBar; end
68
+ #
69
+ # # bad
70
+ # define_method :foo_bar do
71
+ # end
72
+ #
73
+ # # good
74
+ # define_method :fooBar do
75
+ # end
76
+ #
77
+ # # bad
78
+ # Struct.new(:foo_bar)
79
+ #
80
+ # # good
81
+ # Struct.new(:fooBar)
82
+ #
83
+ # # bad
84
+ # alias_method :foo_bar, :some_method
85
+ #
86
+ # # good
87
+ # alias_method :fooBar, :some_method
88
+ #
89
+ # @example ForbiddenIdentifiers: ['def', 'super']
90
+ # # bad
91
+ # def def; end
92
+ # def super; end
93
+ #
94
+ # @example ForbiddenPatterns: ['_v1\z', '_gen1\z']
95
+ # # bad
96
+ # def release_v1; end
97
+ # def api_gen1; end
98
+ #
31
99
  class MethodName < Base
32
100
  include ConfigurableNaming
33
101
  include AllowedPattern
34
102
  include RangeHelp
103
+ include ForbiddenIdentifiers
104
+ include ForbiddenPattern
35
105
 
36
106
  MSG = 'Use %<style>s for method names.'
107
+ MSG_FORBIDDEN = '`%<identifier>s` is forbidden, use another method name instead.'
108
+
109
+ OPERATOR_METHODS = %i[| ^ & <=> == === =~ > >= < <= << >> + - * /
110
+ % ** ~ +@ -@ !@ ~@ [] []= ! != !~ `].to_set.freeze
37
111
 
38
112
  # @!method sym_name(node)
39
113
  def_node_matcher :sym_name, '(sym $_name)'
@@ -41,35 +115,133 @@ module RuboCop
41
115
  # @!method str_name(node)
42
116
  def_node_matcher :str_name, '(str $_name)'
43
117
 
118
+ # @!method new_struct?(node)
119
+ def_node_matcher :new_struct?, '(send (const {nil? cbase} :Struct) :new ...)'
120
+
121
+ # @!method define_data?(node)
122
+ def_node_matcher :define_data?, '(send (const {nil? cbase} :Data) :define ...)'
123
+
44
124
  def on_send(node)
125
+ if node.method?(:define_method) || node.method?(:define_singleton_method)
126
+ handle_define_method(node)
127
+ elsif new_struct?(node)
128
+ handle_new_struct(node)
129
+ elsif define_data?(node)
130
+ handle_define_data(node)
131
+ elsif node.method?(:alias_method)
132
+ handle_alias_method(node)
133
+ else
134
+ handle_attr_accessor(node)
135
+ end
136
+ end
137
+
138
+ def on_def(node)
139
+ return if node.operator_method? || matches_allowed_pattern?(node.method_name)
140
+
141
+ if forbidden_name?(node.method_name.to_s)
142
+ register_forbidden_name(node)
143
+ else
144
+ check_name(node, node.method_name, node.loc.name)
145
+ end
146
+ end
147
+ alias on_defs on_def
148
+
149
+ def on_alias(node)
150
+ return unless (new_identifier = node.new_identifier).sym_type?
151
+
152
+ handle_method_name(new_identifier, new_identifier.value)
153
+ end
154
+
155
+ private
156
+
157
+ def handle_define_method(node)
158
+ return unless node.first_argument&.type?(:str, :sym)
159
+
160
+ handle_method_name(node, node.first_argument.value)
161
+ end
162
+
163
+ def handle_new_struct(node)
164
+ arguments = node.first_argument&.str_type? ? node.arguments[1..] : node.arguments
165
+ arguments.select { |argument| argument.type?(:sym, :str) }.each do |name|
166
+ handle_method_name(name, name.value)
167
+ end
168
+ end
169
+
170
+ def handle_define_data(node)
171
+ node.arguments.select { |argument| argument.type?(:sym, :str) }.each do |name|
172
+ handle_method_name(name, name.value)
173
+ end
174
+ end
175
+
176
+ def handle_alias_method(node)
177
+ return unless node.arguments.size == 2
178
+ return unless node.first_argument.type?(:str, :sym)
179
+
180
+ handle_method_name(node.first_argument, node.first_argument.value)
181
+ end
182
+
183
+ def handle_attr_accessor(node)
45
184
  return unless (attrs = node.attribute_accessor?)
46
185
 
47
186
  attrs.last.each do |name_item|
48
187
  name = attr_name(name_item)
49
188
  next if !name || matches_allowed_pattern?(name)
50
189
 
51
- check_name(node, name, range_position(node))
190
+ if forbidden_name?(name.to_s)
191
+ register_forbidden_name(node)
192
+ else
193
+ check_name(node, name, range_position(node))
194
+ end
52
195
  end
53
196
  end
54
197
 
55
- def on_def(node)
56
- return if node.operator_method? || matches_allowed_pattern?(node.method_name)
198
+ def handle_method_name(node, name)
199
+ return if !name || matches_allowed_pattern?(name)
57
200
 
58
- check_name(node, node.method_name, node.loc.name)
201
+ if forbidden_name?(name.to_s)
202
+ register_forbidden_name(node)
203
+ elsif !OPERATOR_METHODS.include?(name.to_sym)
204
+ check_name(node, name, range_position(node))
205
+ end
59
206
  end
60
- alias on_defs on_def
61
207
 
62
- private
208
+ def forbidden_name?(name)
209
+ forbidden_identifier?(name) || forbidden_pattern?(name)
210
+ end
211
+
212
+ # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
213
+ def register_forbidden_name(node)
214
+ if node.any_def_type?
215
+ name_node = node.loc.name
216
+ method_name = node.method_name
217
+ elsif node.literal?
218
+ name_node = node
219
+ method_name = node.value
220
+ elsif (attrs = node.attribute_accessor?)
221
+ name_node = attrs.last.last
222
+ method_name = attr_name(name_node)
223
+ else
224
+ name_node = node.first_argument
225
+ method_name = node.first_argument.value
226
+ end
227
+ message = format(MSG_FORBIDDEN, identifier: method_name)
228
+ add_offense(name_node, message: message)
229
+ end
230
+ # rubocop:enable Metrics/MethodLength, Metrics/AbcSize
63
231
 
64
232
  def attr_name(name_item)
65
233
  sym_name(name_item) || str_name(name_item)
66
234
  end
67
235
 
68
236
  def range_position(node)
69
- selector_end_pos = node.loc.selector.end_pos + 1
70
- expr_end_pos = node.source_range.end_pos
237
+ if node.loc.respond_to?(:selector)
238
+ selector_end_pos = node.loc.selector.end_pos + 1
239
+ expr_end_pos = node.source_range.end_pos
71
240
 
72
- range_between(selector_end_pos, expr_end_pos)
241
+ range_between(selector_end_pos, expr_end_pos)
242
+ else
243
+ node.source_range
244
+ end
73
245
  end
74
246
 
75
247
  def message(style)
@@ -0,0 +1,319 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Naming
6
+ # Checks that predicate methods end with `?` and non-predicate methods do not.
7
+ #
8
+ # The names of predicate methods (methods that return a boolean value) should end
9
+ # in a question mark. Methods that don't return a boolean, shouldn't
10
+ # end in a question mark.
11
+ #
12
+ # The cop assesses a predicate method as one that returns boolean values. Likewise,
13
+ # a method that only returns literal values is assessed as non-predicate. Other predicate
14
+ # method calls are assumed to return boolean values. The cop does not make an assessment
15
+ # if the return type is unknown (non-predicate method calls, variables, etc.).
16
+ #
17
+ # NOTE: The `initialize` method and operator methods (`def ==`, etc.) are ignored.
18
+ #
19
+ # By default, the cop runs in `conservative` mode, which allows a method to be named
20
+ # with a question mark as long as at least one return value is boolean. In `aggressive`
21
+ # mode, methods with a question mark will register an offense if any known non-boolean
22
+ # return values are detected.
23
+ #
24
+ # The cop also has `AllowedMethods` configuration in order to prevent the cop from
25
+ # registering an offense from a method name that does not confirm to the naming
26
+ # guidelines. By default, `call` is allowed. The cop also has `AllowedPatterns`
27
+ # configuration to allow method names by regular expression.
28
+ #
29
+ # Although returning a call to another predicate method is treated as a boolean value,
30
+ # certain method names can be known to not return a boolean, despite ending in a `?`
31
+ # (for example, `Numeric#nonzero?` returns `self` or `nil`). These methods can be
32
+ # configured using `NonBooleanPredicates`.
33
+ #
34
+ # The cop can furthermore be configured to allow all bang methods (method names
35
+ # ending with `!`), with `AllowBangMethods: true` (default false).
36
+ #
37
+ # @example Mode: conservative (default)
38
+ # # bad
39
+ # def foo
40
+ # bar == baz
41
+ # end
42
+ #
43
+ # # good
44
+ # def foo?
45
+ # bar == baz
46
+ # end
47
+ #
48
+ # # bad
49
+ # def foo?
50
+ # 5
51
+ # end
52
+ #
53
+ # # good
54
+ # def foo
55
+ # 5
56
+ # end
57
+ #
58
+ # # bad
59
+ # def foo
60
+ # x == y
61
+ # end
62
+ #
63
+ # # good
64
+ # def foo?
65
+ # x == y
66
+ # end
67
+ #
68
+ # # bad
69
+ # def foo
70
+ # !x
71
+ # end
72
+ #
73
+ # # good
74
+ # def foo?
75
+ # !x
76
+ # end
77
+ #
78
+ # # bad - returns the value of another predicate method
79
+ # def foo
80
+ # bar?
81
+ # end
82
+ #
83
+ # # good
84
+ # def foo?
85
+ # bar?
86
+ # end
87
+ #
88
+ # # good - operator method
89
+ # def ==(other)
90
+ # hash == other.hash
91
+ # end
92
+ #
93
+ # # good - at least one return value is boolean
94
+ # def foo?
95
+ # return unless bar?
96
+ # true
97
+ # end
98
+ #
99
+ # # ok - return type is not known
100
+ # def foo?
101
+ # bar
102
+ # end
103
+ #
104
+ # # ok - return type is not known
105
+ # def foo
106
+ # bar?
107
+ # end
108
+ #
109
+ # @example Mode: aggressive
110
+ # # bad - the method returns nil in some cases
111
+ # def foo?
112
+ # return unless bar?
113
+ # true
114
+ # end
115
+ #
116
+ # @example AllowedMethods: [call] (default)
117
+ # # good
118
+ # def call
119
+ # foo == bar
120
+ # end
121
+ #
122
+ # @example AllowedPatterns: [\Afoo]
123
+ # # good
124
+ # def foo?
125
+ # 'foo'
126
+ # end
127
+ #
128
+ # @example AllowBangMethods: false (default)
129
+ # # bad
130
+ # def save!
131
+ # true
132
+ # end
133
+ #
134
+ # @example AllowBangMethods: true
135
+ # # good
136
+ # def save!
137
+ # true
138
+ # end
139
+ #
140
+ class PredicateMethod < Base
141
+ include AllowedMethods
142
+ include AllowedPattern
143
+
144
+ MSG_PREDICATE = 'Predicate method names should end with `?`.'
145
+ MSG_NON_PREDICATE = 'Non-predicate method names should not end with `?`.'
146
+
147
+ def on_def(node)
148
+ return if allowed?(node)
149
+
150
+ return_values = return_values(node.body)
151
+ return if acceptable?(return_values)
152
+
153
+ if node.predicate_method? && potential_non_predicate?(return_values)
154
+ add_offense(node.loc.name, message: MSG_NON_PREDICATE)
155
+ elsif !node.predicate_method? && all_return_values_boolean?(return_values)
156
+ add_offense(node.loc.name, message: MSG_PREDICATE)
157
+ end
158
+ end
159
+ alias on_defs on_def
160
+
161
+ private
162
+
163
+ def allowed?(node)
164
+ node.method?(:initialize) ||
165
+ allowed_method?(node.method_name) ||
166
+ matches_allowed_pattern?(node.method_name) ||
167
+ allowed_bang_method?(node) ||
168
+ node.operator_method? ||
169
+ node.body.nil?
170
+ end
171
+
172
+ def acceptable?(return_values)
173
+ # In `conservative` mode, if the method returns `super`, `zsuper`, or a
174
+ # non-comparison method call, the method name is acceptable.
175
+ return false unless conservative?
176
+
177
+ return_values.any? do |value|
178
+ value.type?(:super, :zsuper) || unknown_method_call?(value)
179
+ end
180
+ end
181
+
182
+ def unknown_method_call?(value)
183
+ return false unless value.call_type?
184
+
185
+ !method_returning_boolean?(value)
186
+ end
187
+
188
+ def return_values(node)
189
+ # Collect all the (implicit and explicit) return values of a node
190
+ return_values = Set.new(node.begin_type? ? [] : [extract_return_value(node)])
191
+
192
+ node.each_descendant(:return) do |return_node|
193
+ return_values << extract_return_value(return_node)
194
+ end
195
+
196
+ return_values << last_value(node)
197
+
198
+ process_return_values(return_values)
199
+ end
200
+
201
+ def all_return_values_boolean?(return_values)
202
+ values = return_values.reject { |value| value.type?(:super, :zsuper) }
203
+ return false if values.empty?
204
+
205
+ values.all? { |value| boolean_return?(value) }
206
+ end
207
+
208
+ def boolean_return?(value)
209
+ return true if value.boolean_type?
210
+
211
+ method_returning_boolean?(value)
212
+ end
213
+
214
+ def method_returning_boolean?(value)
215
+ return false unless value.call_type?
216
+ return false if wayward_predicate?(value.method_name)
217
+
218
+ value.comparison_method? || value.predicate_method? || value.negation_method?
219
+ end
220
+
221
+ def potential_non_predicate?(return_values)
222
+ # Assumes a method to be non-predicate if all return values are non-boolean literals.
223
+ #
224
+ # In `Mode: conservative`, if any of the return values is a boolean,
225
+ # the method name is acceptable.
226
+ # In `Mode: aggressive`, all return values must be booleans for a predicate
227
+ # method, or else an offense will be registered.
228
+ return false if conservative? && return_values.any? { |value| boolean_return?(value) }
229
+
230
+ return_values.any? do |value|
231
+ value.literal? && !value.boolean_type?
232
+ end
233
+ end
234
+
235
+ def extract_return_value(node)
236
+ return node unless node.return_type?
237
+
238
+ # `return` without a value is a `nil` return.
239
+ return s(:nil) if node.arguments.empty?
240
+
241
+ # When there's a multiple return, it cannot be a predicate
242
+ # so just return an `array` sexp for simplicity.
243
+ return s(:array) unless node.arguments.one?
244
+
245
+ node.first_argument
246
+ end
247
+
248
+ def last_value(node)
249
+ value = node.begin_type? ? node.children.last || s(:nil) : node
250
+
251
+ value.return_type? ? extract_return_value(value) : value
252
+ end
253
+
254
+ def process_return_values(return_values)
255
+ return_values.flat_map do |value|
256
+ if value.conditional?
257
+ process_return_values(extract_conditional_branches(value))
258
+ elsif and_or?(value)
259
+ process_return_values(extract_and_or_clauses(value))
260
+ else
261
+ value
262
+ end
263
+ end
264
+ end
265
+
266
+ def and_or?(node)
267
+ node.type?(:and, :or)
268
+ end
269
+
270
+ def extract_and_or_clauses(node)
271
+ # Recursively traverse an `and` or `or` node to collect all clauses within
272
+ return node unless and_or?(node)
273
+
274
+ [extract_and_or_clauses(node.lhs), extract_and_or_clauses(node.rhs)].flatten
275
+ end
276
+
277
+ def extract_conditional_branches(node)
278
+ return node unless node.conditional?
279
+
280
+ if node.type?(:while, :until)
281
+ # If there is no body, act as implicit `nil`.
282
+ node.body ? [last_value(node.body)] : [s(:nil)]
283
+ else
284
+ # Branches with no value act as an implicit `nil`.
285
+ branches = node.branches.map { |branch| branch ? last_value(branch) : s(:nil) }
286
+ # Missing else branches also act as an implicit `nil`.
287
+ branches.push(s(:nil)) unless node.else_branch
288
+ branches
289
+ end
290
+ end
291
+
292
+ def conservative?
293
+ cop_config.fetch('Mode', :conservative).to_sym == :conservative
294
+ end
295
+
296
+ def allowed_bang_method?(node)
297
+ return false unless allow_bang_methods?
298
+
299
+ node.bang_method?
300
+ end
301
+
302
+ def allow_bang_methods?
303
+ cop_config.fetch('AllowBangMethods', false)
304
+ end
305
+
306
+ # If a method ending in `?` is known to not return a boolean value,
307
+ # (for example, `Numeric#nonzero?`) it should be treated as a non-boolean
308
+ # value, despite the method naming.
309
+ def wayward_predicate?(name)
310
+ wayward_predicates.include?(name.to_s)
311
+ end
312
+
313
+ def wayward_predicates
314
+ Array(cop_config.fetch('WaywardPredicates', []))
315
+ end
316
+ end
317
+ end
318
+ end
319
+ end