rubocop 1.69.2 → 1.73.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (299) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +4 -4
  4. data/config/default.yml +90 -13
  5. data/config/internal_affairs.yml +16 -0
  6. data/lib/rubocop/cli/command/execute_runner.rb +3 -3
  7. data/lib/rubocop/cli/command/show_cops.rb +24 -2
  8. data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
  9. data/lib/rubocop/comment_config.rb +2 -2
  10. data/lib/rubocop/config.rb +17 -4
  11. data/lib/rubocop/config_loader.rb +48 -8
  12. data/lib/rubocop/config_loader_resolver.rb +35 -10
  13. data/lib/rubocop/config_validator.rb +19 -9
  14. data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
  15. data/lib/rubocop/cop/base.rb +6 -0
  16. data/lib/rubocop/cop/bundler/duplicated_gem.rb +1 -1
  17. data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
  18. data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
  19. data/lib/rubocop/cop/internal_affairs/example_description.rb +4 -2
  20. data/lib/rubocop/cop/internal_affairs/location_exists.rb +116 -0
  21. data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
  22. data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +3 -2
  23. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -1
  24. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
  25. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
  26. data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +229 -0
  27. data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
  28. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
  29. data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
  30. data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
  31. data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +3 -1
  32. data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
  33. data/lib/rubocop/cop/internal_affairs/undefined_config.rb +7 -1
  34. data/lib/rubocop/cop/internal_affairs.rb +5 -16
  35. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -1
  36. data/lib/rubocop/cop/layout/argument_alignment.rb +2 -8
  37. data/lib/rubocop/cop/layout/block_alignment.rb +3 -1
  38. data/lib/rubocop/cop/layout/class_structure.rb +9 -9
  39. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +4 -4
  40. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  41. data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
  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 +7 -11
  44. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +27 -1
  45. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +1 -1
  46. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +22 -2
  47. data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
  48. data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
  49. data/lib/rubocop/cop/layout/first_argument_indentation.rb +3 -8
  50. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +2 -7
  51. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
  52. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
  53. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
  54. data/lib/rubocop/cop/layout/hash_alignment.rb +6 -4
  55. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -1
  56. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +7 -1
  57. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
  58. data/lib/rubocop/cop/layout/line_length.rb +4 -3
  59. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
  60. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
  61. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +1 -0
  62. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
  63. data/lib/rubocop/cop/layout/redundant_line_break.rb +7 -6
  64. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +1 -1
  65. data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -1
  66. data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
  67. data/lib/rubocop/cop/layout/space_after_comma.rb +1 -1
  68. data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
  69. data/lib/rubocop/cop/layout/space_after_semicolon.rb +1 -1
  70. data/lib/rubocop/cop/layout/space_around_keyword.rb +1 -0
  71. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
  72. data/lib/rubocop/cop/layout/space_around_operators.rb +3 -3
  73. data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
  74. data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
  75. data/lib/rubocop/cop/layout/trailing_whitespace.rb +5 -3
  76. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
  77. data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +119 -0
  78. data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
  79. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +1 -1
  80. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
  81. data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
  82. data/lib/rubocop/cop/lint/cop_directive_syntax.rb +84 -0
  83. data/lib/rubocop/cop/lint/debugger.rb +1 -1
  84. data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
  85. data/lib/rubocop/cop/lint/duplicate_methods.rb +0 -14
  86. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -1
  87. data/lib/rubocop/cop/lint/duplicate_set_element.rb +20 -7
  88. data/lib/rubocop/cop/lint/empty_conditional_body.rb +10 -5
  89. data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
  90. data/lib/rubocop/cop/lint/float_comparison.rb +6 -8
  91. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  92. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
  93. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  94. data/lib/rubocop/cop/lint/literal_as_condition.rb +99 -9
  95. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +24 -6
  96. data/lib/rubocop/cop/lint/missing_super.rb +2 -2
  97. data/lib/rubocop/cop/lint/mixed_case_range.rb +3 -3
  98. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  99. data/lib/rubocop/cop/lint/nested_method_definition.rb +8 -4
  100. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  101. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +4 -3
  102. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +1 -1
  103. data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +18 -31
  104. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +2 -1
  105. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -5
  106. data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
  107. data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -21
  108. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
  109. data/lib/rubocop/cop/lint/redundant_type_conversion.rb +252 -0
  110. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  111. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +8 -1
  112. data/lib/rubocop/cop/lint/shared_mutable_default.rb +65 -0
  113. data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
  114. data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
  115. data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
  116. data/lib/rubocop/cop/lint/syntax.rb +4 -1
  117. data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +1 -4
  118. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +1 -1
  119. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -1
  120. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  121. data/lib/rubocop/cop/lint/unreachable_loop.rb +1 -1
  122. data/lib/rubocop/cop/lint/useless_access_modifier.rb +4 -4
  123. data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
  124. data/lib/rubocop/cop/lint/useless_constant_scoping.rb +80 -0
  125. data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
  126. data/lib/rubocop/cop/lint/useless_numeric_operation.rb +2 -1
  127. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +2 -2
  128. data/lib/rubocop/cop/lint/void.rb +11 -9
  129. data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
  130. data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
  131. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -1
  132. data/lib/rubocop/cop/metrics/method_length.rb +8 -1
  133. data/lib/rubocop/cop/metrics/module_length.rb +1 -1
  134. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
  135. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
  136. data/lib/rubocop/cop/mixin/alignment.rb +2 -2
  137. data/lib/rubocop/cop/mixin/allowed_pattern.rb +4 -4
  138. data/lib/rubocop/cop/mixin/check_line_breakable.rb +11 -11
  139. data/lib/rubocop/cop/mixin/comments_help.rb +4 -2
  140. data/lib/rubocop/cop/mixin/dig_help.rb +1 -1
  141. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -1
  142. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +22 -22
  143. data/lib/rubocop/cop/mixin/hash_subset.rb +203 -0
  144. data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
  145. data/lib/rubocop/cop/mixin/method_complexity.rb +1 -1
  146. data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
  147. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +48 -24
  148. data/lib/rubocop/cop/mixin/range_help.rb +3 -3
  149. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
  150. data/lib/rubocop/cop/mixin/statement_modifier.rb +8 -3
  151. data/lib/rubocop/cop/mixin/string_help.rb +2 -2
  152. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  153. data/lib/rubocop/cop/mixin/trailing_comma.rb +15 -3
  154. data/lib/rubocop/cop/naming/block_forwarding.rb +19 -15
  155. data/lib/rubocop/cop/naming/predicate_name.rb +44 -0
  156. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +3 -3
  157. data/lib/rubocop/cop/naming/variable_name.rb +64 -6
  158. data/lib/rubocop/cop/security/compound_hash.rb +1 -0
  159. data/lib/rubocop/cop/style/access_modifier_declarations.rb +34 -5
  160. data/lib/rubocop/cop/style/accessor_grouping.rb +19 -5
  161. data/lib/rubocop/cop/style/and_or.rb +1 -1
  162. data/lib/rubocop/cop/style/arguments_forwarding.rb +39 -23
  163. data/lib/rubocop/cop/style/array_first_last.rb +18 -2
  164. data/lib/rubocop/cop/style/block_delimiters.rb +7 -20
  165. data/lib/rubocop/cop/style/class_and_module_children.rb +6 -3
  166. data/lib/rubocop/cop/style/collection_methods.rb +1 -1
  167. data/lib/rubocop/cop/style/combinable_defined.rb +1 -1
  168. data/lib/rubocop/cop/style/combinable_loops.rb +2 -2
  169. data/lib/rubocop/cop/style/commented_keyword.rb +1 -1
  170. data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
  171. data/lib/rubocop/cop/style/conditional_assignment.rb +6 -4
  172. data/lib/rubocop/cop/style/documentation.rb +1 -1
  173. data/lib/rubocop/cop/style/double_negation.rb +3 -3
  174. data/lib/rubocop/cop/style/each_for_simple_loop.rb +4 -7
  175. data/lib/rubocop/cop/style/each_with_object.rb +2 -3
  176. data/lib/rubocop/cop/style/empty_else.rb +4 -2
  177. data/lib/rubocop/cop/style/empty_literal.rb +1 -1
  178. data/lib/rubocop/cop/style/empty_method.rb +1 -1
  179. data/lib/rubocop/cop/style/endless_method.rb +163 -18
  180. data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
  181. data/lib/rubocop/cop/style/exact_regexp_match.rb +3 -10
  182. data/lib/rubocop/cop/style/explicit_block_argument.rb +15 -2
  183. data/lib/rubocop/cop/style/exponential_notation.rb +1 -1
  184. data/lib/rubocop/cop/style/fetch_env_var.rb +1 -1
  185. data/lib/rubocop/cop/style/float_division.rb +8 -4
  186. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
  187. data/lib/rubocop/cop/style/hash_each_methods.rb +3 -6
  188. data/lib/rubocop/cop/style/hash_except.rb +24 -148
  189. data/lib/rubocop/cop/style/hash_slice.rb +80 -0
  190. data/lib/rubocop/cop/style/hash_syntax.rb +6 -3
  191. data/lib/rubocop/cop/style/identical_conditional_branches.rb +22 -3
  192. data/lib/rubocop/cop/style/if_unless_modifier.rb +3 -3
  193. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +1 -1
  194. data/lib/rubocop/cop/style/if_with_semicolon.rb +2 -2
  195. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  196. data/lib/rubocop/cop/style/inverse_methods.rb +6 -6
  197. data/lib/rubocop/cop/style/it_assignment.rb +36 -0
  198. data/lib/rubocop/cop/style/keyword_parameters_order.rb +1 -1
  199. data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
  200. data/lib/rubocop/cop/style/map_into_array.rb +1 -1
  201. data/lib/rubocop/cop/style/map_to_hash.rb +1 -1
  202. data/lib/rubocop/cop/style/map_to_set.rb +3 -2
  203. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +19 -12
  204. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -0
  205. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +2 -1
  206. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -4
  207. data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
  208. data/lib/rubocop/cop/style/missing_else.rb +2 -0
  209. data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -1
  210. data/lib/rubocop/cop/style/multiple_comparison.rb +26 -20
  211. data/lib/rubocop/cop/style/mutable_constant.rb +3 -3
  212. data/lib/rubocop/cop/style/negated_if_else_condition.rb +1 -1
  213. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +1 -1
  214. data/lib/rubocop/cop/style/object_then.rb +13 -15
  215. data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
  216. data/lib/rubocop/cop/style/parallel_assignment.rb +1 -5
  217. data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
  218. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  219. data/lib/rubocop/cop/style/proc.rb +1 -2
  220. data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
  221. data/lib/rubocop/cop/style/raise_args.rb +6 -4
  222. data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
  223. data/lib/rubocop/cop/style/redundant_begin.rb +1 -1
  224. data/lib/rubocop/cop/style/redundant_condition.rb +48 -2
  225. data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +2 -1
  226. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +6 -10
  227. data/lib/rubocop/cop/style/redundant_each.rb +1 -1
  228. data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
  229. data/lib/rubocop/cop/style/redundant_format.rb +250 -0
  230. data/lib/rubocop/cop/style/redundant_freeze.rb +2 -2
  231. data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
  232. data/lib/rubocop/cop/style/redundant_line_continuation.rb +34 -13
  233. data/lib/rubocop/cop/style/redundant_parentheses.rb +28 -14
  234. data/lib/rubocop/cop/style/redundant_regexp_argument.rb +3 -0
  235. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
  236. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -1
  237. data/lib/rubocop/cop/style/redundant_self_assignment.rb +14 -28
  238. data/lib/rubocop/cop/style/redundant_sort.rb +2 -2
  239. data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -2
  240. data/lib/rubocop/cop/style/return_nil.rb +1 -1
  241. data/lib/rubocop/cop/style/safe_navigation.rb +2 -2
  242. data/lib/rubocop/cop/style/semicolon.rb +1 -1
  243. data/lib/rubocop/cop/style/send_with_literal_method_name.rb +2 -1
  244. data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
  245. data/lib/rubocop/cop/style/single_line_do_end_block.rb +1 -2
  246. data/lib/rubocop/cop/style/single_line_methods.rb +6 -7
  247. data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
  248. data/lib/rubocop/cop/style/sole_nested_conditional.rb +2 -2
  249. data/lib/rubocop/cop/style/string_concatenation.rb +2 -2
  250. data/lib/rubocop/cop/style/string_literals.rb +1 -1
  251. data/lib/rubocop/cop/style/string_methods.rb +1 -1
  252. data/lib/rubocop/cop/style/super_arguments.rb +65 -17
  253. data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
  254. data/lib/rubocop/cop/style/top_level_method_definition.rb +1 -1
  255. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +4 -1
  256. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
  257. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
  258. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  259. data/lib/rubocop/cop/style/while_until_modifier.rb +0 -1
  260. data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
  261. data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
  262. data/lib/rubocop/cop/util.rb +12 -5
  263. data/lib/rubocop/cop/utils/format_string.rb +7 -5
  264. data/lib/rubocop/cop/variable_force/variable.rb +14 -2
  265. data/lib/rubocop/cop/variable_force/variable_table.rb +3 -3
  266. data/lib/rubocop/cops_documentation_generator.rb +25 -14
  267. data/lib/rubocop/directive_comment.rb +44 -10
  268. data/lib/rubocop/formatter/formatter_set.rb +1 -1
  269. data/lib/rubocop/lsp/diagnostic.rb +189 -0
  270. data/lib/rubocop/lsp/logger.rb +2 -2
  271. data/lib/rubocop/lsp/routes.rb +7 -23
  272. data/lib/rubocop/lsp/runtime.rb +17 -49
  273. data/lib/rubocop/lsp/server.rb +0 -2
  274. data/lib/rubocop/lsp/stdin_runner.rb +83 -0
  275. data/lib/rubocop/options.rb +28 -12
  276. data/lib/rubocop/path_util.rb +15 -8
  277. data/lib/rubocop/plugin/configuration_integrator.rb +143 -0
  278. data/lib/rubocop/plugin/load_error.rb +26 -0
  279. data/lib/rubocop/plugin/loader.rb +100 -0
  280. data/lib/rubocop/plugin/not_supported_error.rb +29 -0
  281. data/lib/rubocop/plugin.rb +46 -0
  282. data/lib/rubocop/rake_task.rb +4 -1
  283. data/lib/rubocop/result_cache.rb +13 -13
  284. data/lib/rubocop/rspec/cop_helper.rb +9 -0
  285. data/lib/rubocop/rspec/expect_offense.rb +6 -2
  286. data/lib/rubocop/rspec/shared_contexts.rb +19 -1
  287. data/lib/rubocop/rspec/support.rb +2 -2
  288. data/lib/rubocop/runner.rb +5 -6
  289. data/lib/rubocop/server/cache.rb +35 -2
  290. data/lib/rubocop/server/cli.rb +2 -2
  291. data/lib/rubocop/target_finder.rb +1 -0
  292. data/lib/rubocop/target_ruby.rb +15 -0
  293. data/lib/rubocop/version.rb +17 -2
  294. data/lib/rubocop.rb +11 -1
  295. data/lib/ruby_lsp/rubocop/addon.rb +75 -0
  296. data/lib/ruby_lsp/rubocop/runtime_adapter.rb +47 -0
  297. metadata +53 -16
  298. data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
  299. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -18,10 +18,24 @@ module RuboCop
18
18
  # @api private
19
19
  COPS_PATTERN = "(all|#{COP_NAMES_PATTERN})"
20
20
  # @api private
21
+ AVAILABLE_MODES = %w[disable enable todo].freeze
22
+ # @api private
23
+ DIRECTIVE_MARKER_PATTERN = '# rubocop : '
24
+ # @api private
25
+ DIRECTIVE_MARKER_REGEXP = Regexp.new(DIRECTIVE_MARKER_PATTERN.gsub(' ', '\s*'))
26
+ # @api private
27
+ DIRECTIVE_HEADER_PATTERN = "#{DIRECTIVE_MARKER_PATTERN}((?:#{AVAILABLE_MODES.join('|')}))\\b"
28
+ # @api private
21
29
  DIRECTIVE_COMMENT_REGEXP = Regexp.new(
22
- "# rubocop : ((?:disable|enable|todo))\\b #{COPS_PATTERN}"
30
+ "#{DIRECTIVE_HEADER_PATTERN} #{COPS_PATTERN}"
23
31
  .gsub(' ', '\s*')
24
32
  )
33
+ # @api private
34
+ TRAILING_COMMENT_MARKER = '--'
35
+ # @api private
36
+ MALFORMED_DIRECTIVE_WITHOUT_COP_NAME_REGEXP = Regexp.new(
37
+ "\\A#{DIRECTIVE_HEADER_PATTERN}\\s*\\z".gsub(' ', '\s*')
38
+ )
25
39
 
26
40
  def self.before_comment(line)
27
41
  line.split(DIRECTIVE_COMMENT_REGEXP).first
@@ -32,9 +46,28 @@ module RuboCop
32
46
  def initialize(comment, cop_registry = Cop::Registry.global)
33
47
  @comment = comment
34
48
  @cop_registry = cop_registry
49
+ @match_data = comment.text.match(DIRECTIVE_COMMENT_REGEXP)
35
50
  @mode, @cops = match_captures
36
51
  end
37
52
 
53
+ # Checks if the comment starts with `# rubocop:` marker
54
+ def start_with_marker?
55
+ comment.text.start_with?(DIRECTIVE_MARKER_REGEXP)
56
+ end
57
+
58
+ # Checks if the comment is malformed as a `# rubocop:` directive
59
+ def malformed?
60
+ return true if !start_with_marker? || @match_data.nil?
61
+
62
+ tail = @match_data.post_match.lstrip
63
+ !(tail.empty? || tail.start_with?(TRAILING_COMMENT_MARKER))
64
+ end
65
+
66
+ # Checks if the directive comment is missing a cop name
67
+ def missing_cop_name?
68
+ MALFORMED_DIRECTIVE_WITHOUT_COP_NAME_REGEXP.match?(comment.text)
69
+ end
70
+
38
71
  # Checks if this directive relates to single line
39
72
  def single_line?
40
73
  !comment.text.start_with?(DIRECTIVE_COMMENT_REGEXP)
@@ -55,7 +88,7 @@ module RuboCop
55
88
 
56
89
  # Returns match captures to directive comment pattern
57
90
  def match_captures
58
- @match_captures ||= comment.text.match(DIRECTIVE_COMMENT_REGEXP)&.captures
91
+ @match_captures ||= @match_data&.captures
59
92
  end
60
93
 
61
94
  # Checks if this directive disables cops
@@ -88,10 +121,15 @@ module RuboCop
88
121
  @cop_names ||= all_cops? ? all_cop_names : parsed_cop_names
89
122
  end
90
123
 
124
+ # Returns an array of cops for this directive comment, without resolving departments
125
+ def raw_cop_names
126
+ @raw_cop_names ||= (cops || '').split(/,\s*/)
127
+ end
128
+
91
129
  # Returns array of specified in this directive department names
92
130
  # when all department disabled
93
131
  def department_names
94
- splitted_cops_string.select { |cop| department?(cop) }
132
+ raw_cop_names.select { |cop| department?(cop) }
95
133
  end
96
134
 
97
135
  # Checks if directive departments include cop
@@ -101,11 +139,11 @@ module RuboCop
101
139
 
102
140
  # Checks if cop department has already used in directive comment
103
141
  def overridden_by_department?(cop)
104
- in_directive_department?(cop) && splitted_cops_string.include?(cop)
142
+ in_directive_department?(cop) && raw_cop_names.include?(cop)
105
143
  end
106
144
 
107
145
  def directive_count
108
- splitted_cops_string.count
146
+ raw_cop_names.count
109
147
  end
110
148
 
111
149
  # Returns line number for directive
@@ -115,12 +153,8 @@ module RuboCop
115
153
 
116
154
  private
117
155
 
118
- def splitted_cops_string
119
- (cops || '').split(/,\s*/)
120
- end
121
-
122
156
  def parsed_cop_names
123
- cops = splitted_cops_string.map do |name|
157
+ cops = raw_cop_names.map do |name|
124
158
  department?(name) ? cop_names_for_department(name) : name
125
159
  end.flatten
126
160
  cops - [LINT_SYNTAX_COP]
@@ -77,7 +77,7 @@ module RuboCop
77
77
  case formatter_type
78
78
  when Class
79
79
  formatter_type
80
- when /\A[A-Z]/
80
+ when /\A(::)?[A-Z]/
81
81
  custom_formatter_class(formatter_type)
82
82
  else
83
83
  builtin_formatter_class(formatter_type)
@@ -0,0 +1,189 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'severity'
4
+
5
+ #
6
+ # This code is based on https://github.com/standardrb/standard.
7
+ #
8
+ # Copyright (c) 2023 Test Double, Inc.
9
+ #
10
+ # The MIT License (MIT)
11
+ #
12
+ # https://github.com/standardrb/standard/blob/main/LICENSE.txt
13
+ #
14
+ module RuboCop
15
+ module LSP
16
+ # Diagnostic for Language Server Protocol of RuboCop.
17
+ # @api private
18
+ class Diagnostic
19
+ def initialize(document_encoding, offense, uri, cop_class)
20
+ @document_encoding = document_encoding
21
+ @offense = offense
22
+ @uri = uri
23
+ @cop_class = cop_class
24
+ end
25
+
26
+ def to_lsp_code_actions
27
+ code_actions = []
28
+
29
+ code_actions << autocorrect_action if correctable?
30
+ code_actions << disable_line_action
31
+
32
+ code_actions
33
+ end
34
+
35
+ # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
36
+ def to_lsp_diagnostic(config)
37
+ highlighted = @offense.highlighted_area
38
+
39
+ LanguageServer::Protocol::Interface::Diagnostic.new(
40
+ message: message,
41
+ source: 'RuboCop',
42
+ code: @offense.cop_name,
43
+ code_description: code_description(config),
44
+ severity: severity,
45
+ range: LanguageServer::Protocol::Interface::Range.new(
46
+ start: LanguageServer::Protocol::Interface::Position.new(
47
+ line: @offense.line - 1,
48
+ character: highlighted.begin_pos
49
+ ),
50
+ end: LanguageServer::Protocol::Interface::Position.new(
51
+ line: @offense.line - 1,
52
+ character: highlighted.end_pos
53
+ )
54
+ ),
55
+ data: {
56
+ correctable: correctable?,
57
+ code_actions: to_lsp_code_actions
58
+ }
59
+ )
60
+ end
61
+ # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
62
+
63
+ private
64
+
65
+ def message
66
+ message = @offense.message
67
+ message += "\n\nThis offense is not autocorrectable.\n" unless correctable?
68
+ message
69
+ end
70
+
71
+ def severity
72
+ Severity.find_by(@offense.severity.name)
73
+ end
74
+
75
+ def code_description(config)
76
+ return unless @cop_class
77
+ return unless (doc_url = @cop_class.documentation_url(config))
78
+
79
+ LanguageServer::Protocol::Interface::CodeDescription.new(href: doc_url)
80
+ end
81
+
82
+ # rubocop:disable Layout/LineLength, Metrics/MethodLength
83
+ def autocorrect_action
84
+ LanguageServer::Protocol::Interface::CodeAction.new(
85
+ title: "Autocorrect #{@offense.cop_name}",
86
+ kind: LanguageServer::Protocol::Constant::CodeActionKind::QUICK_FIX,
87
+ edit: LanguageServer::Protocol::Interface::WorkspaceEdit.new(
88
+ document_changes: [
89
+ LanguageServer::Protocol::Interface::TextDocumentEdit.new(
90
+ text_document: LanguageServer::Protocol::Interface::OptionalVersionedTextDocumentIdentifier.new(
91
+ uri: ensure_uri_scheme(@uri.to_s).to_s,
92
+ version: nil
93
+ ),
94
+ edits: correctable? ? offense_replacements : []
95
+ )
96
+ ]
97
+ ),
98
+ is_preferred: true
99
+ )
100
+ end
101
+ # rubocop:enable Layout/LineLength, Metrics/MethodLength
102
+
103
+ # rubocop:disable Metrics/MethodLength
104
+ def offense_replacements
105
+ @offense.corrector.as_replacements.map do |range, replacement|
106
+ LanguageServer::Protocol::Interface::TextEdit.new(
107
+ range: LanguageServer::Protocol::Interface::Range.new(
108
+ start: LanguageServer::Protocol::Interface::Position.new(
109
+ line: range.line - 1,
110
+ character: range.column
111
+ ),
112
+ end: LanguageServer::Protocol::Interface::Position.new(
113
+ line: range.last_line - 1,
114
+ character: range.last_column
115
+ )
116
+ ),
117
+ new_text: replacement
118
+ )
119
+ end
120
+ end
121
+ # rubocop:enable Metrics/MethodLength
122
+
123
+ # rubocop:disable Layout/LineLength, Metrics/MethodLength
124
+ def disable_line_action
125
+ LanguageServer::Protocol::Interface::CodeAction.new(
126
+ title: "Disable #{@offense.cop_name} for this line",
127
+ kind: LanguageServer::Protocol::Constant::CodeActionKind::QUICK_FIX,
128
+ edit: LanguageServer::Protocol::Interface::WorkspaceEdit.new(
129
+ document_changes: [
130
+ LanguageServer::Protocol::Interface::TextDocumentEdit.new(
131
+ text_document: LanguageServer::Protocol::Interface::OptionalVersionedTextDocumentIdentifier.new(
132
+ uri: ensure_uri_scheme(@uri.to_s).to_s,
133
+ version: nil
134
+ ),
135
+ edits: line_disable_comment
136
+ )
137
+ ]
138
+ )
139
+ )
140
+ end
141
+ # rubocop:enable Layout/LineLength, Metrics/MethodLength
142
+
143
+ def line_disable_comment
144
+ new_text = if @offense.source_line.include?(' # rubocop:disable ')
145
+ ",#{@offense.cop_name}"
146
+ else
147
+ " # rubocop:disable #{@offense.cop_name}"
148
+ end
149
+
150
+ eol = LanguageServer::Protocol::Interface::Position.new(
151
+ line: @offense.line - 1,
152
+ character: length_of_line(@offense.source_line)
153
+ )
154
+
155
+ # TODO: fails for multiline strings - may be preferable to use block
156
+ # comments to disable some offenses
157
+ inline_comment = LanguageServer::Protocol::Interface::TextEdit.new(
158
+ range: LanguageServer::Protocol::Interface::Range.new(start: eol, end: eol),
159
+ new_text: new_text
160
+ )
161
+
162
+ [inline_comment]
163
+ end
164
+
165
+ def length_of_line(line)
166
+ if @document_encoding == Encoding::UTF_16LE
167
+ line_length = 0
168
+ line.codepoints.each do |codepoint|
169
+ line_length += 1
170
+ line_length += 1 if codepoint > RubyLsp::Document::Scanner::SURROGATE_PAIR_START
171
+ end
172
+ line_length
173
+ else
174
+ line.length
175
+ end
176
+ end
177
+
178
+ def correctable?
179
+ !@offense.corrector.nil?
180
+ end
181
+
182
+ def ensure_uri_scheme(uri)
183
+ uri = URI.parse(uri)
184
+ uri.scheme = 'file' if uri.scheme.nil?
185
+ uri
186
+ end
187
+ end
188
+ end
189
+ end
@@ -14,8 +14,8 @@ module RuboCop
14
14
  # Log for Language Server Protocol of RuboCop.
15
15
  # @api private
16
16
  class Logger
17
- def self.log(message)
18
- warn("[server] #{message}")
17
+ def self.log(message, prefix: '[server]')
18
+ warn("#{prefix} #{message}")
19
19
  end
20
20
  end
21
21
  end
@@ -16,6 +16,11 @@ module RuboCop
16
16
  # Routes for Language Server Protocol of RuboCop.
17
17
  # @api private
18
18
  class Routes
19
+ CONFIGURATION_FILE_PATTERNS = [
20
+ RuboCop::ConfigFinder::DOTFILE,
21
+ RuboCop::CLI::Command::AutoGenerateConfig::AUTO_GENERATED_FILE
22
+ ].freeze
23
+
19
24
  def self.handle(name, &block)
20
25
  define_method(:"handle_#{name}", &block)
21
26
  end
@@ -96,7 +101,7 @@ module RuboCop
96
101
 
97
102
  handle 'workspace/didChangeWatchedFiles' do |request|
98
103
  changed = request[:params][:changes].any? do |change|
99
- change[:uri].end_with?(RuboCop::ConfigFinder::DOTFILE)
104
+ CONFIGURATION_FILE_PATTERNS.any? { |path| change[:uri].end_with?(path) }
100
105
  end
101
106
 
102
107
  if changed
@@ -204,14 +209,12 @@ module RuboCop
204
209
 
205
210
  def diagnostic(file_uri, text)
206
211
  @text_cache[file_uri] = text
207
- offenses = @server.offenses(remove_file_protocol_from(file_uri), text)
208
- diagnostics = offenses.map { |offense| to_diagnostic(offense) }
209
212
 
210
213
  {
211
214
  method: 'textDocument/publishDiagnostics',
212
215
  params: {
213
216
  uri: file_uri,
214
- diagnostics: diagnostics
217
+ diagnostics: @server.offenses(remove_file_protocol_from(file_uri), text)
215
218
  }
216
219
  }
217
220
  end
@@ -219,25 +222,6 @@ module RuboCop
219
222
  def remove_file_protocol_from(uri)
220
223
  uri.delete_prefix('file://')
221
224
  end
222
-
223
- def to_diagnostic(offense)
224
- code = offense[:cop_name]
225
- message = offense[:message]
226
- loc = offense[:location]
227
- rubocop_severity = offense[:severity]
228
- severity = Severity.find_by(rubocop_severity)
229
-
230
- {
231
- code: code, message: message, range: to_range(loc), severity: severity, source: 'rubocop'
232
- }
233
- end
234
-
235
- def to_range(location)
236
- {
237
- start: { character: location[:start_column] - 1, line: location[:start_line] - 1 },
238
- end: { character: location[:last_column], line: location[:last_line] - 1 }
239
- }
240
- end
241
225
  end
242
226
  end
243
227
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'stringio'
3
+ require_relative 'diagnostic'
4
+ require_relative 'stdin_runner'
4
5
 
5
6
  #
6
7
  # This code is based on https://github.com/standardrb/standard.
@@ -19,24 +20,16 @@ module RuboCop
19
20
  attr_writer :safe_autocorrect, :lint_mode, :layout_mode
20
21
 
21
22
  def initialize(config_store)
22
- @config_store = config_store
23
- @logged_paths = []
23
+ RuboCop::LSP.enable
24
+
25
+ @runner = RuboCop::Lsp::StdinRunner.new(config_store)
26
+ @cop_registry = RuboCop::Cop::Registry.global.to_h
27
+
24
28
  @safe_autocorrect = true
25
29
  @lint_mode = false
26
30
  @layout_mode = false
27
31
  end
28
32
 
29
- # This abuses the `--stdin` option of rubocop and reads the formatted text
30
- # from the `options[:stdin]` that rubocop mutates. This depends on
31
- # `parallel: false` as well as the fact that RuboCop doesn't otherwise dup
32
- # or reassign that options object. Risky business!
33
- #
34
- # Reassigning `options[:stdin]` is done here:
35
- # https://github.com/rubocop/rubocop/blob/v1.52.0/lib/rubocop/cop/team.rb#L131
36
- # Printing `options[:stdin]`
37
- # https://github.com/rubocop/rubocop/blob/v1.52.0/lib/rubocop/cli/command/execute_runner.rb#L95
38
- # Setting `parallel: true` would break this here:
39
- # https://github.com/rubocop/rubocop/blob/v1.52.0/lib/rubocop/runner.rb#L72
40
33
  def format(path, text, command:)
41
34
  safe_autocorrect = if command
42
35
  command == 'rubocop.formatAutocorrects'
@@ -44,34 +37,23 @@ module RuboCop
44
37
  @safe_autocorrect
45
38
  end
46
39
 
47
- formatting_options = {
48
- stdin: text, force_exclusion: true, autocorrect: true, safe_autocorrect: safe_autocorrect
49
- }
40
+ formatting_options = { autocorrect: true, safe_autocorrect: safe_autocorrect }
50
41
  formatting_options[:only] = config_only_options if @lint_mode || @layout_mode
51
42
 
52
- redirect_stdout { run_rubocop(formatting_options, path) }
53
-
54
- formatting_options[:stdin]
43
+ @runner.run(path, text, formatting_options)
44
+ @runner.formatted_source
55
45
  end
56
46
 
57
- def offenses(path, text)
58
- diagnostic_options = {
59
- stdin: text, force_exclusion: true, formatters: ['json'], format: 'json'
60
- }
47
+ def offenses(path, text, document_encoding = nil)
48
+ diagnostic_options = {}
61
49
  diagnostic_options[:only] = config_only_options if @lint_mode || @layout_mode
62
50
 
63
- json = redirect_stdout { run_rubocop(diagnostic_options, path) }
64
- results = JSON.parse(json, symbolize_names: true)
65
-
66
- if results[:files].empty?
67
- unless @logged_paths.include?(path)
68
- Logger.log "Ignoring file, per configuration: #{path}"
69
- @logged_paths << path
70
- end
71
- return []
51
+ @runner.run(path, text, diagnostic_options)
52
+ @runner.offenses.map do |offense|
53
+ Diagnostic.new(
54
+ document_encoding, offense, path, @cop_registry[offense.cop_name]&.first
55
+ ).to_lsp_diagnostic(@runner.config_for_working_directory)
72
56
  end
73
-
74
- results.dig(:files, 0, :offenses)
75
57
  end
76
58
 
77
59
  private
@@ -82,20 +64,6 @@ module RuboCop
82
64
  only_options << 'Layout' if @layout_mode
83
65
  only_options
84
66
  end
85
-
86
- def redirect_stdout(&block)
87
- stdout = StringIO.new
88
-
89
- RuboCop::Server::Helper.redirect(stdout: stdout, &block)
90
-
91
- stdout.string
92
- end
93
-
94
- def run_rubocop(options, path)
95
- runner = RuboCop::Runner.new(options, @config_store)
96
-
97
- runner.run([path])
98
- end
99
67
  end
100
68
  end
101
69
  end
@@ -22,8 +22,6 @@ module RuboCop
22
22
  def initialize(config_store)
23
23
  $PROGRAM_NAME = "rubocop --lsp #{ConfigFinder.project_root}"
24
24
 
25
- RuboCop::LSP.enable
26
-
27
25
  @reader = LanguageServer::Protocol::Transport::Io::Reader.new($stdin)
28
26
  @writer = LanguageServer::Protocol::Transport::Io::Writer.new($stdout)
29
27
  @runtime = RuboCop::LSP::Runtime.new(config_store)
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # This code is based on https://github.com/standardrb/standard.
5
+ #
6
+ # Copyright (c) 2023 Test Double, Inc.
7
+ #
8
+ # The MIT License (MIT)
9
+ #
10
+ # https://github.com/standardrb/standard/blob/main/LICENSE.txt
11
+ #
12
+ module RuboCop
13
+ module Lsp
14
+ # Originally lifted from:
15
+ # https://github.com/Shopify/ruby-lsp/blob/8d4c17efce4e8ecc8e7c557ab2981db6b22c0b6d/lib/ruby_lsp/requests/support/rubocop_runner.rb#L20
16
+ # @api private
17
+ class StdinRunner < RuboCop::Runner
18
+ class ConfigurationError < StandardError; end
19
+
20
+ attr_reader :offenses, :config_for_working_directory
21
+
22
+ DEFAULT_RUBOCOP_OPTIONS = {
23
+ stderr: true,
24
+ force_exclusion: true,
25
+ formatters: ['RuboCop::Formatter::BaseFormatter'],
26
+ raise_cop_error: true,
27
+ todo_file: nil,
28
+ todo_ignore_files: []
29
+ }.freeze
30
+
31
+ def initialize(config_store)
32
+ @options = {}
33
+
34
+ @offenses = []
35
+ @warnings = []
36
+ @errors = []
37
+
38
+ @config_for_working_directory = config_store.for_pwd
39
+
40
+ super(@options, config_store)
41
+ end
42
+
43
+ # rubocop:disable Metrics/MethodLength
44
+ def run(path, contents, options)
45
+ @options = options.merge(DEFAULT_RUBOCOP_OPTIONS)
46
+ @options[:stdin] = contents
47
+
48
+ @offenses = []
49
+ @warnings = []
50
+ @errors = []
51
+
52
+ super([path])
53
+
54
+ raise Interrupt if aborting?
55
+ rescue RuboCop::Runner::InfiniteCorrectionLoop => e
56
+ if defined?(::RubyLsp::Requests::Formatting::Error)
57
+ raise ::RubyLsp::Requests::Formatting::Error, e.message
58
+ end
59
+
60
+ raise e
61
+ rescue RuboCop::ValidationError => e
62
+ raise ConfigurationError, e.message
63
+ rescue StandardError => e
64
+ if defined?(::RubyLsp::Requests::Formatting::Error)
65
+ raise ::RubyLsp::Requests::Support::InternalRuboCopError, e
66
+ end
67
+
68
+ raise e
69
+ end
70
+ # rubocop:enable Metrics/MethodLength
71
+
72
+ def formatted_source
73
+ @options[:stdin]
74
+ end
75
+
76
+ private
77
+
78
+ def file_finished(_file, offenses)
79
+ @offenses = offenses
80
+ end
81
+ end
82
+ end
83
+ end
@@ -243,6 +243,7 @@ module RuboCop
243
243
  option(opts, '--init')
244
244
  option(opts, '-c', '--config FILE')
245
245
  option(opts, '-d', '--debug')
246
+ option(opts, '--plugin FILE') { |f| plugin_feature(f) }
246
247
  option(opts, '-r', '--require FILE') { |f| require_feature(f) }
247
248
  option(opts, '--[no-]color')
248
249
  option(opts, '-v', '--version')
@@ -299,11 +300,25 @@ module RuboCop
299
300
  long_opt[2..].sub('[no-]', '').sub(/ .*/, '').tr('-', '_').gsub(/[\[\]]/, '').to_sym
300
301
  end
301
302
 
302
- def require_feature(file)
303
- # If any features were added on the CLI from `--require`,
303
+ def plugin_feature(file)
304
+ # If any features were added on the CLI from `--plugin`,
304
305
  # add them to the config.
305
- ConfigLoader.add_loaded_features(file)
306
- require file
306
+ ConfigLoaderResolver.new.resolve_plugins(Config.new, file)
307
+ end
308
+
309
+ def require_feature(file)
310
+ if Plugin.plugin_capable?(file)
311
+ # NOTE: Compatibility for before plugins style.
312
+ warn Rainbow(<<~MESSAGE).yellow
313
+ #{file} gem supports plugin, use `--plugin` instead of `--require`.
314
+ MESSAGE
315
+ plugin_feature(file)
316
+ else
317
+ # If any features were added on the CLI from `--require`,
318
+ # add them to the config.
319
+ require file
320
+ ConfigLoader.add_loaded_features(file)
321
+ end
307
322
  end
308
323
  end
309
324
 
@@ -397,7 +412,7 @@ module RuboCop
397
412
  return if @options[:format] == 'junit'
398
413
 
399
414
  raise OptionArgumentError,
400
- format('--display-only-failed can only be used together with --format junit.')
415
+ '--display-only-failed can only be used together with --format junit.'
401
416
  end
402
417
 
403
418
  def validate_display_only_correctable_and_autocorrect
@@ -415,14 +430,13 @@ module RuboCop
415
430
  !@options.key?(:display_only_safe_correctable)
416
431
 
417
432
  raise OptionArgumentError,
418
- format('--display-only-failed cannot be used together with other display options.')
433
+ '--display-only-failed cannot be used together with other display options.'
419
434
  end
420
435
 
421
436
  def validate_lsp_and_editor_mode
422
437
  return if !@options.key?(:lsp) || !@options.key?(:editor_mode)
423
438
 
424
- raise OptionArgumentError,
425
- format('Do not specify `--editor-mode` as it is redundant in `--lsp`.')
439
+ raise OptionArgumentError, 'Do not specify `--editor-mode` as it is redundant in `--lsp`.'
426
440
  end
427
441
 
428
442
  def validate_autocorrect
@@ -436,7 +450,7 @@ module RuboCop
436
450
  return unless @options.key?(:disable_uncorrectable)
437
451
 
438
452
  raise OptionArgumentError,
439
- format('--disable-uncorrectable can only be used together with --autocorrect.')
453
+ '--disable-uncorrectable can only be used together with --autocorrect.'
440
454
  end
441
455
 
442
456
  def disable_parallel_when_invalid_option_combo
@@ -504,6 +518,7 @@ module RuboCop
504
518
  only_guide_cops: ['Run only cops for rules that link to a',
505
519
  'style guide.'],
506
520
  except: 'Exclude the given cop(s).',
521
+ plugin: 'Load a RuboCop plugin.',
507
522
  require: 'Require Ruby file.',
508
523
  config: 'Specify configuration file.',
509
524
  auto_gen_config: ['Generate a configuration file acting as a',
@@ -542,8 +557,8 @@ module RuboCop
542
557
  only_recognized_file_types: ['Inspect files given on the command line only if',
543
558
  'they are listed in `AllCops/Include` parameters',
544
559
  'of user configuration or default configuration.'],
545
- ignore_disable_comments: ['Run cops even when they are disabled locally',
546
- 'by a `rubocop:disable` directive.'],
560
+ ignore_disable_comments: ['Report offenses even if they have been manually disabled',
561
+ 'with a `rubocop:disable` or `rubocop:todo` directive.'],
547
562
  ignore_parent_exclusion: ['Prevent from inheriting `AllCops/Exclude` from',
548
563
  'parent folders.'],
549
564
  ignore_unrecognized_cops: ['Ignore unrecognized cops or departments in the config.'],
@@ -579,7 +594,8 @@ module RuboCop
579
594
  'when combined with --display-only-correctable.'],
580
595
  show_cops: ['Shows the given cops, or all cops by',
581
596
  'default, and their configurations for the',
582
- 'current directory.'],
597
+ 'current directory.',
598
+ 'You can use `*` as a wildcard.'],
583
599
  show_docs_url: ['Display url to documentation for the given',
584
600
  'cops, or base url by default.'],
585
601
  fail_fast: ['Inspect files in order of modification',