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
@@ -7,6 +7,9 @@ module RuboCop
7
7
  # can be combined into a single loop. It is very likely that combining them
8
8
  # will make the code more efficient and more concise.
9
9
  #
10
+ # NOTE: Autocorrection is not applied when the block variable names differ in separate loops,
11
+ # as it is impossible to determine which variable name should be prioritized.
12
+ #
10
13
  # @safety
11
14
  # The cop is unsafe, because the first loop might modify state that the
12
15
  # second loop depends on; these two aren't combinable.
@@ -59,10 +62,9 @@ module RuboCop
59
62
  class CombinableLoops < Base
60
63
  extend AutoCorrector
61
64
 
62
- include RangeHelp
63
-
64
65
  MSG = 'Combine this loop with the previous loop.'
65
66
 
67
+ # rubocop:disable Metrics/CyclomaticComplexity
66
68
  def on_block(node)
67
69
  return unless node.parent&.begin_type?
68
70
  return unless collection_looping_method?(node)
@@ -70,11 +72,15 @@ module RuboCop
70
72
  return unless node.body && node.left_sibling.body
71
73
 
72
74
  add_offense(node) do |corrector|
75
+ next unless node.arguments == node.left_sibling.arguments
76
+
73
77
  combine_with_left_sibling(corrector, node)
74
78
  end
75
79
  end
80
+ # rubocop:enable Metrics/CyclomaticComplexity
76
81
 
77
82
  alias on_numblock on_block
83
+ alias on_itblock on_block
78
84
 
79
85
  def on_for(node)
80
86
  return unless node.parent&.begin_type?
@@ -93,7 +99,7 @@ module RuboCop
93
99
  end
94
100
 
95
101
  def same_collection_looping_block?(node, sibling)
96
- return false if sibling.nil? || (!sibling.block_type? && !sibling.numblock_type?)
102
+ return false if sibling.nil? || !sibling.any_block_type?
97
103
 
98
104
  sibling.method?(node.method_name) &&
99
105
  sibling.receiver == node.receiver &&
@@ -105,11 +111,19 @@ module RuboCop
105
111
  end
106
112
 
107
113
  def combine_with_left_sibling(corrector, node)
108
- corrector.replace(
109
- node.left_sibling.body,
110
- "#{node.left_sibling.body.source}\n#{node.body.source}"
111
- )
112
- corrector.remove(range_with_surrounding_space(range: node.source_range, side: :left))
114
+ corrector.remove(node.left_sibling.body.source_range.end.join(node.left_sibling.loc.end))
115
+ corrector.remove(node.source_range.begin.join(node.body.source_range.begin))
116
+
117
+ correct_end_of_block(corrector, node)
118
+ end
119
+
120
+ def correct_end_of_block(corrector, node)
121
+ return unless node.left_sibling.respond_to?(:braces?)
122
+ return if node.right_sibling&.any_block_type?
123
+
124
+ end_of_block = node.left_sibling.braces? ? '}' : ' end'
125
+ corrector.remove(node.loc.end)
126
+ corrector.insert_before(node.source_range.end, end_of_block)
113
127
  end
114
128
  end
115
129
  end
@@ -173,7 +173,7 @@ module RuboCop
173
173
  end
174
174
 
175
175
  def preferred_delimiters_config
176
- config.for_cop('Style/PercentLiteralDelimiters') ['PreferredDelimiters']
176
+ config.for_cop('Style/PercentLiteralDelimiters')['PreferredDelimiters']
177
177
  end
178
178
  end
179
179
  end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative '../../directive_comment'
4
+
3
5
  module RuboCop
4
6
  module Cop
5
7
  module Style
@@ -7,8 +9,8 @@ module RuboCop
7
9
  # These keywords are: `class`, `module`, `def`, `begin`, `end`.
8
10
  #
9
11
  # Note that some comments
10
- # (`:nodoc:`, `:yields:`, `rubocop:disable` and `rubocop:todo`)
11
- # are allowed.
12
+ # (`:nodoc:`, `:yields:`, `rubocop:disable` and `rubocop:todo`),
13
+ # RBS::Inline annotation, and Steep annotation (`steep:ignore`) are allowed.
12
14
  #
13
15
  # Autocorrection removes comments from `end` keyword and keeps comments
14
16
  # for `class`, `module`, `def` and `begin` above the keyword.
@@ -49,11 +51,17 @@ module RuboCop
49
51
  KEYWORDS = %w[begin class def end module].freeze
50
52
  KEYWORD_REGEXES = KEYWORDS.map { |w| /^\s*#{w}\s/ }.freeze
51
53
 
52
- ALLOWED_COMMENTS = %w[:nodoc: :yields: rubocop:disable rubocop:todo].freeze
53
- ALLOWED_COMMENT_REGEXES = ALLOWED_COMMENTS.map { |c| /#\s*#{c}/ }.freeze
54
+ ALLOWED_COMMENTS = %w[:nodoc: :yields:].freeze
55
+ ALLOWED_COMMENT_REGEXES = (ALLOWED_COMMENTS.map { |c| /#\s*#{c}/ } +
56
+ [DirectiveComment::DIRECTIVE_COMMENT_REGEXP]).freeze
54
57
 
55
58
  REGEXP = /(?<keyword>\S+).*#/.freeze
56
59
 
60
+ SUBCLASS_DEFINITION = /\A\s*class\s+(\w|::)+\s*<\s*(\w|::)+/.freeze
61
+ METHOD_OR_END_DEFINITIONS = /\A\s*(def\s|end)/.freeze
62
+
63
+ STEEP_REGEXP = /#\ssteep:ignore(\s|\z)/.freeze
64
+
57
65
  def on_new_investigation
58
66
  processed_source.comments.each do |comment|
59
67
  next unless offensive?(comment) && (match = source_line(comment).match(REGEXP))
@@ -79,6 +87,9 @@ module RuboCop
79
87
 
80
88
  def offensive?(comment)
81
89
  line = source_line(comment)
90
+ return false if rbs_inline_annotation?(line, comment)
91
+ return false if steep_annotation?(comment)
92
+
82
93
  KEYWORD_REGEXES.any? { |r| r.match?(line) } &&
83
94
  ALLOWED_COMMENT_REGEXES.none? { |r| r.match?(line) }
84
95
  end
@@ -86,6 +97,21 @@ module RuboCop
86
97
  def source_line(comment)
87
98
  comment.source_range.source_line
88
99
  end
100
+
101
+ def rbs_inline_annotation?(line, comment)
102
+ case line
103
+ when SUBCLASS_DEFINITION
104
+ comment.text.start_with?(/#\[.+\]/)
105
+ when METHOD_OR_END_DEFINITIONS
106
+ comment.text.start_with?('#:')
107
+ else
108
+ false
109
+ end
110
+ end
111
+
112
+ def steep_annotation?(comment)
113
+ comment.text.match?(STEEP_REGEXP)
114
+ end
89
115
  end
90
116
  end
91
117
  end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # Checks for logical comparison which can be replaced with `Comparable#between?`.
7
+ #
8
+ # NOTE: `Comparable#between?` is on average slightly slower than logical comparison,
9
+ # although the difference generally isn't observable. If you require maximum
10
+ # performance, consider using logical comparison.
11
+ #
12
+ # @safety
13
+ # This cop is unsafe because the receiver may not respond to `between?`.
14
+ #
15
+ # @example
16
+ #
17
+ # # bad
18
+ # x >= min && x <= max
19
+ #
20
+ # # bad
21
+ # x <= max && x >= min
22
+ #
23
+ # # good
24
+ # x.between?(min, max)
25
+ #
26
+ class ComparableBetween < Base
27
+ extend AutoCorrector
28
+
29
+ MSG = 'Prefer `%<prefer>s` over logical comparison.'
30
+
31
+ # @!method logical_comparison_between_by_min_first?(node)
32
+ def_node_matcher :logical_comparison_between_by_min_first?, <<~PATTERN
33
+ (and
34
+ (send
35
+ {$_value :>= $_min | $_min :<= $_value})
36
+ (send
37
+ {$_value :<= $_max | $_max :>= $_value}))
38
+ PATTERN
39
+
40
+ # @!method logical_comparison_between_by_max_first?(node)
41
+ def_node_matcher :logical_comparison_between_by_max_first?, <<~PATTERN
42
+ (and
43
+ (send
44
+ {$_value :<= $_max | $_max :>= $_value})
45
+ (send
46
+ {$_value :>= $_min | $_min :<= $_value}))
47
+ PATTERN
48
+
49
+ def on_and(node)
50
+ logical_comparison_between_by_min_first?(node) do |*args|
51
+ min_and_value, max_and_value = args.each_slice(2).to_a
52
+
53
+ register_offense(node, min_and_value, max_and_value)
54
+ end
55
+
56
+ logical_comparison_between_by_max_first?(node) do |*args|
57
+ max_and_value, min_and_value = args.each_slice(2).to_a
58
+
59
+ register_offense(node, min_and_value, max_and_value)
60
+ end
61
+ end
62
+
63
+ private
64
+
65
+ def register_offense(node, min_and_value, max_and_value)
66
+ value = (min_and_value & max_and_value).first
67
+ min = min_and_value.find { _1 != value } || value
68
+ max = max_and_value.find { _1 != value } || value
69
+
70
+ prefer = "#{value.source}.between?(#{min.source}, #{max.source})"
71
+ add_offense(node, message: format(MSG, prefer: prefer)) do |corrector|
72
+ corrector.replace(node, prefer)
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -63,6 +63,7 @@ module RuboCop
63
63
  end
64
64
  end
65
65
  # rubocop:enable Metrics
66
+ alias on_csend on_send
66
67
 
67
68
  private
68
69
 
@@ -85,7 +86,7 @@ module RuboCop
85
86
 
86
87
  def percent_literals_includes_only_basic_literals?(node)
87
88
  node.arguments.select(&:percent_literal?).all? do |arg|
88
- arg.children.all? { |child| child.str_type? || child.sym_type? }
89
+ arg.children.all? { |child| child.type?(:str, :sym) }
89
90
  end
90
91
  end
91
92
  end
@@ -33,24 +33,20 @@ module RuboCop
33
33
  branch.begin_type? ? Array(branch).last : branch
34
34
  end
35
35
 
36
- # rubocop:disable Metrics/AbcSize
37
36
  def lhs(node)
38
37
  case node.type
39
38
  when :send
40
39
  lhs_for_send(node)
41
- when :op_asgn
42
- "#{node.children[0].source} #{node.children[1]}= "
43
- when :and_asgn, :or_asgn
44
- "#{node.children[0].source} #{node.loc.operator.source} "
40
+ when :op_asgn, :and_asgn, :or_asgn
41
+ "#{node.assignment_node.source} #{node.operator}= "
45
42
  when :casgn
46
43
  lhs_for_casgn(node)
47
44
  when *ConditionalAssignment::VARIABLE_ASSIGNMENT_TYPES
48
- "#{node.children[0]} = "
45
+ "#{node.name} = "
49
46
  else
50
47
  node.source
51
48
  end
52
49
  end
53
- # rubocop:enable Metrics/AbcSize
54
50
 
55
51
  def indent(cop, source)
56
52
  conf = cop.config.for_cop(END_ALIGNMENT)
@@ -73,7 +69,7 @@ module RuboCop
73
69
  elsif_branches << node.if_branch
74
70
 
75
71
  else_branch = node.else_branch
76
- if else_branch&.if_type? && else_branch&.elsif?
72
+ if else_branch&.if_type? && else_branch.elsif?
77
73
  expand_elsif(else_branch, elsif_branches)
78
74
  else
79
75
  elsif_branches << else_branch
@@ -94,11 +90,12 @@ module RuboCop
94
90
  end
95
91
 
96
92
  def lhs_for_casgn(node)
97
- namespace = node.children[0]
98
- if namespace.nil? || namespace.cbase_type?
99
- "#{namespace&.source}#{node.children[1]} = "
93
+ if node.namespace.nil?
94
+ "#{node.name} = "
95
+ elsif node.namespace.cbase_type?
96
+ "::#{node.name} = "
100
97
  else
101
- "#{namespace.source}::#{node.children[1]} = "
98
+ "#{node.namespace.const_name}::#{node.name} = "
102
99
  end
103
100
  end
104
101
 
@@ -110,13 +107,13 @@ module RuboCop
110
107
  parent = node.parent
111
108
  return true unless parent
112
109
 
113
- !(parent.mlhs_type? || parent.resbody_type?)
110
+ !parent.type?(:mlhs, :resbody)
114
111
  end
115
112
  end
116
113
 
117
- # Check for `if` and `case` statements where each branch is used for
118
- # assignment to the same variable when using the return of the
119
- # condition can be used instead.
114
+ # Checks for `if` and `case` statements where each branch is used for
115
+ # both the assignment and comparison of the same variable
116
+ # when using the return of the condition can be used instead.
120
117
  #
121
118
  # @example EnforcedStyle: assign_to_condition (default)
122
119
  # # bad
@@ -210,11 +207,10 @@ module RuboCop
210
207
  class ConditionalAssignment < Base
211
208
  include ConditionalAssignmentHelper
212
209
  include ConfigurableEnforcedStyle
213
- include IgnoredNode
214
210
  extend AutoCorrector
215
211
 
216
212
  MSG = 'Use the return of the conditional for variable assignment and comparison.'
217
- ASSIGN_TO_CONDITION_MSG = 'Assign variables inside of conditionals'
213
+ ASSIGN_TO_CONDITION_MSG = 'Assign variables inside of conditionals.'
218
214
  VARIABLE_ASSIGNMENT_TYPES = %i[casgn cvasgn gvasgn ivasgn lvasgn].freeze
219
215
  ASSIGNMENT_TYPES = VARIABLE_ASSIGNMENT_TYPES + %i[and_asgn or_asgn op_asgn masgn].freeze
220
216
  LINE_LENGTH = 'Layout/LineLength'
@@ -233,7 +229,7 @@ module RuboCop
233
229
  PATTERN
234
230
 
235
231
  ASSIGNMENT_TYPES.each do |type|
236
- define_method "on_#{type}" do |node|
232
+ define_method :"on_#{type}" do |node|
237
233
  return if part_of_ignored_node?(node)
238
234
  return if node.parent&.shorthand_asgn?
239
235
 
@@ -313,22 +309,25 @@ module RuboCop
313
309
  end
314
310
 
315
311
  def allowed_single_line?(branches)
316
- single_line_conditions_only? && branches.any?(&:begin_type?)
312
+ single_line_conditions_only? && branches.compact.any?(&:begin_type?)
317
313
  end
318
314
 
319
315
  def assignment_node(node)
320
- *_variable, assignment = *node
316
+ assignment = node.send_type? ? node.last_argument : node.expression
317
+ return unless assignment
321
318
 
322
319
  # ignore pseudo-assignments without rhs in for nodes
323
320
  return if node.parent&.for_type?
324
321
 
325
- assignment, = *assignment if assignment.begin_type? && assignment.children.one?
322
+ if assignment.begin_type? && assignment.children.one?
323
+ assignment = assignment.children.first
324
+ end
326
325
 
327
326
  assignment
328
327
  end
329
328
 
330
329
  def move_assignment_outside_condition(corrector, node)
331
- if node.case_type? || node.case_match_type?
330
+ if node.type?(:case, :case_match)
332
331
  CaseCorrector.correct(corrector, self, node)
333
332
  elsif node.ternary?
334
333
  TernaryCorrector.correct(corrector, node)
@@ -338,11 +337,11 @@ module RuboCop
338
337
  end
339
338
 
340
339
  def move_assignment_inside_condition(corrector, node)
341
- *_assignment, condition = *node
340
+ condition = node.send_type? ? node.last_argument : node.expression
342
341
 
343
342
  if ternary_condition?(condition)
344
343
  TernaryCorrector.move_assignment_inside_condition(corrector, node)
345
- elsif condition.case_type? || condition.case_match_type?
344
+ elsif condition.type?(:case, :case_match)
346
345
  CaseCorrector.move_assignment_inside_condition(corrector, node)
347
346
  elsif condition.if_type?
348
347
  IfCorrector.move_assignment_inside_condition(corrector, node)
@@ -438,31 +437,47 @@ module RuboCop
438
437
  # Helper module to provide common methods to ConditionalAssignment
439
438
  # correctors
440
439
  module ConditionalCorrectorHelper
440
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
441
441
  def remove_whitespace_in_branches(corrector, branch, condition, column)
442
442
  branch.each_node do |child|
443
443
  next if child.source_range.nil?
444
+ next if child.parent.dstr_type?
444
445
 
445
446
  white_space = white_space_range(child, column)
446
- corrector.remove(white_space) if white_space.source.strip.empty?
447
+ corrector.remove(white_space) if white_space
447
448
  end
448
449
 
449
- [condition.loc.else, condition.loc.end].each do |loc|
450
- corrector.remove_preceding(loc, loc.column - column)
450
+ if condition.loc.else && !same_line?(condition.else_branch, condition)
451
+ corrector.remove_preceding(condition.loc.else, condition.loc.else.column - column)
451
452
  end
453
+
454
+ return unless condition.loc.end && !same_line?(
455
+ condition.branches.last.parent.else_branch, condition.loc.end
456
+ )
457
+
458
+ corrector.remove_preceding(condition.loc.end, condition.loc.end.column - column)
459
+ end
460
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity
461
+
462
+ def same_line?(node1, node2)
463
+ RuboCop::Cop::Util.same_line?(node1, node2)
452
464
  end
453
465
 
454
466
  def white_space_range(node, column)
455
467
  expression = node.source_range
456
- begin_pos = expression.begin_pos - (expression.column - column - 2)
468
+ end_pos = expression.begin_pos
469
+ begin_pos = end_pos - (expression.column - column - 2)
470
+
471
+ return nil if begin_pos > end_pos
457
472
 
458
- Parser::Source::Range.new(expression.source_buffer, begin_pos, expression.begin_pos)
473
+ white_space = Parser::Source::Range.new(expression.source_buffer, begin_pos, end_pos)
474
+ white_space if white_space.source.strip.empty?
459
475
  end
460
476
 
461
477
  def assignment(node)
462
- *_, condition = *node
463
- Parser::Source::Range.new(node.source_range.source_buffer,
464
- node.source_range.begin_pos,
465
- condition.source_range.begin_pos)
478
+ condition = node.send_type? ? node.last_argument : node.expression
479
+
480
+ node.source_range.begin.join(condition.source_range.begin)
466
481
  end
467
482
 
468
483
  def correct_if_branches(corrector, cop, node)
@@ -507,7 +522,7 @@ module RuboCop
507
522
  end
508
523
 
509
524
  def move_assignment_inside_condition(corrector, node)
510
- *_var, rhs = *node
525
+ rhs = node.send_type? ? node.last_argument : node.expression
511
526
  if_branch, else_branch = extract_branches(node)
512
527
  assignment = assignment(node)
513
528
 
@@ -534,12 +549,12 @@ module RuboCop
534
549
  end
535
550
 
536
551
  def element_assignment?(node)
537
- node.send_type? && node.method_name != :[]=
552
+ node.send_type? && !node.method?(:[]=)
538
553
  end
539
554
 
540
555
  def extract_branches(node)
541
- *_var, rhs = *node
542
- condition, = *rhs if rhs.begin_type? && rhs.children.one?
556
+ rhs = node.send_type? ? node.last_argument : node.expression
557
+ condition = rhs.children.first if rhs.begin_type? && rhs.children.one?
543
558
  _condition, if_branch, else_branch = *(condition || rhs)
544
559
 
545
560
  [if_branch, else_branch]
@@ -568,7 +583,7 @@ module RuboCop
568
583
 
569
584
  def move_assignment_inside_condition(corrector, node)
570
585
  column = node.source_range.column
571
- *_var, condition = *node
586
+ condition = node.send_type? ? node.last_argument : node.expression
572
587
  assignment = assignment(node)
573
588
 
574
589
  corrector.remove(assignment)
@@ -596,6 +611,8 @@ module RuboCop
596
611
 
597
612
  return unless (branch_else = branch.parent.loc.else)
598
613
 
614
+ return if same_line?(branch_else, condition)
615
+
599
616
  corrector.remove_preceding(branch_else, branch_else.column - column)
600
617
  end
601
618
  end
@@ -619,7 +636,7 @@ module RuboCop
619
636
 
620
637
  def move_assignment_inside_condition(corrector, node)
621
638
  column = node.source_range.column
622
- *_var, condition = *node
639
+ condition = node.send_type? ? node.last_argument : node.expression
623
640
  assignment = assignment(node)
624
641
 
625
642
  corrector.remove(assignment)
@@ -48,13 +48,17 @@ module RuboCop
48
48
  MSG = 'Explicitly make `%<constant_name>s` public or private using ' \
49
49
  'either `#public_constant` or `#private_constant`.'
50
50
 
51
+ # @!method visibility_declaration_for(node)
52
+ def_node_matcher :visibility_declaration_for, <<~PATTERN
53
+ (send nil? {:public_constant :private_constant} $...)
54
+ PATTERN
55
+
51
56
  def on_casgn(node)
52
57
  return unless class_or_module_scope?(node)
53
58
  return if visibility_declaration?(node)
54
59
  return if ignore_modules? && module?(node)
55
60
 
56
- message = message(node)
57
- add_offense(node, message: message)
61
+ add_offense(node, message: format(MSG, constant_name: node.name))
58
62
  end
59
63
 
60
64
  private
@@ -64,13 +68,7 @@ module RuboCop
64
68
  end
65
69
 
66
70
  def module?(node)
67
- node.children.last.class_constructor?
68
- end
69
-
70
- def message(node)
71
- _namespace, constant_name, _value = *node
72
-
73
- format(MSG, constant_name: constant_name)
71
+ node.expression.class_constructor?
74
72
  end
75
73
 
76
74
  def class_or_module_scope?(node)
@@ -84,22 +82,20 @@ module RuboCop
84
82
  end
85
83
  end
86
84
 
85
+ # rubocop:disable Metrics/AbcSize
87
86
  def visibility_declaration?(node)
88
- _namespace, constant_name, _value = *node
89
-
90
87
  node.parent.each_child_node(:send).any? do |child|
91
- visibility_declaration_for?(child, constant_name)
92
- end
93
- end
88
+ next false unless (arguments = visibility_declaration_for(child))
94
89
 
95
- # @!method visibility_declaration_for?(node, const_name)
96
- def_node_matcher :visibility_declaration_for?, <<~PATTERN
97
- (send nil? {:public_constant :private_constant} ({sym str} #match_name?(%1)))
98
- PATTERN
90
+ arguments = arguments.first.children.first.to_a if arguments.first&.splat_type?
91
+ constant_values = arguments.map do |argument|
92
+ argument.value.to_sym if argument.respond_to?(:value)
93
+ end
99
94
 
100
- def match_name?(name, constant_name)
101
- name.to_sym == constant_name.to_sym
95
+ constant_values.include?(node.name)
96
+ end
102
97
  end
98
+ # rubocop:enable Metrics/AbcSize
103
99
  end
104
100
  end
105
101
  end
@@ -28,18 +28,27 @@ module RuboCop
28
28
  def on_new_investigation
29
29
  return if notice.empty? || notice_found?(processed_source)
30
30
 
31
- add_offense(offense_range, message: format(MSG, notice: notice)) do |corrector|
32
- verify_autocorrect_notice!
33
-
34
- token = insert_notice_before(processed_source)
35
- range = token.nil? ? range_between(0, 0) : token.pos
36
-
37
- corrector.insert_before(range, "#{autocorrect_notice}\n")
31
+ verify_autocorrect_notice!
32
+ message = format(MSG, notice: notice)
33
+ if processed_source.blank?
34
+ add_global_offense(message)
35
+ else
36
+ offense_range = source_range(processed_source.buffer, 1, 0)
37
+ add_offense(offense_range, message: message) do |corrector|
38
+ autocorrect(corrector)
39
+ end
38
40
  end
39
41
  end
40
42
 
41
43
  private
42
44
 
45
+ def autocorrect(corrector)
46
+ token = insert_notice_before(processed_source)
47
+ range = token.nil? ? range_between(0, 0) : token.pos
48
+
49
+ corrector.insert_before(range, "#{autocorrect_notice}\n")
50
+ end
51
+
43
52
  def notice
44
53
  cop_config['Notice']
45
54
  end
@@ -48,17 +57,16 @@ module RuboCop
48
57
  cop_config['AutocorrectNotice']
49
58
  end
50
59
 
51
- def offense_range
52
- source_range(processed_source.buffer, 1, 0)
53
- end
54
-
55
60
  def verify_autocorrect_notice!
56
- raise Warning, AUTOCORRECT_EMPTY_WARNING if autocorrect_notice.empty?
61
+ if autocorrect_notice.nil? || autocorrect_notice.empty?
62
+ raise Warning, "#{cop_name}: #{AUTOCORRECT_EMPTY_WARNING}"
63
+ end
57
64
 
58
65
  regex = Regexp.new(notice)
59
- return if autocorrect_notice&.match?(regex)
66
+ return if autocorrect_notice.gsub(/^# */, '').match?(regex)
60
67
 
61
- raise Warning, "AutocorrectNotice '#{autocorrect_notice}' must match Notice /#{notice}/"
68
+ message = "AutocorrectNotice '#{autocorrect_notice}' must match Notice /#{notice}/"
69
+ raise Warning, "#{cop_name}: #{message}"
62
70
  end
63
71
 
64
72
  def insert_notice_before(processed_source)
@@ -72,26 +80,28 @@ module RuboCop
72
80
  return false if token_index >= processed_source.tokens.size
73
81
 
74
82
  token = processed_source.tokens[token_index]
75
- token.comment? && /^#!.*$/.match?(token.text)
83
+ token.comment? && /\A#!.*\z/.match?(token.text)
76
84
  end
77
85
 
78
86
  def encoding_token?(processed_source, token_index)
79
87
  return false if token_index >= processed_source.tokens.size
80
88
 
81
89
  token = processed_source.tokens[token_index]
82
- token.comment? && /^#.*coding\s?[:=]\s?(?:UTF|utf)-8/.match?(token.text)
90
+ token.comment? && /\A#.*coding\s?[:=]\s?(?:UTF|utf)-8/.match?(token.text)
83
91
  end
84
92
 
85
93
  def notice_found?(processed_source)
86
- notice_found = false
87
- notice_regexp = Regexp.new(notice)
94
+ notice_regexp = Regexp.new(notice.lines.map(&:strip).join)
95
+ multiline_notice = +''
88
96
  processed_source.tokens.each do |token|
89
97
  break unless token.comment?
90
98
 
91
- notice_found = notice_regexp.match?(token.text)
92
- break if notice_found
99
+ multiline_notice << token.text.sub(/\A# */, '')
100
+
101
+ break if notice_regexp.match?(token.text)
93
102
  end
94
- notice_found
103
+
104
+ multiline_notice.match?(notice_regexp)
95
105
  end
96
106
  end
97
107
  end