rubocop 1.66.0 → 1.72.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +160 -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 +6 -10
  14. data/lib/rubocop/config.rb +21 -20
  15. data/lib/rubocop/config_loader.rb +62 -16
  16. data/lib/rubocop/config_loader_resolver.rb +36 -11
  17. data/lib/rubocop/config_validator.rb +25 -18
  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/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 +2 -2
  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 +229 -0
  43. data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
  44. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
  45. data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +1 -1
  46. data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
  47. data/lib/rubocop/cop/internal_affairs/operator_keyword.rb +48 -0
  48. data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
  49. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +6 -21
  50. data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +11 -2
  51. data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
  52. data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +0 -2
  53. data/lib/rubocop/cop/internal_affairs/undefined_config.rb +7 -1
  54. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +0 -5
  55. data/lib/rubocop/cop/internal_affairs.rb +6 -0
  56. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +6 -2
  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/class_structure.rb +9 -9
  62. data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
  63. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  64. data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
  65. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +3 -3
  66. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +7 -11
  67. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +3 -3
  68. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
  69. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +4 -5
  70. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +23 -1
  71. data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
  72. data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
  73. data/lib/rubocop/cop/layout/first_argument_indentation.rb +3 -8
  74. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +2 -7
  75. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
  76. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
  77. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +8 -0
  78. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
  79. data/lib/rubocop/cop/layout/hash_alignment.rb +6 -4
  80. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -1
  81. data/lib/rubocop/cop/layout/indentation_width.rb +11 -12
  82. data/lib/rubocop/cop/layout/leading_comment_space.rb +71 -1
  83. data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +11 -2
  84. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +7 -1
  85. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
  86. data/lib/rubocop/cop/layout/line_length.rb +119 -4
  87. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
  88. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
  89. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -1
  90. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
  91. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
  92. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +2 -3
  93. data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
  94. data/lib/rubocop/cop/layout/redundant_line_break.rb +10 -41
  95. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +4 -3
  96. data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -1
  97. data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
  98. data/lib/rubocop/cop/layout/space_after_comma.rb +1 -1
  99. data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
  100. data/lib/rubocop/cop/layout/space_after_semicolon.rb +1 -1
  101. data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -1
  102. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
  103. data/lib/rubocop/cop/layout/space_around_operators.rb +19 -20
  104. data/lib/rubocop/cop/layout/space_before_brackets.rb +5 -5
  105. data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
  106. data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
  107. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +6 -0
  108. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +4 -0
  109. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +4 -0
  110. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +0 -1
  111. data/lib/rubocop/cop/layout/trailing_whitespace.rb +5 -3
  112. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
  113. data/lib/rubocop/cop/lint/ambiguous_range.rb +4 -1
  114. data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +119 -0
  115. data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
  116. data/lib/rubocop/cop/lint/big_decimal_new.rb +4 -7
  117. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +10 -12
  118. data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
  119. data/lib/rubocop/cop/lint/circular_argument_reference.rb +6 -0
  120. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
  121. data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
  122. data/lib/rubocop/cop/lint/cop_directive_syntax.rb +84 -0
  123. data/lib/rubocop/cop/lint/debugger.rb +1 -1
  124. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +2 -1
  125. data/lib/rubocop/cop/lint/duplicate_branch.rb +39 -4
  126. data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
  127. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -1
  128. data/lib/rubocop/cop/lint/duplicate_set_element.rb +87 -0
  129. data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
  130. data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
  131. data/lib/rubocop/cop/lint/empty_file.rb +0 -2
  132. data/lib/rubocop/cop/lint/ensure_return.rb +1 -4
  133. data/lib/rubocop/cop/lint/erb_new_arguments.rb +1 -1
  134. data/lib/rubocop/cop/lint/float_comparison.rb +20 -9
  135. data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -4
  136. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
  137. data/lib/rubocop/cop/lint/hash_new_with_keyword_arguments_as_default.rb +55 -0
  138. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +11 -5
  139. data/lib/rubocop/cop/lint/interpolation_check.rb +9 -0
  140. data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +8 -14
  141. data/lib/rubocop/cop/lint/literal_as_condition.rb +1 -0
  142. data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +1 -1
  143. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +49 -8
  144. data/lib/rubocop/cop/lint/missing_super.rb +2 -2
  145. data/lib/rubocop/cop/lint/mixed_case_range.rb +3 -6
  146. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  147. data/lib/rubocop/cop/lint/nested_method_definition.rb +9 -5
  148. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  149. data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +2 -2
  150. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +12 -3
  151. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +3 -3
  152. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +1 -1
  153. data/lib/rubocop/cop/lint/number_conversion.rb +0 -1
  154. data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -2
  155. data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +93 -0
  156. data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +1 -2
  157. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +3 -2
  158. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +6 -11
  159. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +1 -1
  160. data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
  161. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +13 -8
  162. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +8 -7
  163. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
  164. data/lib/rubocop/cop/lint/redundant_type_conversion.rb +231 -0
  165. data/lib/rubocop/cop/lint/refinement_import_methods.rb +1 -1
  166. data/lib/rubocop/cop/lint/regexp_as_condition.rb +0 -1
  167. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  168. data/lib/rubocop/cop/lint/rescue_type.rb +3 -7
  169. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +17 -1
  170. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +109 -41
  171. data/lib/rubocop/cop/lint/self_assignment.rb +8 -10
  172. data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
  173. data/lib/rubocop/cop/lint/shared_mutable_default.rb +65 -0
  174. data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
  175. data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
  176. data/lib/rubocop/cop/lint/symbol_conversion.rb +2 -2
  177. data/lib/rubocop/cop/lint/syntax.rb +4 -1
  178. data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +88 -0
  179. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +1 -1
  180. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -1
  181. data/lib/rubocop/cop/lint/unreachable_code.rb +51 -2
  182. data/lib/rubocop/cop/lint/unreachable_loop.rb +1 -1
  183. data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
  184. data/lib/rubocop/cop/lint/uri_regexp.rb +25 -7
  185. data/lib/rubocop/cop/lint/useless_access_modifier.rb +4 -4
  186. data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
  187. data/lib/rubocop/cop/lint/useless_constant_scoping.rb +74 -0
  188. data/lib/rubocop/cop/lint/useless_defined.rb +55 -0
  189. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +4 -0
  190. data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
  191. data/lib/rubocop/cop/lint/useless_numeric_operation.rb +2 -1
  192. data/lib/rubocop/cop/lint/useless_rescue.rb +1 -1
  193. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +2 -2
  194. data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -25
  195. data/lib/rubocop/cop/lint/void.rb +8 -11
  196. data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
  197. data/lib/rubocop/cop/metrics/class_length.rb +9 -9
  198. data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
  199. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +5 -2
  200. data/lib/rubocop/cop/metrics/method_length.rb +8 -1
  201. data/lib/rubocop/cop/metrics/module_length.rb +1 -1
  202. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
  203. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
  204. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +2 -3
  205. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
  206. data/lib/rubocop/cop/mixin/alignment.rb +2 -2
  207. data/lib/rubocop/cop/mixin/check_assignment.rb +4 -12
  208. data/lib/rubocop/cop/mixin/check_line_breakable.rb +20 -10
  209. data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +49 -0
  210. data/lib/rubocop/cop/mixin/comments_help.rb +8 -3
  211. data/lib/rubocop/cop/mixin/dig_help.rb +27 -0
  212. data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +24 -0
  213. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +4 -2
  214. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +22 -22
  215. data/lib/rubocop/cop/mixin/hash_subset.rb +188 -0
  216. data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
  217. data/lib/rubocop/cop/mixin/line_length_help.rb +5 -4
  218. data/lib/rubocop/cop/mixin/method_complexity.rb +1 -1
  219. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +5 -9
  220. data/lib/rubocop/cop/mixin/percent_array.rb +1 -1
  221. data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
  222. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +68 -30
  223. data/lib/rubocop/cop/mixin/range_help.rb +3 -4
  224. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
  225. data/lib/rubocop/cop/mixin/statement_modifier.rb +11 -5
  226. data/lib/rubocop/cop/mixin/string_help.rb +2 -2
  227. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  228. data/lib/rubocop/cop/mixin/target_ruby_version.rb +17 -1
  229. data/lib/rubocop/cop/mixin/trailing_comma.rb +3 -3
  230. data/lib/rubocop/cop/naming/accessor_method_name.rb +6 -6
  231. data/lib/rubocop/cop/naming/block_forwarding.rb +20 -16
  232. data/lib/rubocop/cop/naming/constant_name.rb +6 -7
  233. data/lib/rubocop/cop/naming/file_name.rb +0 -2
  234. data/lib/rubocop/cop/naming/inclusive_language.rb +12 -3
  235. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +11 -12
  236. data/lib/rubocop/cop/naming/predicate_name.rb +45 -1
  237. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +6 -14
  238. data/lib/rubocop/cop/naming/variable_name.rb +3 -4
  239. data/lib/rubocop/cop/naming/variable_number.rb +2 -3
  240. data/lib/rubocop/cop/offense.rb +4 -5
  241. data/lib/rubocop/cop/security/compound_hash.rb +2 -0
  242. data/lib/rubocop/cop/security/yaml_load.rb +3 -2
  243. data/lib/rubocop/cop/style/access_modifier_declarations.rb +96 -28
  244. data/lib/rubocop/cop/style/accessor_grouping.rb +10 -2
  245. data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +79 -0
  246. data/lib/rubocop/cop/style/and_or.rb +1 -1
  247. data/lib/rubocop/cop/style/arguments_forwarding.rb +78 -22
  248. data/lib/rubocop/cop/style/array_first_last.rb +18 -2
  249. data/lib/rubocop/cop/style/array_intersect.rb +5 -4
  250. data/lib/rubocop/cop/style/bitwise_predicate.rb +100 -0
  251. data/lib/rubocop/cop/style/block_delimiters.rb +49 -19
  252. data/lib/rubocop/cop/style/case_like_if.rb +8 -11
  253. data/lib/rubocop/cop/style/class_and_module_children.rb +6 -3
  254. data/lib/rubocop/cop/style/collection_compact.rb +10 -10
  255. data/lib/rubocop/cop/style/collection_methods.rb +1 -1
  256. data/lib/rubocop/cop/style/combinable_defined.rb +115 -0
  257. data/lib/rubocop/cop/style/combinable_loops.rb +9 -2
  258. data/lib/rubocop/cop/style/commented_keyword.rb +17 -1
  259. data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
  260. data/lib/rubocop/cop/style/conditional_assignment.rb +26 -26
  261. data/lib/rubocop/cop/style/constant_visibility.rb +3 -12
  262. data/lib/rubocop/cop/style/data_inheritance.rb +1 -1
  263. data/lib/rubocop/cop/style/dig_chain.rb +89 -0
  264. data/lib/rubocop/cop/style/documentation.rb +1 -1
  265. data/lib/rubocop/cop/style/double_negation.rb +3 -3
  266. data/lib/rubocop/cop/style/each_for_simple_loop.rb +4 -7
  267. data/lib/rubocop/cop/style/each_with_object.rb +2 -3
  268. data/lib/rubocop/cop/style/empty_else.rb +5 -2
  269. data/lib/rubocop/cop/style/empty_literal.rb +2 -2
  270. data/lib/rubocop/cop/style/empty_method.rb +1 -1
  271. data/lib/rubocop/cop/style/endless_method.rb +1 -14
  272. data/lib/rubocop/cop/style/eval_with_location.rb +2 -2
  273. data/lib/rubocop/cop/style/exact_regexp_match.rb +2 -3
  274. data/lib/rubocop/cop/style/explicit_block_argument.rb +15 -2
  275. data/lib/rubocop/cop/style/exponential_notation.rb +1 -1
  276. data/lib/rubocop/cop/style/fetch_env_var.rb +2 -1
  277. data/lib/rubocop/cop/style/file_null.rb +89 -0
  278. data/lib/rubocop/cop/style/file_touch.rb +75 -0
  279. data/lib/rubocop/cop/style/float_division.rb +8 -4
  280. data/lib/rubocop/cop/style/for.rb +0 -1
  281. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
  282. data/lib/rubocop/cop/style/global_vars.rb +1 -3
  283. data/lib/rubocop/cop/style/guard_clause.rb +16 -3
  284. data/lib/rubocop/cop/style/hash_conversion.rb +1 -2
  285. data/lib/rubocop/cop/style/hash_each_methods.rb +9 -6
  286. data/lib/rubocop/cop/style/hash_except.rb +35 -147
  287. data/lib/rubocop/cop/style/hash_slice.rb +80 -0
  288. data/lib/rubocop/cop/style/hash_syntax.rb +8 -5
  289. data/lib/rubocop/cop/style/identical_conditional_branches.rb +22 -3
  290. data/lib/rubocop/cop/style/if_inside_else.rb +1 -2
  291. data/lib/rubocop/cop/style/if_unless_modifier.rb +3 -3
  292. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +2 -3
  293. data/lib/rubocop/cop/style/if_with_semicolon.rb +28 -6
  294. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  295. data/lib/rubocop/cop/style/inverse_methods.rb +6 -7
  296. data/lib/rubocop/cop/style/it_assignment.rb +36 -0
  297. data/lib/rubocop/cop/style/keyword_arguments_merging.rb +67 -0
  298. data/lib/rubocop/cop/style/keyword_parameters_order.rb +1 -1
  299. data/lib/rubocop/cop/style/lambda.rb +1 -1
  300. data/lib/rubocop/cop/style/lambda_call.rb +3 -2
  301. data/lib/rubocop/cop/style/magic_comment_format.rb +3 -8
  302. data/lib/rubocop/cop/style/map_into_array.rb +61 -12
  303. data/lib/rubocop/cop/style/map_to_hash.rb +1 -1
  304. data/lib/rubocop/cop/style/map_to_set.rb +3 -2
  305. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +32 -20
  306. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -0
  307. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -11
  308. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -4
  309. data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
  310. data/lib/rubocop/cop/style/missing_else.rb +2 -0
  311. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +33 -3
  312. data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -1
  313. data/lib/rubocop/cop/style/multiline_memoization.rb +2 -2
  314. data/lib/rubocop/cop/style/multiple_comparison.rb +52 -51
  315. data/lib/rubocop/cop/style/mutable_constant.rb +7 -8
  316. data/lib/rubocop/cop/style/negated_if_else_condition.rb +7 -5
  317. data/lib/rubocop/cop/style/nested_modifier.rb +1 -1
  318. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +2 -2
  319. data/lib/rubocop/cop/style/nested_ternary_operator.rb +5 -4
  320. data/lib/rubocop/cop/style/not.rb +1 -1
  321. data/lib/rubocop/cop/style/object_then.rb +14 -15
  322. data/lib/rubocop/cop/style/one_line_conditional.rb +29 -4
  323. data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
  324. data/lib/rubocop/cop/style/operator_method_call.rb +25 -7
  325. data/lib/rubocop/cop/style/or_assignment.rb +3 -6
  326. data/lib/rubocop/cop/style/parallel_assignment.rb +9 -18
  327. data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
  328. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  329. data/lib/rubocop/cop/style/proc.rb +1 -2
  330. data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
  331. data/lib/rubocop/cop/style/raise_args.rb +7 -5
  332. data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
  333. data/lib/rubocop/cop/style/redundant_argument.rb +3 -1
  334. data/lib/rubocop/cop/style/redundant_assignment.rb +1 -1
  335. data/lib/rubocop/cop/style/redundant_begin.rb +5 -1
  336. data/lib/rubocop/cop/style/redundant_condition.rb +39 -24
  337. data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +2 -1
  338. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +6 -10
  339. data/lib/rubocop/cop/style/redundant_each.rb +1 -1
  340. data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
  341. data/lib/rubocop/cop/style/redundant_format.rb +222 -0
  342. data/lib/rubocop/cop/style/redundant_freeze.rb +2 -2
  343. data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
  344. data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +1 -1
  345. data/lib/rubocop/cop/style/redundant_line_continuation.rb +56 -17
  346. data/lib/rubocop/cop/style/redundant_parentheses.rb +38 -24
  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 +141 -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 +7 -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 -26
  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
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'securerandom'
4
4
  require 'socket'
5
+ require 'stringio'
5
6
 
6
7
  #
7
8
  # This code is based on https://github.com/fohte/rubocop-daemon.
@@ -127,6 +127,7 @@ module RuboCop
127
127
  if mode == :only_recognized_file_types || force_exclusion?
128
128
  files.select! { |file| included_file?(file) }
129
129
  end
130
+ files.reject! { |file| FileTest.directory?(file) }
130
131
 
131
132
  force_exclusion? ? without_excluded(files) : files
132
133
  end
@@ -34,6 +34,20 @@ module RuboCop
34
34
  end
35
35
  end
36
36
 
37
+ # The target ruby version may be configured by setting the
38
+ # `RUBOCOP_TARGET_RUBY_VERSION` environment variable.
39
+ class RuboCopEnvVar < Source
40
+ def name
41
+ '`RUBOCOP_TARGET_RUBY_VERSION` environment variable'
42
+ end
43
+
44
+ private
45
+
46
+ def find_version
47
+ ENV.fetch('RUBOCOP_TARGET_RUBY_VERSION', nil)&.to_f
48
+ end
49
+ end
50
+
37
51
  # The target ruby version may be configured in RuboCop's config.
38
52
  # @api private
39
53
  class RuboCopConfig < Source
@@ -53,8 +67,6 @@ module RuboCop
53
67
  class GemspecFile < Source
54
68
  extend NodePattern::Macros
55
69
 
56
- GEMSPEC_EXTENSION = '.gemspec'
57
-
58
70
  # @!method required_ruby_version(node)
59
71
  def_node_search :required_ruby_version, <<~PATTERN
60
72
  (send _ :required_ruby_version= $_)
@@ -68,7 +80,7 @@ module RuboCop
68
80
  PATTERN
69
81
 
70
82
  def name
71
- "`required_ruby_version` parameter (in #{gemspec_filename})"
83
+ "`required_ruby_version` parameter (in #{gemspec_filepath})"
72
84
  end
73
85
 
74
86
  private
@@ -83,16 +95,18 @@ module RuboCop
83
95
  find_minimal_known_ruby(right_hand_side)
84
96
  end
85
97
 
86
- def gemspec_filename
87
- @gemspec_filename ||= begin
88
- basename = Pathname.new(@config.base_dir_for_path_parameters).basename.to_s
89
- "#{basename}#{GEMSPEC_EXTENSION}"
90
- end
91
- end
92
-
93
98
  def gemspec_filepath
94
- @gemspec_filepath ||=
95
- @config.find_file_upwards(gemspec_filename, @config.base_dir_for_path_parameters)
99
+ return @gemspec_filepath if defined?(@gemspec_filepath)
100
+
101
+ @gemspec_filepath =
102
+ @config.traverse_directories_upwards(@config.base_dir_for_path_parameters) do |dir|
103
+ # NOTE: Can't use `dir.glob` because of JRuby 9.4.8.0 incompatibility:
104
+ # https://github.com/jruby/jruby/issues/8358
105
+ candidates = Pathname.glob("#{dir}/*.gemspec")
106
+ # Bundler will use a gemspec whatever the filename is, as long as its the only one in
107
+ # the folder.
108
+ break candidates.first if candidates.one?
109
+ end
96
110
  end
97
111
 
98
112
  def version_from_gemspec_file(file)
@@ -246,6 +260,7 @@ module RuboCop
246
260
  end
247
261
 
248
262
  SOURCES = [
263
+ RuboCopEnvVar,
249
264
  RuboCopConfig,
250
265
  GemspecFile,
251
266
  RubyVersionFile,
@@ -273,7 +288,7 @@ module RuboCop
273
288
 
274
289
  def rubocop_version_with_support
275
290
  if supported?
276
- RuboCop::Version.version
291
+ RuboCop::Version::STRING
277
292
  else
278
293
  OBSOLETE_RUBIES[version]
279
294
  end
@@ -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.0'
6
+ STRING = '1.72.1'
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,36 +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)
8
+ handler = DuplicationCheckHandler.new(&on_duplicated)
9
+ parser = Psych::Parser.new(handler)
10
+ parser.parse(yaml_string, filename)
11
+ parser.handler.root.children[0]
19
12
  end
20
13
 
21
- def self.traverse(tree, &on_duplicated)
22
- case tree
23
- when Psych::Nodes::Mapping
24
- tree.children.each_slice(2).with_object([]) do |(key, value), keys|
25
- exist = keys.find { |key2| key2.value == key.value }
26
- yield(exist, key) if exist
27
- keys << key
28
- traverse(value, &on_duplicated)
29
- end
30
- else
31
- children = tree.children
32
- return unless children
14
+ class DuplicationCheckHandler < Psych::TreeBuilder # :nodoc:
15
+ def initialize(&block)
16
+ super()
17
+ @block = block
18
+ end
33
19
 
34
- 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
35
31
  end
36
32
  end
37
-
38
- private_class_method :traverse
39
33
  end
40
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