rubocop 1.69.2 → 1.75.4

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 (372) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +4 -4
  4. data/config/default.yml +183 -41
  5. data/config/internal_affairs.yml +20 -0
  6. data/config/obsoletion.yml +3 -1
  7. data/lib/rubocop/cli/command/execute_runner.rb +3 -3
  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.rb +1 -1
  11. data/lib/rubocop/comment_config.rb +2 -2
  12. data/lib/rubocop/config.rb +52 -10
  13. data/lib/rubocop/config_loader.rb +52 -9
  14. data/lib/rubocop/config_loader_resolver.rb +36 -10
  15. data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -3
  16. data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
  17. data/lib/rubocop/config_obsoletion.rb +46 -2
  18. data/lib/rubocop/config_validator.rb +25 -14
  19. data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
  20. data/lib/rubocop/cop/base.rb +6 -0
  21. data/lib/rubocop/cop/bundler/duplicated_gem.rb +1 -1
  22. data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
  23. data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
  24. data/lib/rubocop/cop/internal_affairs/example_description.rb +8 -4
  25. data/lib/rubocop/cop/internal_affairs/location_exists.rb +116 -0
  26. data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
  27. data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +3 -2
  28. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -1
  29. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
  30. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
  31. data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +230 -0
  32. data/lib/rubocop/cop/internal_affairs/node_type_group.rb +91 -0
  33. data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
  34. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
  35. data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
  36. data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
  37. data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +6 -5
  38. data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +3 -1
  39. data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
  40. data/lib/rubocop/cop/internal_affairs/undefined_config.rb +13 -2
  41. data/lib/rubocop/cop/internal_affairs.rb +6 -16
  42. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -1
  43. data/lib/rubocop/cop/layout/argument_alignment.rb +2 -8
  44. data/lib/rubocop/cop/layout/block_alignment.rb +3 -1
  45. data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
  46. data/lib/rubocop/cop/layout/class_structure.rb +9 -9
  47. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +4 -4
  48. data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
  49. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  50. data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
  51. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +2 -2
  52. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +7 -11
  53. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +28 -1
  54. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +1 -0
  55. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +1 -1
  56. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +22 -2
  57. data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
  58. data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
  59. data/lib/rubocop/cop/layout/first_argument_indentation.rb +3 -8
  60. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +2 -7
  61. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
  62. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
  63. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
  64. data/lib/rubocop/cop/layout/hash_alignment.rb +7 -5
  65. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -1
  66. data/lib/rubocop/cop/layout/indentation_width.rb +1 -0
  67. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +7 -1
  68. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
  69. data/lib/rubocop/cop/layout/line_length.rb +9 -4
  70. data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -0
  71. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
  72. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
  73. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +1 -0
  74. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
  75. data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
  76. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +1 -1
  77. data/lib/rubocop/cop/layout/redundant_line_break.rb +16 -11
  78. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +3 -5
  79. data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -1
  80. data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
  81. data/lib/rubocop/cop/layout/space_after_comma.rb +1 -1
  82. data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
  83. data/lib/rubocop/cop/layout/space_after_semicolon.rb +1 -1
  84. data/lib/rubocop/cop/layout/space_around_keyword.rb +1 -0
  85. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
  86. data/lib/rubocop/cop/layout/space_around_operators.rb +7 -4
  87. data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -0
  88. data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
  89. data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
  90. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -0
  91. data/lib/rubocop/cop/layout/trailing_whitespace.rb +5 -3
  92. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
  93. data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +119 -0
  94. data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
  95. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +1 -1
  96. data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
  97. data/lib/rubocop/cop/lint/circular_argument_reference.rb +2 -5
  98. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
  99. data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
  100. data/lib/rubocop/cop/lint/cop_directive_syntax.rb +84 -0
  101. data/lib/rubocop/cop/lint/debugger.rb +3 -3
  102. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +1 -1
  103. data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
  104. data/lib/rubocop/cop/lint/duplicate_methods.rb +2 -17
  105. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -1
  106. data/lib/rubocop/cop/lint/duplicate_set_element.rb +20 -7
  107. data/lib/rubocop/cop/lint/empty_conditional_body.rb +14 -64
  108. data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
  109. data/lib/rubocop/cop/lint/erb_new_arguments.rb +0 -6
  110. data/lib/rubocop/cop/lint/float_comparison.rb +6 -8
  111. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  112. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
  113. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  114. data/lib/rubocop/cop/lint/literal_as_condition.rb +117 -9
  115. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +24 -6
  116. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +1 -1
  117. data/lib/rubocop/cop/lint/missing_super.rb +2 -2
  118. data/lib/rubocop/cop/lint/mixed_case_range.rb +3 -3
  119. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  120. data/lib/rubocop/cop/lint/nested_method_definition.rb +9 -5
  121. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  122. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +4 -3
  123. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
  124. data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +18 -31
  125. data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +1 -1
  126. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +2 -1
  127. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -5
  128. data/lib/rubocop/cop/lint/raise_exception.rb +29 -10
  129. data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
  130. data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -21
  131. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
  132. data/lib/rubocop/cop/lint/redundant_type_conversion.rb +261 -0
  133. data/lib/rubocop/cop/lint/redundant_with_index.rb +3 -0
  134. data/lib/rubocop/cop/lint/redundant_with_object.rb +3 -0
  135. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  136. data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -11
  137. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +8 -1
  138. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +8 -1
  139. data/lib/rubocop/cop/lint/shared_mutable_default.rb +76 -0
  140. data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
  141. data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
  142. data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
  143. data/lib/rubocop/cop/lint/syntax.rb +4 -1
  144. data/lib/rubocop/cop/lint/to_enum_arguments.rb +1 -1
  145. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
  146. data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +1 -4
  147. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +3 -1
  148. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -1
  149. data/lib/rubocop/cop/lint/unreachable_code.rb +2 -1
  150. data/lib/rubocop/cop/lint/unreachable_loop.rb +6 -6
  151. data/lib/rubocop/cop/lint/useless_access_modifier.rb +5 -4
  152. data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
  153. data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
  154. data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
  155. data/lib/rubocop/cop/lint/useless_numeric_operation.rb +2 -1
  156. data/lib/rubocop/cop/lint/useless_rescue.rb +1 -1
  157. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +2 -2
  158. data/lib/rubocop/cop/lint/void.rb +12 -9
  159. data/lib/rubocop/cop/message_annotator.rb +7 -3
  160. data/lib/rubocop/cop/metrics/block_length.rb +1 -0
  161. data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
  162. data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
  163. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -1
  164. data/lib/rubocop/cop/metrics/method_length.rb +9 -1
  165. data/lib/rubocop/cop/metrics/module_length.rb +1 -1
  166. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
  167. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -1
  168. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
  169. data/lib/rubocop/cop/mixin/alignment.rb +2 -2
  170. data/lib/rubocop/cop/mixin/allowed_pattern.rb +4 -4
  171. data/lib/rubocop/cop/mixin/check_line_breakable.rb +13 -13
  172. data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +2 -2
  173. data/lib/rubocop/cop/mixin/comments_help.rb +4 -2
  174. data/lib/rubocop/cop/mixin/def_node.rb +1 -1
  175. data/lib/rubocop/cop/mixin/dig_help.rb +1 -1
  176. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
  177. data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
  178. data/lib/rubocop/cop/mixin/forbidden_pattern.rb +16 -0
  179. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +0 -1
  180. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +22 -22
  181. data/lib/rubocop/cop/mixin/hash_subset.rb +203 -0
  182. data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
  183. data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
  184. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +2 -0
  185. data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
  186. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +48 -24
  187. data/lib/rubocop/cop/mixin/range_help.rb +15 -3
  188. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
  189. data/lib/rubocop/cop/mixin/statement_modifier.rb +8 -3
  190. data/lib/rubocop/cop/mixin/string_help.rb +2 -2
  191. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  192. data/lib/rubocop/cop/mixin/target_ruby_version.rb +1 -1
  193. data/lib/rubocop/cop/mixin/trailing_comma.rb +16 -4
  194. data/lib/rubocop/cop/naming/block_forwarding.rb +19 -15
  195. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1 -1
  196. data/lib/rubocop/cop/naming/method_name.rb +64 -8
  197. data/lib/rubocop/cop/naming/predicate_name.rb +44 -0
  198. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +3 -3
  199. data/lib/rubocop/cop/naming/variable_name.rb +51 -6
  200. data/lib/rubocop/cop/registry.rb +9 -6
  201. data/lib/rubocop/cop/security/compound_hash.rb +1 -0
  202. data/lib/rubocop/cop/style/access_modifier_declarations.rb +34 -5
  203. data/lib/rubocop/cop/style/accessor_grouping.rb +19 -5
  204. data/lib/rubocop/cop/style/and_or.rb +1 -1
  205. data/lib/rubocop/cop/style/arguments_forwarding.rb +44 -28
  206. data/lib/rubocop/cop/style/array_first_last.rb +18 -2
  207. data/lib/rubocop/cop/style/array_intersect.rb +39 -28
  208. data/lib/rubocop/cop/style/block_delimiters.rb +9 -21
  209. data/lib/rubocop/cop/style/class_and_module_children.rb +52 -11
  210. data/lib/rubocop/cop/style/class_equality_comparison.rb +1 -1
  211. data/lib/rubocop/cop/style/collection_methods.rb +2 -1
  212. data/lib/rubocop/cop/style/combinable_defined.rb +1 -1
  213. data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
  214. data/lib/rubocop/cop/style/commented_keyword.rb +12 -5
  215. data/lib/rubocop/cop/style/comparable_between.rb +75 -0
  216. data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
  217. data/lib/rubocop/cop/style/conditional_assignment.rb +20 -6
  218. data/lib/rubocop/cop/style/documentation.rb +1 -1
  219. data/lib/rubocop/cop/style/double_negation.rb +4 -4
  220. data/lib/rubocop/cop/style/each_for_simple_loop.rb +4 -7
  221. data/lib/rubocop/cop/style/each_with_object.rb +2 -3
  222. data/lib/rubocop/cop/style/empty_else.rb +4 -2
  223. data/lib/rubocop/cop/style/empty_literal.rb +5 -1
  224. data/lib/rubocop/cop/style/empty_method.rb +1 -1
  225. data/lib/rubocop/cop/style/endless_method.rb +163 -18
  226. data/lib/rubocop/cop/style/eval_with_location.rb +4 -4
  227. data/lib/rubocop/cop/style/exact_regexp_match.rb +3 -10
  228. data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
  229. data/lib/rubocop/cop/style/explicit_block_argument.rb +16 -3
  230. data/lib/rubocop/cop/style/exponential_notation.rb +3 -3
  231. data/lib/rubocop/cop/style/fetch_env_var.rb +1 -1
  232. data/lib/rubocop/cop/style/float_division.rb +8 -4
  233. data/lib/rubocop/cop/style/for.rb +1 -0
  234. data/lib/rubocop/cop/style/format_string_token.rb +38 -11
  235. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -2
  236. data/lib/rubocop/cop/style/global_std_stream.rb +3 -0
  237. data/lib/rubocop/cop/style/guard_clause.rb +2 -1
  238. data/lib/rubocop/cop/style/hash_each_methods.rb +6 -8
  239. data/lib/rubocop/cop/style/hash_except.rb +24 -148
  240. data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
  241. data/lib/rubocop/cop/style/hash_slice.rb +80 -0
  242. data/lib/rubocop/cop/style/hash_syntax.rb +9 -3
  243. data/lib/rubocop/cop/style/hash_transform_keys.rb +2 -2
  244. data/lib/rubocop/cop/style/hash_transform_values.rb +2 -2
  245. data/lib/rubocop/cop/style/identical_conditional_branches.rb +22 -3
  246. data/lib/rubocop/cop/style/if_inside_else.rb +10 -13
  247. data/lib/rubocop/cop/style/if_unless_modifier.rb +5 -5
  248. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +2 -2
  249. data/lib/rubocop/cop/style/if_with_semicolon.rb +2 -2
  250. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  251. data/lib/rubocop/cop/style/inverse_methods.rb +15 -11
  252. data/lib/rubocop/cop/style/invertible_unless_condition.rb +2 -2
  253. data/lib/rubocop/cop/style/ip_addresses.rb +2 -2
  254. data/lib/rubocop/cop/style/it_assignment.rb +36 -0
  255. data/lib/rubocop/cop/style/it_block_parameter.rb +100 -0
  256. data/lib/rubocop/cop/style/keyword_parameters_order.rb +14 -8
  257. data/lib/rubocop/cop/style/lambda.rb +1 -0
  258. data/lib/rubocop/cop/style/lambda_call.rb +7 -2
  259. data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
  260. data/lib/rubocop/cop/style/map_into_array.rb +5 -2
  261. data/lib/rubocop/cop/style/map_to_hash.rb +1 -1
  262. data/lib/rubocop/cop/style/map_to_set.rb +3 -2
  263. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +23 -16
  264. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -0
  265. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +2 -1
  266. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -4
  267. data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
  268. data/lib/rubocop/cop/style/missing_else.rb +2 -0
  269. data/lib/rubocop/cop/style/multiline_block_chain.rb +3 -2
  270. data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -9
  271. data/lib/rubocop/cop/style/multiple_comparison.rb +26 -20
  272. data/lib/rubocop/cop/style/mutable_constant.rb +3 -3
  273. data/lib/rubocop/cop/style/negated_if_else_condition.rb +1 -1
  274. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +1 -1
  275. data/lib/rubocop/cop/style/next.rb +44 -0
  276. data/lib/rubocop/cop/style/object_then.rb +14 -15
  277. data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
  278. data/lib/rubocop/cop/style/parallel_assignment.rb +1 -5
  279. data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
  280. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  281. data/lib/rubocop/cop/style/proc.rb +2 -2
  282. data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
  283. data/lib/rubocop/cop/style/raise_args.rb +14 -12
  284. data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
  285. data/lib/rubocop/cop/style/redundant_begin.rb +2 -1
  286. data/lib/rubocop/cop/style/redundant_condition.rb +59 -2
  287. data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +16 -5
  288. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +6 -10
  289. data/lib/rubocop/cop/style/redundant_each.rb +1 -1
  290. data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
  291. data/lib/rubocop/cop/style/redundant_format.rb +257 -0
  292. data/lib/rubocop/cop/style/redundant_freeze.rb +3 -3
  293. data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
  294. data/lib/rubocop/cop/style/redundant_line_continuation.rb +34 -16
  295. data/lib/rubocop/cop/style/redundant_parentheses.rb +48 -16
  296. data/lib/rubocop/cop/style/redundant_regexp_argument.rb +3 -0
  297. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
  298. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -1
  299. data/lib/rubocop/cop/style/redundant_self.rb +1 -0
  300. data/lib/rubocop/cop/style/redundant_self_assignment.rb +14 -28
  301. data/lib/rubocop/cop/style/redundant_sort.rb +2 -2
  302. data/lib/rubocop/cop/style/redundant_sort_by.rb +17 -1
  303. data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -2
  304. data/lib/rubocop/cop/style/rescue_modifier.rb +3 -0
  305. data/lib/rubocop/cop/style/return_nil.rb +2 -2
  306. data/lib/rubocop/cop/style/safe_navigation.rb +20 -5
  307. data/lib/rubocop/cop/style/select_by_regexp.rb +4 -1
  308. data/lib/rubocop/cop/style/semicolon.rb +1 -1
  309. data/lib/rubocop/cop/style/send_with_literal_method_name.rb +2 -1
  310. data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
  311. data/lib/rubocop/cop/style/single_line_do_end_block.rb +4 -3
  312. data/lib/rubocop/cop/style/single_line_methods.rb +6 -7
  313. data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
  314. data/lib/rubocop/cop/style/sole_nested_conditional.rb +41 -106
  315. data/lib/rubocop/cop/style/string_concatenation.rb +2 -2
  316. data/lib/rubocop/cop/style/string_literals.rb +1 -1
  317. data/lib/rubocop/cop/style/string_methods.rb +1 -1
  318. data/lib/rubocop/cop/style/super_arguments.rb +66 -19
  319. data/lib/rubocop/cop/style/symbol_proc.rb +2 -0
  320. data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
  321. data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -1
  322. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +11 -2
  323. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
  324. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
  325. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  326. data/lib/rubocop/cop/style/while_until_modifier.rb +0 -1
  327. data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
  328. data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
  329. data/lib/rubocop/cop/util.rb +12 -5
  330. data/lib/rubocop/cop/utils/format_string.rb +10 -5
  331. data/lib/rubocop/cop/variable_force/scope.rb +1 -1
  332. data/lib/rubocop/cop/variable_force/variable.rb +10 -3
  333. data/lib/rubocop/cop/variable_force/variable_table.rb +3 -3
  334. data/lib/rubocop/cop/variable_force.rb +1 -1
  335. data/lib/rubocop/cops_documentation_generator.rb +31 -16
  336. data/lib/rubocop/directive_comment.rb +45 -11
  337. data/lib/rubocop/ext/regexp_node.rb +0 -1
  338. data/lib/rubocop/formatter/disabled_config_formatter.rb +1 -1
  339. data/lib/rubocop/formatter/formatter_set.rb +1 -1
  340. data/lib/rubocop/formatter/pacman_formatter.rb +1 -1
  341. data/lib/rubocop/lsp/diagnostic.rb +189 -0
  342. data/lib/rubocop/lsp/logger.rb +2 -2
  343. data/lib/rubocop/lsp/routes.rb +7 -23
  344. data/lib/rubocop/lsp/runtime.rb +18 -50
  345. data/lib/rubocop/lsp/server.rb +0 -2
  346. data/lib/rubocop/lsp/stdin_runner.rb +85 -0
  347. data/lib/rubocop/magic_comment.rb +8 -0
  348. data/lib/rubocop/options.rb +28 -12
  349. data/lib/rubocop/path_util.rb +15 -8
  350. data/lib/rubocop/plugin/configuration_integrator.rb +143 -0
  351. data/lib/rubocop/plugin/load_error.rb +26 -0
  352. data/lib/rubocop/plugin/loader.rb +100 -0
  353. data/lib/rubocop/plugin/not_supported_error.rb +29 -0
  354. data/lib/rubocop/plugin.rb +46 -0
  355. data/lib/rubocop/rake_task.rb +4 -1
  356. data/lib/rubocop/result_cache.rb +13 -13
  357. data/lib/rubocop/rspec/cop_helper.rb +13 -1
  358. data/lib/rubocop/rspec/expect_offense.rb +6 -2
  359. data/lib/rubocop/rspec/shared_contexts.rb +38 -1
  360. data/lib/rubocop/rspec/support.rb +4 -2
  361. data/lib/rubocop/runner.rb +10 -7
  362. data/lib/rubocop/server/cache.rb +47 -11
  363. data/lib/rubocop/server/cli.rb +2 -2
  364. data/lib/rubocop/target_finder.rb +7 -2
  365. data/lib/rubocop/target_ruby.rb +16 -1
  366. data/lib/rubocop/version.rb +30 -8
  367. data/lib/rubocop.rb +16 -1
  368. data/lib/ruby_lsp/rubocop/addon.rb +75 -0
  369. data/lib/ruby_lsp/rubocop/runtime_adapter.rb +65 -0
  370. metadata +59 -16
  371. data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
  372. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -0,0 +1,111 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ # Checks for cases where exceptions unrelated to the numeric constructors `Integer()`,
7
+ # `Float()`, `BigDecimal()`, `Complex()`, and `Rational()` may be unintentionally swallowed.
8
+ #
9
+ # @safety
10
+ # The cop is unsafe for autocorrection because unexpected errors occurring in the argument
11
+ # passed to numeric constructor (e.g., `Integer()`) can lead to incompatible behavior.
12
+ # For example, changing it to `Integer(potential_exception_method_call, exception: false)`
13
+ # ensures that exceptions raised by `potential_exception_method_call` are not ignored.
14
+ #
15
+ # [source,ruby]
16
+ # ----
17
+ # Integer(potential_exception_method_call) rescue nil
18
+ # ----
19
+ #
20
+ # @example
21
+ #
22
+ # # bad
23
+ # Integer(arg) rescue nil
24
+ #
25
+ # # bad
26
+ # begin
27
+ # Integer(arg)
28
+ # rescue
29
+ # nil
30
+ # end
31
+ #
32
+ # # bad
33
+ # begin
34
+ # Integer(arg)
35
+ # rescue
36
+ # end
37
+ #
38
+ # # good
39
+ # Integer(arg, exception: false)
40
+ #
41
+ class SuppressedExceptionInNumberConversion < Base
42
+ extend AutoCorrector
43
+ extend TargetRubyVersion
44
+
45
+ MSG = 'Use `%<prefer>s` instead.'
46
+ EXPECTED_EXCEPTION_CLASSES = %w[ArgumentError TypeError ::ArgumentError ::TypeError].freeze
47
+
48
+ # @!method numeric_constructor_rescue_nil(node)
49
+ def_node_matcher :numeric_constructor_rescue_nil, <<~PATTERN
50
+ (rescue
51
+ $#numeric_method?
52
+ (resbody nil? nil? (nil)) nil?)
53
+ PATTERN
54
+
55
+ # @!method begin_numeric_constructor_rescue_nil(node)
56
+ def_node_matcher :begin_numeric_constructor_rescue_nil, <<~PATTERN
57
+ (kwbegin
58
+ (rescue
59
+ $#numeric_method?
60
+ (resbody $_? nil?
61
+ {(nil) nil?}) nil?))
62
+ PATTERN
63
+
64
+ # @!method numeric_method?(node)
65
+ def_node_matcher :numeric_method?, <<~PATTERN
66
+ {
67
+ (call #constructor_receiver? {:Integer :BigDecimal :Complex :Rational}
68
+ _ _?)
69
+ (call #constructor_receiver? :Float
70
+ _)
71
+ }
72
+ PATTERN
73
+
74
+ # @!method constructor_receiver?(node)
75
+ def_node_matcher :constructor_receiver?, <<~PATTERN
76
+ {nil? (const {nil? cbase} :Kernel)}
77
+ PATTERN
78
+
79
+ minimum_target_ruby_version 2.6
80
+
81
+ # rubocop:disable Metrics/AbcSize
82
+ def on_rescue(node)
83
+ if (method, exception_classes = begin_numeric_constructor_rescue_nil(node.parent))
84
+ return unless expected_exception_classes_only?(exception_classes)
85
+
86
+ node = node.parent
87
+ else
88
+ return unless (method = numeric_constructor_rescue_nil(node))
89
+ end
90
+
91
+ arguments = method.arguments.map(&:source) << 'exception: false'
92
+ prefer = "#{method.method_name}(#{arguments.join(', ')})"
93
+ prefer = "#{method.receiver.source}#{method.loc.dot.source}#{prefer}" if method.receiver
94
+
95
+ add_offense(node, message: format(MSG, prefer: prefer)) do |corrector|
96
+ corrector.replace(node, prefer)
97
+ end
98
+ end
99
+ # rubocop:enable Metrics/AbcSize
100
+
101
+ private
102
+
103
+ def expected_exception_classes_only?(exception_classes)
104
+ return true unless (arguments = exception_classes.first)
105
+
106
+ (arguments.values.map(&:source) - EXPECTED_EXCEPTION_CLASSES).none?
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
@@ -78,7 +78,7 @@ module RuboCop
78
78
  def on_send(node)
79
79
  return unless node.receiver
80
80
 
81
- if node.receiver.str_type? || node.receiver.sym_type?
81
+ if node.receiver.type?(:str, :sym)
82
82
  register_offense(node, correction: node.receiver.value.to_sym.inspect)
83
83
  elsif node.receiver.dstr_type?
84
84
  register_offense(node, correction: ":\"#{node.receiver.value.to_sym}\"")
@@ -6,9 +6,12 @@ module RuboCop
6
6
  # Repacks Parser's diagnostics/errors
7
7
  # into RuboCop's offenses.
8
8
  class Syntax < Base
9
+ LEVELS = %i[error fatal].freeze
10
+
9
11
  def on_other_file
10
12
  add_offense_from_error(processed_source.parser_error) if processed_source.parser_error
11
- processed_source.diagnostics.each do |diagnostic|
13
+ syntax_errors = processed_source.diagnostics.select { |d| LEVELS.include?(d.level) }
14
+ syntax_errors.each do |diagnostic|
12
15
  add_offense_from_diagnostic(diagnostic, processed_source.ruby_version)
13
16
  end
14
17
  super
@@ -45,7 +45,7 @@ module RuboCop
45
45
  PATTERN
46
46
 
47
47
  def on_send(node)
48
- def_node = node.each_ancestor(:def, :defs).first
48
+ def_node = node.each_ancestor(:any_def).first
49
49
  return unless def_node
50
50
 
51
51
  enum_conversion_call?(node) do |method_node, arguments|
@@ -40,7 +40,7 @@ module RuboCop
40
40
  # top-level return node's ancestors should not be of block, def, or
41
41
  # defs type.
42
42
  def top_level_return?(return_node)
43
- return_node.each_ancestor(:block, :def, :defs).none?
43
+ return_node.each_ancestor(:block, :any_def).none?
44
44
  end
45
45
  end
46
46
  end
@@ -55,12 +55,9 @@ module RuboCop
55
55
  return if node.each_descendant(:dstr).any?
56
56
 
57
57
  regexp_constructor(node) do |text|
58
- Regexp::Parser.parse(text.value)&.each_expression do |expr|
58
+ parse_regexp(text.value)&.each_expression do |expr|
59
59
  detect_offenses(text, expr)
60
60
  end
61
- rescue Regexp::Parser::Error
62
- # Upon encountering an invalid regular expression,
63
- # we aim to proceed and identify any remaining potential offenses.
64
61
  end
65
62
  end
66
63
 
@@ -53,6 +53,7 @@ module RuboCop
53
53
  end
54
54
 
55
55
  alias on_numblock on_block
56
+ alias on_itblock on_block
56
57
 
57
58
  private
58
59
 
@@ -74,6 +75,7 @@ module RuboCop
74
75
 
75
76
  def arg_count(node)
76
77
  return node.children[1] if node.numblock_type? # the maximum numbered param for the block
78
+ return 1 if node.itblock_type? # `it` block parameter is always one
77
79
 
78
80
  # Only `arg`, `optarg` and `mlhs` (destructuring) count as arguments that
79
81
  # can be used. Keyword arguments are not used for these methods so are
@@ -81,7 +83,7 @@ module RuboCop
81
83
  node.arguments.count do |arg|
82
84
  return Float::INFINITY if arg.restarg_type?
83
85
 
84
- arg.arg_type? || arg.optarg_type? || arg.mlhs_type?
86
+ arg.type?(:arg, :optarg, :mlhs)
85
87
  end
86
88
  end
87
89
  end
@@ -130,7 +130,7 @@ module RuboCop
130
130
 
131
131
  block_body_node.each_descendant(:next, :break) do |n|
132
132
  # Ignore `next`/`break` inside an inner block
133
- next if n.each_ancestor(:block).first != block_body_node.parent
133
+ next if n.each_ancestor(:any_block).first != block_body_node.parent
134
134
  next unless n.first_argument
135
135
 
136
136
  nodes << n.first_argument
@@ -43,6 +43,7 @@ module RuboCop
43
43
  end
44
44
 
45
45
  alias on_numblock on_block
46
+ alias on_itblock on_block
46
47
 
47
48
  def after_block(node)
48
49
  @instance_eval_count -= 1 if instance_eval_block?(node)
@@ -117,7 +118,7 @@ module RuboCop
117
118
  end
118
119
 
119
120
  def instance_eval_block?(node)
120
- node.block_type? && node.method?(:instance_eval)
121
+ node.any_block_type? && node.method?(:instance_eval)
121
122
  end
122
123
 
123
124
  def report_on_flow_command?(node)
@@ -101,14 +101,13 @@ module RuboCop
101
101
  check(node) if loop_method?(node)
102
102
  end
103
103
 
104
- def on_numblock(node)
105
- check(node) if loop_method?(node)
106
- end
104
+ alias on_numblock on_block
105
+ alias on_itblock on_block
107
106
 
108
107
  private
109
108
 
110
109
  def loop_method?(node)
111
- return false unless node.block_type? || node.numblock_type?
110
+ return false unless node.any_block_type?
112
111
 
113
112
  send_node = node.send_node
114
113
  loopable = send_node.enumerable_method? || send_node.enumerator_method? ||
@@ -189,8 +188,9 @@ module RuboCop
189
188
 
190
189
  def preceded_by_continue_statement?(break_statement)
191
190
  break_statement.left_siblings.any? do |sibling|
192
- # Numblocks have the arguments count as a number in the AST.
193
- next if sibling.is_a?(Integer)
191
+ # Numblocks have the arguments count as a number or,
192
+ # itblocks have `:it` symbol in the AST.
193
+ next if sibling.is_a?(Integer) || sibling.is_a?(Symbol)
194
194
  next if sibling.loop_keyword? || loop_method?(sibling)
195
195
 
196
196
  sibling.each_descendant(*CONTINUE_KEYWORDS).any?
@@ -143,6 +143,7 @@ module RuboCop
143
143
  end
144
144
 
145
145
  alias on_numblock on_block
146
+ alias on_itblock on_block
146
147
 
147
148
  private
148
149
 
@@ -159,12 +160,12 @@ module RuboCop
159
160
 
160
161
  # @!method dynamic_method_definition?(node)
161
162
  def_node_matcher :dynamic_method_definition?, <<~PATTERN
162
- {(send nil? :define_method ...) ({block numblock} (send nil? :define_method ...) ...)}
163
+ {(send nil? :define_method ...) (any_block (send nil? :define_method ...) ...)}
163
164
  PATTERN
164
165
 
165
166
  # @!method class_or_instance_eval?(node)
166
167
  def_node_matcher :class_or_instance_eval?, <<~PATTERN
167
- ({block numblock} (send _ {:class_eval :instance_eval}) ...)
168
+ (any_block (send _ {:class_eval :instance_eval}) ...)
168
169
  PATTERN
169
170
 
170
171
  def check_node(node)
@@ -268,7 +269,7 @@ module RuboCop
268
269
  end
269
270
 
270
271
  def start_of_new_scope?(child)
271
- child.module_type? || child.class_type? || child.sclass_type? || eval_call?(child)
272
+ child.type?(:module, :class, :sclass) || eval_call?(child)
272
273
  end
273
274
 
274
275
  def eval_call?(child)
@@ -282,7 +283,7 @@ module RuboCop
282
283
  matcher_name = :"#{m}_block?"
283
284
  unless respond_to?(matcher_name)
284
285
  self.class.def_node_matcher matcher_name, <<~PATTERN
285
- ({block numblock} (send {nil? const} {:#{m}} ...) ...)
286
+ (any_block (send {nil? const} {:#{m}} ...) ...)
286
287
  PATTERN
287
288
  end
288
289
 
@@ -17,7 +17,7 @@ module RuboCop
17
17
  # rescue, ensure, etc.
18
18
  #
19
19
  # This cop's autocorrection avoids cases like `a ||= 1` because removing assignment from
20
- # operator assignment can cause NameError if this assignment has been used to declare
20
+ # operator assignment can cause `NameError` if this assignment has been used to declare
21
21
  # a local variable. For example, replacing `a ||= 1` with `a || 1` may cause
22
22
  # "undefined local variable or method `a' for main:Object (NameError)".
23
23
  #
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ # Checks for useless constant scoping. Private constants must be defined using
7
+ # `private_constant`. Even if `private` access modifier is used, it is public scope despite
8
+ # its appearance.
9
+ #
10
+ # It does not support autocorrection due to behavior change and multiple ways to fix it.
11
+ # Or a public constant may be intended.
12
+ #
13
+ # @example
14
+ #
15
+ # # bad
16
+ # class Foo
17
+ # private
18
+ # PRIVATE_CONST = 42
19
+ # end
20
+ #
21
+ # # good
22
+ # class Foo
23
+ # PRIVATE_CONST = 42
24
+ # private_constant :PRIVATE_CONST
25
+ # end
26
+ #
27
+ # # good
28
+ # class Foo
29
+ # PUBLIC_CONST = 42 # If private scope is not intended.
30
+ # end
31
+ #
32
+ class UselessConstantScoping < Base
33
+ MSG = 'Useless `private` access modifier for constant scope.'
34
+
35
+ # @!method private_constants(node)
36
+ def_node_matcher :private_constants, <<~PATTERN
37
+ (send nil? :private_constant $...)
38
+ PATTERN
39
+
40
+ def on_casgn(node)
41
+ return unless after_private_modifier?(node.left_siblings)
42
+ return if private_constantize?(node.right_siblings, node.name)
43
+
44
+ add_offense(node)
45
+ end
46
+
47
+ private
48
+
49
+ def after_private_modifier?(left_siblings)
50
+ access_modifier_candidates = left_siblings.compact.select do |left_sibling|
51
+ left_sibling.respond_to?(:send_type?) && left_sibling.send_type?
52
+ end
53
+
54
+ access_modifier_candidates.any? do |candidate|
55
+ candidate.command?(:private) && candidate.arguments.none?
56
+ end
57
+ end
58
+
59
+ def private_constantize?(right_siblings, const_value)
60
+ private_constant_arguments = right_siblings.map { |node| private_constants(node) }
61
+
62
+ private_constant_values = private_constant_arguments.flatten.filter_map do |constant|
63
+ constant.value.to_sym if constant.respond_to?(:value)
64
+ end
65
+
66
+ private_constant_values.include?(const_value)
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -59,7 +59,7 @@ module RuboCop
59
59
  end
60
60
 
61
61
  def use_rest_or_optional_args?(node)
62
- node.arguments.any? { |arg| arg.restarg_type? || arg.optarg_type? || arg.kwoptarg_type? }
62
+ node.arguments.any? { |arg| arg.type?(:restarg, :optarg, :kwoptarg) }
63
63
  end
64
64
 
65
65
  def delegating?(node, def_node)
@@ -35,7 +35,7 @@ module RuboCop
35
35
  RESTRICT_ON_SEND = %i[+ - * / **].freeze
36
36
 
37
37
  # @!method useless_operation?(node)
38
- def_node_matcher :useless_operation?, '(send (send nil? $_) $_ (int $_))'
38
+ def_node_matcher :useless_operation?, '(call (call nil? $_) $_ (int $_))'
39
39
 
40
40
  # @!method useless_abbreviated_assignment?(node)
41
41
  def_node_matcher :useless_abbreviated_assignment?, '(op-asgn (lvasgn $_) $_ (int $_))'
@@ -50,6 +50,7 @@ module RuboCop
50
50
  corrector.replace(node, variable)
51
51
  end
52
52
  end
53
+ alias on_csend on_send
53
54
 
54
55
  def on_op_asgn(node)
55
56
  return unless useless_abbreviated_assignment?(node)
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Lint
6
- # Checks for useless `rescue`s, which only reraise rescued exceptions.
6
+ # Checks for useless ``rescue``s, which only reraise rescued exceptions.
7
7
  #
8
8
  # @example
9
9
  # # bad
@@ -72,7 +72,7 @@ module RuboCop
72
72
  def_node_matcher :method_definition, <<~PATTERN
73
73
  {
74
74
  (def %1 ...)
75
- ({block numblock} (send _ :define_method (sym %1)) ...)
75
+ (any_block (send _ :define_method (sym %1)) ...)
76
76
  }
77
77
  PATTERN
78
78
 
@@ -108,7 +108,7 @@ module RuboCop
108
108
 
109
109
  def find_method_definition(node, method_name)
110
110
  node.each_ancestor.lazy.map do |ancestor|
111
- ancestor.each_child_node(:def, :block, :numblock).find do |child|
111
+ ancestor.each_child_node(:def, :any_block).find do |child|
112
112
  method_definition(child, method_name)
113
113
  end
114
114
  end.find(&:itself)
@@ -86,6 +86,7 @@ module RuboCop
86
86
  check_expression(node.body)
87
87
  end
88
88
  alias on_numblock on_block
89
+ alias on_itblock on_block
89
90
 
90
91
  def on_begin(node)
91
92
  check_begin(node)
@@ -103,7 +104,7 @@ module RuboCop
103
104
  expressions.pop unless in_void_context?(node)
104
105
  expressions.each do |expr|
105
106
  check_void_op(expr) do
106
- block_node = node.each_ancestor(:block).first
107
+ block_node = node.each_ancestor(:any_block).first
107
108
 
108
109
  block_node&.method?(:each)
109
110
  end
@@ -113,7 +114,8 @@ module RuboCop
113
114
  end
114
115
 
115
116
  def check_expression(expr)
116
- expr = expr.body if expr.if_type? && expr.modifier_form?
117
+ expr = expr.body if expr.if_type?
118
+ return unless expr
117
119
 
118
120
  check_literal(expr)
119
121
  check_var(expr)
@@ -124,9 +126,14 @@ module RuboCop
124
126
  check_nonmutating(expr)
125
127
  end
126
128
 
129
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
127
130
  def check_void_op(node, &block)
128
131
  node = node.children.first while node.begin_type?
129
132
  return unless node.call_type? && OPERATORS.include?(node.method_name)
133
+ if !UNARY_OPERATORS.include?(node.method_name) && node.loc.dot && node.arguments.none?
134
+ return
135
+ end
136
+
130
137
  return if block && yield(node)
131
138
 
132
139
  add_offense(node.loc.selector,
@@ -134,6 +141,7 @@ module RuboCop
134
141
  autocorrect_void_op(corrector, node)
135
142
  end
136
143
  end
144
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
137
145
 
138
146
  def check_var(node)
139
147
  return unless node.variable? || node.const_type?
@@ -178,7 +186,7 @@ module RuboCop
178
186
  end
179
187
 
180
188
  def check_nonmutating(node)
181
- return if !node.send_type? && !node.block_type? && !node.numblock_type?
189
+ return unless node.type?(:send, :any_block)
182
190
 
183
191
  method_name = node.method_name
184
192
  return unless NONMUTATING_METHODS.include?(method_name)
@@ -200,11 +208,6 @@ module RuboCop
200
208
  # NOTE: the `begin` node case is already handled via `on_begin`
201
209
  return if body.begin_type?
202
210
 
203
- check_void_op(body) do
204
- block_node = node.each_ancestor(:block).first
205
- block_node&.method?(:each)
206
- end
207
-
208
211
  check_expression(body)
209
212
  end
210
213
 
@@ -229,7 +232,7 @@ module RuboCop
229
232
  end
230
233
 
231
234
  def autocorrect_void_expression(corrector, node)
232
- return if node.parent.if_type? && node.parent.modifier_form?
235
+ return if node.parent.if_type?
233
236
 
234
237
  corrector.remove(range_with_surrounding_space(range: node.source_range, side: :left))
235
238
  end
@@ -32,7 +32,7 @@ module RuboCop
32
32
  # @param [String] cop_name for specific cop name
33
33
  # @param [Hash] cop_config configs for specific cop, from config#for_cop
34
34
  # @option cop_config [String] :StyleGuide Extension of base styleguide URL
35
- # @option cop_config [String] :Reference Full reference URL
35
+ # @option cop_config [String] :References Full reference URLs
36
36
  # @option cop_config [String] :Details
37
37
  #
38
38
  # @param [Hash, nil] options optional
@@ -100,8 +100,12 @@ module RuboCop
100
100
  end
101
101
 
102
102
  def reference_urls
103
- urls = Array(cop_config['Reference'])
104
- urls.nil? || urls.empty? ? nil : urls.reject(&:empty?)
103
+ urls = cop_config
104
+ .values_at('References', 'Reference') # Support legacy Reference key
105
+ .flat_map { Array(_1) }
106
+ .reject(&:empty?)
107
+
108
+ urls unless urls.empty?
105
109
  end
106
110
 
107
111
  def extra_details?
@@ -57,6 +57,7 @@ module RuboCop
57
57
  check_code_length(node)
58
58
  end
59
59
  alias on_numblock on_block
60
+ alias on_itblock on_block
60
61
 
61
62
  private
62
63
 
@@ -52,7 +52,7 @@ module RuboCop
52
52
  def consider_node?(node)
53
53
  return true if NESTING_BLOCKS.include?(node.type)
54
54
 
55
- count_blocks? && (node.block_type? || node.numblock_type?)
55
+ count_blocks? && node.any_block_type?
56
56
  end
57
57
 
58
58
  def message(max)
@@ -52,12 +52,19 @@ module RuboCop
52
52
  'Prefer reading the data from an external source.'
53
53
  RESTRICT_ON_SEND = [:[]].freeze
54
54
 
55
+ # @!method set_const?(node)
56
+ def_node_matcher :set_const?, <<~PATTERN
57
+ (const {cbase nil?} :Set)
58
+ PATTERN
59
+
55
60
  def on_array(node)
56
61
  add_offense(node) if node.children.length >= collection_threshold
57
62
  end
58
63
  alias on_hash on_array
59
64
 
60
65
  def on_index(node)
66
+ return unless set_const?(node.receiver)
67
+
61
68
  add_offense(node) if node.arguments.length >= collection_threshold
62
69
  end
63
70
 
@@ -36,7 +36,7 @@ module RuboCop
36
36
  include MethodComplexity
37
37
  include Utils::IteratingBlock
38
38
 
39
- MSG = 'Cyclomatic complexity for %<method>s is too high. [%<complexity>d/%<max>d]'
39
+ MSG = 'Cyclomatic complexity for `%<method>s` is too high. [%<complexity>d/%<max>d]'
40
40
  COUNTED_NODES = %i[if while until for csend block block_pass
41
41
  rescue when in_pattern and or or_asgn and_asgn].freeze
42
42
 
@@ -48,7 +48,7 @@ module RuboCop
48
48
  LABEL = 'Method'
49
49
 
50
50
  def on_def(node)
51
- return if allowed_method?(node.method_name) || matches_allowed_pattern?(node.method_name)
51
+ return if allowed?(node.method_name)
52
52
 
53
53
  check_code_length(node)
54
54
  end
@@ -57,15 +57,23 @@ module RuboCop
57
57
  def on_block(node)
58
58
  return unless node.method?(:define_method)
59
59
 
60
+ method_name = node.send_node.first_argument
61
+ return if method_name.basic_literal? && allowed?(method_name.value)
62
+
60
63
  check_code_length(node)
61
64
  end
62
65
  alias on_numblock on_block
66
+ alias on_itblock on_block
63
67
 
64
68
  private
65
69
 
66
70
  def cop_label
67
71
  LABEL
68
72
  end
73
+
74
+ def allowed?(method_name)
75
+ allowed_method?(method_name) || matches_allowed_pattern?(method_name)
76
+ end
69
77
  end
70
78
  end
71
79
  end
@@ -50,7 +50,7 @@ module RuboCop
50
50
 
51
51
  # @!method module_definition?(node)
52
52
  def_node_matcher :module_definition?, <<~PATTERN
53
- (casgn nil? _ ({block numblock} (send (const {nil? cbase} :Module) :new) ...))
53
+ (casgn nil? _ (any_block (send (const {nil? cbase} :Module) :new) ...))
54
54
  PATTERN
55
55
 
56
56
  def message(length, max_length)
@@ -27,7 +27,7 @@ module RuboCop
27
27
  # end # ===
28
28
  # end # 7 complexity points
29
29
  class PerceivedComplexity < CyclomaticComplexity
30
- MSG = 'Perceived complexity for %<method>s is too high. [%<complexity>d/%<max>d]'
30
+ MSG = 'Perceived complexity for `%<method>s` is too high. [%<complexity>d/%<max>d]'
31
31
 
32
32
  COUNTED_NODES = (CyclomaticComplexity::COUNTED_NODES - [:when] + [:case]).freeze
33
33
 
@@ -145,7 +145,7 @@ module RuboCop
145
145
 
146
146
  def extract_body(node)
147
147
  case node.type
148
- when :class, :module, :sclass, :block, :numblock, :def, :defs
148
+ when :class, :module, :sclass, :block, :numblock, :itblock, :def, :defs
149
149
  node.body
150
150
  when :casgn
151
151
  extract_body(node.expression)