rubocop 1.67.0 → 1.73.0

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 (412) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +4 -4
  4. data/config/default.yml +168 -19
  5. data/config/internal_affairs.yml +16 -0
  6. data/lib/rubocop/cached_data.rb +12 -4
  7. data/lib/rubocop/cli/command/execute_runner.rb +4 -4
  8. data/lib/rubocop/cli/command/show_cops.rb +24 -2
  9. data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
  10. data/lib/rubocop/cli/command/version.rb +2 -2
  11. data/lib/rubocop/comment_config.rb +2 -2
  12. data/lib/rubocop/config.rb +17 -4
  13. data/lib/rubocop/config_loader.rb +48 -8
  14. data/lib/rubocop/config_loader_resolver.rb +35 -10
  15. data/lib/rubocop/config_validator.rb +19 -9
  16. data/lib/rubocop/cop/autocorrect_logic.rb +36 -19
  17. data/lib/rubocop/cop/base.rb +7 -1
  18. data/lib/rubocop/cop/bundler/duplicated_gem.rb +2 -2
  19. data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
  20. data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
  21. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
  22. data/lib/rubocop/cop/correctors/alignment_corrector.rb +1 -12
  23. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +1 -1
  24. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +10 -0
  25. data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +1 -2
  26. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +0 -2
  27. data/lib/rubocop/cop/generator.rb +6 -0
  28. data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
  29. data/lib/rubocop/cop/internal_affairs/example_description.rb +4 -2
  30. data/lib/rubocop/cop/internal_affairs/location_exists.rb +116 -0
  31. data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
  32. data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +3 -4
  33. data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +3 -2
  34. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -1
  35. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
  36. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
  37. data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +229 -0
  38. data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
  39. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
  40. data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +1 -1
  41. data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
  42. data/lib/rubocop/cop/internal_affairs/operator_keyword.rb +48 -0
  43. data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
  44. data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +3 -1
  45. data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
  46. data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +0 -2
  47. data/lib/rubocop/cop/internal_affairs/undefined_config.rb +7 -1
  48. data/lib/rubocop/cop/internal_affairs.rb +6 -16
  49. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -1
  50. data/lib/rubocop/cop/layout/argument_alignment.rb +2 -9
  51. data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
  52. data/lib/rubocop/cop/layout/begin_end_alignment.rb +0 -1
  53. data/lib/rubocop/cop/layout/block_alignment.rb +3 -2
  54. data/lib/rubocop/cop/layout/class_structure.rb +9 -9
  55. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  56. data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
  57. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +2 -2
  58. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +7 -11
  59. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +29 -4
  60. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
  61. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +4 -5
  62. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +23 -1
  63. data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
  64. data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
  65. data/lib/rubocop/cop/layout/first_argument_indentation.rb +3 -8
  66. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +2 -7
  67. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
  68. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
  69. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
  70. data/lib/rubocop/cop/layout/hash_alignment.rb +6 -4
  71. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -1
  72. data/lib/rubocop/cop/layout/indentation_width.rb +7 -7
  73. data/lib/rubocop/cop/layout/leading_comment_space.rb +44 -1
  74. data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +11 -2
  75. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +7 -1
  76. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
  77. data/lib/rubocop/cop/layout/line_length.rb +119 -4
  78. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
  79. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
  80. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -1
  81. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
  82. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
  83. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +2 -3
  84. data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
  85. data/lib/rubocop/cop/layout/redundant_line_break.rb +10 -41
  86. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +4 -3
  87. data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -1
  88. data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
  89. data/lib/rubocop/cop/layout/space_after_comma.rb +1 -1
  90. data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
  91. data/lib/rubocop/cop/layout/space_after_semicolon.rb +1 -1
  92. data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -1
  93. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
  94. data/lib/rubocop/cop/layout/space_around_operators.rb +19 -20
  95. data/lib/rubocop/cop/layout/space_before_brackets.rb +5 -5
  96. data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
  97. data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
  98. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +6 -0
  99. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +4 -0
  100. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +4 -0
  101. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +0 -1
  102. data/lib/rubocop/cop/layout/trailing_whitespace.rb +5 -3
  103. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
  104. data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +119 -0
  105. data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
  106. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +10 -12
  107. data/lib/rubocop/cop/lint/circular_argument_reference.rb +6 -0
  108. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
  109. data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
  110. data/lib/rubocop/cop/lint/cop_directive_syntax.rb +84 -0
  111. data/lib/rubocop/cop/lint/debugger.rb +1 -1
  112. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +2 -1
  113. data/lib/rubocop/cop/lint/duplicate_branch.rb +39 -4
  114. data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
  115. data/lib/rubocop/cop/lint/duplicate_methods.rb +0 -14
  116. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -1
  117. data/lib/rubocop/cop/lint/duplicate_set_element.rb +20 -7
  118. data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
  119. data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
  120. data/lib/rubocop/cop/lint/empty_file.rb +0 -2
  121. data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
  122. data/lib/rubocop/cop/lint/float_comparison.rb +20 -14
  123. data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -4
  124. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
  125. data/lib/rubocop/cop/lint/hash_new_with_keyword_arguments_as_default.rb +55 -0
  126. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  127. data/lib/rubocop/cop/lint/interpolation_check.rb +9 -0
  128. data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +3 -0
  129. data/lib/rubocop/cop/lint/literal_as_condition.rb +105 -7
  130. data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +1 -1
  131. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +24 -6
  132. data/lib/rubocop/cop/lint/missing_super.rb +2 -2
  133. data/lib/rubocop/cop/lint/mixed_case_range.rb +4 -7
  134. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  135. data/lib/rubocop/cop/lint/nested_method_definition.rb +9 -5
  136. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  137. data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +2 -2
  138. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +12 -3
  139. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +3 -3
  140. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +1 -1
  141. data/lib/rubocop/cop/lint/number_conversion.rb +0 -1
  142. data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -2
  143. data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +93 -0
  144. data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +1 -2
  145. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +3 -2
  146. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -5
  147. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +1 -1
  148. data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
  149. data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -21
  150. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +12 -7
  151. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +8 -7
  152. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
  153. data/lib/rubocop/cop/lint/redundant_type_conversion.rb +252 -0
  154. data/lib/rubocop/cop/lint/refinement_import_methods.rb +1 -1
  155. data/lib/rubocop/cop/lint/regexp_as_condition.rb +0 -1
  156. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  157. data/lib/rubocop/cop/lint/rescue_type.rb +3 -7
  158. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +17 -1
  159. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +5 -1
  160. data/lib/rubocop/cop/lint/self_assignment.rb +8 -10
  161. data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
  162. data/lib/rubocop/cop/lint/shared_mutable_default.rb +65 -0
  163. data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
  164. data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
  165. data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
  166. data/lib/rubocop/cop/lint/syntax.rb +4 -1
  167. data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +88 -0
  168. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +1 -1
  169. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -1
  170. data/lib/rubocop/cop/lint/unreachable_code.rb +51 -2
  171. data/lib/rubocop/cop/lint/unreachable_loop.rb +1 -1
  172. data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
  173. data/lib/rubocop/cop/lint/useless_access_modifier.rb +4 -4
  174. data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
  175. data/lib/rubocop/cop/lint/useless_constant_scoping.rb +80 -0
  176. data/lib/rubocop/cop/lint/useless_defined.rb +55 -0
  177. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +4 -0
  178. data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
  179. data/lib/rubocop/cop/lint/useless_numeric_operation.rb +2 -1
  180. data/lib/rubocop/cop/lint/useless_rescue.rb +1 -1
  181. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +2 -2
  182. data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -25
  183. data/lib/rubocop/cop/lint/void.rb +14 -11
  184. data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
  185. data/lib/rubocop/cop/metrics/class_length.rb +9 -9
  186. data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
  187. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +5 -2
  188. data/lib/rubocop/cop/metrics/method_length.rb +8 -1
  189. data/lib/rubocop/cop/metrics/module_length.rb +1 -1
  190. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
  191. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
  192. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +2 -3
  193. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
  194. data/lib/rubocop/cop/mixin/alignment.rb +2 -2
  195. data/lib/rubocop/cop/mixin/allowed_pattern.rb +4 -4
  196. data/lib/rubocop/cop/mixin/check_assignment.rb +4 -12
  197. data/lib/rubocop/cop/mixin/check_line_breakable.rb +20 -10
  198. data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +49 -0
  199. data/lib/rubocop/cop/mixin/comments_help.rb +8 -3
  200. data/lib/rubocop/cop/mixin/dig_help.rb +27 -0
  201. data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +24 -0
  202. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +4 -2
  203. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +22 -22
  204. data/lib/rubocop/cop/mixin/hash_subset.rb +203 -0
  205. data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
  206. data/lib/rubocop/cop/mixin/line_length_help.rb +5 -4
  207. data/lib/rubocop/cop/mixin/method_complexity.rb +1 -1
  208. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +5 -9
  209. data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
  210. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +68 -30
  211. data/lib/rubocop/cop/mixin/range_help.rb +3 -4
  212. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
  213. data/lib/rubocop/cop/mixin/statement_modifier.rb +8 -3
  214. data/lib/rubocop/cop/mixin/string_help.rb +2 -2
  215. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  216. data/lib/rubocop/cop/mixin/target_ruby_version.rb +17 -1
  217. data/lib/rubocop/cop/mixin/trailing_comma.rb +15 -3
  218. data/lib/rubocop/cop/naming/accessor_method_name.rb +6 -6
  219. data/lib/rubocop/cop/naming/block_forwarding.rb +20 -16
  220. data/lib/rubocop/cop/naming/constant_name.rb +6 -7
  221. data/lib/rubocop/cop/naming/file_name.rb +0 -2
  222. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +11 -12
  223. data/lib/rubocop/cop/naming/predicate_name.rb +44 -0
  224. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +6 -14
  225. data/lib/rubocop/cop/naming/variable_name.rb +63 -6
  226. data/lib/rubocop/cop/naming/variable_number.rb +2 -3
  227. data/lib/rubocop/cop/offense.rb +2 -3
  228. data/lib/rubocop/cop/security/compound_hash.rb +2 -0
  229. data/lib/rubocop/cop/security/yaml_load.rb +3 -2
  230. data/lib/rubocop/cop/style/access_modifier_declarations.rb +86 -28
  231. data/lib/rubocop/cop/style/accessor_grouping.rb +19 -5
  232. data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +79 -0
  233. data/lib/rubocop/cop/style/and_or.rb +1 -1
  234. data/lib/rubocop/cop/style/arguments_forwarding.rb +39 -23
  235. data/lib/rubocop/cop/style/array_first_last.rb +18 -2
  236. data/lib/rubocop/cop/style/array_intersect.rb +5 -4
  237. data/lib/rubocop/cop/style/bitwise_predicate.rb +100 -0
  238. data/lib/rubocop/cop/style/block_delimiters.rb +41 -24
  239. data/lib/rubocop/cop/style/case_like_if.rb +8 -11
  240. data/lib/rubocop/cop/style/class_and_module_children.rb +6 -3
  241. data/lib/rubocop/cop/style/collection_methods.rb +1 -1
  242. data/lib/rubocop/cop/style/combinable_defined.rb +115 -0
  243. data/lib/rubocop/cop/style/combinable_loops.rb +2 -2
  244. data/lib/rubocop/cop/style/commented_keyword.rb +11 -1
  245. data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
  246. data/lib/rubocop/cop/style/conditional_assignment.rb +25 -25
  247. data/lib/rubocop/cop/style/constant_visibility.rb +3 -12
  248. data/lib/rubocop/cop/style/dig_chain.rb +89 -0
  249. data/lib/rubocop/cop/style/documentation.rb +1 -1
  250. data/lib/rubocop/cop/style/double_negation.rb +3 -3
  251. data/lib/rubocop/cop/style/each_for_simple_loop.rb +4 -7
  252. data/lib/rubocop/cop/style/each_with_object.rb +2 -3
  253. data/lib/rubocop/cop/style/empty_else.rb +4 -2
  254. data/lib/rubocop/cop/style/empty_literal.rb +1 -1
  255. data/lib/rubocop/cop/style/empty_method.rb +1 -1
  256. data/lib/rubocop/cop/style/endless_method.rb +150 -18
  257. data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
  258. data/lib/rubocop/cop/style/exact_regexp_match.rb +2 -3
  259. data/lib/rubocop/cop/style/explicit_block_argument.rb +15 -2
  260. data/lib/rubocop/cop/style/exponential_notation.rb +1 -1
  261. data/lib/rubocop/cop/style/fetch_env_var.rb +2 -1
  262. data/lib/rubocop/cop/style/file_null.rb +89 -0
  263. data/lib/rubocop/cop/style/file_touch.rb +75 -0
  264. data/lib/rubocop/cop/style/float_division.rb +8 -4
  265. data/lib/rubocop/cop/style/for.rb +0 -1
  266. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
  267. data/lib/rubocop/cop/style/global_vars.rb +1 -3
  268. data/lib/rubocop/cop/style/guard_clause.rb +15 -2
  269. data/lib/rubocop/cop/style/hash_conversion.rb +1 -2
  270. data/lib/rubocop/cop/style/hash_each_methods.rb +3 -6
  271. data/lib/rubocop/cop/style/hash_except.rb +35 -147
  272. data/lib/rubocop/cop/style/hash_slice.rb +80 -0
  273. data/lib/rubocop/cop/style/hash_syntax.rb +6 -3
  274. data/lib/rubocop/cop/style/identical_conditional_branches.rb +22 -3
  275. data/lib/rubocop/cop/style/if_inside_else.rb +0 -1
  276. data/lib/rubocop/cop/style/if_unless_modifier.rb +3 -3
  277. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +2 -3
  278. data/lib/rubocop/cop/style/if_with_semicolon.rb +20 -9
  279. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  280. data/lib/rubocop/cop/style/inverse_methods.rb +6 -7
  281. data/lib/rubocop/cop/style/it_assignment.rb +36 -0
  282. data/lib/rubocop/cop/style/keyword_arguments_merging.rb +67 -0
  283. data/lib/rubocop/cop/style/keyword_parameters_order.rb +1 -1
  284. data/lib/rubocop/cop/style/lambda_call.rb +3 -2
  285. data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
  286. data/lib/rubocop/cop/style/map_into_array.rb +7 -2
  287. data/lib/rubocop/cop/style/map_to_hash.rb +1 -1
  288. data/lib/rubocop/cop/style/map_to_set.rb +3 -2
  289. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +20 -13
  290. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -0
  291. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -11
  292. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -4
  293. data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
  294. data/lib/rubocop/cop/style/missing_else.rb +2 -0
  295. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +33 -3
  296. data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -1
  297. data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
  298. data/lib/rubocop/cop/style/multiple_comparison.rb +52 -51
  299. data/lib/rubocop/cop/style/mutable_constant.rb +7 -8
  300. data/lib/rubocop/cop/style/negated_if_else_condition.rb +7 -5
  301. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +1 -1
  302. data/lib/rubocop/cop/style/nested_ternary_operator.rb +5 -4
  303. data/lib/rubocop/cop/style/not.rb +1 -1
  304. data/lib/rubocop/cop/style/object_then.rb +14 -15
  305. data/lib/rubocop/cop/style/one_line_conditional.rb +25 -4
  306. data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
  307. data/lib/rubocop/cop/style/operator_method_call.rb +5 -6
  308. data/lib/rubocop/cop/style/or_assignment.rb +3 -6
  309. data/lib/rubocop/cop/style/parallel_assignment.rb +9 -18
  310. data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
  311. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  312. data/lib/rubocop/cop/style/proc.rb +1 -2
  313. data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
  314. data/lib/rubocop/cop/style/raise_args.rb +7 -5
  315. data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
  316. data/lib/rubocop/cop/style/redundant_argument.rb +3 -1
  317. data/lib/rubocop/cop/style/redundant_assignment.rb +1 -1
  318. data/lib/rubocop/cop/style/redundant_begin.rb +1 -1
  319. data/lib/rubocop/cop/style/redundant_condition.rb +72 -23
  320. data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +2 -1
  321. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +6 -10
  322. data/lib/rubocop/cop/style/redundant_each.rb +1 -1
  323. data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
  324. data/lib/rubocop/cop/style/redundant_format.rb +250 -0
  325. data/lib/rubocop/cop/style/redundant_freeze.rb +2 -2
  326. data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
  327. data/lib/rubocop/cop/style/redundant_line_continuation.rb +54 -15
  328. data/lib/rubocop/cop/style/redundant_parentheses.rb +36 -24
  329. data/lib/rubocop/cop/style/redundant_regexp_argument.rb +4 -0
  330. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
  331. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -1
  332. data/lib/rubocop/cop/style/redundant_return.rb +2 -2
  333. data/lib/rubocop/cop/style/redundant_self.rb +8 -15
  334. data/lib/rubocop/cop/style/redundant_self_assignment.rb +20 -32
  335. data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +4 -4
  336. data/lib/rubocop/cop/style/redundant_sort.rb +3 -3
  337. data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -2
  338. data/lib/rubocop/cop/style/rescue_modifier.rb +2 -3
  339. data/lib/rubocop/cop/style/return_nil.rb +1 -1
  340. data/lib/rubocop/cop/style/safe_navigation.rb +14 -2
  341. data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
  342. data/lib/rubocop/cop/style/select_by_regexp.rb +1 -1
  343. data/lib/rubocop/cop/style/self_assignment.rb +11 -17
  344. data/lib/rubocop/cop/style/semicolon.rb +1 -1
  345. data/lib/rubocop/cop/style/send_with_literal_method_name.rb +2 -1
  346. data/lib/rubocop/cop/style/signal_exception.rb +2 -3
  347. data/lib/rubocop/cop/style/single_argument_dig.rb +9 -5
  348. data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
  349. data/lib/rubocop/cop/style/single_line_do_end_block.rb +12 -3
  350. data/lib/rubocop/cop/style/single_line_methods.rb +6 -7
  351. data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
  352. data/lib/rubocop/cop/style/sole_nested_conditional.rb +4 -5
  353. data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
  354. data/lib/rubocop/cop/style/string_concatenation.rb +15 -14
  355. data/lib/rubocop/cop/style/string_literals.rb +1 -1
  356. data/lib/rubocop/cop/style/string_methods.rb +1 -1
  357. data/lib/rubocop/cop/style/super_arguments.rb +65 -17
  358. data/lib/rubocop/cop/style/swap_values.rb +4 -15
  359. data/lib/rubocop/cop/style/ternary_parentheses.rb +25 -4
  360. data/lib/rubocop/cop/style/top_level_method_definition.rb +1 -1
  361. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +4 -1
  362. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
  363. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
  364. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -4
  365. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  366. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -2
  367. data/lib/rubocop/cop/style/while_until_modifier.rb +0 -1
  368. data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
  369. data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
  370. data/lib/rubocop/cop/util.rb +12 -5
  371. data/lib/rubocop/cop/utils/format_string.rb +7 -5
  372. data/lib/rubocop/cop/variable_force/assignment.rb +18 -3
  373. data/lib/rubocop/cop/variable_force/branch.rb +1 -1
  374. data/lib/rubocop/cop/variable_force/variable.rb +18 -2
  375. data/lib/rubocop/cop/variable_force/variable_table.rb +5 -5
  376. data/lib/rubocop/cop/variable_force.rb +4 -10
  377. data/lib/rubocop/cops_documentation_generator.rb +44 -23
  378. data/lib/rubocop/directive_comment.rb +44 -10
  379. data/lib/rubocop/formatter/disabled_config_formatter.rb +1 -1
  380. data/lib/rubocop/formatter/formatter_set.rb +1 -1
  381. data/lib/rubocop/lsp/diagnostic.rb +189 -0
  382. data/lib/rubocop/lsp/logger.rb +2 -2
  383. data/lib/rubocop/lsp/routes.rb +7 -23
  384. data/lib/rubocop/lsp/runtime.rb +17 -49
  385. data/lib/rubocop/lsp/server.rb +0 -2
  386. data/lib/rubocop/lsp/stdin_runner.rb +83 -0
  387. data/lib/rubocop/magic_comment.rb +3 -3
  388. data/lib/rubocop/options.rb +28 -12
  389. data/lib/rubocop/path_util.rb +15 -8
  390. data/lib/rubocop/plugin/configuration_integrator.rb +143 -0
  391. data/lib/rubocop/plugin/load_error.rb +26 -0
  392. data/lib/rubocop/plugin/loader.rb +100 -0
  393. data/lib/rubocop/plugin/not_supported_error.rb +29 -0
  394. data/lib/rubocop/plugin.rb +46 -0
  395. data/lib/rubocop/rake_task.rb +4 -1
  396. data/lib/rubocop/result_cache.rb +13 -13
  397. data/lib/rubocop/rspec/cop_helper.rb +9 -0
  398. data/lib/rubocop/rspec/expect_offense.rb +6 -2
  399. data/lib/rubocop/rspec/shared_contexts.rb +19 -1
  400. data/lib/rubocop/rspec/support.rb +2 -2
  401. data/lib/rubocop/runner.rb +21 -14
  402. data/lib/rubocop/server/cache.rb +35 -2
  403. data/lib/rubocop/server/cli.rb +2 -2
  404. data/lib/rubocop/target_finder.rb +1 -0
  405. data/lib/rubocop/target_ruby.rb +16 -1
  406. data/lib/rubocop/version.rb +41 -7
  407. data/lib/rubocop.rb +27 -1
  408. data/lib/ruby_lsp/rubocop/addon.rb +75 -0
  409. data/lib/ruby_lsp/rubocop/runtime_adapter.rb +47 -0
  410. metadata +73 -20
  411. data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
  412. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -13,6 +13,15 @@ module CopHelper
13
13
  let(:parser_engine) { ENV.fetch('PARSER_ENGINE', :parser_whitequark).to_sym }
14
14
  let(:rails_version) { false }
15
15
 
16
+ before(:all) do
17
+ next if ENV['RUBOCOP_CORE_DEVELOPMENT']
18
+
19
+ plugins = Gem.loaded_specs.filter_map do |feature_name, feature_specification|
20
+ feature_name if feature_specification.metadata['default_lint_roller_plugin']
21
+ end
22
+ RuboCop::Plugin.integrate_plugins(RuboCop::Config.new, plugins)
23
+ end
24
+
16
25
  def inspect_source(source, file = nil)
17
26
  RuboCop::Formatter::DisabledConfigFormatter.config_to_allow_offenses = {}
18
27
  RuboCop::Formatter::DisabledConfigFormatter.detected_styles = {}
@@ -190,7 +190,10 @@ module RuboCop
190
190
  def expect_no_offenses(source, file = nil)
191
191
  offenses = inspect_source(source, file)
192
192
 
193
- expected_annotations = AnnotatedSource.parse(source)
193
+ # Since source given `expect_no_offenses` does not have annotations, we do not need to parse
194
+ # for them, and can just build an `AnnotatedSource` object from the source lines.
195
+ # This also prevents treating source lines that begin with a caret as an annotation.
196
+ expected_annotations = AnnotatedSource.new(source.each_line.to_a, [])
194
197
  actual_annotations = expected_annotations.with_offense_annotations(offenses)
195
198
  expect(actual_annotations.to_s).to eq(source)
196
199
  end
@@ -221,7 +224,8 @@ module RuboCop
221
224
 
222
225
  # Parsed representation of code annotated with the `^^^ Message` style
223
226
  class AnnotatedSource
224
- ANNOTATION_PATTERN = /\A\s*(\^+|\^{}) ?/.freeze
227
+ # Ignore escaped carets, don't treat as annotations
228
+ ANNOTATION_PATTERN = /\A\s*((?<!\\)\^+|\^{}) ?/.freeze
225
229
  ABBREV = "[...]\n"
226
230
 
227
231
  # @param annotated_source [String] string passed to the matchers
@@ -80,6 +80,21 @@ RSpec.shared_context 'maintain registry' do
80
80
  end
81
81
  end
82
82
 
83
+ RSpec.shared_context 'maintain default configuration' do
84
+ around(:each) do |example|
85
+ # Make a copy of the current configuration that will not change when source hash changes
86
+ default_configuration = RuboCop::ConfigLoader.default_configuration
87
+ config = RuboCop::Config.create(
88
+ default_configuration.to_h.clone,
89
+ default_configuration.loaded_path
90
+ )
91
+
92
+ example.run
93
+
94
+ RuboCop::ConfigLoader.instance_variable_set(:@default_configuration, config)
95
+ end
96
+ end
97
+
83
98
  # This context assumes nothing and defines `cop`, among others.
84
99
  RSpec.shared_context 'config' do # rubocop:disable Metrics/BlockLength
85
100
  ### Meant to be overridden at will
@@ -98,6 +113,8 @@ RSpec.shared_context 'config' do # rubocop:disable Metrics/BlockLength
98
113
 
99
114
  let(:cop_options) { {} }
100
115
 
116
+ let(:gem_versions) { {} }
117
+
101
118
  ### Utilities
102
119
 
103
120
  def source_range(range, buffer: source_buffer)
@@ -138,7 +155,8 @@ RSpec.shared_context 'config' do # rubocop:disable Metrics/BlockLength
138
155
 
139
156
  allow(config).to receive(:gem_versions_in_target).and_return(
140
157
  {
141
- 'railties' => rails_version_in_gemfile
158
+ 'railties' => rails_version_in_gemfile,
159
+ **gem_versions.transform_values { |value| Gem::Version.new(value) }
142
160
  }
143
161
  )
144
162
 
@@ -4,18 +4,18 @@
4
4
 
5
5
  require_relative 'cop_helper'
6
6
  require_relative 'expect_offense'
7
- require_relative 'host_environment_simulation_helper'
8
7
  require_relative 'parallel_formatter'
9
8
  require_relative 'shared_contexts'
10
9
 
11
10
  RSpec.configure do |config|
12
11
  config.include CopHelper
13
- config.include HostEnvironmentSimulatorHelper
12
+ config.include RuboCop::RSpec::ExpectOffense
14
13
  config.include_context 'config', :config
15
14
  config.include_context 'isolated environment', :isolated_environment
16
15
  config.include_context 'isolated bundler', :isolated_bundler
17
16
  config.include_context 'lsp', :lsp
18
17
  config.include_context 'maintain registry', :restore_registry
18
+ config.include_context 'maintain default configuration', :restore_configuration
19
19
  config.include_context 'ruby 2.0', :ruby20
20
20
  config.include_context 'ruby 2.1', :ruby21
21
21
  config.include_context 'ruby 2.2', :ruby22
@@ -20,11 +20,7 @@ module RuboCop
20
20
  message = 'Infinite loop detected'
21
21
  message += " in #{path}" if path
22
22
  message += " and caused by #{root_cause}" if root_cause
23
- message += "\n"
24
- hint = 'Hint: Please update to the latest RuboCop version if not already in use, ' \
25
- "and report a bug if the issue still occurs on this version.\n" \
26
- 'Please check the latest version at https://rubygems.org/gems/rubocop.'
27
- super(Rainbow(message).red + Rainbow(hint).yellow)
23
+ super(message)
28
24
  end
29
25
  end
30
26
 
@@ -139,7 +135,7 @@ module RuboCop
139
135
  offenses = process_file(file)
140
136
  yield file
141
137
 
142
- if offenses.any? { |o| considered_failure?(o) }
138
+ if offenses.any? { |o| considered_failure?(o) && offense_displayed?(o) }
143
139
  break false if @options[:fail_fast]
144
140
 
145
141
  next false
@@ -157,8 +153,11 @@ module RuboCop
157
153
  file_started(file)
158
154
  offenses = file_offenses(file)
159
155
  rescue InfiniteCorrectionLoop => e
156
+ raise e if @options[:raise_cop_error]
157
+
158
+ errors << e
159
+ warn Rainbow(e.message).red
160
160
  offenses = e.offenses.compact.sort.freeze
161
- raise
162
161
  ensure
163
162
  file_finished(file, offenses || [])
164
163
  end
@@ -363,8 +362,12 @@ module RuboCop
363
362
  result = ruby_extractor.call(processed_source)
364
363
  break result if result
365
364
  rescue StandardError
366
- raise Error, "Ruby extractor #{ruby_extractor.source_location[0]} failed to process " \
367
- "#{processed_source.path}."
365
+ location = if ruby_extractor.is_a?(Proc)
366
+ ruby_extractor.source_location
367
+ else
368
+ ruby_extractor.method(:call).source_location
369
+ end
370
+ raise Error, "Ruby extractor #{location[0]} failed to process #{processed_source.path}."
368
371
  end
369
372
  end
370
373
 
@@ -436,18 +439,22 @@ module RuboCop
436
439
  !offense.corrected? && offense.severity >= minimum_severity_to_fail
437
440
  end
438
441
 
439
- def offenses_to_report(offenses)
442
+ def offense_displayed?(offense)
440
443
  if @options[:display_only_fail_level_offenses]
441
- offenses.select { |o| considered_failure?(o) }
444
+ considered_failure?(offense)
442
445
  elsif @options[:display_only_safe_correctable]
443
- offenses.select { |o| supports_safe_autocorrect?(o) }
446
+ supports_safe_autocorrect?(offense)
444
447
  elsif @options[:display_only_correctable]
445
- offenses.select(&:correctable?)
448
+ offense.correctable?
446
449
  else
447
- offenses
450
+ true
448
451
  end
449
452
  end
450
453
 
454
+ def offenses_to_report(offenses)
455
+ offenses.select { |o| offense_displayed?(o) }
456
+ end
457
+
451
458
  def supports_safe_autocorrect?(offense)
452
459
  cop_class = Cop::Registry.global.find_by_cop_name(offense.cop_name)
453
460
  default_cfg = default_config(offense.cop_name)
@@ -2,8 +2,10 @@
2
2
 
3
3
  require 'digest'
4
4
  require 'pathname'
5
+ require 'yaml'
5
6
  require_relative '../cache_config'
6
7
  require_relative '../config_finder'
8
+ require_relative '../path_util'
7
9
 
8
10
  #
9
11
  # This code is based on https://github.com/fohte/rubocop-daemon.
@@ -50,9 +52,11 @@ module RuboCop
50
52
  end.find(&:exist?)
51
53
  version_data = lockfile_path&.read || RuboCop::Version::STRING
52
54
  config_data = Pathname(ConfigFinder.find_config_path(Dir.pwd)).read
53
- todo_data = (rubocop_todo = Pathname('.rubocop_todo.yml')).exist? ? rubocop_todo.read : ''
55
+ yaml = YAML.safe_load(config_data, permitted_classes: [Regexp, Symbol], aliases: true)
56
+ inherit_from_data = inherit_from_data(yaml)
57
+ require_data = require_data(yaml)
54
58
 
55
- Digest::SHA1.hexdigest(version_data + config_data + todo_data)
59
+ Digest::SHA1.hexdigest(version_data + config_data + inherit_from_data + require_data)
56
60
  end
57
61
  # rubocop:enable Metrics/AbcSize
58
62
 
@@ -164,6 +168,35 @@ module RuboCop
164
168
  def write_version_file(version)
165
169
  version_path.write(version)
166
170
  end
171
+
172
+ def inherit_from_data(yaml)
173
+ return '' unless (inherit_from_paths = yaml['inherit_from'])
174
+
175
+ Array(inherit_from_paths).map do |path|
176
+ next if PathUtil.remote_file?(path)
177
+
178
+ path = Pathname(path)
179
+
180
+ path.exist? ? path.read : ''
181
+ end.join
182
+ end
183
+
184
+ def require_data(yaml)
185
+ return '' unless (require_paths = yaml['require'])
186
+
187
+ Array(require_paths).map do |path|
188
+ # NOTE: This targets only relative or absolute path specifications.
189
+ # For example, specifications like `require: rubocop-performance`,
190
+ # which can be loaded from `$LOAD_PATH`, are ignored.
191
+ next unless path.start_with?('.', '/')
192
+
193
+ # NOTE: `.so` files are not typically specified, so only `.rb` files are targeted.
194
+ path = "#{path}.rb" unless path.end_with?('.rb')
195
+ path = Pathname(path)
196
+
197
+ path.exist? ? path.read : ''
198
+ end.join
199
+ end
167
200
  end
168
201
  end
169
202
  end
@@ -86,7 +86,7 @@ module RuboCop
86
86
  end
87
87
  # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
88
88
 
89
- # rubocop:disable Metrics/CyclomaticComplexity, Metrics/MethodLength:
89
+ # rubocop:disable Metrics/CyclomaticComplexity, Metrics/MethodLength
90
90
  def run_command(server_command, detach:)
91
91
  case server_command
92
92
  when '--server'
@@ -107,7 +107,7 @@ module RuboCop
107
107
  Server::ClientCommand::Status.new.run
108
108
  end
109
109
  end
110
- # rubocop:enable Metrics/CyclomaticComplexity, Metrics/MethodLength:
110
+ # rubocop:enable Metrics/CyclomaticComplexity, Metrics/MethodLength
111
111
 
112
112
  def fetch_cache_root_path_from(arguments)
113
113
  cache_root = arguments.detect { |argument| argument.start_with?('--cache-root') }
@@ -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
@@ -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,7 +3,7 @@
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.73.0'
7
7
 
8
8
  MSG = '%<version>s (using %<parser_version>s, ' \
9
9
  'rubocop-ast %<rubocop_ast_version>s, ' \
@@ -18,12 +18,13 @@ module RuboCop
18
18
  'rubocop-md' => 'markdown', 'rubocop-factory_bot' => 'factory_bot'
19
19
  }.freeze
20
20
 
21
+ # NOTE: Marked as private but used by gems like standard.
21
22
  # @api private
22
23
  def self.version(debug: false, env: nil)
23
24
  if debug
24
25
  verbose_version = format(MSG, version: STRING, parser_version: parser_version,
25
26
  rubocop_ast_version: RuboCop::AST::Version::STRING,
26
- target_ruby_version: TargetRuby.new(Config.new).version,
27
+ target_ruby_version: target_ruby_version(env),
27
28
  ruby_engine: RUBY_ENGINE, ruby_version: RUBY_VERSION,
28
29
  server_mode: server_mode,
29
30
  ruby_platform: RUBY_PLATFORM)
@@ -41,6 +42,11 @@ module RuboCop
41
42
  end
42
43
  end
43
44
 
45
+ # @api private
46
+ def self.verbose(env: nil)
47
+ version(debug: true, env: env)
48
+ end
49
+
44
50
  # @api private
45
51
  def self.parser_version
46
52
  config_path = ConfigFinder.find_config_path(Dir.pwd)
@@ -57,14 +63,21 @@ module RuboCop
57
63
  end
58
64
 
59
65
  # @api private
66
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
60
67
  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
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}"
65
74
  end
66
75
 
67
- 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|
68
81
  next unless (match = loaded_feature.match(/rubocop-(?<feature>.*)/))
69
82
 
70
83
  # Get the expected name of the folder containing the extension code.
@@ -83,6 +96,27 @@ module RuboCop
83
96
 
84
97
  " - #{loaded_feature} #{feature_version}"
85
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
86
120
  end
87
121
 
88
122
  # 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
@@ -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'
@@ -143,7 +148,6 @@ require_relative 'rubocop/cop/mixin/comments_help' # relies on visibility_help
143
148
  require_relative 'rubocop/cop/mixin/def_node' # relies on visibility_help
144
149
 
145
150
  require_relative 'rubocop/cop/utils/format_string'
146
- require_relative 'rubocop/cop/utils/regexp_ranges'
147
151
 
148
152
  require_relative 'rubocop/cop/migration/department_name'
149
153
 
@@ -289,6 +293,7 @@ require_relative 'rubocop/cop/lint/ambiguous_operator'
289
293
  require_relative 'rubocop/cop/lint/ambiguous_operator_precedence'
290
294
  require_relative 'rubocop/cop/lint/ambiguous_range'
291
295
  require_relative 'rubocop/cop/lint/ambiguous_regexp_literal'
296
+ require_relative 'rubocop/cop/lint/array_literal_in_regexp'
292
297
  require_relative 'rubocop/cop/lint/assignment_in_condition'
293
298
  require_relative 'rubocop/cop/lint/big_decimal_new'
294
299
  require_relative 'rubocop/cop/lint/binary_operator_with_identical_operands'
@@ -296,7 +301,9 @@ require_relative 'rubocop/cop/lint/boolean_symbol'
296
301
  require_relative 'rubocop/cop/lint/circular_argument_reference'
297
302
  require_relative 'rubocop/cop/lint/constant_definition_in_block'
298
303
  require_relative 'rubocop/cop/lint/constant_overwritten_in_rescue'
304
+ require_relative 'rubocop/cop/lint/constant_reassignment'
299
305
  require_relative 'rubocop/cop/lint/constant_resolution'
306
+ require_relative 'rubocop/cop/lint/cop_directive_syntax'
300
307
  require_relative 'rubocop/cop/lint/debugger'
301
308
  require_relative 'rubocop/cop/lint/deprecated_class_methods'
302
309
  require_relative 'rubocop/cop/lint/deprecated_constants'
@@ -325,12 +332,14 @@ require_relative 'rubocop/cop/lint/empty_in_pattern'
325
332
  require_relative 'rubocop/cop/lint/empty_interpolation'
326
333
  require_relative 'rubocop/cop/lint/empty_when'
327
334
  require_relative 'rubocop/cop/lint/ensure_return'
335
+ require_relative 'rubocop/cop/lint/shared_mutable_default'
328
336
  require_relative 'rubocop/cop/lint/erb_new_arguments'
329
337
  require_relative 'rubocop/cop/lint/flip_flop'
330
338
  require_relative 'rubocop/cop/lint/float_comparison'
331
339
  require_relative 'rubocop/cop/lint/float_out_of_range'
332
340
  require_relative 'rubocop/cop/lint/format_parameter_mismatch'
333
341
  require_relative 'rubocop/cop/lint/hash_compare_by_identity'
342
+ require_relative 'rubocop/cop/lint/hash_new_with_keyword_arguments_as_default'
334
343
  require_relative 'rubocop/cop/lint/heredoc_method_call_position'
335
344
  require_relative 'rubocop/cop/lint/identity_comparison'
336
345
  require_relative 'rubocop/cop/lint/implicit_string_concatenation'
@@ -358,6 +367,7 @@ require_relative 'rubocop/cop/lint/non_deterministic_require_order'
358
367
  require_relative 'rubocop/cop/lint/non_local_exit_from_iterator'
359
368
  require_relative 'rubocop/cop/lint/number_conversion'
360
369
  require_relative 'rubocop/cop/lint/numbered_parameter_assignment'
370
+ require_relative 'rubocop/cop/lint/numeric_operation_with_constant_result'
361
371
  require_relative 'rubocop/cop/lint/or_assignment_to_constant'
362
372
  require_relative 'rubocop/cop/lint/ordered_magic_comments'
363
373
  require_relative 'rubocop/cop/lint/out_of_range_regexp_ref'
@@ -374,6 +384,7 @@ require_relative 'rubocop/cop/lint/redundant_require_statement'
374
384
  require_relative 'rubocop/cop/lint/redundant_safe_navigation'
375
385
  require_relative 'rubocop/cop/lint/redundant_splat_expansion'
376
386
  require_relative 'rubocop/cop/lint/redundant_string_coercion'
387
+ require_relative 'rubocop/cop/lint/redundant_type_conversion'
377
388
  require_relative 'rubocop/cop/lint/redundant_with_index'
378
389
  require_relative 'rubocop/cop/lint/redundant_with_object'
379
390
  require_relative 'rubocop/cop/lint/refinement_import_methods'
@@ -395,6 +406,7 @@ require_relative 'rubocop/cop/lint/shadowed_exception'
395
406
  require_relative 'rubocop/cop/lint/shadowing_outer_local_variable'
396
407
  require_relative 'rubocop/cop/lint/struct_new_override'
397
408
  require_relative 'rubocop/cop/lint/suppressed_exception'
409
+ require_relative 'rubocop/cop/lint/suppressed_exception_in_number_conversion'
398
410
  require_relative 'rubocop/cop/lint/symbol_conversion'
399
411
  require_relative 'rubocop/cop/lint/syntax'
400
412
  require_relative 'rubocop/cop/lint/to_enum_arguments'
@@ -403,6 +415,7 @@ require_relative 'rubocop/cop/lint/top_level_return_with_argument'
403
415
  require_relative 'rubocop/cop/lint/trailing_comma_in_attribute_declaration'
404
416
  require_relative 'rubocop/cop/lint/triple_quotes'
405
417
  require_relative 'rubocop/cop/lint/underscore_prefixed_variable_name'
418
+ require_relative 'rubocop/cop/lint/unescaped_bracket_in_regexp'
406
419
  require_relative 'rubocop/cop/lint/unexpected_block_arity'
407
420
  require_relative 'rubocop/cop/lint/unified_integer'
408
421
  require_relative 'rubocop/cop/lint/unmodified_reduce_accumulator'
@@ -414,6 +427,8 @@ require_relative 'rubocop/cop/lint/uri_escape_unescape'
414
427
  require_relative 'rubocop/cop/lint/uri_regexp'
415
428
  require_relative 'rubocop/cop/lint/useless_access_modifier'
416
429
  require_relative 'rubocop/cop/lint/useless_assignment'
430
+ require_relative 'rubocop/cop/lint/useless_constant_scoping'
431
+ require_relative 'rubocop/cop/lint/useless_defined'
417
432
  require_relative 'rubocop/cop/lint/useless_else_without_rescue'
418
433
  require_relative 'rubocop/cop/lint/useless_method_definition'
419
434
  require_relative 'rubocop/cop/lint/useless_numeric_operation'
@@ -460,6 +475,7 @@ require_relative 'rubocop/cop/naming/variable_number'
460
475
  require_relative 'rubocop/cop/style/access_modifier_declarations'
461
476
  require_relative 'rubocop/cop/style/accessor_grouping'
462
477
  require_relative 'rubocop/cop/style/alias'
478
+ require_relative 'rubocop/cop/style/ambiguous_endless_method_definition'
463
479
  require_relative 'rubocop/cop/style/and_or'
464
480
  require_relative 'rubocop/cop/style/arguments_forwarding'
465
481
  require_relative 'rubocop/cop/style/array_coercion'
@@ -472,6 +488,7 @@ require_relative 'rubocop/cop/style/auto_resource_cleanup'
472
488
  require_relative 'rubocop/cop/style/bare_percent_literals'
473
489
  require_relative 'rubocop/cop/style/begin_block'
474
490
  require_relative 'rubocop/cop/style/bisected_attr_accessor'
491
+ require_relative 'rubocop/cop/style/bitwise_predicate'
475
492
  require_relative 'rubocop/cop/style/block_comments'
476
493
  require_relative 'rubocop/cop/style/block_delimiters'
477
494
  require_relative 'rubocop/cop/style/case_equality'
@@ -487,6 +504,7 @@ require_relative 'rubocop/cop/style/collection_compact'
487
504
  require_relative 'rubocop/cop/style/collection_methods'
488
505
  require_relative 'rubocop/cop/style/colon_method_call'
489
506
  require_relative 'rubocop/cop/style/colon_method_definition'
507
+ require_relative 'rubocop/cop/style/combinable_defined'
490
508
  require_relative 'rubocop/cop/style/combinable_loops'
491
509
  require_relative 'rubocop/cop/style/command_literal'
492
510
  require_relative 'rubocop/cop/style/comment_annotation'
@@ -499,6 +517,7 @@ require_relative 'rubocop/cop/style/copyright'
499
517
  require_relative 'rubocop/cop/style/data_inheritance'
500
518
  require_relative 'rubocop/cop/style/date_time'
501
519
  require_relative 'rubocop/cop/style/def_with_parentheses'
520
+ require_relative 'rubocop/cop/style/dig_chain'
502
521
  require_relative 'rubocop/cop/style/dir'
503
522
  require_relative 'rubocop/cop/style/dir_empty'
504
523
  require_relative 'rubocop/cop/style/disable_cops_within_source_code_directive'
@@ -528,7 +547,9 @@ require_relative 'rubocop/cop/style/explicit_block_argument'
528
547
  require_relative 'rubocop/cop/style/exponential_notation'
529
548
  require_relative 'rubocop/cop/style/fetch_env_var'
530
549
  require_relative 'rubocop/cop/style/file_empty'
550
+ require_relative 'rubocop/cop/style/file_null'
531
551
  require_relative 'rubocop/cop/style/file_read'
552
+ require_relative 'rubocop/cop/style/file_touch'
532
553
  require_relative 'rubocop/cop/style/file_write'
533
554
  require_relative 'rubocop/cop/style/float_division'
534
555
  require_relative 'rubocop/cop/style/for'
@@ -543,6 +564,7 @@ require_relative 'rubocop/cop/style/hash_conversion'
543
564
  require_relative 'rubocop/cop/style/hash_each_methods'
544
565
  require_relative 'rubocop/cop/style/hash_except'
545
566
  require_relative 'rubocop/cop/style/hash_like_case'
567
+ require_relative 'rubocop/cop/style/hash_slice'
546
568
  require_relative 'rubocop/cop/style/hash_syntax'
547
569
  require_relative 'rubocop/cop/style/hash_transform_keys'
548
570
  require_relative 'rubocop/cop/style/hash_transform_values'
@@ -559,6 +581,8 @@ require_relative 'rubocop/cop/style/inverse_methods'
559
581
  require_relative 'rubocop/cop/style/inline_comment'
560
582
  require_relative 'rubocop/cop/style/invertible_unless_condition'
561
583
  require_relative 'rubocop/cop/style/ip_addresses'
584
+ require_relative 'rubocop/cop/style/it_assignment'
585
+ require_relative 'rubocop/cop/style/keyword_arguments_merging'
562
586
  require_relative 'rubocop/cop/style/keyword_parameters_order'
563
587
  require_relative 'rubocop/cop/style/lambda'
564
588
  require_relative 'rubocop/cop/style/lambda_call'
@@ -583,6 +607,7 @@ require_relative 'rubocop/cop/style/redundant_each'
583
607
  require_relative 'rubocop/cop/style/redundant_fetch_block'
584
608
  require_relative 'rubocop/cop/style/redundant_file_extension_in_require'
585
609
  require_relative 'rubocop/cop/style/redundant_filter_chain'
610
+ require_relative 'rubocop/cop/style/redundant_format'
586
611
  require_relative 'rubocop/cop/style/redundant_heredoc_delimiter_quotes'
587
612
  require_relative 'rubocop/cop/style/redundant_initialize'
588
613
  require_relative 'rubocop/cop/style/redundant_interpolation_unfreeze'
@@ -592,6 +617,7 @@ require_relative 'rubocop/cop/style/redundant_regexp_constructor'
592
617
  require_relative 'rubocop/cop/style/redundant_self_assignment'
593
618
  require_relative 'rubocop/cop/style/redundant_self_assignment_branch'
594
619
  require_relative 'rubocop/cop/style/require_order'
620
+ require_relative 'rubocop/cop/style/safe_navigation_chain_length'
595
621
  require_relative 'rubocop/cop/style/single_line_do_end_block'
596
622
  require_relative 'rubocop/cop/style/sole_nested_conditional'
597
623
  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