rubocop 1.72.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 (316) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +22 -18
  3. data/config/default.yml +240 -65
  4. data/config/internal_affairs.yml +20 -0
  5. data/config/obsoletion.yml +8 -3
  6. data/exe/rubocop +1 -8
  7. data/lib/rubocop/cli/command/auto_generate_config.rb +2 -2
  8. data/lib/rubocop/cli.rb +19 -4
  9. data/lib/rubocop/config.rb +35 -6
  10. data/lib/rubocop/config_loader.rb +8 -40
  11. data/lib/rubocop/config_loader_resolver.rb +9 -7
  12. data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -3
  13. data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
  14. data/lib/rubocop/config_obsoletion.rb +46 -2
  15. data/lib/rubocop/config_store.rb +5 -0
  16. data/lib/rubocop/config_validator.rb +7 -6
  17. data/lib/rubocop/cop/autocorrect_logic.rb +22 -14
  18. data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -1
  19. data/lib/rubocop/cop/correctors/alignment_corrector.rb +7 -4
  20. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +7 -2
  21. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -2
  22. data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
  23. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +37 -15
  24. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
  25. data/lib/rubocop/cop/gemspec/require_mfa.rb +15 -1
  26. data/lib/rubocop/cop/internal_affairs/example_description.rb +9 -5
  27. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +4 -4
  28. data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +6 -2
  29. data/lib/rubocop/cop/internal_affairs/node_type_group.rb +92 -0
  30. data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +1 -1
  31. data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +6 -5
  32. data/lib/rubocop/cop/internal_affairs/undefined_config.rb +6 -1
  33. data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
  34. data/lib/rubocop/cop/internal_affairs.rb +1 -0
  35. data/lib/rubocop/cop/layout/block_alignment.rb +2 -2
  36. data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
  37. data/lib/rubocop/cop/layout/class_structure.rb +36 -1
  38. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
  39. data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
  40. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  41. data/lib/rubocop/cop/layout/else_alignment.rb +1 -1
  42. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +1 -1
  43. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +32 -14
  44. data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +101 -0
  45. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +34 -4
  46. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +8 -29
  47. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +1 -0
  48. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +1 -1
  49. data/lib/rubocop/cop/layout/first_argument_indentation.rb +1 -1
  50. data/lib/rubocop/cop/layout/hash_alignment.rb +4 -7
  51. data/lib/rubocop/cop/layout/indentation_width.rb +1 -0
  52. data/lib/rubocop/cop/layout/leading_comment_space.rb +13 -1
  53. data/lib/rubocop/cop/layout/line_length.rb +43 -10
  54. data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -0
  55. data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
  56. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +9 -5
  57. data/lib/rubocop/cop/layout/redundant_line_break.rb +9 -5
  58. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +11 -5
  59. data/lib/rubocop/cop/layout/space_after_semicolon.rb +10 -0
  60. data/lib/rubocop/cop/layout/space_around_keyword.rb +6 -1
  61. data/lib/rubocop/cop/layout/space_around_operators.rb +12 -1
  62. data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -0
  63. data/lib/rubocop/cop/layout/space_before_brackets.rb +5 -38
  64. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +12 -3
  65. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -0
  66. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +3 -0
  67. data/lib/rubocop/cop/layout/trailing_whitespace.rb +1 -1
  68. data/lib/rubocop/cop/lint/ambiguous_range.rb +5 -0
  69. data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +2 -3
  70. data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
  71. data/lib/rubocop/cop/lint/circular_argument_reference.rb +2 -5
  72. data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +3 -2
  73. data/lib/rubocop/cop/lint/cop_directive_syntax.rb +13 -7
  74. data/lib/rubocop/cop/lint/debugger.rb +2 -4
  75. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -1
  76. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +5 -2
  77. data/lib/rubocop/cop/lint/duplicate_methods.rb +111 -23
  78. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +5 -42
  79. data/lib/rubocop/cop/lint/empty_conditional_body.rb +14 -64
  80. data/lib/rubocop/cop/lint/empty_interpolation.rb +14 -1
  81. data/lib/rubocop/cop/lint/erb_new_arguments.rb +0 -6
  82. data/lib/rubocop/cop/lint/float_comparison.rb +32 -10
  83. data/lib/rubocop/cop/lint/identity_comparison.rb +19 -15
  84. data/lib/rubocop/cop/lint/literal_as_condition.rb +124 -10
  85. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +17 -8
  86. data/lib/rubocop/cop/lint/mixed_case_range.rb +2 -2
  87. data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -1
  88. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
  89. data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +1 -0
  90. data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +1 -1
  91. data/lib/rubocop/cop/lint/raise_exception.rb +29 -10
  92. data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
  93. data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -21
  94. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +101 -2
  95. data/lib/rubocop/cop/lint/redundant_type_conversion.rb +43 -13
  96. data/lib/rubocop/cop/lint/redundant_with_index.rb +3 -0
  97. data/lib/rubocop/cop/lint/redundant_with_object.rb +3 -0
  98. data/lib/rubocop/cop/lint/require_range_parentheses.rb +1 -1
  99. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -4
  100. data/lib/rubocop/cop/lint/rescue_type.rb +1 -1
  101. data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -11
  102. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +4 -4
  103. data/lib/rubocop/cop/lint/self_assignment.rb +31 -5
  104. data/lib/rubocop/cop/lint/shadowed_argument.rb +7 -7
  105. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +13 -1
  106. data/lib/rubocop/cop/lint/shared_mutable_default.rb +12 -1
  107. data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
  108. data/lib/rubocop/cop/lint/to_enum_arguments.rb +1 -1
  109. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
  110. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +2 -0
  111. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -0
  112. data/lib/rubocop/cop/lint/unreachable_loop.rb +5 -5
  113. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +2 -0
  114. data/lib/rubocop/cop/lint/useless_access_modifier.rb +30 -4
  115. data/lib/rubocop/cop/lint/useless_assignment.rb +2 -0
  116. data/lib/rubocop/cop/lint/useless_constant_scoping.rb +9 -12
  117. data/lib/rubocop/cop/lint/useless_default_value_argument.rb +90 -0
  118. data/lib/rubocop/cop/lint/useless_numeric_operation.rb +1 -0
  119. data/lib/rubocop/cop/lint/useless_or.rb +98 -0
  120. data/lib/rubocop/cop/lint/useless_rescue.rb +1 -1
  121. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +3 -3
  122. data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +121 -0
  123. data/lib/rubocop/cop/lint/void.rb +16 -2
  124. data/lib/rubocop/cop/message_annotator.rb +7 -3
  125. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  126. data/lib/rubocop/cop/metrics/block_length.rb +1 -0
  127. data/lib/rubocop/cop/metrics/method_length.rb +1 -0
  128. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -1
  129. data/lib/rubocop/cop/mixin/alignment.rb +1 -1
  130. data/lib/rubocop/cop/mixin/allowed_pattern.rb +4 -4
  131. data/lib/rubocop/cop/mixin/check_line_breakable.rb +3 -3
  132. data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +2 -2
  133. data/lib/rubocop/cop/mixin/def_node.rb +1 -1
  134. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
  135. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -7
  136. data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
  137. data/lib/rubocop/cop/mixin/forbidden_pattern.rb +16 -0
  138. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -2
  139. data/lib/rubocop/cop/mixin/gemspec_help.rb +22 -0
  140. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +15 -14
  141. data/lib/rubocop/cop/mixin/hash_subset.rb +19 -4
  142. data/lib/rubocop/cop/mixin/line_length_help.rb +24 -8
  143. data/lib/rubocop/cop/mixin/method_complexity.rb +1 -0
  144. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +2 -0
  145. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
  146. data/lib/rubocop/cop/mixin/range_help.rb +12 -0
  147. data/lib/rubocop/cop/mixin/target_ruby_version.rb +1 -1
  148. data/lib/rubocop/cop/mixin/trailing_comma.rb +18 -2
  149. data/lib/rubocop/cop/naming/block_forwarding.rb +3 -3
  150. data/lib/rubocop/cop/naming/file_name.rb +2 -2
  151. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1 -1
  152. data/lib/rubocop/cop/naming/method_name.rb +187 -15
  153. data/lib/rubocop/cop/naming/predicate_method.rb +319 -0
  154. data/lib/rubocop/cop/naming/{predicate_name.rb → predicate_prefix.rb} +4 -4
  155. data/lib/rubocop/cop/naming/variable_name.rb +51 -6
  156. data/lib/rubocop/cop/registry.rb +9 -6
  157. data/lib/rubocop/cop/security/eval.rb +2 -1
  158. data/lib/rubocop/cop/security/json_load.rb +33 -11
  159. data/lib/rubocop/cop/security/open.rb +1 -0
  160. data/lib/rubocop/cop/style/access_modifier_declarations.rb +32 -10
  161. data/lib/rubocop/cop/style/accessor_grouping.rb +32 -6
  162. data/lib/rubocop/cop/style/arguments_forwarding.rb +21 -24
  163. data/lib/rubocop/cop/style/array_intersect.rb +113 -38
  164. data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +47 -0
  165. data/lib/rubocop/cop/style/bitwise_predicate.rb +8 -1
  166. data/lib/rubocop/cop/style/block_delimiters.rb +3 -2
  167. data/lib/rubocop/cop/style/case_like_if.rb +1 -1
  168. data/lib/rubocop/cop/style/class_and_module_children.rb +48 -10
  169. data/lib/rubocop/cop/style/class_equality_comparison.rb +1 -1
  170. data/lib/rubocop/cop/style/collection_methods.rb +1 -0
  171. data/lib/rubocop/cop/style/collection_querying.rb +167 -0
  172. data/lib/rubocop/cop/style/combinable_loops.rb +1 -0
  173. data/lib/rubocop/cop/style/command_literal.rb +1 -1
  174. data/lib/rubocop/cop/style/commented_keyword.rb +12 -5
  175. data/lib/rubocop/cop/style/comparable_between.rb +78 -0
  176. data/lib/rubocop/cop/style/conditional_assignment.rb +26 -8
  177. data/lib/rubocop/cop/style/constant_visibility.rb +14 -9
  178. data/lib/rubocop/cop/style/data_inheritance.rb +7 -0
  179. data/lib/rubocop/cop/style/def_with_parentheses.rb +18 -5
  180. data/lib/rubocop/cop/style/dig_chain.rb +1 -1
  181. data/lib/rubocop/cop/style/double_negation.rb +3 -3
  182. data/lib/rubocop/cop/style/empty_literal.rb +4 -0
  183. data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +100 -0
  184. data/lib/rubocop/cop/style/endless_method.rb +176 -18
  185. data/lib/rubocop/cop/style/eval_with_location.rb +3 -3
  186. data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
  187. data/lib/rubocop/cop/style/explicit_block_argument.rb +3 -3
  188. data/lib/rubocop/cop/style/exponential_notation.rb +5 -4
  189. data/lib/rubocop/cop/style/fetch_env_var.rb +32 -6
  190. data/lib/rubocop/cop/style/float_division.rb +15 -1
  191. data/lib/rubocop/cop/style/for.rb +1 -0
  192. data/lib/rubocop/cop/style/format_string_token.rb +38 -11
  193. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -2
  194. data/lib/rubocop/cop/style/global_std_stream.rb +3 -0
  195. data/lib/rubocop/cop/style/guard_clause.rb +2 -1
  196. data/lib/rubocop/cop/style/hash_conversion.rb +16 -8
  197. data/lib/rubocop/cop/style/hash_each_methods.rb +3 -2
  198. data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
  199. data/lib/rubocop/cop/style/hash_syntax.rb +4 -1
  200. data/lib/rubocop/cop/style/hash_transform_keys.rb +2 -2
  201. data/lib/rubocop/cop/style/hash_transform_values.rb +2 -2
  202. data/lib/rubocop/cop/style/identical_conditional_branches.rb +3 -3
  203. data/lib/rubocop/cop/style/if_inside_else.rb +10 -13
  204. data/lib/rubocop/cop/style/if_unless_modifier.rb +35 -8
  205. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +4 -7
  206. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +1 -1
  207. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  208. data/lib/rubocop/cop/style/inverse_methods.rb +10 -6
  209. data/lib/rubocop/cop/style/invertible_unless_condition.rb +2 -2
  210. data/lib/rubocop/cop/style/ip_addresses.rb +2 -2
  211. data/lib/rubocop/cop/style/it_assignment.rb +69 -12
  212. data/lib/rubocop/cop/style/it_block_parameter.rb +121 -0
  213. data/lib/rubocop/cop/style/keyword_parameters_order.rb +13 -7
  214. data/lib/rubocop/cop/style/lambda.rb +1 -0
  215. data/lib/rubocop/cop/style/lambda_call.rb +7 -2
  216. data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
  217. data/lib/rubocop/cop/style/map_into_array.rb +4 -1
  218. data/lib/rubocop/cop/style/map_to_hash.rb +12 -3
  219. data/lib/rubocop/cop/style/map_to_set.rb +1 -3
  220. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +9 -8
  221. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +16 -0
  222. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -1
  223. data/lib/rubocop/cop/style/min_max_comparison.rb +13 -5
  224. data/lib/rubocop/cop/style/multiline_block_chain.rb +2 -1
  225. data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -0
  226. data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -9
  227. data/lib/rubocop/cop/style/next.rb +44 -0
  228. data/lib/rubocop/cop/style/nil_comparison.rb +9 -7
  229. data/lib/rubocop/cop/style/object_then.rb +1 -0
  230. data/lib/rubocop/cop/style/one_line_conditional.rb +17 -9
  231. data/lib/rubocop/cop/style/parallel_assignment.rb +32 -20
  232. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
  233. data/lib/rubocop/cop/style/proc.rb +1 -0
  234. data/lib/rubocop/cop/style/raise_args.rb +8 -8
  235. data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
  236. data/lib/rubocop/cop/style/redundant_begin.rb +35 -0
  237. data/lib/rubocop/cop/style/redundant_condition.rb +57 -0
  238. data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +14 -4
  239. data/lib/rubocop/cop/style/redundant_exception.rb +1 -1
  240. data/lib/rubocop/cop/style/redundant_fetch_block.rb +1 -9
  241. data/lib/rubocop/cop/style/redundant_format.rb +79 -18
  242. data/lib/rubocop/cop/style/redundant_freeze.rb +2 -2
  243. data/lib/rubocop/cop/style/redundant_interpolation.rb +12 -3
  244. data/lib/rubocop/cop/style/redundant_line_continuation.rb +1 -4
  245. data/lib/rubocop/cop/style/redundant_parentheses.rb +73 -18
  246. data/lib/rubocop/cop/style/redundant_regexp_argument.rb +4 -0
  247. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +8 -0
  248. data/lib/rubocop/cop/style/redundant_self.rb +9 -5
  249. data/lib/rubocop/cop/style/redundant_self_assignment.rb +1 -1
  250. data/lib/rubocop/cop/style/redundant_sort_by.rb +17 -1
  251. data/lib/rubocop/cop/style/regexp_literal.rb +1 -1
  252. data/lib/rubocop/cop/style/rescue_modifier.rb +3 -0
  253. data/lib/rubocop/cop/style/return_nil.rb +2 -2
  254. data/lib/rubocop/cop/style/safe_navigation.rb +61 -14
  255. data/lib/rubocop/cop/style/select_by_regexp.rb +4 -1
  256. data/lib/rubocop/cop/style/semicolon.rb +23 -7
  257. data/lib/rubocop/cop/style/single_line_do_end_block.rb +3 -1
  258. data/lib/rubocop/cop/style/single_line_methods.rb +10 -7
  259. data/lib/rubocop/cop/style/sole_nested_conditional.rb +75 -101
  260. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -1
  261. data/lib/rubocop/cop/style/string_concatenation.rb +18 -15
  262. data/lib/rubocop/cop/style/struct_inheritance.rb +8 -1
  263. data/lib/rubocop/cop/style/super_arguments.rb +1 -2
  264. data/lib/rubocop/cop/style/symbol_array.rb +1 -1
  265. data/lib/rubocop/cop/style/symbol_proc.rb +3 -1
  266. data/lib/rubocop/cop/style/top_level_method_definition.rb +1 -0
  267. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +52 -1
  268. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
  269. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1 -1
  270. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
  271. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  272. data/lib/rubocop/cop/style/unless_else.rb +10 -9
  273. data/lib/rubocop/cop/team.rb +1 -1
  274. data/lib/rubocop/cop/util.rb +1 -1
  275. data/lib/rubocop/cop/utils/format_string.rb +15 -2
  276. data/lib/rubocop/cop/variable_force/assignment.rb +7 -3
  277. data/lib/rubocop/cop/variable_force/scope.rb +1 -1
  278. data/lib/rubocop/cop/variable_force/variable.rb +3 -8
  279. data/lib/rubocop/cop/variable_force.rb +26 -9
  280. data/lib/rubocop/cops_documentation_generator.rb +23 -7
  281. data/lib/rubocop/directive_comment.rb +1 -1
  282. data/lib/rubocop/ext/regexp_node.rb +0 -1
  283. data/lib/rubocop/formatter/disabled_config_formatter.rb +19 -5
  284. data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
  285. data/lib/rubocop/formatter/html_formatter.rb +1 -1
  286. data/lib/rubocop/formatter/markdown_formatter.rb +1 -0
  287. data/lib/rubocop/formatter/offense_count_formatter.rb +1 -1
  288. data/lib/rubocop/formatter/pacman_formatter.rb +2 -1
  289. data/lib/rubocop/lsp/diagnostic.rb +25 -24
  290. data/lib/rubocop/lsp/routes.rb +65 -9
  291. data/lib/rubocop/lsp/runtime.rb +5 -5
  292. data/lib/rubocop/lsp/server.rb +2 -2
  293. data/lib/rubocop/lsp/stdin_runner.rb +3 -17
  294. data/lib/rubocop/magic_comment.rb +8 -0
  295. data/lib/rubocop/pending_cops_reporter.rb +56 -0
  296. data/lib/rubocop/plugin/configuration_integrator.rb +2 -0
  297. data/lib/rubocop/plugin/load_error.rb +1 -1
  298. data/lib/rubocop/plugin.rb +9 -2
  299. data/lib/rubocop/result_cache.rb +14 -12
  300. data/lib/rubocop/rspec/cop_helper.rb +6 -1
  301. data/lib/rubocop/rspec/expect_offense.rb +9 -3
  302. data/lib/rubocop/rspec/shared_contexts.rb +34 -0
  303. data/lib/rubocop/rspec/support.rb +3 -0
  304. data/lib/rubocop/runner.rb +10 -4
  305. data/lib/rubocop/server/cache.rb +17 -12
  306. data/lib/rubocop/server/client_command/base.rb +10 -0
  307. data/lib/rubocop/server/client_command/exec.rb +2 -1
  308. data/lib/rubocop/server/client_command/start.rb +11 -1
  309. data/lib/rubocop/target_finder.rb +13 -9
  310. data/lib/rubocop/target_ruby.rb +11 -2
  311. data/lib/rubocop/version.rb +14 -7
  312. data/lib/rubocop.rb +17 -2
  313. data/lib/ruby_lsp/rubocop/addon.rb +25 -10
  314. data/lib/ruby_lsp/rubocop/runtime_adapter.rb +57 -5
  315. metadata +24 -8
  316. data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
@@ -6,6 +6,26 @@ InternalAffairs/CopDescription:
6
6
  Include:
7
7
  - 'lib/rubocop/cop/**/*.rb'
8
8
 
9
+ InternalAffairs/ExampleHeredocDelimiter:
10
+ Include:
11
+ - 'spec/rubocop/cop/**/*.rb'
12
+
13
+ InternalAffairs/ExampleDescription:
14
+ Include:
15
+ - 'spec/rubocop/cop/**/*.rb'
16
+
17
+ InternalAffairs/NodeTypeGroup:
18
+ Include:
19
+ - 'lib/rubocop/cop/**/*.rb'
20
+
21
+ InternalAffairs/OnSendWithoutOnCSend:
22
+ Include:
23
+ - 'lib/rubocop/cop/**/*.rb'
24
+
25
+ InternalAffairs/UndefinedConfig:
26
+ Include:
27
+ - 'lib/rubocop/cop/**/*.rb'
28
+
9
29
  InternalAffairs/UselessMessageAssertion:
10
30
  Include:
11
31
  - '**/*_spec.rb'
@@ -31,6 +31,9 @@ renamed:
31
31
  Lint/UnneededRequireStatement: Lint/RedundantRequireStatement
32
32
  Lint/UnneededSplatExpansion: Lint/RedundantSplatExpansion
33
33
  Metrics/LineLength: Layout/LineLength
34
+ Naming/PredicateName:
35
+ new_name: Naming/PredicatePrefix
36
+ severity: warning
34
37
  Naming/UncommunicativeBlockParamName: Naming/BlockParameterName
35
38
  Naming/UncommunicativeMethodParamName: Naming/MethodParameterName
36
39
  Style/AccessorMethodName: Naming/AccessorMethodName
@@ -43,7 +46,9 @@ renamed:
43
46
  Style/MethodCallParentheses: Style/MethodCallWithoutArgsParentheses
44
47
  Style/MethodName: Naming/MethodName
45
48
  Style/OpMethod: Naming/BinaryOperatorParameterName
46
- Style/PredicateName: Naming/PredicateName
49
+ Style/PredicateName:
50
+ new_name: Naming/PredicatePrefix
51
+ severity: warning
47
52
  Style/SingleSpaceBeforeFirstArg: Layout/SpaceBeforeFirstArg
48
53
  Style/UnneededCapitalW: Style/RedundantCapitalW
49
54
  Style/UnneededCondition: Style/RedundantCondition
@@ -177,10 +182,10 @@ changed_parameters:
177
182
  - cops: Naming/HeredocDelimiterNaming
178
183
  parameters: Blacklist
179
184
  alternative: ForbiddenDelimiters
180
- - cops: Naming/PredicateName
185
+ - cops: Naming/PredicatePrefix
181
186
  parameters: NamePrefixBlacklist
182
187
  alternative: ForbiddenPrefixes
183
- - cops: Naming/PredicateName
188
+ - cops: Naming/PredicatePrefix
184
189
  parameters: NameWhitelist
185
190
  alternative: AllowedMethods
186
191
  - cops:
data/exe/rubocop CHANGED
@@ -12,13 +12,6 @@ if RuboCop::Server.running?
12
12
  exit_status = RuboCop::Server::ClientCommand::Exec.new.run
13
13
  else
14
14
  require 'rubocop'
15
-
16
- cli = RuboCop::CLI.new
17
-
18
- time_start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
19
- exit_status = cli.run
20
- elapsed_time = Process.clock_gettime(Process::CLOCK_MONOTONIC) - time_start
21
-
22
- puts "Finished in #{elapsed_time} seconds" if cli.options[:debug] || cli.options[:display_time]
15
+ exit_status = RuboCop::CLI.new.run
23
16
  end
24
17
  exit exit_status
@@ -83,7 +83,7 @@ module RuboCop
83
83
  execute_runner
84
84
  @options.delete(:only)
85
85
  @config_store = ConfigStore.new
86
- @config_store.options_config = @options[:config] if @options[:config]
86
+ @config_store.apply_options!(@options)
87
87
  # Save the todo configuration of the LineLength cop.
88
88
  File.read(AUTO_GENERATED_FILE).lines.drop_while { |line| line.start_with?('#') }.join
89
89
  end
@@ -99,7 +99,7 @@ module RuboCop
99
99
 
100
100
  def reset_config_and_auto_gen_file
101
101
  @config_store = ConfigStore.new
102
- @config_store.options_config = @options[:config] if @options[:config]
102
+ @config_store.apply_options!(@options)
103
103
  File.open(AUTO_GENERATED_FILE, 'w') {} # create or truncate if exists
104
104
  add_inheritance_from_auto_generated_file(@options[:config])
105
105
  end
data/lib/rubocop/cli.rb CHANGED
@@ -12,7 +12,7 @@ module RuboCop
12
12
  STATUS_INTERRUPTED = Signal.list['INT'] + 128
13
13
  DEFAULT_PARALLEL_OPTIONS = %i[
14
14
  color config debug display_style_guide display_time display_only_fail_level_offenses
15
- display_only_failed editor_mode except extra_details fail_level fix_layout format
15
+ display_only_failed editor_mode except extra_details fail_level fix_layout format formatters
16
16
  ignore_disable_comments lint only only_guide_cops require safe
17
17
  autocorrect safe_autocorrect autocorrect_all
18
18
  ].freeze
@@ -37,6 +37,8 @@ module RuboCop
37
37
  #
38
38
  # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
39
39
  def run(args = ARGV)
40
+ time_start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
41
+
40
42
  @options, paths = Options.new.parse(args)
41
43
  @env = Environment.new(@options, @config_store, paths)
42
44
 
@@ -48,11 +50,12 @@ module RuboCop
48
50
  validate_options_vs_config
49
51
  parallel_by_default!
50
52
  apply_default_formatter
53
+ report_pending_cops
51
54
  execute_runners
52
55
  end
53
56
  end
54
57
  rescue ConfigNotFoundError, IncorrectCopNameError, OptionArgumentError => e
55
- warn e.message
58
+ warn Rainbow(e.message).red
56
59
  STATUS_ERROR
57
60
  rescue RuboCop::Error => e
58
61
  warn Rainbow("Error: #{e.message}").red
@@ -71,6 +74,9 @@ module RuboCop
71
74
  warn e.message
72
75
  warn e.backtrace
73
76
  STATUS_ERROR
77
+ ensure
78
+ elapsed_time = Process.clock_gettime(Process::CLOCK_MONOTONIC) - time_start
79
+ puts "Finished in #{elapsed_time} seconds" if @options[:debug] || @options[:display_time]
74
80
  end
75
81
  # rubocop:enable Metrics/MethodLength, Metrics/AbcSize
76
82
 
@@ -155,10 +161,10 @@ module RuboCop
155
161
 
156
162
  def act_on_options
157
163
  set_options_to_config_loader
164
+ set_options_to_pending_cops_reporter
158
165
  handle_editor_mode
159
166
 
160
- @config_store.options_config = @options[:config] if @options[:config]
161
- @config_store.force_default_config! if @options[:force_default_config]
167
+ @config_store.apply_options!(@options)
162
168
 
163
169
  handle_exiting_options
164
170
 
@@ -179,6 +185,11 @@ module RuboCop
179
185
  ConfigLoader.ignore_unrecognized_cops = @options[:ignore_unrecognized_cops]
180
186
  end
181
187
 
188
+ def set_options_to_pending_cops_reporter
189
+ PendingCopsReporter.disable_pending_cops = @options[:disable_pending_cops]
190
+ PendingCopsReporter.enable_pending_cops = @options[:enable_pending_cops]
191
+ end
192
+
182
193
  def handle_editor_mode
183
194
  RuboCop::LSP.enable if @options[:editor_mode]
184
195
  end
@@ -208,5 +219,9 @@ module RuboCop
208
219
  [[formatter, @options[:output_path]]]
209
220
  end
210
221
  end
222
+
223
+ def report_pending_cops
224
+ PendingCopsReporter.warn_if_needed(@config_store.for_pwd)
225
+ end
211
226
  end
212
227
  end
@@ -27,14 +27,43 @@ module RuboCop
27
27
  config
28
28
  end
29
29
 
30
- # rubocop:disable Metrics/AbcSize
30
+ # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
31
31
  def initialize(hash = RuboCop::ConfigLoader.default_configuration, loaded_path = nil)
32
32
  @loaded_path = loaded_path
33
33
  @for_cop = Hash.new do |h, cop|
34
34
  cop_name = cop.respond_to?(:cop_name) ? cop.cop_name : cop
35
- qualified_cop_name = Cop::Registry.qualified_cop_name(cop_name, loaded_path)
36
- cop_options = self[qualified_cop_name].dup || {}
37
- cop_options['Enabled'] = enable_cop?(qualified_cop_name, cop_options)
35
+
36
+ if ConfigObsoletion.deprecated_cop_name?(cop)
37
+ # Since a deprecated cop will no longer have a qualified name (as the badge is no
38
+ # longer valid), and since we do not want to automatically enable the cop, we just
39
+ # set the configuration to an empty hash if it is unset.
40
+ # This is necessary to allow a renamed cop have its old configuration merged in
41
+ # before being used (which is necessary to allow it to be disabled via config).
42
+ cop_options = self[cop_name].dup || {}
43
+ else
44
+ qualified_cop_name = Cop::Registry.qualified_cop_name(cop_name, loaded_path, warn: false)
45
+ cop_options = self[qualified_cop_name].dup || {}
46
+ cop_options['Enabled'] = enable_cop?(qualified_cop_name, cop_options)
47
+
48
+ # If the cop has deprecated names (ie. it has been renamed), it is possible that
49
+ # users will still have old configuration for the cop's old name. In this case,
50
+ # if `ConfigObsoletion` is configured to warn rather than error (and therefore
51
+ # RuboCop runs), we want to respect the old configuration, so merge it in.
52
+ #
53
+ # NOTE: If there is configuration for both the cop and a deprecated names, the old
54
+ # configuration will be merged on top of the new configuration!
55
+ ConfigObsoletion.deprecated_names_for(cop).each do |deprecated_cop_name|
56
+ deprecated_config = @for_cop[deprecated_cop_name]
57
+ next if deprecated_config.empty?
58
+
59
+ warn Rainbow(<<~WARNING).yellow
60
+ Warning: Using `#{deprecated_cop_name}` configuration in #{loaded_path} for `#{cop}`.
61
+ WARNING
62
+
63
+ cop_options.merge!(@for_cop[deprecated_cop_name])
64
+ end
65
+ end
66
+
38
67
  h[cop] = h[cop_name] = cop_options
39
68
  end
40
69
  @hash = hash
@@ -43,7 +72,7 @@ module RuboCop
43
72
  @badge_config_cache = {}.compare_by_identity
44
73
  @clusivity_config_exists_cache = {}
45
74
  end
46
- # rubocop:enable Metrics/AbcSize
75
+ # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
47
76
 
48
77
  def loaded_plugins
49
78
  @loaded_plugins ||= ConfigLoader.loaded_plugins
@@ -262,7 +291,7 @@ module RuboCop
262
291
  end
263
292
 
264
293
  def parser_engine
265
- @parser_engine ||= for_all_cops.fetch('ParserEngine', :parser_whitequark).to_sym
294
+ @parser_engine ||= for_all_cops.fetch('ParserEngine', :default).to_sym
266
295
  end
267
296
 
268
297
  def target_rails_version
@@ -22,14 +22,6 @@ module RuboCop
22
22
  class << self
23
23
  include FileFinder
24
24
 
25
- PENDING_BANNER = <<~BANNER
26
- The following cops were added to RuboCop, but are not configured. Please set Enabled to either `true` or `false` in your `.rubocop.yml` file.
27
-
28
- Please also note that you can opt-in to new cops by default by adding this to your config:
29
- AllCops:
30
- NewCops: enable
31
- BANNER
32
-
33
25
  attr_accessor :debug, :ignore_parent_exclusion, :disable_pending_cops, :enable_pending_cops,
34
26
  :ignore_unrecognized_cops
35
27
  attr_writer :default_configuration
@@ -63,7 +55,6 @@ module RuboCop
63
55
  loaded_features = resolver.resolve_requires(path, hash)
64
56
  add_loaded_features(loaded_features)
65
57
 
66
- resolver.override_department_setting_for_cops({}, hash)
67
58
  resolver.resolve_inheritance_from_gems(hash)
68
59
  resolver.resolve_inheritance(path, hash, file, debug?)
69
60
  hash.delete('inherit_from')
@@ -84,7 +75,9 @@ module RuboCop
84
75
 
85
76
  puts "configuration from #{absolute_path}" if debug?
86
77
 
87
- raise(TypeError, "Malformed configuration in #{absolute_path}") unless hash.is_a?(Hash)
78
+ unless hash.is_a?(Hash)
79
+ raise(ValidationError, "Malformed configuration in #{absolute_path}")
80
+ end
88
81
 
89
82
  hash
90
83
  end
@@ -92,8 +85,12 @@ module RuboCop
92
85
  def add_missing_namespaces(path, hash)
93
86
  # Using `hash.each_key` will cause the
94
87
  # `can't add a new key into hash during iteration` error
88
+ obsoletion = ConfigObsoletion.new(hash)
89
+
95
90
  hash_keys = hash.keys
96
91
  hash_keys.each do |key|
92
+ next if obsoletion.deprecated_cop_name?(key)
93
+
97
94
  q = Cop::Registry.qualified_cop_name(key, path)
98
95
  next if q == key
99
96
 
@@ -129,21 +126,7 @@ module RuboCop
129
126
  add_excludes_from_files(config, config_file)
130
127
  end
131
128
 
132
- merge_with_default(config, config_file).tap do |merged_config|
133
- unless possible_new_cops?(merged_config)
134
- pending_cops = pending_cops_only_qualified(merged_config.pending_cops)
135
- warn_on_pending_cops(pending_cops) unless pending_cops.empty?
136
- end
137
- end
138
- end
139
-
140
- def pending_cops_only_qualified(pending_cops)
141
- pending_cops.select { |cop| Cop::Registry.qualified_cop?(cop.name) }
142
- end
143
-
144
- def possible_new_cops?(config)
145
- disable_pending_cops || enable_pending_cops ||
146
- config.disabled_new_cops? || config.enabled_new_cops?
129
+ merge_with_default(config, config_file)
147
130
  end
148
131
 
149
132
  def add_excludes_from_files(config, config_file)
@@ -205,21 +188,6 @@ module RuboCop
205
188
  ConfigFinder.project_root
206
189
  end
207
190
 
208
- def warn_on_pending_cops(pending_cops)
209
- warn Rainbow(PENDING_BANNER).yellow
210
-
211
- pending_cops.each { |cop| warn_pending_cop cop }
212
-
213
- warn Rainbow('For more information: https://docs.rubocop.org/rubocop/versioning.html').yellow
214
- end
215
-
216
- def warn_pending_cop(cop)
217
- version = cop.metadata['VersionAdded'] || 'N/A'
218
-
219
- warn Rainbow("#{cop.name}: # new in #{version}").yellow
220
- warn Rainbow(' Enabled: true').yellow
221
- end
222
-
223
191
  # Merges the given configuration with the default one.
224
192
  def merge_with_default(config, config_file, unset_nil: true)
225
193
  resolver.merge_with_default(config, config_file, unset_nil: unset_nil)
@@ -9,7 +9,8 @@ module RuboCop
9
9
  # @api private
10
10
  class ConfigLoaderResolver # rubocop:disable Metrics/ClassLength
11
11
  def resolve_plugins(rubocop_config, plugins)
12
- return if (plugins = Array(plugins)).empty?
12
+ plugins = Array(plugins) - ConfigLoader.loaded_plugins.map { |plugin| plugin.about.name }
13
+ return if plugins.empty?
13
14
 
14
15
  Plugin.integrate_plugins(rubocop_config, plugins)
15
16
  end
@@ -123,7 +124,7 @@ module RuboCop
123
124
  elsif merge_hashes?(base_hash, derived_hash, key)
124
125
  result[key] = merge(base_hash[key], derived_hash[key], **opts)
125
126
  elsif should_union?(derived_hash, base_hash, opts[:inherit_mode], key)
126
- result[key] = base_hash[key] | derived_hash[key]
127
+ result[key] = Array(base_hash[key]) | Array(derived_hash[key])
127
128
  elsif opts[:debug]
128
129
  warn_on_duplicate_setting(base_hash, derived_hash, key, **opts)
129
130
  end
@@ -205,7 +206,7 @@ module RuboCop
205
206
  end
206
207
 
207
208
  def should_union?(derived_hash, base_hash, root_mode, key)
208
- return false unless base_hash[key].is_a?(Array)
209
+ return false unless base_hash[key].is_a?(Array) || derived_hash[key].is_a?(Array)
209
210
 
210
211
  derived_mode = derived_hash['inherit_mode']
211
212
  return false if should_override?(derived_mode, key)
@@ -294,10 +295,11 @@ module RuboCop
294
295
  begin
295
296
  gem = Bundler.load.specs[gem_name].first
296
297
  gem_path = gem.full_gem_path if gem
297
- rescue Bundler::GemfileNotFound
298
- # No Gemfile found. Bundler may be loaded manually
299
- rescue Bundler::GitError
300
- # The Gemfile exists but contains an uninstalled git source
298
+ rescue StandardError
299
+ # The Gemfile has a problem, which could be one of:
300
+ # - No Gemfile found. Bundler may be loaded manually
301
+ # - The Gemfile exists but contains an uninstalled git source
302
+ # - The Gemfile exists but cannot be loaded for some other reason
301
303
  end
302
304
  end
303
305
 
@@ -15,7 +15,7 @@ module RuboCop
15
15
  end
16
16
 
17
17
  def violated?
18
- return false if feature_loaded?
18
+ return false if plugin_loaded?
19
19
 
20
20
  affected_cops.any?
21
21
  end
@@ -38,8 +38,9 @@ module RuboCop
38
38
  end
39
39
  end
40
40
 
41
- def feature_loaded?
42
- config.loaded_features.include?(gem)
41
+ def plugin_loaded?
42
+ # Plugins loaded via `require` are included in `loaded_features`.
43
+ config.loaded_plugins.include?(gem) || config.loaded_features.include?(gem)
43
44
  end
44
45
  end
45
46
  end
@@ -6,17 +6,28 @@ module RuboCop
6
6
  # a cop or moving it to a new department.
7
7
  # @api private
8
8
  class RenamedCop < CopRule
9
- attr_reader :new_name
9
+ attr_reader :new_name, :metadata
10
10
 
11
- def initialize(config, old_name, new_name)
11
+ def initialize(config, old_name, name_or_hash)
12
12
  super(config, old_name)
13
- @new_name = new_name
13
+
14
+ if name_or_hash.is_a?(Hash)
15
+ @metadata = name_or_hash
16
+ @new_name = name_or_hash['new_name']
17
+ else
18
+ @metadata = {}
19
+ @new_name = name_or_hash
20
+ end
14
21
  end
15
22
 
16
23
  def rule_message
17
24
  "The `#{old_name}` cop has been #{verb} to `#{new_name}`."
18
25
  end
19
26
 
27
+ def warning?
28
+ severity == 'warning'
29
+ end
30
+
20
31
  private
21
32
 
22
33
  def moved?
@@ -29,6 +40,10 @@ module RuboCop
29
40
  def verb
30
41
  moved? ? 'moved' : 'renamed'
31
42
  end
43
+
44
+ def severity
45
+ metadata['severity']
46
+ end
32
47
  end
33
48
  end
34
49
  end
@@ -23,9 +23,40 @@ module RuboCop
23
23
  class << self
24
24
  attr_accessor :files
25
25
 
26
+ def global
27
+ @global ||= new(Config.new)
28
+ end
29
+
30
+ def reset!
31
+ @global = nil
32
+ @deprecated_names = {}
33
+ LOAD_RULES_CACHE[rules_cache_key] = nil
34
+ end
35
+
36
+ def rules_cache_key
37
+ files.hash
38
+ end
39
+
26
40
  def legacy_cop_names
27
41
  # Used by DepartmentName#qualified_legacy_cop_name
28
- new(Config.new).rules.select(&:cop_rule?).map(&:old_name)
42
+ global.legacy_cop_names
43
+ end
44
+
45
+ def deprecated_cop_name?(name)
46
+ global.deprecated_cop_name?(name)
47
+ end
48
+
49
+ def deprecated_names_for(cop)
50
+ @deprecated_names ||= {}
51
+ return @deprecated_names[cop] if @deprecated_names.key?(cop)
52
+
53
+ @deprecated_names[cop] = global.rules.filter_map do |rule|
54
+ next unless rule.cop_rule?
55
+ next unless rule.respond_to?(:new_name)
56
+ next unless rule.new_name == cop
57
+
58
+ rule.old_name
59
+ end
29
60
  end
30
61
  end
31
62
 
@@ -45,12 +76,21 @@ module RuboCop
45
76
  raise ValidationError, messages.join("\n")
46
77
  end
47
78
 
79
+ def legacy_cop_names
80
+ # Used by DepartmentName#qualified_legacy_cop_name
81
+ cop_rules.map(&:old_name)
82
+ end
83
+
84
+ def deprecated_cop_name?(name)
85
+ legacy_cop_names.include?(name)
86
+ end
87
+
48
88
  private
49
89
 
50
90
  # Default rules for obsoletions are in config/obsoletion.yml
51
91
  # Additional rules files can be added with `RuboCop::ConfigObsoletion.files << filename`
52
92
  def load_rules # rubocop:disable Metrics/AbcSize
53
- rules = LOAD_RULES_CACHE[self.class.files] ||=
93
+ rules = LOAD_RULES_CACHE[self.class.rules_cache_key] ||=
54
94
  self.class.files.each_with_object({}) do |filename, hash|
55
95
  hash.merge!(YAML.safe_load(File.read(filename)) || {}) do |_key, first, second|
56
96
  case first
@@ -107,5 +147,9 @@ module RuboCop
107
147
  rule.message
108
148
  end
109
149
  end
150
+
151
+ def cop_rules
152
+ rules.select(&:cop_rule?)
153
+ end
110
154
  end
111
155
  end
@@ -25,6 +25,11 @@ module RuboCop
25
25
  @validated = true
26
26
  end
27
27
 
28
+ def apply_options!(options)
29
+ self.options_config = options[:config] if options[:config]
30
+ force_default_config! if options[:force_default_config]
31
+ end
32
+
28
33
  def options_config=(options_config)
29
34
  loaded_config = ConfigLoader.load_file(options_config)
30
35
  @options_config = ConfigLoader.merge_with_default(loaded_config, options_config)
@@ -9,16 +9,16 @@ module RuboCop
9
9
 
10
10
  # @api private
11
11
  COMMON_PARAMS = %w[Exclude Include Severity inherit_mode AutoCorrect StyleGuide Details
12
- Enabled].freeze
12
+ Enabled Reference References].freeze
13
13
  # @api private
14
14
  INTERNAL_PARAMS = %w[Description StyleGuide
15
15
  VersionAdded VersionChanged VersionRemoved
16
- Reference Safe SafeAutoCorrect].freeze
16
+ Reference References Safe SafeAutoCorrect].freeze
17
17
  # @api private
18
18
  NEW_COPS_VALUES = %w[pending disable enable].freeze
19
19
 
20
20
  # @api private
21
- CONFIG_CHECK_KEYS = %w[Enabled Safe SafeAutoCorrect AutoCorrect].to_set.freeze
21
+ CONFIG_CHECK_KEYS = %w[Enabled Safe SafeAutoCorrect AutoCorrect References].to_set.freeze
22
22
  CONFIG_CHECK_DEPARTMENTS = %w[pending override_department].freeze
23
23
  CONFIG_CHECK_AUTOCORRECTS = %w[always contextual disabled].freeze
24
24
  private_constant :CONFIG_CHECK_KEYS, :CONFIG_CHECK_DEPARTMENTS
@@ -118,6 +118,7 @@ module RuboCop
118
118
  invalid_cop_names.each do |name|
119
119
  # There could be a custom cop with this name. If so, don't warn
120
120
  next if Cop::Registry.global.contains_cop_matching?([name])
121
+ next if ConfigObsoletion.deprecated_cop_name?(name)
121
122
 
122
123
  # Special case for inherit_mode, which is a directive that we keep in
123
124
  # the configuration (even though it's not a cop), because it's easier
@@ -259,8 +260,7 @@ module RuboCop
259
260
  end
260
261
  end
261
262
 
262
- # rubocop:disable Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity
263
- def check_cop_config_value(hash, parent = nil)
263
+ def check_cop_config_value(hash, parent = nil) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
264
264
  hash.each do |key, value|
265
265
  check_cop_config_value(value, key) if value.is_a?(Hash)
266
266
 
@@ -270,6 +270,8 @@ module RuboCop
270
270
  supposed_values = 'a boolean'
271
271
  elsif key == 'AutoCorrect' && !CONFIG_CHECK_AUTOCORRECTS.include?(value)
272
272
  supposed_values = '`always`, `contextual`, `disabled`, or a boolean'
273
+ elsif key == 'References'
274
+ supposed_values = 'an array of strings'
273
275
  else
274
276
  next
275
277
  end
@@ -277,7 +279,6 @@ module RuboCop
277
279
  raise ValidationError, param_error_message(parent, key, value, supposed_values)
278
280
  end
279
281
  end
280
- # rubocop:enable Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity
281
282
 
282
283
  # FIXME: Handling colors in exception messages like this is ugly.
283
284
  def param_error_message(parent, key, value, supposed_values)
@@ -35,8 +35,8 @@ module RuboCop
35
35
  # `false` is the same as `disabled` for backward compatibility.
36
36
  return false if ['disabled', false].include?(cop_config['AutoCorrect'])
37
37
 
38
- # When LSP is enabled, it is considered as editing source code,
39
- # and autocorrection with `AutoCorrect: contextual` will not be performed.
38
+ # When LSP is enabled or the `--editor-mode` option is on, it is considered as editing
39
+ # source code, and autocorrection with `AutoCorrect: contextual` will not be performed.
40
40
  return false if contextual_autocorrect? && LSP.enabled?
41
41
 
42
42
  # :safe_autocorrect is a derived option based on several command-line
@@ -50,7 +50,7 @@ module RuboCop
50
50
 
51
51
  def disable_offense(offense_range)
52
52
  unbreakable_range = multiline_ranges(offense_range)&.find do |range|
53
- range_overlaps_offense?(offense_range, range)
53
+ eol_comment_would_be_inside_literal?(offense_range, range)
54
54
  end
55
55
 
56
56
  if unbreakable_range
@@ -75,22 +75,26 @@ module RuboCop
75
75
  end
76
76
 
77
77
  def disable_offense_with_eol_or_surround_comment(range)
78
- eol_comment = " # rubocop:todo #{cop_name}"
79
- needed_line_length = (range.source_line + eol_comment).length
80
-
81
- if needed_line_length <= max_line_length
82
- disable_offense_at_end_of_line(range_of_first_line(range), eol_comment)
83
- else
78
+ if line_with_eol_comment_too_long?(range)
84
79
  disable_offense_before_and_after(range_by_lines(range))
80
+ else
81
+ disable_offense_at_end_of_line(range_of_first_line(range))
85
82
  end
86
83
  end
87
84
 
88
- def range_overlaps_offense?(offense_range, range)
89
- offense_range.begin_pos > range.begin_pos && range.overlaps?(offense_range)
85
+ def eol_comment_would_be_inside_literal?(offense_range, literal_range)
86
+ return true if line_with_eol_comment_too_long?(offense_range)
87
+
88
+ offense_line = offense_range.line
89
+ offense_line >= literal_range.first_line && offense_line < literal_range.last_line
90
+ end
91
+
92
+ def line_with_eol_comment_too_long?(range)
93
+ (range.source_line + eol_comment).length > max_line_length
90
94
  end
91
95
 
92
96
  def surrounding_heredoc?(node)
93
- node.type?(:str, :dstr, :xstr) && node.heredoc?
97
+ node.any_str_type? && node.heredoc?
94
98
  end
95
99
 
96
100
  def heredoc_range(node)
@@ -102,7 +106,7 @@ module RuboCop
102
106
  end
103
107
 
104
108
  def string_continuation?(node)
105
- node.type?(:str, :dstr, :xstr) && node.source.match?(/\\\s*$/)
109
+ node.any_str_type? && node.source.match?(/\\\s*$/)
106
110
  end
107
111
 
108
112
  def multiline_string?(node)
@@ -132,10 +136,14 @@ module RuboCop
132
136
  config.for_cop('Layout/LineLength')['Max'] || 120
133
137
  end
134
138
 
135
- def disable_offense_at_end_of_line(range, eol_comment)
139
+ def disable_offense_at_end_of_line(range)
136
140
  Corrector.new(range).insert_after(range, eol_comment)
137
141
  end
138
142
 
143
+ def eol_comment
144
+ " # rubocop:todo #{cop_name}"
145
+ end
146
+
139
147
  def disable_offense_before_and_after(range_by_lines)
140
148
  range_with_newline = range_by_lines.resize(range_by_lines.size + 1)
141
149
  leading_whitespace = range_by_lines.source_line[/^\s*/]
@@ -45,7 +45,7 @@ module RuboCop
45
45
 
46
46
  gem_declarations(processed_source.ast)
47
47
  .each_cons(2) do |previous, current|
48
- next unless consecutive_lines(previous, current)
48
+ next unless consecutive_lines?(previous, current)
49
49
  next unless case_insensitive_out_of_order?(gem_name(current), gem_name(previous))
50
50
 
51
51
  register_offense(previous, current)