rubocop 1.52.1 → 1.79.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (658) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +93 -88
  4. data/assets/output.css.erb +159 -0
  5. data/assets/output.html.erb +1 -160
  6. data/config/default.yml +596 -91
  7. data/config/internal_affairs.yml +31 -0
  8. data/config/obsoletion.yml +13 -3
  9. data/exe/rubocop +4 -3
  10. data/lib/rubocop/cached_data.rb +21 -5
  11. data/lib/rubocop/cli/command/auto_generate_config.rb +28 -15
  12. data/lib/rubocop/cli/command/execute_runner.rb +4 -4
  13. data/lib/rubocop/cli/command/lsp.rb +19 -0
  14. data/lib/rubocop/cli/command/show_cops.rb +24 -2
  15. data/lib/rubocop/cli/command/show_docs_url.rb +2 -2
  16. data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
  17. data/lib/rubocop/cli/command/version.rb +2 -2
  18. data/lib/rubocop/cli.rb +26 -3
  19. data/lib/rubocop/comment_config.rb +3 -3
  20. data/lib/rubocop/config.rb +92 -22
  21. data/lib/rubocop/config_finder.rb +14 -4
  22. data/lib/rubocop/config_loader.rb +68 -57
  23. data/lib/rubocop/config_loader_resolver.rb +52 -20
  24. data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -3
  25. data/lib/rubocop/config_obsoletion/parameter_rule.rb +9 -1
  26. data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
  27. data/lib/rubocop/config_obsoletion.rb +56 -9
  28. data/lib/rubocop/config_validator.rb +39 -20
  29. data/lib/rubocop/cop/autocorrect_logic.rb +57 -25
  30. data/lib/rubocop/cop/base.rb +80 -19
  31. data/lib/rubocop/cop/bundler/duplicated_gem.rb +3 -2
  32. data/lib/rubocop/cop/bundler/duplicated_group.rb +127 -0
  33. data/lib/rubocop/cop/bundler/gem_comment.rb +3 -3
  34. data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
  35. data/lib/rubocop/cop/bundler/gem_version.rb +6 -7
  36. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
  37. data/lib/rubocop/cop/bundler/ordered_gems.rb +10 -2
  38. data/lib/rubocop/cop/cop.rb +30 -4
  39. data/lib/rubocop/cop/correctors/alignment_corrector.rb +1 -12
  40. data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +4 -8
  41. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +6 -14
  42. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +7 -4
  43. data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -0
  44. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +6 -3
  45. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +10 -0
  46. data/lib/rubocop/cop/documentation.rb +32 -5
  47. data/lib/rubocop/cop/exclude_limit.rb +1 -1
  48. data/lib/rubocop/cop/force.rb +12 -0
  49. data/lib/rubocop/cop/gemspec/add_runtime_dependency.rb +38 -0
  50. data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
  51. data/lib/rubocop/cop/gemspec/dependency_version.rb +5 -7
  52. data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +3 -4
  53. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +39 -17
  54. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +10 -2
  55. data/lib/rubocop/cop/gemspec/require_mfa.rb +15 -1
  56. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +5 -3
  57. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +3 -3
  58. data/lib/rubocop/cop/generator/require_file_injector.rb +1 -1
  59. data/lib/rubocop/cop/generator.rb +6 -0
  60. data/lib/rubocop/cop/internal_affairs/cop_description.rb +0 -4
  61. data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
  62. data/lib/rubocop/cop/internal_affairs/empty_line_between_expect_offense_and_correction.rb +2 -1
  63. data/lib/rubocop/cop/internal_affairs/example_description.rb +51 -25
  64. data/lib/rubocop/cop/internal_affairs/location_exists.rb +116 -0
  65. data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
  66. data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +6 -5
  67. data/lib/rubocop/cop/internal_affairs/method_name_end_with.rb +8 -6
  68. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +19 -20
  69. data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +54 -0
  70. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +127 -33
  71. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
  72. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
  73. data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +231 -0
  74. data/lib/rubocop/cop/internal_affairs/node_type_group.rb +92 -0
  75. data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
  76. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
  77. data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +1 -1
  78. data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
  79. data/lib/rubocop/cop/internal_affairs/operator_keyword.rb +48 -0
  80. data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
  81. data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +6 -5
  82. data/lib/rubocop/cop/internal_affairs/redundant_expect_offense_arguments.rb +34 -0
  83. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +6 -21
  84. data/lib/rubocop/cop/internal_affairs/redundant_method_dispatch_node.rb +11 -2
  85. data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +11 -2
  86. data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
  87. data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +0 -2
  88. data/lib/rubocop/cop/internal_affairs/undefined_config.rb +23 -2
  89. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -5
  90. data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
  91. data/lib/rubocop/cop/internal_affairs.rb +9 -0
  92. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +6 -2
  93. data/lib/rubocop/cop/layout/argument_alignment.rb +3 -10
  94. data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
  95. data/lib/rubocop/cop/layout/assignment_indentation.rb +3 -2
  96. data/lib/rubocop/cop/layout/begin_end_alignment.rb +0 -1
  97. data/lib/rubocop/cop/layout/block_alignment.rb +32 -13
  98. data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
  99. data/lib/rubocop/cop/layout/case_indentation.rb +1 -1
  100. data/lib/rubocop/cop/layout/class_structure.rb +51 -9
  101. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +1 -1
  102. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
  103. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  104. data/lib/rubocop/cop/layout/condition_position.rb +0 -4
  105. data/lib/rubocop/cop/layout/def_end_alignment.rb +2 -2
  106. data/lib/rubocop/cop/layout/dot_position.rb +2 -6
  107. data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
  108. data/lib/rubocop/cop/layout/empty_comment.rb +3 -1
  109. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +46 -13
  110. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +14 -7
  111. data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +1 -1
  112. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +33 -13
  113. data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +101 -0
  114. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +37 -7
  115. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +8 -29
  116. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
  117. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +1 -0
  118. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +1 -1
  119. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +14 -8
  120. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +23 -1
  121. data/lib/rubocop/cop/layout/end_alignment.rb +16 -4
  122. data/lib/rubocop/cop/layout/extra_spacing.rb +5 -11
  123. data/lib/rubocop/cop/layout/first_argument_indentation.rb +6 -11
  124. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +19 -10
  125. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
  126. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
  127. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +8 -0
  128. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +3 -3
  129. data/lib/rubocop/cop/layout/hash_alignment.rb +8 -6
  130. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +4 -3
  131. data/lib/rubocop/cop/layout/heredoc_indentation.rb +5 -2
  132. data/lib/rubocop/cop/layout/indentation_style.rb +1 -1
  133. data/lib/rubocop/cop/layout/indentation_width.rb +16 -16
  134. data/lib/rubocop/cop/layout/leading_comment_space.rb +84 -2
  135. data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +28 -11
  136. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +8 -2
  137. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +4 -2
  138. data/lib/rubocop/cop/layout/line_length.rb +168 -28
  139. data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -0
  140. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
  141. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
  142. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -1
  143. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +21 -6
  144. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
  145. data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
  146. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +3 -4
  147. data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
  148. data/lib/rubocop/cop/layout/redundant_line_break.rb +40 -44
  149. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +8 -9
  150. data/lib/rubocop/cop/layout/single_line_block_chain.rb +6 -1
  151. data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
  152. data/lib/rubocop/cop/layout/space_after_comma.rb +10 -2
  153. data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
  154. data/lib/rubocop/cop/layout/space_after_not.rb +1 -1
  155. data/lib/rubocop/cop/layout/space_after_semicolon.rb +11 -1
  156. data/lib/rubocop/cop/layout/space_around_keyword.rb +8 -2
  157. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +3 -3
  158. data/lib/rubocop/cop/layout/space_around_operators.rb +83 -38
  159. data/lib/rubocop/cop/layout/space_before_block_braces.rb +20 -10
  160. data/lib/rubocop/cop/layout/space_before_brackets.rb +7 -40
  161. data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
  162. data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
  163. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +18 -3
  164. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +5 -0
  165. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +8 -1
  166. data/lib/rubocop/cop/layout/space_inside_parens.rb +1 -1
  167. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +1 -1
  168. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +3 -5
  169. data/lib/rubocop/cop/layout/trailing_empty_lines.rb +5 -0
  170. data/lib/rubocop/cop/layout/trailing_whitespace.rb +5 -3
  171. data/lib/rubocop/cop/legacy/corrector.rb +12 -2
  172. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -3
  173. data/lib/rubocop/cop/lint/ambiguous_operator.rb +0 -2
  174. data/lib/rubocop/cop/lint/ambiguous_range.rb +9 -1
  175. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +0 -2
  176. data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +118 -0
  177. data/lib/rubocop/cop/lint/assignment_in_condition.rb +7 -9
  178. data/lib/rubocop/cop/lint/big_decimal_new.rb +4 -7
  179. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +11 -13
  180. data/lib/rubocop/cop/lint/boolean_symbol.rb +2 -4
  181. data/lib/rubocop/cop/lint/circular_argument_reference.rb +4 -14
  182. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
  183. data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +1 -1
  184. data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
  185. data/lib/rubocop/cop/lint/cop_directive_syntax.rb +84 -0
  186. data/lib/rubocop/cop/lint/debugger.rb +45 -10
  187. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +2 -2
  188. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +3 -12
  189. data/lib/rubocop/cop/lint/duplicate_branch.rb +39 -4
  190. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -5
  191. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +2 -5
  192. data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
  193. data/lib/rubocop/cop/lint/duplicate_methods.rb +110 -32
  194. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +47 -20
  195. data/lib/rubocop/cop/lint/duplicate_set_element.rb +87 -0
  196. data/lib/rubocop/cop/lint/each_with_object_argument.rb +0 -4
  197. data/lib/rubocop/cop/lint/else_layout.rb +0 -2
  198. data/lib/rubocop/cop/lint/empty_block.rb +1 -1
  199. data/lib/rubocop/cop/lint/empty_conditional_body.rb +29 -58
  200. data/lib/rubocop/cop/lint/empty_ensure.rb +2 -12
  201. data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
  202. data/lib/rubocop/cop/lint/empty_file.rb +0 -2
  203. data/lib/rubocop/cop/lint/empty_interpolation.rb +3 -5
  204. data/lib/rubocop/cop/lint/empty_when.rb +1 -3
  205. data/lib/rubocop/cop/lint/ensure_return.rb +2 -10
  206. data/lib/rubocop/cop/lint/erb_new_arguments.rb +24 -23
  207. data/lib/rubocop/cop/lint/float_comparison.rb +58 -15
  208. data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -8
  209. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -12
  210. data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +2 -1
  211. data/lib/rubocop/cop/lint/hash_new_with_keyword_arguments_as_default.rb +55 -0
  212. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +1 -1
  213. data/lib/rubocop/cop/lint/identity_comparison.rb +19 -15
  214. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +23 -12
  215. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +0 -7
  216. data/lib/rubocop/cop/lint/interpolation_check.rb +9 -4
  217. data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +50 -0
  218. data/lib/rubocop/cop/lint/literal_as_condition.rb +126 -11
  219. data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +85 -0
  220. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +50 -13
  221. data/lib/rubocop/cop/lint/loop.rb +6 -12
  222. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +1 -1
  223. data/lib/rubocop/cop/lint/missing_super.rb +33 -7
  224. data/lib/rubocop/cop/lint/mixed_case_range.rb +113 -0
  225. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  226. data/lib/rubocop/cop/lint/nested_method_definition.rb +10 -12
  227. data/lib/rubocop/cop/lint/next_without_accumulator.rb +6 -25
  228. data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +2 -7
  229. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +22 -10
  230. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +6 -8
  231. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
  232. data/lib/rubocop/cop/lint/number_conversion.rb +13 -4
  233. data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -2
  234. data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +94 -0
  235. data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -3
  236. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +3 -2
  237. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +6 -11
  238. data/lib/rubocop/cop/lint/percent_string_array.rb +0 -4
  239. data/lib/rubocop/cop/lint/percent_symbol_array.rb +0 -4
  240. data/lib/rubocop/cop/lint/raise_exception.rb +29 -10
  241. data/lib/rubocop/cop/lint/rand_one.rb +0 -4
  242. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +4 -2
  243. data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +130 -0
  244. data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -12
  245. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +178 -10
  246. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +9 -8
  247. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -6
  248. data/lib/rubocop/cop/lint/redundant_type_conversion.rb +261 -0
  249. data/lib/rubocop/cop/lint/redundant_with_index.rb +9 -2
  250. data/lib/rubocop/cop/lint/redundant_with_object.rb +5 -2
  251. data/lib/rubocop/cop/lint/refinement_import_methods.rb +1 -1
  252. data/lib/rubocop/cop/lint/regexp_as_condition.rb +0 -1
  253. data/lib/rubocop/cop/lint/require_parentheses.rb +0 -4
  254. data/lib/rubocop/cop/lint/require_range_parentheses.rb +1 -1
  255. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -5
  256. data/lib/rubocop/cop/lint/rescue_type.rb +5 -11
  257. data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -13
  258. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +31 -13
  259. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +109 -41
  260. data/lib/rubocop/cop/lint/script_permission.rb +3 -3
  261. data/lib/rubocop/cop/lint/self_assignment.rb +71 -10
  262. data/lib/rubocop/cop/lint/shadowed_argument.rb +1 -0
  263. data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
  264. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +26 -12
  265. data/lib/rubocop/cop/lint/shared_mutable_default.rb +76 -0
  266. data/lib/rubocop/cop/lint/struct_new_override.rb +12 -12
  267. data/lib/rubocop/cop/lint/suppressed_exception.rb +3 -3
  268. data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
  269. data/lib/rubocop/cop/lint/symbol_conversion.rb +9 -4
  270. data/lib/rubocop/cop/lint/syntax.rb +10 -4
  271. data/lib/rubocop/cop/lint/to_enum_arguments.rb +7 -7
  272. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
  273. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1 -1
  274. data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +88 -0
  275. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +3 -1
  276. data/lib/rubocop/cop/lint/unified_integer.rb +0 -4
  277. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +4 -3
  278. data/lib/rubocop/cop/lint/unreachable_code.rb +56 -9
  279. data/lib/rubocop/cop/lint/unreachable_loop.rb +14 -8
  280. data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
  281. data/lib/rubocop/cop/lint/uri_regexp.rb +25 -7
  282. data/lib/rubocop/cop/lint/useless_access_modifier.rb +36 -10
  283. data/lib/rubocop/cop/lint/useless_assignment.rb +51 -20
  284. data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
  285. data/lib/rubocop/cop/lint/useless_default_value_argument.rb +90 -0
  286. data/lib/rubocop/cop/lint/useless_defined.rb +55 -0
  287. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +4 -4
  288. data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
  289. data/lib/rubocop/cop/lint/useless_numeric_operation.rb +79 -0
  290. data/lib/rubocop/cop/lint/useless_or.rb +98 -0
  291. data/lib/rubocop/cop/lint/useless_rescue.rb +2 -2
  292. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +5 -5
  293. data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -29
  294. data/lib/rubocop/cop/lint/useless_times.rb +2 -2
  295. data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +121 -0
  296. data/lib/rubocop/cop/lint/void.rb +88 -27
  297. data/lib/rubocop/cop/message_annotator.rb +7 -3
  298. data/lib/rubocop/cop/metrics/abc_size.rb +4 -4
  299. data/lib/rubocop/cop/metrics/block_length.rb +8 -6
  300. data/lib/rubocop/cop/metrics/block_nesting.rb +20 -8
  301. data/lib/rubocop/cop/metrics/class_length.rb +23 -17
  302. data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
  303. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +5 -2
  304. data/lib/rubocop/cop/metrics/method_length.rb +16 -7
  305. data/lib/rubocop/cop/metrics/module_length.rb +7 -6
  306. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
  307. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
  308. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +39 -12
  309. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
  310. data/lib/rubocop/cop/migration/department_name.rb +2 -2
  311. data/lib/rubocop/cop/mixin/alignment.rb +8 -4
  312. data/lib/rubocop/cop/mixin/allowed_methods.rb +7 -1
  313. data/lib/rubocop/cop/mixin/allowed_pattern.rb +15 -3
  314. data/lib/rubocop/cop/mixin/annotation_comment.rb +0 -2
  315. data/lib/rubocop/cop/mixin/check_assignment.rb +4 -12
  316. data/lib/rubocop/cop/mixin/check_line_breakable.rb +22 -12
  317. data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +49 -0
  318. data/lib/rubocop/cop/mixin/code_length.rb +12 -1
  319. data/lib/rubocop/cop/mixin/comments_help.rb +24 -15
  320. data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -0
  321. data/lib/rubocop/cop/mixin/configurable_max.rb +5 -1
  322. data/lib/rubocop/cop/mixin/def_node.rb +1 -1
  323. data/lib/rubocop/cop/mixin/dig_help.rb +27 -0
  324. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
  325. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -1
  326. data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +24 -0
  327. data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
  328. data/lib/rubocop/cop/mixin/forbidden_pattern.rb +16 -0
  329. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +23 -12
  330. data/lib/rubocop/cop/mixin/gemspec_help.rb +22 -0
  331. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +15 -14
  332. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +45 -35
  333. data/lib/rubocop/cop/mixin/hash_subset.rb +203 -0
  334. data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
  335. data/lib/rubocop/cop/mixin/heredoc.rb +6 -2
  336. data/lib/rubocop/cop/mixin/line_length_help.rb +34 -12
  337. data/lib/rubocop/cop/mixin/method_complexity.rb +17 -7
  338. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +10 -11
  339. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
  340. data/lib/rubocop/cop/mixin/percent_array.rb +1 -1
  341. data/lib/rubocop/cop/mixin/percent_literal.rb +2 -2
  342. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +71 -35
  343. data/lib/rubocop/cop/mixin/range_help.rb +15 -4
  344. data/lib/rubocop/cop/mixin/rescue_node.rb +4 -0
  345. data/lib/rubocop/cop/mixin/safe_assignment.rb +1 -1
  346. data/lib/rubocop/cop/mixin/statement_modifier.rb +11 -5
  347. data/lib/rubocop/cop/mixin/string_help.rb +5 -3
  348. data/lib/rubocop/cop/mixin/string_literals_help.rb +12 -0
  349. data/lib/rubocop/cop/mixin/target_ruby_version.rb +17 -1
  350. data/lib/rubocop/cop/mixin/trailing_comma.rb +22 -6
  351. data/lib/rubocop/cop/naming/accessor_method_name.rb +11 -6
  352. data/lib/rubocop/cop/naming/block_forwarding.rb +40 -9
  353. data/lib/rubocop/cop/naming/constant_name.rb +7 -9
  354. data/lib/rubocop/cop/naming/file_name.rb +5 -7
  355. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +3 -1
  356. data/lib/rubocop/cop/naming/inclusive_language.rb +13 -5
  357. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +16 -17
  358. data/lib/rubocop/cop/naming/method_name.rb +185 -15
  359. data/lib/rubocop/cop/naming/predicate_method.rb +306 -0
  360. data/lib/rubocop/cop/naming/predicate_prefix.rb +204 -0
  361. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +14 -13
  362. data/lib/rubocop/cop/naming/variable_name.rb +50 -6
  363. data/lib/rubocop/cop/naming/variable_number.rb +2 -3
  364. data/lib/rubocop/cop/offense.rb +4 -5
  365. data/lib/rubocop/cop/registry.rb +9 -6
  366. data/lib/rubocop/cop/security/compound_hash.rb +4 -2
  367. data/lib/rubocop/cop/security/eval.rb +2 -1
  368. data/lib/rubocop/cop/security/open.rb +3 -2
  369. data/lib/rubocop/cop/security/yaml_load.rb +3 -2
  370. data/lib/rubocop/cop/style/access_modifier_declarations.rb +172 -32
  371. data/lib/rubocop/cop/style/accessor_grouping.rb +43 -9
  372. data/lib/rubocop/cop/style/alias.rb +11 -9
  373. data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +79 -0
  374. data/lib/rubocop/cop/style/and_or.rb +1 -1
  375. data/lib/rubocop/cop/style/arguments_forwarding.rb +472 -63
  376. data/lib/rubocop/cop/style/array_first_last.rb +80 -0
  377. data/lib/rubocop/cop/style/array_intersect.rb +94 -44
  378. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +21 -14
  379. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +2 -2
  380. data/lib/rubocop/cop/style/bitwise_predicate.rb +100 -0
  381. data/lib/rubocop/cop/style/block_comments.rb +1 -1
  382. data/lib/rubocop/cop/style/block_delimiters.rb +56 -24
  383. data/lib/rubocop/cop/style/case_like_if.rb +14 -17
  384. data/lib/rubocop/cop/style/class_and_module_children.rb +52 -11
  385. data/lib/rubocop/cop/style/class_check.rb +1 -0
  386. data/lib/rubocop/cop/style/class_equality_comparison.rb +8 -1
  387. data/lib/rubocop/cop/style/class_vars.rb +3 -3
  388. data/lib/rubocop/cop/style/collection_compact.rb +25 -15
  389. data/lib/rubocop/cop/style/collection_methods.rb +4 -1
  390. data/lib/rubocop/cop/style/collection_querying.rb +167 -0
  391. data/lib/rubocop/cop/style/combinable_defined.rb +115 -0
  392. data/lib/rubocop/cop/style/combinable_loops.rb +25 -9
  393. data/lib/rubocop/cop/style/command_literal.rb +1 -1
  394. data/lib/rubocop/cop/style/commented_keyword.rb +30 -4
  395. data/lib/rubocop/cop/style/comparable_between.rb +78 -0
  396. data/lib/rubocop/cop/style/concat_array_literals.rb +3 -2
  397. data/lib/rubocop/cop/style/conditional_assignment.rb +53 -38
  398. data/lib/rubocop/cop/style/constant_visibility.rb +3 -12
  399. data/lib/rubocop/cop/style/copyright.rb +31 -21
  400. data/lib/rubocop/cop/style/data_inheritance.rb +8 -1
  401. data/lib/rubocop/cop/style/date_time.rb +5 -4
  402. data/lib/rubocop/cop/style/def_with_parentheses.rb +18 -7
  403. data/lib/rubocop/cop/style/dig_chain.rb +89 -0
  404. data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +1 -1
  405. data/lib/rubocop/cop/style/documentation.rb +25 -25
  406. data/lib/rubocop/cop/style/documentation_method.rb +20 -0
  407. data/lib/rubocop/cop/style/double_negation.rb +4 -4
  408. data/lib/rubocop/cop/style/each_for_simple_loop.rb +11 -15
  409. data/lib/rubocop/cop/style/each_with_object.rb +3 -4
  410. data/lib/rubocop/cop/style/empty_case_condition.rb +6 -1
  411. data/lib/rubocop/cop/style/empty_else.rb +10 -7
  412. data/lib/rubocop/cop/style/empty_heredoc.rb +1 -14
  413. data/lib/rubocop/cop/style/empty_literal.rb +36 -23
  414. data/lib/rubocop/cop/style/empty_method.rb +1 -1
  415. data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +100 -0
  416. data/lib/rubocop/cop/style/endless_method.rb +150 -18
  417. data/lib/rubocop/cop/style/eval_with_location.rb +23 -31
  418. data/lib/rubocop/cop/style/exact_regexp_match.rb +6 -5
  419. data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
  420. data/lib/rubocop/cop/style/explicit_block_argument.rb +18 -5
  421. data/lib/rubocop/cop/style/exponential_notation.rb +6 -5
  422. data/lib/rubocop/cop/style/fetch_env_var.rb +34 -7
  423. data/lib/rubocop/cop/style/file_null.rb +89 -0
  424. data/lib/rubocop/cop/style/file_read.rb +2 -5
  425. data/lib/rubocop/cop/style/file_touch.rb +75 -0
  426. data/lib/rubocop/cop/style/file_write.rb +2 -5
  427. data/lib/rubocop/cop/style/float_division.rb +8 -4
  428. data/lib/rubocop/cop/style/for.rb +4 -2
  429. data/lib/rubocop/cop/style/format_string.rb +33 -12
  430. data/lib/rubocop/cop/style/format_string_token.rb +38 -11
  431. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +6 -3
  432. data/lib/rubocop/cop/style/global_std_stream.rb +10 -1
  433. data/lib/rubocop/cop/style/global_vars.rb +1 -3
  434. data/lib/rubocop/cop/style/guard_clause.rb +46 -4
  435. data/lib/rubocop/cop/style/hash_conversion.rb +26 -9
  436. data/lib/rubocop/cop/style/hash_each_methods.rb +110 -12
  437. data/lib/rubocop/cop/style/hash_except.rb +38 -146
  438. data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
  439. data/lib/rubocop/cop/style/hash_slice.rb +80 -0
  440. data/lib/rubocop/cop/style/hash_syntax.rb +35 -7
  441. data/lib/rubocop/cop/style/hash_transform_keys.rb +2 -2
  442. data/lib/rubocop/cop/style/hash_transform_values.rb +2 -2
  443. data/lib/rubocop/cop/style/identical_conditional_branches.rb +57 -9
  444. data/lib/rubocop/cop/style/if_inside_else.rb +11 -15
  445. data/lib/rubocop/cop/style/if_unless_modifier.rb +36 -9
  446. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +4 -7
  447. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +8 -8
  448. data/lib/rubocop/cop/style/if_with_semicolon.rb +62 -8
  449. data/lib/rubocop/cop/style/in_pattern_then.rb +6 -2
  450. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  451. data/lib/rubocop/cop/style/inverse_methods.rb +22 -18
  452. data/lib/rubocop/cop/style/invertible_unless_condition.rb +49 -7
  453. data/lib/rubocop/cop/style/ip_addresses.rb +2 -2
  454. data/lib/rubocop/cop/style/it_assignment.rb +93 -0
  455. data/lib/rubocop/cop/style/it_block_parameter.rb +121 -0
  456. data/lib/rubocop/cop/style/keyword_arguments_merging.rb +67 -0
  457. data/lib/rubocop/cop/style/keyword_parameters_order.rb +14 -8
  458. data/lib/rubocop/cop/style/lambda.rb +5 -4
  459. data/lib/rubocop/cop/style/lambda_call.rb +14 -3
  460. data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
  461. data/lib/rubocop/cop/style/magic_comment_format.rb +1 -1
  462. data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +82 -50
  463. data/lib/rubocop/cop/style/map_into_array.rb +236 -0
  464. data/lib/rubocop/cop/style/map_to_hash.rb +29 -10
  465. data/lib/rubocop/cop/style/map_to_set.rb +4 -5
  466. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +59 -25
  467. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +21 -5
  468. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +30 -13
  469. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -4
  470. data/lib/rubocop/cop/style/method_def_parentheses.rb +2 -2
  471. data/lib/rubocop/cop/style/min_max_comparison.rb +13 -5
  472. data/lib/rubocop/cop/style/missing_else.rb +2 -4
  473. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +35 -5
  474. data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
  475. data/lib/rubocop/cop/style/multiline_block_chain.rb +3 -2
  476. data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -0
  477. data/lib/rubocop/cop/style/multiline_memoization.rb +2 -2
  478. data/lib/rubocop/cop/style/multiline_method_signature.rb +10 -9
  479. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +6 -4
  480. data/lib/rubocop/cop/style/multiline_when_then.rb +0 -4
  481. data/lib/rubocop/cop/style/multiple_comparison.rb +53 -60
  482. data/lib/rubocop/cop/style/mutable_constant.rb +7 -8
  483. data/lib/rubocop/cop/style/negated_if_else_condition.rb +7 -5
  484. data/lib/rubocop/cop/style/nested_modifier.rb +1 -1
  485. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +2 -2
  486. data/lib/rubocop/cop/style/nested_ternary_operator.rb +8 -15
  487. data/lib/rubocop/cop/style/next.rb +45 -1
  488. data/lib/rubocop/cop/style/nil_comparison.rb +2 -0
  489. data/lib/rubocop/cop/style/not.rb +1 -1
  490. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
  491. data/lib/rubocop/cop/style/numeric_predicate.rb +12 -4
  492. data/lib/rubocop/cop/style/object_then.rb +16 -14
  493. data/lib/rubocop/cop/style/one_line_conditional.rb +31 -6
  494. data/lib/rubocop/cop/style/open_struct_use.rb +6 -6
  495. data/lib/rubocop/cop/style/operator_method_call.rb +32 -8
  496. data/lib/rubocop/cop/style/or_assignment.rb +3 -6
  497. data/lib/rubocop/cop/style/parallel_assignment.rb +47 -45
  498. data/lib/rubocop/cop/style/parentheses_around_condition.rb +8 -0
  499. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  500. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
  501. data/lib/rubocop/cop/style/preferred_hash_methods.rb +1 -1
  502. data/lib/rubocop/cop/style/proc.rb +2 -2
  503. data/lib/rubocop/cop/style/quoted_symbols.rb +2 -4
  504. data/lib/rubocop/cop/style/raise_args.rb +19 -14
  505. data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
  506. data/lib/rubocop/cop/style/redundant_argument.rb +35 -4
  507. data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
  508. data/lib/rubocop/cop/style/redundant_assignment.rb +11 -3
  509. data/lib/rubocop/cop/style/redundant_begin.rb +17 -4
  510. data/lib/rubocop/cop/style/redundant_condition.rb +97 -25
  511. data/lib/rubocop/cop/style/redundant_conditional.rb +2 -10
  512. data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +50 -0
  513. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +89 -5
  514. data/lib/rubocop/cop/style/redundant_each.rb +7 -4
  515. data/lib/rubocop/cop/style/redundant_exception.rb +33 -13
  516. data/lib/rubocop/cop/style/redundant_fetch_block.rb +4 -12
  517. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -1
  518. data/lib/rubocop/cop/style/redundant_filter_chain.rb +23 -6
  519. data/lib/rubocop/cop/style/redundant_format.rb +262 -0
  520. data/lib/rubocop/cop/style/redundant_freeze.rb +4 -4
  521. data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
  522. data/lib/rubocop/cop/style/redundant_interpolation.rb +1 -1
  523. data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +46 -0
  524. data/lib/rubocop/cop/style/redundant_line_continuation.rb +73 -20
  525. data/lib/rubocop/cop/style/redundant_parentheses.rb +155 -40
  526. data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -1
  527. data/lib/rubocop/cop/style/redundant_regexp_argument.rb +107 -0
  528. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
  529. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +10 -25
  530. data/lib/rubocop/cop/style/redundant_return.rb +16 -5
  531. data/lib/rubocop/cop/style/redundant_self.rb +32 -20
  532. data/lib/rubocop/cop/style/redundant_self_assignment.rb +20 -32
  533. data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +12 -5
  534. data/lib/rubocop/cop/style/redundant_sort.rb +11 -10
  535. data/lib/rubocop/cop/style/redundant_sort_by.rb +19 -3
  536. data/lib/rubocop/cop/style/redundant_string_escape.rb +5 -3
  537. data/lib/rubocop/cop/style/regexp_literal.rb +1 -1
  538. data/lib/rubocop/cop/style/require_order.rb +2 -2
  539. data/lib/rubocop/cop/style/rescue_modifier.rb +18 -4
  540. data/lib/rubocop/cop/style/return_nil.rb +8 -4
  541. data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +137 -0
  542. data/lib/rubocop/cop/style/safe_navigation.rb +145 -61
  543. data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
  544. data/lib/rubocop/cop/style/sample.rb +3 -4
  545. data/lib/rubocop/cop/style/select_by_regexp.rb +20 -13
  546. data/lib/rubocop/cop/style/self_assignment.rb +12 -18
  547. data/lib/rubocop/cop/style/semicolon.rb +10 -5
  548. data/lib/rubocop/cop/style/send.rb +4 -4
  549. data/lib/rubocop/cop/style/send_with_literal_method_name.rb +105 -0
  550. data/lib/rubocop/cop/style/signal_exception.rb +3 -4
  551. data/lib/rubocop/cop/style/single_argument_dig.rb +16 -8
  552. data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
  553. data/lib/rubocop/cop/style/single_line_do_end_block.rb +78 -0
  554. data/lib/rubocop/cop/style/single_line_methods.rb +13 -11
  555. data/lib/rubocop/cop/style/slicing_with_range.rb +105 -10
  556. data/lib/rubocop/cop/style/sole_nested_conditional.rb +75 -88
  557. data/lib/rubocop/cop/style/special_global_vars.rb +2 -3
  558. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -1
  559. data/lib/rubocop/cop/style/string_chars.rb +1 -0
  560. data/lib/rubocop/cop/style/string_concatenation.rb +15 -15
  561. data/lib/rubocop/cop/style/string_literals.rb +1 -1
  562. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +30 -5
  563. data/lib/rubocop/cop/style/string_methods.rb +1 -1
  564. data/lib/rubocop/cop/style/strip.rb +7 -4
  565. data/lib/rubocop/cop/style/struct_inheritance.rb +9 -2
  566. data/lib/rubocop/cop/style/super_arguments.rb +221 -0
  567. data/lib/rubocop/cop/style/super_with_args_parentheses.rb +35 -0
  568. data/lib/rubocop/cop/style/swap_values.rb +4 -15
  569. data/lib/rubocop/cop/style/symbol_array.rb +35 -15
  570. data/lib/rubocop/cop/style/symbol_proc.rb +78 -6
  571. data/lib/rubocop/cop/style/ternary_parentheses.rb +26 -5
  572. data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -1
  573. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +11 -2
  574. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
  575. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1 -1
  576. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
  577. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -4
  578. data/lib/rubocop/cop/style/trivial_accessors.rb +2 -2
  579. data/lib/rubocop/cop/style/unpack_first.rb +11 -14
  580. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -2
  581. data/lib/rubocop/cop/style/while_until_do.rb +0 -2
  582. data/lib/rubocop/cop/style/while_until_modifier.rb +0 -2
  583. data/lib/rubocop/cop/style/yaml_file_read.rb +66 -0
  584. data/lib/rubocop/cop/style/yoda_condition.rb +12 -6
  585. data/lib/rubocop/cop/style/yoda_expression.rb +10 -8
  586. data/lib/rubocop/cop/style/zero_length_predicate.rb +32 -24
  587. data/lib/rubocop/cop/team.rb +28 -4
  588. data/lib/rubocop/cop/util.rb +20 -7
  589. data/lib/rubocop/cop/utils/format_string.rb +10 -5
  590. data/lib/rubocop/cop/variable_force/assignment.rb +35 -7
  591. data/lib/rubocop/cop/variable_force/branch.rb +1 -1
  592. data/lib/rubocop/cop/variable_force/scope.rb +1 -1
  593. data/lib/rubocop/cop/variable_force/variable.rb +14 -3
  594. data/lib/rubocop/cop/variable_force/variable_table.rb +5 -5
  595. data/lib/rubocop/cop/variable_force.rb +40 -19
  596. data/lib/rubocop/cops_documentation_generator.rb +133 -56
  597. data/lib/rubocop/core_ext/string.rb +2 -6
  598. data/lib/rubocop/directive_comment.rb +54 -18
  599. data/lib/rubocop/ext/regexp_node.rb +17 -35
  600. data/lib/rubocop/ext/regexp_parser.rb +7 -21
  601. data/lib/rubocop/file_finder.rb +11 -9
  602. data/lib/rubocop/formatter/clang_style_formatter.rb +3 -7
  603. data/lib/rubocop/formatter/disabled_config_formatter.rb +26 -10
  604. data/lib/rubocop/formatter/formatter_set.rb +8 -2
  605. data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
  606. data/lib/rubocop/formatter/html_formatter.rb +38 -15
  607. data/lib/rubocop/formatter/json_formatter.rb +0 -1
  608. data/lib/rubocop/formatter/junit_formatter.rb +71 -24
  609. data/lib/rubocop/formatter/markdown_formatter.rb +1 -0
  610. data/lib/rubocop/formatter/offense_count_formatter.rb +13 -3
  611. data/lib/rubocop/formatter/pacman_formatter.rb +2 -1
  612. data/lib/rubocop/formatter/tap_formatter.rb +3 -7
  613. data/lib/rubocop/formatter.rb +1 -1
  614. data/lib/rubocop/lockfile.rb +58 -7
  615. data/lib/rubocop/lsp/diagnostic.rb +189 -0
  616. data/lib/rubocop/lsp/logger.rb +22 -0
  617. data/lib/rubocop/lsp/routes.rb +227 -0
  618. data/lib/rubocop/lsp/runtime.rb +69 -0
  619. data/lib/rubocop/lsp/server.rb +70 -0
  620. data/lib/rubocop/lsp/severity.rb +27 -0
  621. data/lib/rubocop/lsp/stdin_runner.rb +85 -0
  622. data/lib/rubocop/lsp.rb +36 -0
  623. data/lib/rubocop/magic_comment.rb +24 -14
  624. data/lib/rubocop/options.rb +54 -23
  625. data/lib/rubocop/path_util.rb +21 -10
  626. data/lib/rubocop/pending_cops_reporter.rb +56 -0
  627. data/lib/rubocop/plugin/configuration_integrator.rb +143 -0
  628. data/lib/rubocop/plugin/load_error.rb +26 -0
  629. data/lib/rubocop/plugin/loader.rb +100 -0
  630. data/lib/rubocop/plugin/not_supported_error.rb +29 -0
  631. data/lib/rubocop/plugin.rb +46 -0
  632. data/lib/rubocop/rake_task.rb +5 -2
  633. data/lib/rubocop/remote_config.rb +5 -1
  634. data/lib/rubocop/result_cache.rb +29 -30
  635. data/lib/rubocop/rspec/cop_helper.rb +20 -2
  636. data/lib/rubocop/rspec/expect_offense.rb +31 -12
  637. data/lib/rubocop/rspec/shared_contexts.rb +114 -21
  638. data/lib/rubocop/rspec/support.rb +7 -2
  639. data/lib/rubocop/runner.rb +40 -13
  640. data/lib/rubocop/server/cache.rb +63 -10
  641. data/lib/rubocop/server/cli.rb +2 -2
  642. data/lib/rubocop/server/client_command/base.rb +10 -0
  643. data/lib/rubocop/server/client_command/exec.rb +4 -4
  644. data/lib/rubocop/server/client_command/start.rb +11 -1
  645. data/lib/rubocop/server/core.rb +5 -0
  646. data/lib/rubocop/server/server_command/exec.rb +0 -1
  647. data/lib/rubocop/string_interpreter.rb +3 -3
  648. data/lib/rubocop/target_finder.rb +97 -82
  649. data/lib/rubocop/target_ruby.rb +102 -77
  650. data/lib/rubocop/version.rb +67 -9
  651. data/lib/rubocop/yaml_duplication_checker.rb +20 -26
  652. data/lib/rubocop.rb +69 -2
  653. data/lib/ruby_lsp/rubocop/addon.rb +75 -0
  654. data/lib/ruby_lsp/rubocop/runtime_adapter.rb +65 -0
  655. metadata +136 -42
  656. data/lib/rubocop/cop/naming/predicate_name.rb +0 -134
  657. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
  658. /data/lib/rubocop/formatter/{git_hub_actions_formatter.rb → github_actions_formatter.rb} +0 -0
@@ -11,6 +11,24 @@ module RuboCop
11
11
  DO_NOT_MIX_OMIT_VALUE_MSG = "#{DO_NOT_MIX_MSG_PREFIX} #{OMIT_HASH_VALUE_MSG}"
12
12
  DO_NOT_MIX_EXPLICIT_VALUE_MSG = "#{DO_NOT_MIX_MSG_PREFIX} #{EXPLICIT_HASH_VALUE_MSG}"
13
13
 
14
+ DefNode = Struct.new(:node) do
15
+ def selector
16
+ if node.loc.respond_to?(:selector)
17
+ node.loc.selector
18
+ else
19
+ node.loc.keyword
20
+ end
21
+ end
22
+
23
+ def first_argument
24
+ node.first_argument
25
+ end
26
+
27
+ def last_argument
28
+ node.last_argument
29
+ end
30
+ end
31
+
14
32
  def on_hash_for_mixed_shorthand(hash_node)
15
33
  return if ignore_mixed_hash_shorthand_syntax?(hash_node)
16
34
 
@@ -48,29 +66,33 @@ module RuboCop
48
66
 
49
67
  def register_offense(node, message, replacement) # rubocop:disable Metrics/AbcSize
50
68
  add_offense(node.value, message: message) do |corrector|
51
- if (def_node = def_node_that_require_parentheses(node))
52
- last_argument = def_node.last_argument
53
- if last_argument.nil? || !last_argument.hash_type?
54
- next corrector.replace(node, replacement)
55
- end
56
-
57
- white_spaces = range_between(def_node.selector.end_pos,
58
- def_node.first_argument.source_range.begin_pos)
59
- corrector.replace(white_spaces, '(')
60
- corrector.insert_after(last_argument, ')') if node == last_argument.pairs.last
61
- end
62
69
  corrector.replace(node, replacement)
70
+
71
+ next unless (def_node = def_node_that_require_parentheses(node))
72
+
73
+ last_argument = def_node.last_argument
74
+ if last_argument.nil? || !last_argument.hash_type?
75
+ next corrector.replace(node, replacement)
76
+ end
77
+
78
+ white_spaces = range_between(def_node.selector.end_pos,
79
+ def_node.first_argument.source_range.begin_pos)
80
+ next if node.parent.braces?
81
+
82
+ corrector.replace(white_spaces, '(')
83
+ corrector.insert_after(last_argument, ')') if node == last_argument.pairs.last
63
84
  end
64
85
  end
65
86
 
66
87
  def ignore_mixed_hash_shorthand_syntax?(hash_node)
67
- target_ruby_version <= 3.0 || enforced_shorthand_syntax != 'consistent' ||
88
+ target_ruby_version <= 3.0 ||
89
+ !%w[consistent either_consistent].include?(enforced_shorthand_syntax) ||
68
90
  !hash_node.hash_type?
69
91
  end
70
92
 
71
93
  def ignore_hash_shorthand_syntax?(pair_node)
72
94
  target_ruby_version <= 3.0 || enforced_shorthand_syntax == 'either' ||
73
- enforced_shorthand_syntax == 'consistent' ||
95
+ %w[consistent either_consistent].include?(enforced_shorthand_syntax) ||
74
96
  !pair_node.parent.hash_type?
75
97
  end
76
98
 
@@ -82,7 +104,7 @@ module RuboCop
82
104
  return true if !node.key.sym_type? || require_hash_value_for_around_hash_literal?(node)
83
105
 
84
106
  hash_value = node.value
85
- return true unless hash_value.send_type? || hash_value.lvar_type?
107
+ return true unless hash_value.type?(:send, :lvar)
86
108
 
87
109
  hash_key_source != hash_value.source || hash_key_source.end_with?('!', '?')
88
110
  end
@@ -105,7 +127,7 @@ module RuboCop
105
127
  return if dispatch_node.parent && parentheses?(dispatch_node.parent)
106
128
  return if last_expression?(dispatch_node) && !method_dispatch_as_argument?(dispatch_node)
107
129
 
108
- def_node = node.each_ancestor(:send, :csend, :super, :yield).first
130
+ def_node = node.each_ancestor(:call, :super, :yield).first
109
131
 
110
132
  DefNode.new(def_node) unless def_node && def_node.arguments.empty?
111
133
  end
@@ -113,7 +135,7 @@ module RuboCop
113
135
 
114
136
  def find_ancestor_method_dispatch_node(node)
115
137
  return unless (ancestor = node.parent.parent)
116
- return unless ancestor.call_type? || ancestor.super_type? || ancestor.yield_type?
138
+ return unless ancestor.type?(:call, :super, :yield)
117
139
  return if brackets?(ancestor)
118
140
 
119
141
  ancestor
@@ -146,7 +168,7 @@ module RuboCop
146
168
  parent = method_dispatch_node.parent
147
169
  return false unless parent
148
170
 
149
- parent.call_type? || parent.super_type? || parent.yield_type?
171
+ parent.type?(:call, :super, :yield)
150
172
  end
151
173
 
152
174
  def breakdown_value_types_of_hash(hash_node)
@@ -169,6 +191,11 @@ module RuboCop
169
191
  hash_value_type_breakdown[:value_needed]&.any?
170
192
  end
171
193
 
194
+ def ignore_explicit_omissible_hash_shorthand_syntax?(hash_value_type_breakdown)
195
+ hash_value_type_breakdown.keys == [:value_omittable] &&
196
+ enforced_shorthand_syntax == 'either_consistent'
197
+ end
198
+
172
199
  def each_omitted_value_pair(hash_value_type_breakdown, &block)
173
200
  hash_value_type_breakdown[:value_omitted]&.each(&block)
174
201
  end
@@ -195,6 +222,7 @@ module RuboCop
195
222
 
196
223
  def no_mixed_shorthand_syntax_check(hash_value_type_breakdown)
197
224
  return if hash_with_values_that_cant_be_omitted?(hash_value_type_breakdown)
225
+ return if ignore_explicit_omissible_hash_shorthand_syntax?(hash_value_type_breakdown)
198
226
 
199
227
  each_omittable_value_pair(hash_value_type_breakdown) do |pair_node|
200
228
  hash_key_source = pair_node.key.source
@@ -202,24 +230,6 @@ module RuboCop
202
230
  register_offense(pair_node, OMIT_HASH_VALUE_MSG, replacement)
203
231
  end
204
232
  end
205
-
206
- DefNode = Struct.new(:node) do
207
- def selector
208
- if node.loc.respond_to?(:selector)
209
- node.loc.selector
210
- else
211
- node.loc.keyword
212
- end
213
- end
214
-
215
- def first_argument
216
- node.first_argument
217
- end
218
-
219
- def last_argument
220
- node.last_argument
221
- end
222
- end
223
233
  end
224
234
  end
225
235
  # rubocop:enable Metrics/ModuleLength
@@ -0,0 +1,203 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ # Common functionality for Style/HashExcept and Style/HashSlice cops.
6
+ # It registers an offense on methods with blocks that are equivalent
7
+ # to Hash#except or Hash#slice.
8
+ # rubocop:disable Metrics/ModuleLength
9
+ module HashSubset
10
+ include RangeHelp
11
+ extend NodePattern::Macros
12
+
13
+ RESTRICT_ON_SEND = %i[reject select filter].freeze
14
+
15
+ SUBSET_METHODS = %i[== != eql? include?].freeze
16
+ ACTIVE_SUPPORT_SUBSET_METHODS = (SUBSET_METHODS + %i[in? exclude?]).freeze
17
+
18
+ MSG = 'Use `%<prefer>s` instead.'
19
+
20
+ # @!method block_with_first_arg_check?(node)
21
+ def_node_matcher :block_with_first_arg_check?, <<~PATTERN
22
+ (block
23
+ (call _ _)
24
+ (args
25
+ $(arg _key)
26
+ $(arg _))
27
+ {
28
+ $(send
29
+ {(lvar _key) $_ _ | _ $_ (lvar _key)})
30
+ (send
31
+ $(send
32
+ {(lvar _key) $_ _ | _ $_ (lvar _key)}) :!)
33
+ })
34
+ PATTERN
35
+
36
+ def on_send(node)
37
+ offense_range, key_source = extract_offense(node)
38
+
39
+ return unless offense_range
40
+ return unless semantically_subset_method?(node)
41
+
42
+ preferred_method = "#{preferred_method_name}(#{key_source})"
43
+ add_offense(offense_range, message: format(MSG, prefer: preferred_method)) do |corrector|
44
+ corrector.replace(offense_range, preferred_method)
45
+ end
46
+ end
47
+ alias on_csend on_send
48
+
49
+ private
50
+
51
+ def semantically_subset_method?(node)
52
+ raise NotImplementedError
53
+ end
54
+
55
+ def preferred_method_name
56
+ raise NotImplementedError
57
+ end
58
+
59
+ def extract_offense(node)
60
+ block = node.parent
61
+ return unless extracts_hash_subset?(block)
62
+
63
+ except_key = except_key(block)
64
+ return if except_key.nil? || !safe_to_register_offense?(block, except_key)
65
+
66
+ [offense_range(node), except_key_source(except_key)]
67
+ end
68
+
69
+ def extracts_hash_subset?(block)
70
+ block_with_first_arg_check?(block) do |key_arg, value_arg, send_node, method|
71
+ # Only consider methods that have one argument
72
+ return false unless send_node.arguments.one?
73
+
74
+ return false unless supported_subset_method?(method)
75
+ return false if range_include?(send_node)
76
+
77
+ case method
78
+ when :include?, :exclude?
79
+ slices_key?(send_node, :first_argument, key_arg, value_arg)
80
+ when :in?
81
+ slices_key?(send_node, :receiver, key_arg, value_arg)
82
+ else
83
+ true
84
+ end
85
+ end
86
+ end
87
+
88
+ def slices_key?(send_node, method, key_arg, value_arg)
89
+ return false if using_value_variable?(send_node, value_arg)
90
+
91
+ node = method == :receiver ? send_node.receiver : send_node.first_argument
92
+ node.source == key_arg.source
93
+ end
94
+
95
+ def range_include?(send_node)
96
+ # When checking `include?`, `exclude?` and `in?` for offenses, if the receiver
97
+ # or first argument is a range, an offense should not be registered.
98
+ # ie. `(1..5).include?(k)` or `k.in?('a'..'z')`
99
+
100
+ return true if send_node.first_argument.range_type?
101
+
102
+ receiver = send_node.receiver
103
+ receiver = receiver.child_nodes.first while receiver.begin_type?
104
+ receiver.range_type?
105
+ end
106
+
107
+ def using_value_variable?(send_node, value_arg)
108
+ # If the receiver of `include?` or `exclude?`, or the first argument of `in?` is the
109
+ # hash value block argument, an offense should not be registered.
110
+ # ie. `v.include?(k)` or `k.in?(v)`
111
+ (send_node.receiver.lvar_type? && send_node.receiver.name == value_arg.name) ||
112
+ (send_node.first_argument.lvar_type? && send_node.first_argument.name == value_arg.name)
113
+ end
114
+
115
+ def supported_subset_method?(method)
116
+ if active_support_extensions_enabled?
117
+ ACTIVE_SUPPORT_SUBSET_METHODS.include?(method)
118
+ else
119
+ SUBSET_METHODS.include?(method)
120
+ end
121
+ end
122
+
123
+ def semantically_except_method?(node)
124
+ block = node.parent
125
+ body, negated = extract_body_if_negated(block.body)
126
+
127
+ if node.method?('reject')
128
+ body.method?('==') || body.method?('eql?') || included?(body, negated)
129
+ else
130
+ body.method?('!=') || not_included?(body, negated)
131
+ end
132
+ end
133
+
134
+ def semantically_slice_method?(node)
135
+ !semantically_except_method?(node)
136
+ end
137
+
138
+ def included?(body, negated)
139
+ if negated
140
+ body.method?('exclude?')
141
+ else
142
+ body.method?('include?') || body.method?('in?')
143
+ end
144
+ end
145
+
146
+ def not_included?(body, negated)
147
+ included?(body, !negated)
148
+ end
149
+
150
+ def safe_to_register_offense?(block, except_key)
151
+ body = block.body
152
+
153
+ if body.method?('==') || body.method?('!=')
154
+ except_key.type?(:sym, :str)
155
+ else
156
+ true
157
+ end
158
+ end
159
+
160
+ def extract_body_if_negated(body)
161
+ if body.method?('!')
162
+ [body.receiver, true]
163
+ else
164
+ [body, false]
165
+ end
166
+ end
167
+
168
+ def except_key_source(key)
169
+ if key.array_type?
170
+ key = if key.percent_literal?
171
+ key.each_value.map { |v| decorate_source(v) }
172
+ else
173
+ key.each_value.map(&:source)
174
+ end
175
+ return key.join(', ')
176
+ end
177
+
178
+ key.literal? ? key.source : "*#{key.source}"
179
+ end
180
+
181
+ def decorate_source(value)
182
+ return ":\"#{value.source}\"" if value.dsym_type?
183
+ return "\"#{value.source}\"" if value.dstr_type?
184
+ return ":#{value.source}" if value.sym_type?
185
+
186
+ "'#{value.source}'"
187
+ end
188
+
189
+ def except_key(node)
190
+ key_arg = node.argument_list.first.source
191
+ body, = extract_body_if_negated(node.body)
192
+ lhs, _method_name, rhs = *body
193
+
194
+ lhs.source == key_arg ? rhs : lhs
195
+ end
196
+
197
+ def offense_range(node)
198
+ range_between(node.loc.selector.begin_pos, node.parent.loc.end.end_pos)
199
+ end
200
+ end
201
+ # rubocop:enable Metrics/ModuleLength
202
+ end
203
+ end
@@ -9,6 +9,80 @@ module RuboCop
9
9
 
10
10
  RESTRICT_ON_SEND = %i[[] to_h].freeze
11
11
 
12
+ # Internal helper class to hold match data
13
+ Captures = Struct.new(:transformed_argname, :transforming_body_expr, :unchanged_body_expr) do
14
+ def noop_transformation?
15
+ transforming_body_expr.lvar_type? &&
16
+ transforming_body_expr.children == [transformed_argname]
17
+ end
18
+
19
+ def transformation_uses_both_args?
20
+ transforming_body_expr.descendants.include?(unchanged_body_expr)
21
+ end
22
+
23
+ def use_transformed_argname?
24
+ transforming_body_expr.each_descendant(:lvar).any? do |node|
25
+ node.source == transformed_argname.to_s
26
+ end
27
+ end
28
+ end
29
+
30
+ # Internal helper class to hold autocorrect data
31
+ Autocorrection = Struct.new(:match, :block_node, :leading, :trailing) do
32
+ def self.from_each_with_object(node, match)
33
+ new(match, node, 0, 0)
34
+ end
35
+
36
+ def self.from_hash_brackets_map(node, match)
37
+ new(match, node.children.last, 'Hash['.length, ']'.length)
38
+ end
39
+
40
+ def self.from_map_to_h(node, match)
41
+ if node.parent&.block_type? && node.parent.send_node == node
42
+ strip_trailing_chars = 0
43
+ else
44
+ map_range = node.children.first.source_range
45
+ node_range = node.source_range
46
+ strip_trailing_chars = node_range.end_pos - map_range.end_pos
47
+ end
48
+
49
+ new(match, node.children.first, 0, strip_trailing_chars)
50
+ end
51
+
52
+ def self.from_to_h(node, match)
53
+ new(match, node, 0, 0)
54
+ end
55
+
56
+ def strip_prefix_and_suffix(node, corrector)
57
+ expression = node.source_range
58
+ corrector.remove_leading(expression, leading)
59
+ corrector.remove_trailing(expression, trailing)
60
+ end
61
+
62
+ def set_new_method_name(new_method_name, corrector)
63
+ range = block_node.send_node.loc.selector
64
+ if (send_end = block_node.send_node.loc.end)
65
+ # If there are arguments (only true in the `each_with_object`
66
+ # case)
67
+ range = range.begin.join(send_end)
68
+ end
69
+ corrector.replace(range, new_method_name)
70
+ end
71
+
72
+ def set_new_arg_name(transformed_argname, corrector)
73
+ corrector.replace(block_node.arguments, "|#{transformed_argname}|")
74
+ end
75
+
76
+ def set_new_body_expression(transforming_body_expr, corrector)
77
+ body_source = transforming_body_expr.source
78
+ if transforming_body_expr.hash_type? && !transforming_body_expr.braces?
79
+ body_source = "{ #{body_source} }"
80
+ end
81
+
82
+ corrector.replace(block_node.body, body_source)
83
+ end
84
+ end
85
+
12
86
  # @!method array_receiver?(node)
13
87
  def_node_matcher :array_receiver?, <<~PATTERN
14
88
  {(array ...) (send _ :each_with_index) (send _ :with_index _ ?) (send _ :zip ...)}
@@ -113,80 +187,6 @@ module RuboCop
113
187
  correction.set_new_arg_name(captures.transformed_argname, corrector)
114
188
  correction.set_new_body_expression(captures.transforming_body_expr, corrector)
115
189
  end
116
-
117
- # Internal helper class to hold match data
118
- Captures = Struct.new(:transformed_argname, :transforming_body_expr, :unchanged_body_expr) do
119
- def noop_transformation?
120
- transforming_body_expr.lvar_type? &&
121
- transforming_body_expr.children == [transformed_argname]
122
- end
123
-
124
- def transformation_uses_both_args?
125
- transforming_body_expr.descendants.include?(unchanged_body_expr)
126
- end
127
-
128
- def use_transformed_argname?
129
- transforming_body_expr.each_descendant(:lvar).any? do |node|
130
- node.source == transformed_argname.to_s
131
- end
132
- end
133
- end
134
-
135
- # Internal helper class to hold autocorrect data
136
- Autocorrection = Struct.new(:match, :block_node, :leading, :trailing) do
137
- def self.from_each_with_object(node, match)
138
- new(match, node, 0, 0)
139
- end
140
-
141
- def self.from_hash_brackets_map(node, match)
142
- new(match, node.children.last, 'Hash['.length, ']'.length)
143
- end
144
-
145
- def self.from_map_to_h(node, match)
146
- if node.parent&.block_type? && node.parent.send_node == node
147
- strip_trailing_chars = 0
148
- else
149
- map_range = node.children.first.source_range
150
- node_range = node.source_range
151
- strip_trailing_chars = node_range.end_pos - map_range.end_pos
152
- end
153
-
154
- new(match, node.children.first, 0, strip_trailing_chars)
155
- end
156
-
157
- def self.from_to_h(node, match)
158
- new(match, node, 0, 0)
159
- end
160
-
161
- def strip_prefix_and_suffix(node, corrector)
162
- expression = node.source_range
163
- corrector.remove_leading(expression, leading)
164
- corrector.remove_trailing(expression, trailing)
165
- end
166
-
167
- def set_new_method_name(new_method_name, corrector)
168
- range = block_node.send_node.loc.selector
169
- if (send_end = block_node.send_node.loc.end)
170
- # If there are arguments (only true in the `each_with_object`
171
- # case)
172
- range = range.begin.join(send_end)
173
- end
174
- corrector.replace(range, new_method_name)
175
- end
176
-
177
- def set_new_arg_name(transformed_argname, corrector)
178
- corrector.replace(block_node.arguments, "|#{transformed_argname}|")
179
- end
180
-
181
- def set_new_body_expression(transforming_body_expr, corrector)
182
- body_source = transforming_body_expr.source
183
- if transforming_body_expr.hash_type? && !transforming_body_expr.braces?
184
- body_source = "{ #{body_source} }"
185
- end
186
-
187
- corrector.replace(block_node.body, body_source)
188
- end
189
- end
190
190
  end
191
191
  end
192
192
  end
@@ -26,11 +26,15 @@ module RuboCop
26
26
  end
27
27
 
28
28
  def delimiter_string(node)
29
- node.source.match(OPENING_DELIMITER).captures[1]
29
+ return '' unless (match = node.source.match(OPENING_DELIMITER))
30
+
31
+ match.captures[1]
30
32
  end
31
33
 
32
34
  def heredoc_type(node)
33
- node.source.match(OPENING_DELIMITER).captures[0]
35
+ return '' unless (match = node.source.match(OPENING_DELIMITER))
36
+
37
+ match.captures[0]
34
38
  end
35
39
  end
36
40
  end
@@ -25,23 +25,28 @@ module RuboCop
25
25
  config.for_cop('Layout/LineLength')['AllowURI']
26
26
  end
27
27
 
28
- def allowed_uri_position?(line, uri_range)
29
- uri_range.begin < max_line_length && uri_range.end == line_length(line)
28
+ def allow_qualified_name?
29
+ config.for_cop('Layout/LineLength')['AllowQualifiedName']
30
+ end
31
+
32
+ def allowed_position?(line, range)
33
+ range.begin < max_line_length && range.end == line_length(line)
30
34
  end
31
35
 
32
36
  def line_length(line)
33
37
  line.length + indentation_difference(line)
34
38
  end
35
39
 
36
- def find_excessive_uri_range(line)
37
- last_uri_match = match_uris(line).last
38
- return nil unless last_uri_match
40
+ def find_excessive_range(line, type)
41
+ last_match = (type == :uri ? match_uris(line) : match_qualified_names(line)).last
42
+ return nil unless last_match
39
43
 
40
- begin_position, end_position = last_uri_match.offset(0).map do |pos|
41
- pos + indentation_difference(line)
42
- end
44
+ begin_position, end_position = last_match.offset(0)
45
+ end_position = extend_end_position(line, end_position)
43
46
 
44
- end_position = extend_uri_end_position(line, end_position)
47
+ line_indentation_difference = indentation_difference(line)
48
+ begin_position += line_indentation_difference
49
+ end_position += line_indentation_difference
45
50
 
46
51
  return nil if begin_position < max_line_length && end_position < max_line_length
47
52
 
@@ -56,6 +61,14 @@ module RuboCop
56
61
  matches
57
62
  end
58
63
 
64
+ def match_qualified_names(string)
65
+ matches = []
66
+ string.scan(qualified_name_regexp) do
67
+ matches << $LAST_MATCH_INFO
68
+ end
69
+ matches
70
+ end
71
+
59
72
  def indentation_difference(line)
60
73
  return 0 unless tab_indentation_width
61
74
 
@@ -69,7 +82,7 @@ module RuboCop
69
82
  index * (tab_indentation_width - 1)
70
83
  end
71
84
 
72
- def extend_uri_end_position(line, end_position)
85
+ def extend_end_position(line, end_position)
73
86
  # Extend the end position YARD comments with linked URLs of the form {<uri> <title>}
74
87
  if line&.match(/{(\s|\S)*}$/)
75
88
  match = line[end_position..line_length(line)]&.match(/(\s|\S)*}/)
@@ -91,8 +104,17 @@ module RuboCop
91
104
  end
92
105
 
93
106
  def uri_regexp
94
- @uri_regexp ||=
95
- URI::DEFAULT_PARSER.make_regexp(config.for_cop('Layout/LineLength')['URISchemes'])
107
+ @uri_regexp ||= begin
108
+ # Ruby 3.4 changes the default parser to RFC3986 which warns on make_regexp.
109
+ # Additionally, the RFC2396_PARSER alias is only available on 3.4 for now.
110
+ # Extra info at https://github.com/ruby/uri/issues/118
111
+ parser = defined?(URI::RFC2396_PARSER) ? URI::RFC2396_PARSER : URI::DEFAULT_PARSER
112
+ parser.make_regexp(config.for_cop('Layout/LineLength')['URISchemes'])
113
+ end
114
+ end
115
+
116
+ def qualified_name_regexp
117
+ /\b(?:[A-Z][A-Za-z0-9_]*::)+[A-Za-z_][A-Za-z0-9_]*\b/
96
118
  end
97
119
 
98
120
  def valid_uri?(uri_ish_string)
@@ -30,12 +30,13 @@ module RuboCop
30
30
  end
31
31
 
32
32
  alias on_numblock on_block
33
+ alias on_itblock on_block
33
34
 
34
35
  private
35
36
 
36
37
  # @!method define_method?(node)
37
38
  def_node_matcher :define_method?, <<~PATTERN
38
- ({block numblock}
39
+ (any_block
39
40
  (send nil? :define_method ({sym str} $_)) _ _)
40
41
  PATTERN
41
42
 
@@ -49,13 +50,13 @@ module RuboCop
49
50
 
50
51
  return unless complexity > max
51
52
 
52
- msg = format(self.class::MSG,
53
- method: method_name,
54
- complexity: complexity,
55
- abc_vector: abc_vector,
56
- max: max)
53
+ msg = format(
54
+ self.class::MSG,
55
+ method: method_name, complexity: complexity, abc_vector: abc_vector, max: max
56
+ )
57
+ location = location(node)
57
58
 
58
- add_offense(node, message: msg) { self.max = complexity.ceil }
59
+ add_offense(location, message: msg) { self.max = complexity.ceil }
59
60
  end
60
61
 
61
62
  def complexity(body)
@@ -69,6 +70,15 @@ module RuboCop
69
70
  end
70
71
  score
71
72
  end
73
+
74
+ def location(node)
75
+ if LSP.enabled?
76
+ end_range = node.loc.respond_to?(:name) ? node.loc.name : node.loc.begin
77
+ node.source_range.begin.join(end_range)
78
+ else
79
+ node.source_range
80
+ end
81
+ end
72
82
  end
73
83
  end
74
84
  end