rubocop 1.66.1 → 1.72.2

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 (434) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +2 -2
  4. data/config/default.yml +162 -14
  5. data/config/internal_affairs.yml +11 -0
  6. data/lib/rubocop/cached_data.rb +12 -4
  7. data/lib/rubocop/cli/command/auto_generate_config.rb +6 -7
  8. data/lib/rubocop/cli/command/execute_runner.rb +4 -4
  9. data/lib/rubocop/cli/command/lsp.rb +2 -2
  10. data/lib/rubocop/cli/command/show_cops.rb +24 -2
  11. data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
  12. data/lib/rubocop/cli/command/version.rb +2 -2
  13. data/lib/rubocop/comment_config.rb +2 -2
  14. data/lib/rubocop/config.rb +17 -4
  15. data/lib/rubocop/config_loader.rb +48 -8
  16. data/lib/rubocop/config_loader_resolver.rb +36 -11
  17. data/lib/rubocop/config_validator.rb +20 -9
  18. data/lib/rubocop/cop/autocorrect_logic.rb +36 -19
  19. data/lib/rubocop/cop/base.rb +13 -3
  20. data/lib/rubocop/cop/bundler/duplicated_gem.rb +2 -2
  21. data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
  22. data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
  23. data/lib/rubocop/cop/bundler/gem_version.rb +1 -0
  24. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
  25. data/lib/rubocop/cop/cop.rb +8 -0
  26. data/lib/rubocop/cop/correctors/alignment_corrector.rb +1 -12
  27. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +1 -1
  28. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +1 -1
  29. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +10 -0
  30. data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +1 -2
  31. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +0 -2
  32. data/lib/rubocop/cop/generator.rb +6 -0
  33. data/lib/rubocop/cop/internal_affairs/cop_description.rb +0 -4
  34. data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
  35. data/lib/rubocop/cop/internal_affairs/example_description.rb +4 -2
  36. data/lib/rubocop/cop/internal_affairs/location_exists.rb +116 -0
  37. data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
  38. data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +3 -4
  39. data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +3 -2
  40. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -1
  41. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
  42. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
  43. data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +229 -0
  44. data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
  45. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
  46. data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +1 -1
  47. data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
  48. data/lib/rubocop/cop/internal_affairs/operator_keyword.rb +48 -0
  49. data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
  50. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +6 -21
  51. data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +11 -2
  52. data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
  53. data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +0 -2
  54. data/lib/rubocop/cop/internal_affairs/undefined_config.rb +7 -1
  55. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +0 -5
  56. data/lib/rubocop/cop/internal_affairs.rb +6 -0
  57. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +6 -2
  58. data/lib/rubocop/cop/layout/argument_alignment.rb +2 -9
  59. data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
  60. data/lib/rubocop/cop/layout/begin_end_alignment.rb +0 -1
  61. data/lib/rubocop/cop/layout/block_alignment.rb +3 -2
  62. data/lib/rubocop/cop/layout/class_structure.rb +9 -9
  63. data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
  64. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  65. data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
  66. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +3 -3
  67. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +7 -11
  68. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +3 -3
  69. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
  70. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +4 -5
  71. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +23 -1
  72. data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
  73. data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
  74. data/lib/rubocop/cop/layout/first_argument_indentation.rb +3 -8
  75. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +2 -7
  76. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
  77. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
  78. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +8 -0
  79. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
  80. data/lib/rubocop/cop/layout/hash_alignment.rb +6 -4
  81. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -1
  82. data/lib/rubocop/cop/layout/indentation_width.rb +11 -12
  83. data/lib/rubocop/cop/layout/leading_comment_space.rb +71 -1
  84. data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +11 -2
  85. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +7 -1
  86. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
  87. data/lib/rubocop/cop/layout/line_length.rb +119 -4
  88. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
  89. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
  90. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -1
  91. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
  92. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
  93. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +2 -3
  94. data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
  95. data/lib/rubocop/cop/layout/redundant_line_break.rb +10 -41
  96. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +4 -3
  97. data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -1
  98. data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
  99. data/lib/rubocop/cop/layout/space_after_comma.rb +1 -1
  100. data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
  101. data/lib/rubocop/cop/layout/space_after_semicolon.rb +1 -1
  102. data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -1
  103. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
  104. data/lib/rubocop/cop/layout/space_around_operators.rb +19 -20
  105. data/lib/rubocop/cop/layout/space_before_brackets.rb +5 -5
  106. data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
  107. data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
  108. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +6 -0
  109. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +4 -0
  110. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +4 -0
  111. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +0 -1
  112. data/lib/rubocop/cop/layout/trailing_whitespace.rb +5 -3
  113. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
  114. data/lib/rubocop/cop/lint/ambiguous_range.rb +4 -1
  115. data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +119 -0
  116. data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
  117. data/lib/rubocop/cop/lint/big_decimal_new.rb +4 -7
  118. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +10 -12
  119. data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
  120. data/lib/rubocop/cop/lint/circular_argument_reference.rb +6 -0
  121. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
  122. data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
  123. data/lib/rubocop/cop/lint/cop_directive_syntax.rb +84 -0
  124. data/lib/rubocop/cop/lint/debugger.rb +1 -1
  125. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +2 -1
  126. data/lib/rubocop/cop/lint/duplicate_branch.rb +39 -4
  127. data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
  128. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -1
  129. data/lib/rubocop/cop/lint/duplicate_set_element.rb +87 -0
  130. data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
  131. data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
  132. data/lib/rubocop/cop/lint/empty_file.rb +0 -2
  133. data/lib/rubocop/cop/lint/ensure_return.rb +1 -4
  134. data/lib/rubocop/cop/lint/erb_new_arguments.rb +1 -1
  135. data/lib/rubocop/cop/lint/float_comparison.rb +20 -9
  136. data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -4
  137. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
  138. data/lib/rubocop/cop/lint/hash_new_with_keyword_arguments_as_default.rb +55 -0
  139. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +11 -5
  140. data/lib/rubocop/cop/lint/interpolation_check.rb +9 -0
  141. data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +8 -14
  142. data/lib/rubocop/cop/lint/literal_as_condition.rb +1 -0
  143. data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +1 -1
  144. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +49 -8
  145. data/lib/rubocop/cop/lint/missing_super.rb +2 -2
  146. data/lib/rubocop/cop/lint/mixed_case_range.rb +3 -6
  147. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  148. data/lib/rubocop/cop/lint/nested_method_definition.rb +9 -5
  149. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  150. data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +2 -2
  151. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +12 -3
  152. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +3 -3
  153. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +1 -1
  154. data/lib/rubocop/cop/lint/number_conversion.rb +0 -1
  155. data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -2
  156. data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +93 -0
  157. data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +1 -2
  158. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +3 -2
  159. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +6 -11
  160. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +1 -1
  161. data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
  162. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +13 -8
  163. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +8 -7
  164. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
  165. data/lib/rubocop/cop/lint/redundant_type_conversion.rb +231 -0
  166. data/lib/rubocop/cop/lint/refinement_import_methods.rb +1 -1
  167. data/lib/rubocop/cop/lint/regexp_as_condition.rb +0 -1
  168. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  169. data/lib/rubocop/cop/lint/rescue_type.rb +3 -7
  170. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +17 -1
  171. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +109 -41
  172. data/lib/rubocop/cop/lint/self_assignment.rb +8 -10
  173. data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
  174. data/lib/rubocop/cop/lint/shared_mutable_default.rb +65 -0
  175. data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
  176. data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
  177. data/lib/rubocop/cop/lint/symbol_conversion.rb +2 -2
  178. data/lib/rubocop/cop/lint/syntax.rb +4 -1
  179. data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +88 -0
  180. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +1 -1
  181. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -1
  182. data/lib/rubocop/cop/lint/unreachable_code.rb +51 -2
  183. data/lib/rubocop/cop/lint/unreachable_loop.rb +1 -1
  184. data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
  185. data/lib/rubocop/cop/lint/uri_regexp.rb +25 -7
  186. data/lib/rubocop/cop/lint/useless_access_modifier.rb +4 -4
  187. data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
  188. data/lib/rubocop/cop/lint/useless_constant_scoping.rb +80 -0
  189. data/lib/rubocop/cop/lint/useless_defined.rb +55 -0
  190. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +4 -0
  191. data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
  192. data/lib/rubocop/cop/lint/useless_numeric_operation.rb +2 -1
  193. data/lib/rubocop/cop/lint/useless_rescue.rb +1 -1
  194. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +2 -2
  195. data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -25
  196. data/lib/rubocop/cop/lint/void.rb +8 -11
  197. data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
  198. data/lib/rubocop/cop/metrics/class_length.rb +9 -9
  199. data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
  200. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +5 -2
  201. data/lib/rubocop/cop/metrics/method_length.rb +8 -1
  202. data/lib/rubocop/cop/metrics/module_length.rb +1 -1
  203. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
  204. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
  205. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +2 -3
  206. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
  207. data/lib/rubocop/cop/mixin/alignment.rb +2 -2
  208. data/lib/rubocop/cop/mixin/allowed_pattern.rb +4 -4
  209. data/lib/rubocop/cop/mixin/check_assignment.rb +4 -12
  210. data/lib/rubocop/cop/mixin/check_line_breakable.rb +20 -10
  211. data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +49 -0
  212. data/lib/rubocop/cop/mixin/comments_help.rb +8 -3
  213. data/lib/rubocop/cop/mixin/dig_help.rb +27 -0
  214. data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +24 -0
  215. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +4 -2
  216. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +22 -22
  217. data/lib/rubocop/cop/mixin/hash_subset.rb +188 -0
  218. data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
  219. data/lib/rubocop/cop/mixin/line_length_help.rb +5 -4
  220. data/lib/rubocop/cop/mixin/method_complexity.rb +1 -1
  221. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +5 -9
  222. data/lib/rubocop/cop/mixin/percent_array.rb +1 -1
  223. data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
  224. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +68 -30
  225. data/lib/rubocop/cop/mixin/range_help.rb +3 -4
  226. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
  227. data/lib/rubocop/cop/mixin/statement_modifier.rb +11 -5
  228. data/lib/rubocop/cop/mixin/string_help.rb +2 -2
  229. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  230. data/lib/rubocop/cop/mixin/target_ruby_version.rb +17 -1
  231. data/lib/rubocop/cop/mixin/trailing_comma.rb +3 -3
  232. data/lib/rubocop/cop/naming/accessor_method_name.rb +6 -6
  233. data/lib/rubocop/cop/naming/block_forwarding.rb +20 -16
  234. data/lib/rubocop/cop/naming/constant_name.rb +6 -7
  235. data/lib/rubocop/cop/naming/file_name.rb +0 -2
  236. data/lib/rubocop/cop/naming/inclusive_language.rb +12 -3
  237. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +11 -12
  238. data/lib/rubocop/cop/naming/predicate_name.rb +45 -1
  239. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +6 -14
  240. data/lib/rubocop/cop/naming/variable_name.rb +3 -4
  241. data/lib/rubocop/cop/naming/variable_number.rb +2 -3
  242. data/lib/rubocop/cop/offense.rb +4 -5
  243. data/lib/rubocop/cop/security/compound_hash.rb +2 -0
  244. data/lib/rubocop/cop/security/yaml_load.rb +3 -2
  245. data/lib/rubocop/cop/style/access_modifier_declarations.rb +96 -28
  246. data/lib/rubocop/cop/style/accessor_grouping.rb +10 -2
  247. data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +79 -0
  248. data/lib/rubocop/cop/style/and_or.rb +1 -1
  249. data/lib/rubocop/cop/style/arguments_forwarding.rb +78 -22
  250. data/lib/rubocop/cop/style/array_first_last.rb +18 -2
  251. data/lib/rubocop/cop/style/array_intersect.rb +5 -4
  252. data/lib/rubocop/cop/style/bitwise_predicate.rb +100 -0
  253. data/lib/rubocop/cop/style/block_delimiters.rb +49 -19
  254. data/lib/rubocop/cop/style/case_like_if.rb +8 -11
  255. data/lib/rubocop/cop/style/class_and_module_children.rb +6 -3
  256. data/lib/rubocop/cop/style/collection_compact.rb +10 -10
  257. data/lib/rubocop/cop/style/collection_methods.rb +1 -1
  258. data/lib/rubocop/cop/style/combinable_defined.rb +115 -0
  259. data/lib/rubocop/cop/style/combinable_loops.rb +9 -2
  260. data/lib/rubocop/cop/style/commented_keyword.rb +17 -1
  261. data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
  262. data/lib/rubocop/cop/style/conditional_assignment.rb +26 -26
  263. data/lib/rubocop/cop/style/constant_visibility.rb +3 -12
  264. data/lib/rubocop/cop/style/data_inheritance.rb +1 -1
  265. data/lib/rubocop/cop/style/dig_chain.rb +89 -0
  266. data/lib/rubocop/cop/style/documentation.rb +1 -1
  267. data/lib/rubocop/cop/style/double_negation.rb +3 -3
  268. data/lib/rubocop/cop/style/each_for_simple_loop.rb +4 -7
  269. data/lib/rubocop/cop/style/each_with_object.rb +2 -3
  270. data/lib/rubocop/cop/style/empty_else.rb +4 -2
  271. data/lib/rubocop/cop/style/empty_literal.rb +1 -1
  272. data/lib/rubocop/cop/style/empty_method.rb +1 -1
  273. data/lib/rubocop/cop/style/endless_method.rb +1 -14
  274. data/lib/rubocop/cop/style/eval_with_location.rb +2 -2
  275. data/lib/rubocop/cop/style/exact_regexp_match.rb +2 -3
  276. data/lib/rubocop/cop/style/explicit_block_argument.rb +15 -2
  277. data/lib/rubocop/cop/style/exponential_notation.rb +1 -1
  278. data/lib/rubocop/cop/style/fetch_env_var.rb +2 -1
  279. data/lib/rubocop/cop/style/file_null.rb +89 -0
  280. data/lib/rubocop/cop/style/file_touch.rb +75 -0
  281. data/lib/rubocop/cop/style/float_division.rb +8 -4
  282. data/lib/rubocop/cop/style/for.rb +0 -1
  283. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
  284. data/lib/rubocop/cop/style/global_vars.rb +1 -3
  285. data/lib/rubocop/cop/style/guard_clause.rb +16 -3
  286. data/lib/rubocop/cop/style/hash_conversion.rb +1 -2
  287. data/lib/rubocop/cop/style/hash_each_methods.rb +9 -6
  288. data/lib/rubocop/cop/style/hash_except.rb +35 -147
  289. data/lib/rubocop/cop/style/hash_slice.rb +80 -0
  290. data/lib/rubocop/cop/style/hash_syntax.rb +8 -5
  291. data/lib/rubocop/cop/style/identical_conditional_branches.rb +22 -3
  292. data/lib/rubocop/cop/style/if_inside_else.rb +1 -2
  293. data/lib/rubocop/cop/style/if_unless_modifier.rb +3 -3
  294. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +2 -3
  295. data/lib/rubocop/cop/style/if_with_semicolon.rb +26 -11
  296. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  297. data/lib/rubocop/cop/style/inverse_methods.rb +6 -7
  298. data/lib/rubocop/cop/style/it_assignment.rb +36 -0
  299. data/lib/rubocop/cop/style/keyword_arguments_merging.rb +67 -0
  300. data/lib/rubocop/cop/style/keyword_parameters_order.rb +1 -1
  301. data/lib/rubocop/cop/style/lambda.rb +1 -1
  302. data/lib/rubocop/cop/style/lambda_call.rb +3 -2
  303. data/lib/rubocop/cop/style/map_into_array.rb +60 -9
  304. data/lib/rubocop/cop/style/map_to_hash.rb +1 -1
  305. data/lib/rubocop/cop/style/map_to_set.rb +3 -2
  306. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +32 -20
  307. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -0
  308. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -11
  309. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -4
  310. data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
  311. data/lib/rubocop/cop/style/missing_else.rb +2 -0
  312. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +33 -3
  313. data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -1
  314. data/lib/rubocop/cop/style/multiline_memoization.rb +2 -2
  315. data/lib/rubocop/cop/style/multiple_comparison.rb +52 -51
  316. data/lib/rubocop/cop/style/mutable_constant.rb +7 -8
  317. data/lib/rubocop/cop/style/negated_if_else_condition.rb +7 -5
  318. data/lib/rubocop/cop/style/nested_modifier.rb +1 -1
  319. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +2 -2
  320. data/lib/rubocop/cop/style/nested_ternary_operator.rb +5 -4
  321. data/lib/rubocop/cop/style/not.rb +1 -1
  322. data/lib/rubocop/cop/style/object_then.rb +14 -15
  323. data/lib/rubocop/cop/style/one_line_conditional.rb +29 -4
  324. data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
  325. data/lib/rubocop/cop/style/operator_method_call.rb +25 -7
  326. data/lib/rubocop/cop/style/or_assignment.rb +3 -6
  327. data/lib/rubocop/cop/style/parallel_assignment.rb +9 -18
  328. data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
  329. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  330. data/lib/rubocop/cop/style/proc.rb +1 -2
  331. data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
  332. data/lib/rubocop/cop/style/raise_args.rb +7 -5
  333. data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
  334. data/lib/rubocop/cop/style/redundant_argument.rb +3 -1
  335. data/lib/rubocop/cop/style/redundant_assignment.rb +1 -1
  336. data/lib/rubocop/cop/style/redundant_begin.rb +5 -1
  337. data/lib/rubocop/cop/style/redundant_condition.rb +39 -24
  338. data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +2 -1
  339. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +6 -10
  340. data/lib/rubocop/cop/style/redundant_each.rb +1 -1
  341. data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
  342. data/lib/rubocop/cop/style/redundant_format.rb +238 -0
  343. data/lib/rubocop/cop/style/redundant_freeze.rb +2 -2
  344. data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
  345. data/lib/rubocop/cop/style/redundant_line_continuation.rb +56 -17
  346. data/lib/rubocop/cop/style/redundant_parentheses.rb +37 -25
  347. data/lib/rubocop/cop/style/redundant_regexp_argument.rb +4 -0
  348. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
  349. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -1
  350. data/lib/rubocop/cop/style/redundant_return.rb +2 -2
  351. data/lib/rubocop/cop/style/redundant_self.rb +8 -15
  352. data/lib/rubocop/cop/style/redundant_self_assignment.rb +20 -32
  353. data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +4 -4
  354. data/lib/rubocop/cop/style/redundant_sort.rb +3 -3
  355. data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -2
  356. data/lib/rubocop/cop/style/require_order.rb +1 -1
  357. data/lib/rubocop/cop/style/rescue_modifier.rb +15 -4
  358. data/lib/rubocop/cop/style/return_nil.rb +1 -1
  359. data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +54 -12
  360. data/lib/rubocop/cop/style/safe_navigation.rb +105 -51
  361. data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
  362. data/lib/rubocop/cop/style/select_by_regexp.rb +10 -7
  363. data/lib/rubocop/cop/style/self_assignment.rb +11 -17
  364. data/lib/rubocop/cop/style/semicolon.rb +2 -2
  365. data/lib/rubocop/cop/style/send_with_literal_method_name.rb +2 -1
  366. data/lib/rubocop/cop/style/signal_exception.rb +2 -3
  367. data/lib/rubocop/cop/style/single_argument_dig.rb +9 -5
  368. data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
  369. data/lib/rubocop/cop/style/single_line_do_end_block.rb +12 -3
  370. data/lib/rubocop/cop/style/single_line_methods.rb +3 -4
  371. data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
  372. data/lib/rubocop/cop/style/sole_nested_conditional.rb +4 -5
  373. data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
  374. data/lib/rubocop/cop/style/string_concatenation.rb +14 -13
  375. data/lib/rubocop/cop/style/string_literals.rb +1 -1
  376. data/lib/rubocop/cop/style/string_methods.rb +1 -1
  377. data/lib/rubocop/cop/style/struct_inheritance.rb +1 -1
  378. data/lib/rubocop/cop/style/super_arguments.rb +65 -17
  379. data/lib/rubocop/cop/style/swap_values.rb +4 -15
  380. data/lib/rubocop/cop/style/ternary_parentheses.rb +26 -5
  381. data/lib/rubocop/cop/style/top_level_method_definition.rb +1 -1
  382. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +4 -1
  383. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -4
  384. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  385. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -2
  386. data/lib/rubocop/cop/style/while_until_modifier.rb +0 -1
  387. data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
  388. data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
  389. data/lib/rubocop/cop/team.rb +8 -1
  390. data/lib/rubocop/cop/util.rb +12 -5
  391. data/lib/rubocop/cop/utils/format_string.rb +7 -5
  392. data/lib/rubocop/cop/variable_force/assignment.rb +18 -3
  393. data/lib/rubocop/cop/variable_force/branch.rb +1 -1
  394. data/lib/rubocop/cop/variable_force/variable.rb +18 -2
  395. data/lib/rubocop/cop/variable_force/variable_table.rb +5 -5
  396. data/lib/rubocop/cop/variable_force.rb +4 -10
  397. data/lib/rubocop/cops_documentation_generator.rb +100 -51
  398. data/lib/rubocop/directive_comment.rb +44 -10
  399. data/lib/rubocop/file_finder.rb +9 -4
  400. data/lib/rubocop/formatter/disabled_config_formatter.rb +1 -1
  401. data/lib/rubocop/formatter/formatter_set.rb +1 -1
  402. data/lib/rubocop/lsp/diagnostic.rb +189 -0
  403. data/lib/rubocop/lsp/logger.rb +2 -2
  404. data/lib/rubocop/lsp/routes.rb +7 -23
  405. data/lib/rubocop/lsp/runtime.rb +18 -48
  406. data/lib/rubocop/lsp/server.rb +0 -3
  407. data/lib/rubocop/lsp/stdin_runner.rb +83 -0
  408. data/lib/rubocop/magic_comment.rb +3 -3
  409. data/lib/rubocop/options.rb +28 -12
  410. data/lib/rubocop/path_util.rb +15 -8
  411. data/lib/rubocop/plugin/configuration_integrator.rb +143 -0
  412. data/lib/rubocop/plugin/load_error.rb +26 -0
  413. data/lib/rubocop/plugin/loader.rb +100 -0
  414. data/lib/rubocop/plugin/not_supported_error.rb +29 -0
  415. data/lib/rubocop/plugin.rb +39 -0
  416. data/lib/rubocop/rake_task.rb +4 -1
  417. data/lib/rubocop/result_cache.rb +13 -13
  418. data/lib/rubocop/rspec/cop_helper.rb +9 -0
  419. data/lib/rubocop/rspec/expect_offense.rb +7 -2
  420. data/lib/rubocop/rspec/shared_contexts.rb +4 -1
  421. data/lib/rubocop/rspec/support.rb +1 -2
  422. data/lib/rubocop/runner.rb +22 -12
  423. data/lib/rubocop/server/cache.rb +39 -1
  424. data/lib/rubocop/server/cli.rb +2 -2
  425. data/lib/rubocop/server/core.rb +1 -0
  426. data/lib/rubocop/target_finder.rb +1 -0
  427. data/lib/rubocop/target_ruby.rb +28 -13
  428. data/lib/rubocop/version.rb +42 -6
  429. data/lib/rubocop/yaml_duplication_checker.rb +20 -27
  430. data/lib/rubocop.rb +29 -0
  431. data/lib/ruby_lsp/rubocop/addon.rb +75 -0
  432. data/lib/ruby_lsp/rubocop/runtime_adapter.rb +47 -0
  433. metadata +75 -19
  434. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -3,10 +3,11 @@
3
3
  module RuboCop
4
4
  # This module holds the RuboCop version information.
5
5
  module Version
6
- STRING = '1.66.1'
6
+ STRING = '1.72.2'
7
7
 
8
8
  MSG = '%<version>s (using %<parser_version>s, ' \
9
9
  'rubocop-ast %<rubocop_ast_version>s, ' \
10
+ 'analyzing as Ruby %<target_ruby_version>s, ' \
10
11
  'running on %<ruby_engine>s %<ruby_version>s)%<server_mode>s [%<ruby_platform>s]'
11
12
 
12
13
  CANONICAL_FEATURE_NAMES = {
@@ -17,11 +18,13 @@ module RuboCop
17
18
  'rubocop-md' => 'markdown', 'rubocop-factory_bot' => 'factory_bot'
18
19
  }.freeze
19
20
 
21
+ # NOTE: Marked as private but used by gems like standard.
20
22
  # @api private
21
23
  def self.version(debug: false, env: nil)
22
24
  if debug
23
25
  verbose_version = format(MSG, version: STRING, parser_version: parser_version,
24
26
  rubocop_ast_version: RuboCop::AST::Version::STRING,
27
+ target_ruby_version: target_ruby_version(env),
25
28
  ruby_engine: RUBY_ENGINE, ruby_version: RUBY_VERSION,
26
29
  server_mode: server_mode,
27
30
  ruby_platform: RUBY_PLATFORM)
@@ -39,6 +42,11 @@ module RuboCop
39
42
  end
40
43
  end
41
44
 
45
+ # @api private
46
+ def self.verbose(env: nil)
47
+ version(debug: true, env: env)
48
+ end
49
+
42
50
  # @api private
43
51
  def self.parser_version
44
52
  config_path = ConfigFinder.find_config_path(Dir.pwd)
@@ -55,14 +63,21 @@ module RuboCop
55
63
  end
56
64
 
57
65
  # @api private
66
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
58
67
  def self.extension_versions(env)
59
- features = Util.silence_warnings do
60
- # Suppress any config issues when loading the config (ie. deprecations,
61
- # pending cops, etc.).
62
- env.config_store.unvalidated.for_pwd.loaded_features.sort
68
+ plugins = config_for_pwd(env).loaded_plugins
69
+ plugin_versions = plugins.filter_map do |plugin|
70
+ next if Plugin::BUILTIN_INTERNAL_PLUGINS.key?(plugin.about.name)
71
+ next unless (plugin_name = plugin.about.name)
72
+
73
+ " - #{plugin_name} #{plugin.about.version}"
63
74
  end
64
75
 
65
- features.filter_map do |loaded_feature|
76
+ # TODO: It needs to be maintained for a while to ensure compatibility with extensions that
77
+ # don't support plugins. It should be removed in future once the old style becomes obsolete.
78
+ features = config_for_pwd(env).loaded_features.sort
79
+ features -= plugins.map { |plugin| plugin.about.name }
80
+ feature_versions = features.filter_map do |loaded_feature|
66
81
  next unless (match = loaded_feature.match(/rubocop-(?<feature>.*)/))
67
82
 
68
83
  # Get the expected name of the folder containing the extension code.
@@ -81,6 +96,27 @@ module RuboCop
81
96
 
82
97
  " - #{loaded_feature} #{feature_version}"
83
98
  end
99
+
100
+ plugin_versions + feature_versions
101
+ end
102
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
103
+
104
+ # @api private
105
+ def self.target_ruby_version(env)
106
+ if env
107
+ config_for_pwd(env).target_ruby_version
108
+ else
109
+ TargetRuby.new(Config.new).version
110
+ end
111
+ end
112
+
113
+ # @api private
114
+ def self.config_for_pwd(env)
115
+ Util.silence_warnings do
116
+ # Suppress any config issues when loading the config (ie. deprecations,
117
+ # pending cops, etc.).
118
+ env.config_store.unvalidated.for_pwd
119
+ end
84
120
  end
85
121
 
86
122
  # Returns feature version in one of two ways:
@@ -5,37 +5,30 @@ module RuboCop
5
5
  # @api private
6
6
  module YAMLDuplicationChecker
7
7
  def self.check(yaml_string, filename, &on_duplicated)
8
- # Ruby 2.6+
9
- tree = if Gem::Version.new(Psych::VERSION) >= Gem::Version.new('3.1.0')
10
- # Specify filename to display helpful message when it raises
11
- # an error.
12
- YAML.parse(yaml_string, filename: filename)
13
- else
14
- YAML.parse(yaml_string, filename)
15
- end
16
- return unless tree
17
-
18
- traverse(tree, &on_duplicated)
19
- tree
8
+ handler = DuplicationCheckHandler.new(&on_duplicated)
9
+ parser = Psych::Parser.new(handler)
10
+ parser.parse(yaml_string, filename)
11
+ parser.handler.root.children[0]
20
12
  end
21
13
 
22
- def self.traverse(tree, &on_duplicated)
23
- case tree
24
- when Psych::Nodes::Mapping
25
- tree.children.each_slice(2).with_object([]) do |(key, value), keys|
26
- exist = keys.find { |key2| key2.value == key.value }
27
- yield(exist, key) if exist
28
- keys << key
29
- traverse(value, &on_duplicated)
30
- end
31
- else
32
- children = tree.children
33
- return unless children
14
+ class DuplicationCheckHandler < Psych::TreeBuilder # :nodoc:
15
+ def initialize(&block)
16
+ super()
17
+ @block = block
18
+ end
34
19
 
35
- children.each { |c| traverse(c, &on_duplicated) }
20
+ def end_mapping
21
+ mapping_node = super
22
+ # OPTIMIZE: Use a hash for faster lookup since there can
23
+ # be quite a few keys at the top-level.
24
+ keys = {}
25
+ mapping_node.children.each_slice(2) do |key, _value|
26
+ duplicate = keys[key.value]
27
+ @block.call(duplicate, key) if duplicate
28
+ keys[key.value] = key
29
+ end
30
+ mapping_node
36
31
  end
37
32
  end
38
-
39
- private_class_method :traverse
40
33
  end
41
34
  end
data/lib/rubocop.rb CHANGED
@@ -11,6 +11,7 @@ require 'rainbow'
11
11
 
12
12
  require 'regexp_parser'
13
13
  require 'set'
14
+ require 'stringio'
14
15
  require 'unicode/display_width'
15
16
 
16
17
  # we have to require RuboCop's version, before rubocop-ast's
@@ -77,12 +78,14 @@ require_relative 'rubocop/cop/mixin/allowed_receivers'
77
78
  require_relative 'rubocop/cop/mixin/auto_corrector' # rubocop:todo Naming/InclusiveLanguage
78
79
  require_relative 'rubocop/cop/mixin/check_assignment'
79
80
  require_relative 'rubocop/cop/mixin/check_line_breakable'
81
+ require_relative 'rubocop/cop/mixin/check_single_line_suitability'
80
82
  require_relative 'rubocop/cop/mixin/configurable_max'
81
83
  require_relative 'rubocop/cop/mixin/code_length' # relies on configurable_max
82
84
  require_relative 'rubocop/cop/mixin/configurable_enforced_style'
83
85
  require_relative 'rubocop/cop/mixin/configurable_formatting'
84
86
  require_relative 'rubocop/cop/mixin/configurable_naming'
85
87
  require_relative 'rubocop/cop/mixin/configurable_numbering'
88
+ require_relative 'rubocop/cop/mixin/dig_help'
86
89
  require_relative 'rubocop/cop/mixin/documentation_comment'
87
90
  require_relative 'rubocop/cop/mixin/duplication'
88
91
  require_relative 'rubocop/cop/mixin/range_help'
@@ -90,12 +93,14 @@ require_relative 'rubocop/cop/mixin/annotation_comment' # relies on range
90
93
  require_relative 'rubocop/cop/mixin/empty_lines_around_body' # relies on range
91
94
  require_relative 'rubocop/cop/mixin/empty_parameter'
92
95
  require_relative 'rubocop/cop/mixin/end_keyword_alignment'
96
+ require_relative 'rubocop/cop/mixin/endless_method_rewriter'
93
97
  require_relative 'rubocop/cop/mixin/enforce_superclass'
94
98
  require_relative 'rubocop/cop/mixin/first_element_line_break'
95
99
  require_relative 'rubocop/cop/mixin/frozen_string_literal'
96
100
  require_relative 'rubocop/cop/mixin/gem_declaration'
97
101
  require_relative 'rubocop/cop/mixin/gemspec_help'
98
102
  require_relative 'rubocop/cop/mixin/hash_alignment_styles'
103
+ require_relative 'rubocop/cop/mixin/hash_subset'
99
104
  require_relative 'rubocop/cop/mixin/hash_transform_method'
100
105
  require_relative 'rubocop/cop/mixin/integer_node'
101
106
  require_relative 'rubocop/cop/mixin/interpolation'
@@ -289,6 +294,7 @@ require_relative 'rubocop/cop/lint/ambiguous_operator'
289
294
  require_relative 'rubocop/cop/lint/ambiguous_operator_precedence'
290
295
  require_relative 'rubocop/cop/lint/ambiguous_range'
291
296
  require_relative 'rubocop/cop/lint/ambiguous_regexp_literal'
297
+ require_relative 'rubocop/cop/lint/array_literal_in_regexp'
292
298
  require_relative 'rubocop/cop/lint/assignment_in_condition'
293
299
  require_relative 'rubocop/cop/lint/big_decimal_new'
294
300
  require_relative 'rubocop/cop/lint/binary_operator_with_identical_operands'
@@ -296,7 +302,9 @@ require_relative 'rubocop/cop/lint/boolean_symbol'
296
302
  require_relative 'rubocop/cop/lint/circular_argument_reference'
297
303
  require_relative 'rubocop/cop/lint/constant_definition_in_block'
298
304
  require_relative 'rubocop/cop/lint/constant_overwritten_in_rescue'
305
+ require_relative 'rubocop/cop/lint/constant_reassignment'
299
306
  require_relative 'rubocop/cop/lint/constant_resolution'
307
+ require_relative 'rubocop/cop/lint/cop_directive_syntax'
300
308
  require_relative 'rubocop/cop/lint/debugger'
301
309
  require_relative 'rubocop/cop/lint/deprecated_class_methods'
302
310
  require_relative 'rubocop/cop/lint/deprecated_constants'
@@ -312,6 +320,7 @@ require_relative 'rubocop/cop/lint/duplicate_methods'
312
320
  require_relative 'rubocop/cop/lint/duplicate_regexp_character_class_element'
313
321
  require_relative 'rubocop/cop/lint/duplicate_require'
314
322
  require_relative 'rubocop/cop/lint/duplicate_rescue_exception'
323
+ require_relative 'rubocop/cop/lint/duplicate_set_element'
315
324
  require_relative 'rubocop/cop/lint/each_with_object_argument'
316
325
  require_relative 'rubocop/cop/lint/else_layout'
317
326
  require_relative 'rubocop/cop/lint/empty_block'
@@ -324,12 +333,14 @@ require_relative 'rubocop/cop/lint/empty_in_pattern'
324
333
  require_relative 'rubocop/cop/lint/empty_interpolation'
325
334
  require_relative 'rubocop/cop/lint/empty_when'
326
335
  require_relative 'rubocop/cop/lint/ensure_return'
336
+ require_relative 'rubocop/cop/lint/shared_mutable_default'
327
337
  require_relative 'rubocop/cop/lint/erb_new_arguments'
328
338
  require_relative 'rubocop/cop/lint/flip_flop'
329
339
  require_relative 'rubocop/cop/lint/float_comparison'
330
340
  require_relative 'rubocop/cop/lint/float_out_of_range'
331
341
  require_relative 'rubocop/cop/lint/format_parameter_mismatch'
332
342
  require_relative 'rubocop/cop/lint/hash_compare_by_identity'
343
+ require_relative 'rubocop/cop/lint/hash_new_with_keyword_arguments_as_default'
333
344
  require_relative 'rubocop/cop/lint/heredoc_method_call_position'
334
345
  require_relative 'rubocop/cop/lint/identity_comparison'
335
346
  require_relative 'rubocop/cop/lint/implicit_string_concatenation'
@@ -357,6 +368,7 @@ require_relative 'rubocop/cop/lint/non_deterministic_require_order'
357
368
  require_relative 'rubocop/cop/lint/non_local_exit_from_iterator'
358
369
  require_relative 'rubocop/cop/lint/number_conversion'
359
370
  require_relative 'rubocop/cop/lint/numbered_parameter_assignment'
371
+ require_relative 'rubocop/cop/lint/numeric_operation_with_constant_result'
360
372
  require_relative 'rubocop/cop/lint/or_assignment_to_constant'
361
373
  require_relative 'rubocop/cop/lint/ordered_magic_comments'
362
374
  require_relative 'rubocop/cop/lint/out_of_range_regexp_ref'
@@ -373,6 +385,7 @@ require_relative 'rubocop/cop/lint/redundant_require_statement'
373
385
  require_relative 'rubocop/cop/lint/redundant_safe_navigation'
374
386
  require_relative 'rubocop/cop/lint/redundant_splat_expansion'
375
387
  require_relative 'rubocop/cop/lint/redundant_string_coercion'
388
+ require_relative 'rubocop/cop/lint/redundant_type_conversion'
376
389
  require_relative 'rubocop/cop/lint/redundant_with_index'
377
390
  require_relative 'rubocop/cop/lint/redundant_with_object'
378
391
  require_relative 'rubocop/cop/lint/refinement_import_methods'
@@ -394,6 +407,7 @@ require_relative 'rubocop/cop/lint/shadowed_exception'
394
407
  require_relative 'rubocop/cop/lint/shadowing_outer_local_variable'
395
408
  require_relative 'rubocop/cop/lint/struct_new_override'
396
409
  require_relative 'rubocop/cop/lint/suppressed_exception'
410
+ require_relative 'rubocop/cop/lint/suppressed_exception_in_number_conversion'
397
411
  require_relative 'rubocop/cop/lint/symbol_conversion'
398
412
  require_relative 'rubocop/cop/lint/syntax'
399
413
  require_relative 'rubocop/cop/lint/to_enum_arguments'
@@ -402,6 +416,7 @@ require_relative 'rubocop/cop/lint/top_level_return_with_argument'
402
416
  require_relative 'rubocop/cop/lint/trailing_comma_in_attribute_declaration'
403
417
  require_relative 'rubocop/cop/lint/triple_quotes'
404
418
  require_relative 'rubocop/cop/lint/underscore_prefixed_variable_name'
419
+ require_relative 'rubocop/cop/lint/unescaped_bracket_in_regexp'
405
420
  require_relative 'rubocop/cop/lint/unexpected_block_arity'
406
421
  require_relative 'rubocop/cop/lint/unified_integer'
407
422
  require_relative 'rubocop/cop/lint/unmodified_reduce_accumulator'
@@ -413,6 +428,8 @@ require_relative 'rubocop/cop/lint/uri_escape_unescape'
413
428
  require_relative 'rubocop/cop/lint/uri_regexp'
414
429
  require_relative 'rubocop/cop/lint/useless_access_modifier'
415
430
  require_relative 'rubocop/cop/lint/useless_assignment'
431
+ require_relative 'rubocop/cop/lint/useless_constant_scoping'
432
+ require_relative 'rubocop/cop/lint/useless_defined'
416
433
  require_relative 'rubocop/cop/lint/useless_else_without_rescue'
417
434
  require_relative 'rubocop/cop/lint/useless_method_definition'
418
435
  require_relative 'rubocop/cop/lint/useless_numeric_operation'
@@ -459,6 +476,7 @@ require_relative 'rubocop/cop/naming/variable_number'
459
476
  require_relative 'rubocop/cop/style/access_modifier_declarations'
460
477
  require_relative 'rubocop/cop/style/accessor_grouping'
461
478
  require_relative 'rubocop/cop/style/alias'
479
+ require_relative 'rubocop/cop/style/ambiguous_endless_method_definition'
462
480
  require_relative 'rubocop/cop/style/and_or'
463
481
  require_relative 'rubocop/cop/style/arguments_forwarding'
464
482
  require_relative 'rubocop/cop/style/array_coercion'
@@ -471,6 +489,7 @@ require_relative 'rubocop/cop/style/auto_resource_cleanup'
471
489
  require_relative 'rubocop/cop/style/bare_percent_literals'
472
490
  require_relative 'rubocop/cop/style/begin_block'
473
491
  require_relative 'rubocop/cop/style/bisected_attr_accessor'
492
+ require_relative 'rubocop/cop/style/bitwise_predicate'
474
493
  require_relative 'rubocop/cop/style/block_comments'
475
494
  require_relative 'rubocop/cop/style/block_delimiters'
476
495
  require_relative 'rubocop/cop/style/case_equality'
@@ -486,6 +505,7 @@ require_relative 'rubocop/cop/style/collection_compact'
486
505
  require_relative 'rubocop/cop/style/collection_methods'
487
506
  require_relative 'rubocop/cop/style/colon_method_call'
488
507
  require_relative 'rubocop/cop/style/colon_method_definition'
508
+ require_relative 'rubocop/cop/style/combinable_defined'
489
509
  require_relative 'rubocop/cop/style/combinable_loops'
490
510
  require_relative 'rubocop/cop/style/command_literal'
491
511
  require_relative 'rubocop/cop/style/comment_annotation'
@@ -498,6 +518,7 @@ require_relative 'rubocop/cop/style/copyright'
498
518
  require_relative 'rubocop/cop/style/data_inheritance'
499
519
  require_relative 'rubocop/cop/style/date_time'
500
520
  require_relative 'rubocop/cop/style/def_with_parentheses'
521
+ require_relative 'rubocop/cop/style/dig_chain'
501
522
  require_relative 'rubocop/cop/style/dir'
502
523
  require_relative 'rubocop/cop/style/dir_empty'
503
524
  require_relative 'rubocop/cop/style/disable_cops_within_source_code_directive'
@@ -527,7 +548,9 @@ require_relative 'rubocop/cop/style/explicit_block_argument'
527
548
  require_relative 'rubocop/cop/style/exponential_notation'
528
549
  require_relative 'rubocop/cop/style/fetch_env_var'
529
550
  require_relative 'rubocop/cop/style/file_empty'
551
+ require_relative 'rubocop/cop/style/file_null'
530
552
  require_relative 'rubocop/cop/style/file_read'
553
+ require_relative 'rubocop/cop/style/file_touch'
531
554
  require_relative 'rubocop/cop/style/file_write'
532
555
  require_relative 'rubocop/cop/style/float_division'
533
556
  require_relative 'rubocop/cop/style/for'
@@ -542,6 +565,7 @@ require_relative 'rubocop/cop/style/hash_conversion'
542
565
  require_relative 'rubocop/cop/style/hash_each_methods'
543
566
  require_relative 'rubocop/cop/style/hash_except'
544
567
  require_relative 'rubocop/cop/style/hash_like_case'
568
+ require_relative 'rubocop/cop/style/hash_slice'
545
569
  require_relative 'rubocop/cop/style/hash_syntax'
546
570
  require_relative 'rubocop/cop/style/hash_transform_keys'
547
571
  require_relative 'rubocop/cop/style/hash_transform_values'
@@ -558,6 +582,8 @@ require_relative 'rubocop/cop/style/inverse_methods'
558
582
  require_relative 'rubocop/cop/style/inline_comment'
559
583
  require_relative 'rubocop/cop/style/invertible_unless_condition'
560
584
  require_relative 'rubocop/cop/style/ip_addresses'
585
+ require_relative 'rubocop/cop/style/it_assignment'
586
+ require_relative 'rubocop/cop/style/keyword_arguments_merging'
561
587
  require_relative 'rubocop/cop/style/keyword_parameters_order'
562
588
  require_relative 'rubocop/cop/style/lambda'
563
589
  require_relative 'rubocop/cop/style/lambda_call'
@@ -582,6 +608,7 @@ require_relative 'rubocop/cop/style/redundant_each'
582
608
  require_relative 'rubocop/cop/style/redundant_fetch_block'
583
609
  require_relative 'rubocop/cop/style/redundant_file_extension_in_require'
584
610
  require_relative 'rubocop/cop/style/redundant_filter_chain'
611
+ require_relative 'rubocop/cop/style/redundant_format'
585
612
  require_relative 'rubocop/cop/style/redundant_heredoc_delimiter_quotes'
586
613
  require_relative 'rubocop/cop/style/redundant_initialize'
587
614
  require_relative 'rubocop/cop/style/redundant_interpolation_unfreeze'
@@ -591,6 +618,7 @@ require_relative 'rubocop/cop/style/redundant_regexp_constructor'
591
618
  require_relative 'rubocop/cop/style/redundant_self_assignment'
592
619
  require_relative 'rubocop/cop/style/redundant_self_assignment_branch'
593
620
  require_relative 'rubocop/cop/style/require_order'
621
+ require_relative 'rubocop/cop/style/safe_navigation_chain_length'
594
622
  require_relative 'rubocop/cop/style/single_line_do_end_block'
595
623
  require_relative 'rubocop/cop/style/sole_nested_conditional'
596
624
  require_relative 'rubocop/cop/style/static_class'
@@ -750,6 +778,7 @@ require_relative 'rubocop/config_store'
750
778
  require_relative 'rubocop/config_validator'
751
779
  require_relative 'rubocop/feature_loader'
752
780
  require_relative 'rubocop/lockfile'
781
+ require_relative 'rubocop/lsp'
753
782
  require_relative 'rubocop/target_finder'
754
783
  require_relative 'rubocop/directive_comment'
755
784
  require_relative 'rubocop/comment_config'
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../rubocop'
4
+ require_relative '../../rubocop/lsp/logger'
5
+ require_relative 'runtime_adapter'
6
+
7
+ module RubyLsp
8
+ module RuboCop
9
+ # A Ruby LSP add-on for RuboCop.
10
+ class Addon < RubyLsp::Addon
11
+ def initializer
12
+ @runtime_adapter = nil
13
+ end
14
+
15
+ def name
16
+ 'RuboCop'
17
+ end
18
+
19
+ def activate(global_state, message_queue)
20
+ ::RuboCop::LSP::Logger.log(
21
+ "Activating RuboCop LSP addon #{::RuboCop::Version::STRING}.", prefix: '[RuboCop]'
22
+ )
23
+
24
+ @runtime_adapter = RuntimeAdapter.new
25
+ global_state.register_formatter('rubocop', @runtime_adapter)
26
+ register_additional_file_watchers(global_state, message_queue)
27
+
28
+ ::RuboCop::LSP::Logger.log(
29
+ "Initialized RuboCop LSP addon #{::RuboCop::Version::STRING}.", prefix: '[RuboCop]'
30
+ )
31
+ end
32
+
33
+ def deactivate
34
+ @runtime_adapter = nil
35
+ end
36
+
37
+ # rubocop:disable Layout/LineLength, Metrics/MethodLength
38
+ def register_additional_file_watchers(global_state, message_queue)
39
+ return unless global_state.supports_watching_files
40
+
41
+ message_queue << Request.new(
42
+ id: 'rubocop-file-watcher',
43
+ method: 'client/registerCapability',
44
+ params: Interface::RegistrationParams.new(
45
+ registrations: [
46
+ Interface::Registration.new(
47
+ id: 'workspace/didChangeWatchedFilesRuboCop',
48
+ method: 'workspace/didChangeWatchedFiles',
49
+ register_options: Interface::DidChangeWatchedFilesRegistrationOptions.new(
50
+ watchers: [
51
+ Interface::FileSystemWatcher.new(
52
+ glob_pattern: '**/.rubocop{,_todo}.yml',
53
+ kind: Constant::WatchKind::CREATE | Constant::WatchKind::CHANGE | Constant::WatchKind::DELETE
54
+ )
55
+ ]
56
+ )
57
+ )
58
+ ]
59
+ )
60
+ )
61
+ end
62
+ # rubocop:enable Layout/LineLength, Metrics/MethodLength
63
+
64
+ def workspace_did_change_watched_files(changes)
65
+ return unless changes.any? { |change| change[:uri].end_with?('.rubocop.yml') }
66
+
67
+ @runtime_adapter = RuntimeAdapter.new
68
+
69
+ ::RuboCop::LSP::Logger.log(<<~MESSAGE, prefix: '[RuboCop]')
70
+ Re-initialized RuboCop LSP addon #{::RuboCop::Version::STRING} due to .rubocop.yml file change.
71
+ MESSAGE
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../rubocop/lsp/runtime'
4
+
5
+ module RubyLsp
6
+ module RuboCop
7
+ # Provides an adapter to bridge RuboCop's built-in LSP runtime with Ruby LSP's add-on.
8
+ # @api private
9
+ class RuntimeAdapter
10
+ include RubyLsp::Requests::Support::Formatter
11
+
12
+ def initialize
13
+ config_store = ::RuboCop::ConfigStore.new
14
+
15
+ @runtime = ::RuboCop::LSP::Runtime.new(config_store)
16
+ end
17
+
18
+ def run_diagnostic(uri, document)
19
+ @runtime.offenses(uri_to_path(uri), document.source, document.encoding)
20
+ end
21
+
22
+ def run_formatting(uri, document)
23
+ @runtime.format(uri_to_path(uri), document.source, command: 'rubocop.formatAutocorrects')
24
+ end
25
+
26
+ def run_range_formatting(_uri, _partial_source, _base_indentation)
27
+ # Not yet supported. Should return the formatted version of `partial_source` which is
28
+ # a partial selection of the entire document. For example, it should not try to add
29
+ # a frozen_string_literal magic comment and all style corrections should start from
30
+ # the `base_indentation`.
31
+ nil
32
+ end
33
+
34
+ private
35
+
36
+ # duplicated from: lib/standard/lsp/routes.rb
37
+ # modified to incorporate Ruby LSP's to_standardized_path method
38
+ def uri_to_path(uri)
39
+ if uri.respond_to?(:to_standardized_path) && (standardized_path = uri.to_standardized_path)
40
+ standardized_path
41
+ else
42
+ uri.to_s.delete_prefix('file://')
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end