rubocop 1.67.0 → 1.75.5

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 (465) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +4 -4
  4. data/config/default.yml +264 -47
  5. data/config/internal_affairs.yml +20 -0
  6. data/config/obsoletion.yml +3 -1
  7. data/lib/rubocop/cached_data.rb +12 -4
  8. data/lib/rubocop/cli/command/execute_runner.rb +4 -4
  9. data/lib/rubocop/cli/command/show_cops.rb +24 -2
  10. data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
  11. data/lib/rubocop/cli/command/version.rb +2 -2
  12. data/lib/rubocop/cli.rb +1 -1
  13. data/lib/rubocop/comment_config.rb +2 -2
  14. data/lib/rubocop/config.rb +52 -10
  15. data/lib/rubocop/config_loader.rb +52 -9
  16. data/lib/rubocop/config_loader_resolver.rb +36 -10
  17. data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -3
  18. data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
  19. data/lib/rubocop/config_obsoletion.rb +46 -2
  20. data/lib/rubocop/config_validator.rb +25 -14
  21. data/lib/rubocop/cop/autocorrect_logic.rb +36 -19
  22. data/lib/rubocop/cop/base.rb +7 -1
  23. data/lib/rubocop/cop/bundler/duplicated_gem.rb +2 -2
  24. data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
  25. data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
  26. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
  27. data/lib/rubocop/cop/correctors/alignment_corrector.rb +1 -12
  28. data/lib/rubocop/cop/correctors/for_to_each_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_enabled.rb +85 -0
  34. data/lib/rubocop/cop/internal_affairs/example_description.rb +8 -4
  35. data/lib/rubocop/cop/internal_affairs/location_exists.rb +116 -0
  36. data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
  37. data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +3 -4
  38. data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +3 -2
  39. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -1
  40. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
  41. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
  42. data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +230 -0
  43. data/lib/rubocop/cop/internal_affairs/node_type_group.rb +91 -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_described_class_as_subject.rb +6 -5
  51. data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +3 -1
  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 +13 -2
  55. data/lib/rubocop/cop/internal_affairs.rb +7 -16
  56. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -1
  57. data/lib/rubocop/cop/layout/argument_alignment.rb +2 -9
  58. data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
  59. data/lib/rubocop/cop/layout/begin_end_alignment.rb +0 -1
  60. data/lib/rubocop/cop/layout/block_alignment.rb +3 -2
  61. data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
  62. data/lib/rubocop/cop/layout/class_structure.rb +9 -9
  63. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +4 -4
  64. data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
  65. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  66. data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
  67. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +3 -3
  68. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +7 -11
  69. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +30 -4
  70. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
  71. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +1 -0
  72. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +4 -5
  73. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +23 -1
  74. data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
  75. data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
  76. data/lib/rubocop/cop/layout/first_argument_indentation.rb +3 -8
  77. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +2 -7
  78. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
  79. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
  80. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
  81. data/lib/rubocop/cop/layout/hash_alignment.rb +8 -6
  82. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -1
  83. data/lib/rubocop/cop/layout/indentation_width.rb +8 -7
  84. data/lib/rubocop/cop/layout/leading_comment_space.rb +57 -2
  85. data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +11 -2
  86. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +7 -1
  87. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
  88. data/lib/rubocop/cop/layout/line_length.rb +123 -4
  89. data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -0
  90. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
  91. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
  92. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -1
  93. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
  94. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
  95. data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
  96. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +3 -4
  97. data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
  98. data/lib/rubocop/cop/layout/redundant_line_break.rb +19 -46
  99. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +6 -7
  100. data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -1
  101. data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
  102. data/lib/rubocop/cop/layout/space_after_comma.rb +1 -1
  103. data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
  104. data/lib/rubocop/cop/layout/space_after_semicolon.rb +11 -1
  105. data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -1
  106. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
  107. data/lib/rubocop/cop/layout/space_around_operators.rb +23 -21
  108. data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -0
  109. data/lib/rubocop/cop/layout/space_before_brackets.rb +5 -5
  110. data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
  111. data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
  112. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +10 -1
  113. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +5 -0
  114. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +7 -0
  115. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +0 -1
  116. data/lib/rubocop/cop/layout/trailing_whitespace.rb +5 -3
  117. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
  118. data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +118 -0
  119. data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
  120. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +10 -12
  121. data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
  122. data/lib/rubocop/cop/lint/circular_argument_reference.rb +4 -1
  123. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
  124. data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
  125. data/lib/rubocop/cop/lint/cop_directive_syntax.rb +84 -0
  126. data/lib/rubocop/cop/lint/debugger.rb +3 -3
  127. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +3 -2
  128. data/lib/rubocop/cop/lint/duplicate_branch.rb +39 -4
  129. data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
  130. data/lib/rubocop/cop/lint/duplicate_methods.rb +2 -17
  131. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -1
  132. data/lib/rubocop/cop/lint/duplicate_set_element.rb +20 -7
  133. data/lib/rubocop/cop/lint/empty_conditional_body.rb +14 -64
  134. data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
  135. data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
  136. data/lib/rubocop/cop/lint/empty_file.rb +0 -2
  137. data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
  138. data/lib/rubocop/cop/lint/erb_new_arguments.rb +0 -6
  139. data/lib/rubocop/cop/lint/float_comparison.rb +20 -14
  140. data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -4
  141. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
  142. data/lib/rubocop/cop/lint/hash_new_with_keyword_arguments_as_default.rb +55 -0
  143. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  144. data/lib/rubocop/cop/lint/interpolation_check.rb +9 -0
  145. data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +3 -0
  146. data/lib/rubocop/cop/lint/literal_as_condition.rb +118 -9
  147. data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +1 -1
  148. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +24 -6
  149. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +1 -1
  150. data/lib/rubocop/cop/lint/missing_super.rb +2 -2
  151. data/lib/rubocop/cop/lint/mixed_case_range.rb +5 -8
  152. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  153. data/lib/rubocop/cop/lint/nested_method_definition.rb +10 -6
  154. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  155. data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +2 -2
  156. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +12 -3
  157. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +3 -3
  158. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
  159. data/lib/rubocop/cop/lint/number_conversion.rb +0 -1
  160. data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -2
  161. data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +93 -0
  162. data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -3
  163. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +3 -2
  164. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -5
  165. data/lib/rubocop/cop/lint/raise_exception.rb +29 -10
  166. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +1 -1
  167. data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
  168. data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -21
  169. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +12 -7
  170. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +8 -7
  171. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
  172. data/lib/rubocop/cop/lint/redundant_type_conversion.rb +261 -0
  173. data/lib/rubocop/cop/lint/redundant_with_index.rb +3 -0
  174. data/lib/rubocop/cop/lint/redundant_with_object.rb +3 -0
  175. data/lib/rubocop/cop/lint/refinement_import_methods.rb +1 -1
  176. data/lib/rubocop/cop/lint/regexp_as_condition.rb +0 -1
  177. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  178. data/lib/rubocop/cop/lint/rescue_type.rb +3 -7
  179. data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -11
  180. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +17 -1
  181. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +5 -1
  182. data/lib/rubocop/cop/lint/self_assignment.rb +8 -10
  183. data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
  184. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +8 -1
  185. data/lib/rubocop/cop/lint/shared_mutable_default.rb +76 -0
  186. data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
  187. data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
  188. data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
  189. data/lib/rubocop/cop/lint/syntax.rb +4 -1
  190. data/lib/rubocop/cop/lint/to_enum_arguments.rb +1 -1
  191. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
  192. data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +88 -0
  193. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +3 -1
  194. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -1
  195. data/lib/rubocop/cop/lint/unreachable_code.rb +52 -2
  196. data/lib/rubocop/cop/lint/unreachable_loop.rb +6 -6
  197. data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
  198. data/lib/rubocop/cop/lint/useless_access_modifier.rb +5 -4
  199. data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
  200. data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
  201. data/lib/rubocop/cop/lint/useless_defined.rb +55 -0
  202. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +4 -0
  203. data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
  204. data/lib/rubocop/cop/lint/useless_numeric_operation.rb +2 -1
  205. data/lib/rubocop/cop/lint/useless_rescue.rb +2 -2
  206. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +2 -2
  207. data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -25
  208. data/lib/rubocop/cop/lint/void.rb +16 -12
  209. data/lib/rubocop/cop/message_annotator.rb +7 -3
  210. data/lib/rubocop/cop/metrics/block_length.rb +1 -0
  211. data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
  212. data/lib/rubocop/cop/metrics/class_length.rb +9 -9
  213. data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
  214. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +5 -2
  215. data/lib/rubocop/cop/metrics/method_length.rb +9 -1
  216. data/lib/rubocop/cop/metrics/module_length.rb +1 -1
  217. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
  218. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
  219. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +3 -4
  220. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
  221. data/lib/rubocop/cop/mixin/alignment.rb +2 -2
  222. data/lib/rubocop/cop/mixin/allowed_pattern.rb +4 -4
  223. data/lib/rubocop/cop/mixin/check_assignment.rb +4 -12
  224. data/lib/rubocop/cop/mixin/check_line_breakable.rb +22 -12
  225. data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +49 -0
  226. data/lib/rubocop/cop/mixin/comments_help.rb +8 -3
  227. data/lib/rubocop/cop/mixin/def_node.rb +1 -1
  228. data/lib/rubocop/cop/mixin/dig_help.rb +27 -0
  229. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
  230. data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +24 -0
  231. data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
  232. data/lib/rubocop/cop/mixin/forbidden_pattern.rb +16 -0
  233. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +3 -2
  234. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +15 -14
  235. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +22 -22
  236. data/lib/rubocop/cop/mixin/hash_subset.rb +203 -0
  237. data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
  238. data/lib/rubocop/cop/mixin/line_length_help.rb +5 -4
  239. data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
  240. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +7 -9
  241. data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
  242. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +68 -30
  243. data/lib/rubocop/cop/mixin/range_help.rb +15 -4
  244. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
  245. data/lib/rubocop/cop/mixin/statement_modifier.rb +8 -3
  246. data/lib/rubocop/cop/mixin/string_help.rb +2 -2
  247. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  248. data/lib/rubocop/cop/mixin/target_ruby_version.rb +17 -1
  249. data/lib/rubocop/cop/mixin/trailing_comma.rb +21 -5
  250. data/lib/rubocop/cop/naming/accessor_method_name.rb +6 -6
  251. data/lib/rubocop/cop/naming/block_forwarding.rb +20 -16
  252. data/lib/rubocop/cop/naming/constant_name.rb +6 -7
  253. data/lib/rubocop/cop/naming/file_name.rb +0 -2
  254. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +12 -13
  255. data/lib/rubocop/cop/naming/method_name.rb +64 -8
  256. data/lib/rubocop/cop/naming/predicate_name.rb +44 -0
  257. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +6 -14
  258. data/lib/rubocop/cop/naming/variable_name.rb +50 -6
  259. data/lib/rubocop/cop/naming/variable_number.rb +2 -3
  260. data/lib/rubocop/cop/offense.rb +2 -3
  261. data/lib/rubocop/cop/registry.rb +9 -6
  262. data/lib/rubocop/cop/security/compound_hash.rb +2 -0
  263. data/lib/rubocop/cop/security/yaml_load.rb +3 -2
  264. data/lib/rubocop/cop/style/access_modifier_declarations.rb +86 -28
  265. data/lib/rubocop/cop/style/accessor_grouping.rb +19 -5
  266. data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +79 -0
  267. data/lib/rubocop/cop/style/and_or.rb +1 -1
  268. data/lib/rubocop/cop/style/arguments_forwarding.rb +47 -28
  269. data/lib/rubocop/cop/style/array_first_last.rb +18 -2
  270. data/lib/rubocop/cop/style/array_intersect.rb +42 -30
  271. data/lib/rubocop/cop/style/bitwise_predicate.rb +100 -0
  272. data/lib/rubocop/cop/style/block_delimiters.rb +43 -25
  273. data/lib/rubocop/cop/style/case_like_if.rb +8 -11
  274. data/lib/rubocop/cop/style/class_and_module_children.rb +52 -11
  275. data/lib/rubocop/cop/style/class_equality_comparison.rb +1 -1
  276. data/lib/rubocop/cop/style/collection_methods.rb +2 -1
  277. data/lib/rubocop/cop/style/combinable_defined.rb +115 -0
  278. data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
  279. data/lib/rubocop/cop/style/commented_keyword.rb +20 -3
  280. data/lib/rubocop/cop/style/comparable_between.rb +75 -0
  281. data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
  282. data/lib/rubocop/cop/style/conditional_assignment.rb +39 -27
  283. data/lib/rubocop/cop/style/constant_visibility.rb +3 -12
  284. data/lib/rubocop/cop/style/dig_chain.rb +89 -0
  285. data/lib/rubocop/cop/style/documentation.rb +1 -1
  286. data/lib/rubocop/cop/style/double_negation.rb +4 -4
  287. data/lib/rubocop/cop/style/each_for_simple_loop.rb +4 -7
  288. data/lib/rubocop/cop/style/each_with_object.rb +2 -3
  289. data/lib/rubocop/cop/style/empty_else.rb +4 -2
  290. data/lib/rubocop/cop/style/empty_literal.rb +5 -1
  291. data/lib/rubocop/cop/style/empty_method.rb +1 -1
  292. data/lib/rubocop/cop/style/endless_method.rb +150 -18
  293. data/lib/rubocop/cop/style/eval_with_location.rb +4 -4
  294. data/lib/rubocop/cop/style/exact_regexp_match.rb +2 -3
  295. data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
  296. data/lib/rubocop/cop/style/explicit_block_argument.rb +16 -3
  297. data/lib/rubocop/cop/style/exponential_notation.rb +3 -3
  298. data/lib/rubocop/cop/style/fetch_env_var.rb +2 -1
  299. data/lib/rubocop/cop/style/file_null.rb +89 -0
  300. data/lib/rubocop/cop/style/file_touch.rb +75 -0
  301. data/lib/rubocop/cop/style/float_division.rb +8 -4
  302. data/lib/rubocop/cop/style/for.rb +1 -1
  303. data/lib/rubocop/cop/style/format_string_token.rb +38 -11
  304. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -2
  305. data/lib/rubocop/cop/style/global_std_stream.rb +3 -0
  306. data/lib/rubocop/cop/style/global_vars.rb +1 -3
  307. data/lib/rubocop/cop/style/guard_clause.rb +17 -3
  308. data/lib/rubocop/cop/style/hash_conversion.rb +1 -2
  309. data/lib/rubocop/cop/style/hash_each_methods.rb +6 -8
  310. data/lib/rubocop/cop/style/hash_except.rb +35 -147
  311. data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
  312. data/lib/rubocop/cop/style/hash_slice.rb +80 -0
  313. data/lib/rubocop/cop/style/hash_syntax.rb +9 -3
  314. data/lib/rubocop/cop/style/hash_transform_keys.rb +2 -2
  315. data/lib/rubocop/cop/style/hash_transform_values.rb +2 -2
  316. data/lib/rubocop/cop/style/identical_conditional_branches.rb +25 -6
  317. data/lib/rubocop/cop/style/if_inside_else.rb +10 -14
  318. data/lib/rubocop/cop/style/if_unless_modifier.rb +5 -5
  319. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +3 -4
  320. data/lib/rubocop/cop/style/if_with_semicolon.rb +20 -9
  321. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  322. data/lib/rubocop/cop/style/inverse_methods.rb +15 -12
  323. data/lib/rubocop/cop/style/invertible_unless_condition.rb +2 -2
  324. data/lib/rubocop/cop/style/ip_addresses.rb +2 -2
  325. data/lib/rubocop/cop/style/it_assignment.rb +36 -0
  326. data/lib/rubocop/cop/style/it_block_parameter.rb +100 -0
  327. data/lib/rubocop/cop/style/keyword_arguments_merging.rb +67 -0
  328. data/lib/rubocop/cop/style/keyword_parameters_order.rb +14 -8
  329. data/lib/rubocop/cop/style/lambda.rb +1 -0
  330. data/lib/rubocop/cop/style/lambda_call.rb +10 -4
  331. data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
  332. data/lib/rubocop/cop/style/map_into_array.rb +11 -3
  333. data/lib/rubocop/cop/style/map_to_hash.rb +1 -1
  334. data/lib/rubocop/cop/style/map_to_set.rb +3 -2
  335. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +27 -17
  336. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -0
  337. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -11
  338. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -4
  339. data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
  340. data/lib/rubocop/cop/style/missing_else.rb +2 -0
  341. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +33 -3
  342. data/lib/rubocop/cop/style/multiline_block_chain.rb +3 -2
  343. data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
  344. data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -9
  345. data/lib/rubocop/cop/style/multiple_comparison.rb +52 -51
  346. data/lib/rubocop/cop/style/mutable_constant.rb +7 -8
  347. data/lib/rubocop/cop/style/negated_if_else_condition.rb +7 -5
  348. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +1 -1
  349. data/lib/rubocop/cop/style/nested_ternary_operator.rb +5 -4
  350. data/lib/rubocop/cop/style/next.rb +44 -0
  351. data/lib/rubocop/cop/style/not.rb +1 -1
  352. data/lib/rubocop/cop/style/object_then.rb +15 -15
  353. data/lib/rubocop/cop/style/one_line_conditional.rb +25 -4
  354. data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
  355. data/lib/rubocop/cop/style/operator_method_call.rb +5 -6
  356. data/lib/rubocop/cop/style/or_assignment.rb +3 -6
  357. data/lib/rubocop/cop/style/parallel_assignment.rb +9 -18
  358. data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
  359. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  360. data/lib/rubocop/cop/style/proc.rb +2 -2
  361. data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
  362. data/lib/rubocop/cop/style/raise_args.rb +15 -13
  363. data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
  364. data/lib/rubocop/cop/style/redundant_argument.rb +3 -1
  365. data/lib/rubocop/cop/style/redundant_assignment.rb +1 -1
  366. data/lib/rubocop/cop/style/redundant_begin.rb +2 -1
  367. data/lib/rubocop/cop/style/redundant_condition.rb +95 -23
  368. data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +16 -5
  369. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +6 -10
  370. data/lib/rubocop/cop/style/redundant_each.rb +1 -1
  371. data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
  372. data/lib/rubocop/cop/style/redundant_format.rb +257 -0
  373. data/lib/rubocop/cop/style/redundant_freeze.rb +3 -3
  374. data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
  375. data/lib/rubocop/cop/style/redundant_line_continuation.rb +54 -18
  376. data/lib/rubocop/cop/style/redundant_parentheses.rb +56 -26
  377. data/lib/rubocop/cop/style/redundant_regexp_argument.rb +4 -0
  378. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
  379. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -1
  380. data/lib/rubocop/cop/style/redundant_return.rb +2 -2
  381. data/lib/rubocop/cop/style/redundant_self.rb +9 -15
  382. data/lib/rubocop/cop/style/redundant_self_assignment.rb +20 -32
  383. data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +4 -4
  384. data/lib/rubocop/cop/style/redundant_sort.rb +3 -3
  385. data/lib/rubocop/cop/style/redundant_sort_by.rb +17 -1
  386. data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -2
  387. data/lib/rubocop/cop/style/rescue_modifier.rb +5 -3
  388. data/lib/rubocop/cop/style/return_nil.rb +2 -2
  389. data/lib/rubocop/cop/style/safe_navigation.rb +32 -5
  390. data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
  391. data/lib/rubocop/cop/style/select_by_regexp.rb +5 -2
  392. data/lib/rubocop/cop/style/self_assignment.rb +11 -17
  393. data/lib/rubocop/cop/style/semicolon.rb +1 -1
  394. data/lib/rubocop/cop/style/send_with_literal_method_name.rb +2 -1
  395. data/lib/rubocop/cop/style/signal_exception.rb +2 -3
  396. data/lib/rubocop/cop/style/single_argument_dig.rb +9 -5
  397. data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
  398. data/lib/rubocop/cop/style/single_line_do_end_block.rb +15 -4
  399. data/lib/rubocop/cop/style/single_line_methods.rb +6 -7
  400. data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
  401. data/lib/rubocop/cop/style/sole_nested_conditional.rb +40 -106
  402. data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
  403. data/lib/rubocop/cop/style/string_concatenation.rb +15 -14
  404. data/lib/rubocop/cop/style/string_literals.rb +1 -1
  405. data/lib/rubocop/cop/style/string_methods.rb +1 -1
  406. data/lib/rubocop/cop/style/super_arguments.rb +66 -19
  407. data/lib/rubocop/cop/style/swap_values.rb +4 -15
  408. data/lib/rubocop/cop/style/symbol_proc.rb +2 -0
  409. data/lib/rubocop/cop/style/ternary_parentheses.rb +25 -4
  410. data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -1
  411. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +11 -2
  412. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
  413. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
  414. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -4
  415. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  416. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -2
  417. data/lib/rubocop/cop/style/while_until_modifier.rb +0 -1
  418. data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
  419. data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
  420. data/lib/rubocop/cop/util.rb +12 -5
  421. data/lib/rubocop/cop/utils/format_string.rb +10 -5
  422. data/lib/rubocop/cop/variable_force/assignment.rb +18 -3
  423. data/lib/rubocop/cop/variable_force/branch.rb +1 -1
  424. data/lib/rubocop/cop/variable_force/scope.rb +1 -1
  425. data/lib/rubocop/cop/variable_force/variable.rb +14 -3
  426. data/lib/rubocop/cop/variable_force/variable_table.rb +5 -5
  427. data/lib/rubocop/cop/variable_force.rb +5 -11
  428. data/lib/rubocop/cops_documentation_generator.rb +50 -25
  429. data/lib/rubocop/directive_comment.rb +45 -11
  430. data/lib/rubocop/ext/regexp_node.rb +0 -1
  431. data/lib/rubocop/formatter/disabled_config_formatter.rb +2 -2
  432. data/lib/rubocop/formatter/formatter_set.rb +1 -1
  433. data/lib/rubocop/formatter/pacman_formatter.rb +1 -1
  434. data/lib/rubocop/lsp/diagnostic.rb +189 -0
  435. data/lib/rubocop/lsp/logger.rb +2 -2
  436. data/lib/rubocop/lsp/routes.rb +7 -23
  437. data/lib/rubocop/lsp/runtime.rb +18 -50
  438. data/lib/rubocop/lsp/server.rb +0 -2
  439. data/lib/rubocop/lsp/stdin_runner.rb +85 -0
  440. data/lib/rubocop/magic_comment.rb +11 -3
  441. data/lib/rubocop/options.rb +28 -12
  442. data/lib/rubocop/path_util.rb +15 -8
  443. data/lib/rubocop/plugin/configuration_integrator.rb +143 -0
  444. data/lib/rubocop/plugin/load_error.rb +26 -0
  445. data/lib/rubocop/plugin/loader.rb +100 -0
  446. data/lib/rubocop/plugin/not_supported_error.rb +29 -0
  447. data/lib/rubocop/plugin.rb +46 -0
  448. data/lib/rubocop/rake_task.rb +4 -1
  449. data/lib/rubocop/result_cache.rb +13 -13
  450. data/lib/rubocop/rspec/cop_helper.rb +13 -1
  451. data/lib/rubocop/rspec/expect_offense.rb +6 -2
  452. data/lib/rubocop/rspec/shared_contexts.rb +38 -1
  453. data/lib/rubocop/rspec/support.rb +4 -2
  454. data/lib/rubocop/runner.rb +26 -15
  455. data/lib/rubocop/server/cache.rb +47 -11
  456. data/lib/rubocop/server/cli.rb +2 -2
  457. data/lib/rubocop/target_finder.rb +7 -2
  458. data/lib/rubocop/target_ruby.rb +17 -2
  459. data/lib/rubocop/version.rb +53 -12
  460. data/lib/rubocop.rb +32 -1
  461. data/lib/ruby_lsp/rubocop/addon.rb +75 -0
  462. data/lib/ruby_lsp/rubocop/runtime_adapter.rb +65 -0
  463. metadata +78 -16
  464. data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
  465. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -3,13 +3,15 @@
3
3
  module RuboCop
4
4
  # This module holds the RuboCop version information.
5
5
  module Version
6
- STRING = '1.67.0'
6
+ STRING = '1.75.5'
7
7
 
8
8
  MSG = '%<version>s (using %<parser_version>s, ' \
9
9
  'rubocop-ast %<rubocop_ast_version>s, ' \
10
10
  'analyzing as Ruby %<target_ruby_version>s, ' \
11
11
  'running on %<ruby_engine>s %<ruby_version>s)%<server_mode>s [%<ruby_platform>s]'
12
12
 
13
+ MINIMUM_PARSABLE_PRISM_VERSION = 3.3
14
+
13
15
  CANONICAL_FEATURE_NAMES = {
14
16
  'Rspec' => 'RSpec', 'Graphql' => 'GraphQL', 'Md' => 'Markdown', 'Factory_bot' => 'FactoryBot',
15
17
  'Thread_safety' => 'ThreadSafety', 'Rspec_rails' => 'RSpecRails'
@@ -18,12 +20,16 @@ module RuboCop
18
20
  'rubocop-md' => 'markdown', 'rubocop-factory_bot' => 'factory_bot'
19
21
  }.freeze
20
22
 
23
+ # NOTE: Marked as private but used by gems like standard.
21
24
  # @api private
25
+ # rubocop:disable Metrics/MethodLength
22
26
  def self.version(debug: false, env: nil)
23
27
  if debug
24
- verbose_version = format(MSG, version: STRING, parser_version: parser_version,
28
+ target_ruby_version = target_ruby_version(env)
29
+ verbose_version = format(MSG, version: STRING,
30
+ parser_version: parser_version(target_ruby_version),
25
31
  rubocop_ast_version: RuboCop::AST::Version::STRING,
26
- target_ruby_version: TargetRuby.new(Config.new).version,
32
+ target_ruby_version: target_ruby_version,
27
33
  ruby_engine: RUBY_ENGINE, ruby_version: RUBY_VERSION,
28
34
  server_mode: server_mode,
29
35
  ruby_platform: RUBY_PLATFORM)
@@ -40,31 +46,45 @@ module RuboCop
40
46
  STRING
41
47
  end
42
48
  end
49
+ # rubocop:enable Metrics/MethodLength
43
50
 
44
51
  # @api private
45
- def self.parser_version
52
+ def self.verbose(env: nil)
53
+ version(debug: true, env: env)
54
+ end
55
+
56
+ # @api private
57
+ def self.parser_version(target_ruby_version)
46
58
  config_path = ConfigFinder.find_config_path(Dir.pwd)
47
59
  yaml = Util.silence_warnings do
48
60
  ConfigLoader.load_yaml_configuration(config_path)
49
61
  end
62
+ parser_engine = yaml.dig('AllCops', 'ParserEngine')
63
+ parser_engine_text = ", #{parser_engine}" if parser_engine
50
64
 
51
- if yaml.dig('AllCops', 'ParserEngine') == 'parser_prism'
52
- require 'prism'
53
- "Prism #{Prism::VERSION}"
65
+ if target_ruby_version >= MINIMUM_PARSABLE_PRISM_VERSION
66
+ "Parser #{Parser::VERSION}, Prism #{Prism::VERSION}#{parser_engine_text}"
54
67
  else
55
68
  "Parser #{Parser::VERSION}"
56
69
  end
57
70
  end
58
71
 
59
72
  # @api private
73
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
60
74
  def self.extension_versions(env)
61
- features = Util.silence_warnings do
62
- # Suppress any config issues when loading the config (ie. deprecations,
63
- # pending cops, etc.).
64
- env.config_store.unvalidated.for_pwd.loaded_features.sort
75
+ plugins = config_for_pwd(env).loaded_plugins
76
+ plugin_versions = plugins.filter_map do |plugin|
77
+ next if Plugin::BUILTIN_INTERNAL_PLUGINS.key?(plugin.about.name)
78
+ next unless (plugin_name = plugin.about.name)
79
+
80
+ " - #{plugin_name} #{plugin.about.version}"
65
81
  end
66
82
 
67
- features.filter_map do |loaded_feature|
83
+ # TODO: It needs to be maintained for a while to ensure compatibility with extensions that
84
+ # don't support plugins. It should be removed in future once the old style becomes obsolete.
85
+ features = config_for_pwd(env).loaded_features.sort
86
+ features -= plugins.map { |plugin| plugin.about.name }
87
+ feature_versions = features.filter_map do |loaded_feature|
68
88
  next unless (match = loaded_feature.match(/rubocop-(?<feature>.*)/))
69
89
 
70
90
  # Get the expected name of the folder containing the extension code.
@@ -83,6 +103,27 @@ module RuboCop
83
103
 
84
104
  " - #{loaded_feature} #{feature_version}"
85
105
  end
106
+
107
+ plugin_versions + feature_versions
108
+ end
109
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
110
+
111
+ # @api private
112
+ def self.target_ruby_version(env)
113
+ if env
114
+ config_for_pwd(env).target_ruby_version
115
+ else
116
+ TargetRuby.new(Config.new).version
117
+ end
118
+ end
119
+
120
+ # @api private
121
+ def self.config_for_pwd(env)
122
+ Util.silence_warnings do
123
+ # Suppress any config issues when loading the config (ie. deprecations,
124
+ # pending cops, etc.).
125
+ env.config_store.unvalidated.for_pwd
126
+ end
86
127
  end
87
128
 
88
129
  # Returns feature version in one of two ways:
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
@@ -74,15 +75,19 @@ require_relative 'rubocop/cop/mixin/allowed_identifiers'
74
75
  require_relative 'rubocop/cop/mixin/allowed_methods'
75
76
  require_relative 'rubocop/cop/mixin/allowed_pattern'
76
77
  require_relative 'rubocop/cop/mixin/allowed_receivers'
78
+ require_relative 'rubocop/cop/mixin/forbidden_identifiers'
79
+ require_relative 'rubocop/cop/mixin/forbidden_pattern'
77
80
  require_relative 'rubocop/cop/mixin/auto_corrector' # rubocop:todo Naming/InclusiveLanguage
78
81
  require_relative 'rubocop/cop/mixin/check_assignment'
79
82
  require_relative 'rubocop/cop/mixin/check_line_breakable'
83
+ require_relative 'rubocop/cop/mixin/check_single_line_suitability'
80
84
  require_relative 'rubocop/cop/mixin/configurable_max'
81
85
  require_relative 'rubocop/cop/mixin/code_length' # relies on configurable_max
82
86
  require_relative 'rubocop/cop/mixin/configurable_enforced_style'
83
87
  require_relative 'rubocop/cop/mixin/configurable_formatting'
84
88
  require_relative 'rubocop/cop/mixin/configurable_naming'
85
89
  require_relative 'rubocop/cop/mixin/configurable_numbering'
90
+ require_relative 'rubocop/cop/mixin/dig_help'
86
91
  require_relative 'rubocop/cop/mixin/documentation_comment'
87
92
  require_relative 'rubocop/cop/mixin/duplication'
88
93
  require_relative 'rubocop/cop/mixin/range_help'
@@ -90,12 +95,14 @@ require_relative 'rubocop/cop/mixin/annotation_comment' # relies on range
90
95
  require_relative 'rubocop/cop/mixin/empty_lines_around_body' # relies on range
91
96
  require_relative 'rubocop/cop/mixin/empty_parameter'
92
97
  require_relative 'rubocop/cop/mixin/end_keyword_alignment'
98
+ require_relative 'rubocop/cop/mixin/endless_method_rewriter'
93
99
  require_relative 'rubocop/cop/mixin/enforce_superclass'
94
100
  require_relative 'rubocop/cop/mixin/first_element_line_break'
95
101
  require_relative 'rubocop/cop/mixin/frozen_string_literal'
96
102
  require_relative 'rubocop/cop/mixin/gem_declaration'
97
103
  require_relative 'rubocop/cop/mixin/gemspec_help'
98
104
  require_relative 'rubocop/cop/mixin/hash_alignment_styles'
105
+ require_relative 'rubocop/cop/mixin/hash_subset'
99
106
  require_relative 'rubocop/cop/mixin/hash_transform_method'
100
107
  require_relative 'rubocop/cop/mixin/integer_node'
101
108
  require_relative 'rubocop/cop/mixin/interpolation'
@@ -143,7 +150,6 @@ require_relative 'rubocop/cop/mixin/comments_help' # relies on visibility_help
143
150
  require_relative 'rubocop/cop/mixin/def_node' # relies on visibility_help
144
151
 
145
152
  require_relative 'rubocop/cop/utils/format_string'
146
- require_relative 'rubocop/cop/utils/regexp_ranges'
147
153
 
148
154
  require_relative 'rubocop/cop/migration/department_name'
149
155
 
@@ -289,6 +295,7 @@ require_relative 'rubocop/cop/lint/ambiguous_operator'
289
295
  require_relative 'rubocop/cop/lint/ambiguous_operator_precedence'
290
296
  require_relative 'rubocop/cop/lint/ambiguous_range'
291
297
  require_relative 'rubocop/cop/lint/ambiguous_regexp_literal'
298
+ require_relative 'rubocop/cop/lint/array_literal_in_regexp'
292
299
  require_relative 'rubocop/cop/lint/assignment_in_condition'
293
300
  require_relative 'rubocop/cop/lint/big_decimal_new'
294
301
  require_relative 'rubocop/cop/lint/binary_operator_with_identical_operands'
@@ -296,7 +303,9 @@ require_relative 'rubocop/cop/lint/boolean_symbol'
296
303
  require_relative 'rubocop/cop/lint/circular_argument_reference'
297
304
  require_relative 'rubocop/cop/lint/constant_definition_in_block'
298
305
  require_relative 'rubocop/cop/lint/constant_overwritten_in_rescue'
306
+ require_relative 'rubocop/cop/lint/constant_reassignment'
299
307
  require_relative 'rubocop/cop/lint/constant_resolution'
308
+ require_relative 'rubocop/cop/lint/cop_directive_syntax'
300
309
  require_relative 'rubocop/cop/lint/debugger'
301
310
  require_relative 'rubocop/cop/lint/deprecated_class_methods'
302
311
  require_relative 'rubocop/cop/lint/deprecated_constants'
@@ -325,12 +334,14 @@ require_relative 'rubocop/cop/lint/empty_in_pattern'
325
334
  require_relative 'rubocop/cop/lint/empty_interpolation'
326
335
  require_relative 'rubocop/cop/lint/empty_when'
327
336
  require_relative 'rubocop/cop/lint/ensure_return'
337
+ require_relative 'rubocop/cop/lint/shared_mutable_default'
328
338
  require_relative 'rubocop/cop/lint/erb_new_arguments'
329
339
  require_relative 'rubocop/cop/lint/flip_flop'
330
340
  require_relative 'rubocop/cop/lint/float_comparison'
331
341
  require_relative 'rubocop/cop/lint/float_out_of_range'
332
342
  require_relative 'rubocop/cop/lint/format_parameter_mismatch'
333
343
  require_relative 'rubocop/cop/lint/hash_compare_by_identity'
344
+ require_relative 'rubocop/cop/lint/hash_new_with_keyword_arguments_as_default'
334
345
  require_relative 'rubocop/cop/lint/heredoc_method_call_position'
335
346
  require_relative 'rubocop/cop/lint/identity_comparison'
336
347
  require_relative 'rubocop/cop/lint/implicit_string_concatenation'
@@ -358,6 +369,7 @@ require_relative 'rubocop/cop/lint/non_deterministic_require_order'
358
369
  require_relative 'rubocop/cop/lint/non_local_exit_from_iterator'
359
370
  require_relative 'rubocop/cop/lint/number_conversion'
360
371
  require_relative 'rubocop/cop/lint/numbered_parameter_assignment'
372
+ require_relative 'rubocop/cop/lint/numeric_operation_with_constant_result'
361
373
  require_relative 'rubocop/cop/lint/or_assignment_to_constant'
362
374
  require_relative 'rubocop/cop/lint/ordered_magic_comments'
363
375
  require_relative 'rubocop/cop/lint/out_of_range_regexp_ref'
@@ -374,6 +386,7 @@ require_relative 'rubocop/cop/lint/redundant_require_statement'
374
386
  require_relative 'rubocop/cop/lint/redundant_safe_navigation'
375
387
  require_relative 'rubocop/cop/lint/redundant_splat_expansion'
376
388
  require_relative 'rubocop/cop/lint/redundant_string_coercion'
389
+ require_relative 'rubocop/cop/lint/redundant_type_conversion'
377
390
  require_relative 'rubocop/cop/lint/redundant_with_index'
378
391
  require_relative 'rubocop/cop/lint/redundant_with_object'
379
392
  require_relative 'rubocop/cop/lint/refinement_import_methods'
@@ -395,6 +408,7 @@ require_relative 'rubocop/cop/lint/shadowed_exception'
395
408
  require_relative 'rubocop/cop/lint/shadowing_outer_local_variable'
396
409
  require_relative 'rubocop/cop/lint/struct_new_override'
397
410
  require_relative 'rubocop/cop/lint/suppressed_exception'
411
+ require_relative 'rubocop/cop/lint/suppressed_exception_in_number_conversion'
398
412
  require_relative 'rubocop/cop/lint/symbol_conversion'
399
413
  require_relative 'rubocop/cop/lint/syntax'
400
414
  require_relative 'rubocop/cop/lint/to_enum_arguments'
@@ -403,6 +417,7 @@ require_relative 'rubocop/cop/lint/top_level_return_with_argument'
403
417
  require_relative 'rubocop/cop/lint/trailing_comma_in_attribute_declaration'
404
418
  require_relative 'rubocop/cop/lint/triple_quotes'
405
419
  require_relative 'rubocop/cop/lint/underscore_prefixed_variable_name'
420
+ require_relative 'rubocop/cop/lint/unescaped_bracket_in_regexp'
406
421
  require_relative 'rubocop/cop/lint/unexpected_block_arity'
407
422
  require_relative 'rubocop/cop/lint/unified_integer'
408
423
  require_relative 'rubocop/cop/lint/unmodified_reduce_accumulator'
@@ -414,6 +429,8 @@ require_relative 'rubocop/cop/lint/uri_escape_unescape'
414
429
  require_relative 'rubocop/cop/lint/uri_regexp'
415
430
  require_relative 'rubocop/cop/lint/useless_access_modifier'
416
431
  require_relative 'rubocop/cop/lint/useless_assignment'
432
+ require_relative 'rubocop/cop/lint/useless_constant_scoping'
433
+ require_relative 'rubocop/cop/lint/useless_defined'
417
434
  require_relative 'rubocop/cop/lint/useless_else_without_rescue'
418
435
  require_relative 'rubocop/cop/lint/useless_method_definition'
419
436
  require_relative 'rubocop/cop/lint/useless_numeric_operation'
@@ -460,6 +477,7 @@ require_relative 'rubocop/cop/naming/variable_number'
460
477
  require_relative 'rubocop/cop/style/access_modifier_declarations'
461
478
  require_relative 'rubocop/cop/style/accessor_grouping'
462
479
  require_relative 'rubocop/cop/style/alias'
480
+ require_relative 'rubocop/cop/style/ambiguous_endless_method_definition'
463
481
  require_relative 'rubocop/cop/style/and_or'
464
482
  require_relative 'rubocop/cop/style/arguments_forwarding'
465
483
  require_relative 'rubocop/cop/style/array_coercion'
@@ -472,6 +490,7 @@ require_relative 'rubocop/cop/style/auto_resource_cleanup'
472
490
  require_relative 'rubocop/cop/style/bare_percent_literals'
473
491
  require_relative 'rubocop/cop/style/begin_block'
474
492
  require_relative 'rubocop/cop/style/bisected_attr_accessor'
493
+ require_relative 'rubocop/cop/style/bitwise_predicate'
475
494
  require_relative 'rubocop/cop/style/block_comments'
476
495
  require_relative 'rubocop/cop/style/block_delimiters'
477
496
  require_relative 'rubocop/cop/style/case_equality'
@@ -487,10 +506,12 @@ require_relative 'rubocop/cop/style/collection_compact'
487
506
  require_relative 'rubocop/cop/style/collection_methods'
488
507
  require_relative 'rubocop/cop/style/colon_method_call'
489
508
  require_relative 'rubocop/cop/style/colon_method_definition'
509
+ require_relative 'rubocop/cop/style/combinable_defined'
490
510
  require_relative 'rubocop/cop/style/combinable_loops'
491
511
  require_relative 'rubocop/cop/style/command_literal'
492
512
  require_relative 'rubocop/cop/style/comment_annotation'
493
513
  require_relative 'rubocop/cop/style/commented_keyword'
514
+ require_relative 'rubocop/cop/style/comparable_between'
494
515
  require_relative 'rubocop/cop/style/comparable_clamp'
495
516
  require_relative 'rubocop/cop/style/concat_array_literals'
496
517
  require_relative 'rubocop/cop/style/conditional_assignment'
@@ -499,6 +520,7 @@ require_relative 'rubocop/cop/style/copyright'
499
520
  require_relative 'rubocop/cop/style/data_inheritance'
500
521
  require_relative 'rubocop/cop/style/date_time'
501
522
  require_relative 'rubocop/cop/style/def_with_parentheses'
523
+ require_relative 'rubocop/cop/style/dig_chain'
502
524
  require_relative 'rubocop/cop/style/dir'
503
525
  require_relative 'rubocop/cop/style/dir_empty'
504
526
  require_relative 'rubocop/cop/style/disable_cops_within_source_code_directive'
@@ -528,7 +550,9 @@ require_relative 'rubocop/cop/style/explicit_block_argument'
528
550
  require_relative 'rubocop/cop/style/exponential_notation'
529
551
  require_relative 'rubocop/cop/style/fetch_env_var'
530
552
  require_relative 'rubocop/cop/style/file_empty'
553
+ require_relative 'rubocop/cop/style/file_null'
531
554
  require_relative 'rubocop/cop/style/file_read'
555
+ require_relative 'rubocop/cop/style/file_touch'
532
556
  require_relative 'rubocop/cop/style/file_write'
533
557
  require_relative 'rubocop/cop/style/float_division'
534
558
  require_relative 'rubocop/cop/style/for'
@@ -542,7 +566,9 @@ require_relative 'rubocop/cop/style/hash_as_last_array_item'
542
566
  require_relative 'rubocop/cop/style/hash_conversion'
543
567
  require_relative 'rubocop/cop/style/hash_each_methods'
544
568
  require_relative 'rubocop/cop/style/hash_except'
569
+ require_relative 'rubocop/cop/style/hash_fetch_chain'
545
570
  require_relative 'rubocop/cop/style/hash_like_case'
571
+ require_relative 'rubocop/cop/style/hash_slice'
546
572
  require_relative 'rubocop/cop/style/hash_syntax'
547
573
  require_relative 'rubocop/cop/style/hash_transform_keys'
548
574
  require_relative 'rubocop/cop/style/hash_transform_values'
@@ -559,6 +585,9 @@ require_relative 'rubocop/cop/style/inverse_methods'
559
585
  require_relative 'rubocop/cop/style/inline_comment'
560
586
  require_relative 'rubocop/cop/style/invertible_unless_condition'
561
587
  require_relative 'rubocop/cop/style/ip_addresses'
588
+ require_relative 'rubocop/cop/style/it_assignment'
589
+ require_relative 'rubocop/cop/style/it_block_parameter'
590
+ require_relative 'rubocop/cop/style/keyword_arguments_merging'
562
591
  require_relative 'rubocop/cop/style/keyword_parameters_order'
563
592
  require_relative 'rubocop/cop/style/lambda'
564
593
  require_relative 'rubocop/cop/style/lambda_call'
@@ -583,6 +612,7 @@ require_relative 'rubocop/cop/style/redundant_each'
583
612
  require_relative 'rubocop/cop/style/redundant_fetch_block'
584
613
  require_relative 'rubocop/cop/style/redundant_file_extension_in_require'
585
614
  require_relative 'rubocop/cop/style/redundant_filter_chain'
615
+ require_relative 'rubocop/cop/style/redundant_format'
586
616
  require_relative 'rubocop/cop/style/redundant_heredoc_delimiter_quotes'
587
617
  require_relative 'rubocop/cop/style/redundant_initialize'
588
618
  require_relative 'rubocop/cop/style/redundant_interpolation_unfreeze'
@@ -592,6 +622,7 @@ require_relative 'rubocop/cop/style/redundant_regexp_constructor'
592
622
  require_relative 'rubocop/cop/style/redundant_self_assignment'
593
623
  require_relative 'rubocop/cop/style/redundant_self_assignment_branch'
594
624
  require_relative 'rubocop/cop/style/require_order'
625
+ require_relative 'rubocop/cop/style/safe_navigation_chain_length'
595
626
  require_relative 'rubocop/cop/style/single_line_do_end_block'
596
627
  require_relative 'rubocop/cop/style/sole_nested_conditional'
597
628
  require_relative 'rubocop/cop/style/static_class'
@@ -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,65 @@
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(
20
+ uri_to_path(uri),
21
+ document.source,
22
+ document.encoding,
23
+ prism_result: prism_result(document)
24
+ )
25
+ end
26
+
27
+ def run_formatting(uri, document)
28
+ @runtime.format(
29
+ uri_to_path(uri),
30
+ document.source,
31
+ command: 'rubocop.formatAutocorrects',
32
+ prism_result: prism_result(document)
33
+ )
34
+ end
35
+
36
+ def run_range_formatting(_uri, _partial_source, _base_indentation)
37
+ # Not yet supported. Should return the formatted version of `partial_source` which is
38
+ # a partial selection of the entire document. For example, it should not try to add
39
+ # a frozen_string_literal magic comment and all style corrections should start from
40
+ # the `base_indentation`.
41
+ nil
42
+ end
43
+
44
+ private
45
+
46
+ # duplicated from: lib/standard/lsp/routes.rb
47
+ # modified to incorporate Ruby LSP's to_standardized_path method
48
+ def uri_to_path(uri)
49
+ if uri.respond_to?(:to_standardized_path) && (standardized_path = uri.to_standardized_path)
50
+ standardized_path
51
+ else
52
+ uri.to_s.delete_prefix('file://')
53
+ end
54
+ end
55
+
56
+ def prism_result(document)
57
+ prism_result = document.parse_result
58
+
59
+ # NOTE: `prism_result` must be `Prism::ParseLexResult` compatible object.
60
+ # This is for compatibility parsed result unsupported.
61
+ prism_result.is_a?(Prism::ParseLexResult) ? prism_result : nil
62
+ end
63
+ end
64
+ end
65
+ end