rubocop 1.67.0 → 1.75.6

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 (471) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +4 -4
  4. data/config/default.yml +266 -47
  5. data/config/internal_affairs.yml +20 -0
  6. data/config/obsoletion.yml +3 -1
  7. data/lib/rubocop/cached_data.rb +12 -4
  8. data/lib/rubocop/cli/command/execute_runner.rb +4 -4
  9. data/lib/rubocop/cli/command/show_cops.rb +24 -2
  10. data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
  11. data/lib/rubocop/cli/command/version.rb +2 -2
  12. data/lib/rubocop/cli.rb +1 -1
  13. data/lib/rubocop/comment_config.rb +2 -2
  14. data/lib/rubocop/config.rb +52 -10
  15. data/lib/rubocop/config_loader.rb +52 -9
  16. data/lib/rubocop/config_loader_resolver.rb +36 -10
  17. data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -3
  18. data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
  19. data/lib/rubocop/config_obsoletion.rb +46 -2
  20. data/lib/rubocop/config_validator.rb +25 -14
  21. data/lib/rubocop/cop/autocorrect_logic.rb +36 -19
  22. data/lib/rubocop/cop/base.rb +7 -1
  23. data/lib/rubocop/cop/bundler/duplicated_gem.rb +2 -2
  24. data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
  25. data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
  26. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
  27. data/lib/rubocop/cop/correctors/alignment_corrector.rb +1 -12
  28. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +1 -1
  29. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +10 -0
  30. data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +1 -2
  31. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +0 -2
  32. data/lib/rubocop/cop/generator.rb +6 -0
  33. data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
  34. data/lib/rubocop/cop/internal_affairs/example_description.rb +8 -4
  35. data/lib/rubocop/cop/internal_affairs/location_exists.rb +116 -0
  36. data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
  37. data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +3 -4
  38. data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +3 -2
  39. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -1
  40. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
  41. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
  42. data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +230 -0
  43. data/lib/rubocop/cop/internal_affairs/node_type_group.rb +91 -0
  44. data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
  45. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
  46. data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +1 -1
  47. data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
  48. data/lib/rubocop/cop/internal_affairs/operator_keyword.rb +48 -0
  49. data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
  50. data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +6 -5
  51. data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +3 -1
  52. data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
  53. data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +0 -2
  54. data/lib/rubocop/cop/internal_affairs/undefined_config.rb +13 -2
  55. data/lib/rubocop/cop/internal_affairs.rb +7 -16
  56. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -1
  57. data/lib/rubocop/cop/layout/argument_alignment.rb +2 -9
  58. data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
  59. data/lib/rubocop/cop/layout/begin_end_alignment.rb +0 -1
  60. data/lib/rubocop/cop/layout/block_alignment.rb +3 -2
  61. data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
  62. data/lib/rubocop/cop/layout/class_structure.rb +9 -9
  63. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +4 -4
  64. data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
  65. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  66. data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
  67. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +3 -3
  68. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +7 -11
  69. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +30 -4
  70. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
  71. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +1 -0
  72. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +4 -5
  73. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +23 -1
  74. data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
  75. data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
  76. data/lib/rubocop/cop/layout/first_argument_indentation.rb +3 -8
  77. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +2 -7
  78. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
  79. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
  80. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
  81. data/lib/rubocop/cop/layout/hash_alignment.rb +8 -6
  82. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -1
  83. data/lib/rubocop/cop/layout/indentation_width.rb +8 -7
  84. data/lib/rubocop/cop/layout/leading_comment_space.rb +57 -2
  85. data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +11 -2
  86. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +7 -1
  87. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
  88. data/lib/rubocop/cop/layout/line_length.rb +123 -4
  89. data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -0
  90. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
  91. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
  92. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -1
  93. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
  94. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
  95. data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
  96. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +3 -4
  97. data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
  98. data/lib/rubocop/cop/layout/redundant_line_break.rb +19 -46
  99. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +6 -7
  100. data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -1
  101. data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
  102. data/lib/rubocop/cop/layout/space_after_comma.rb +1 -1
  103. data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
  104. data/lib/rubocop/cop/layout/space_after_semicolon.rb +11 -1
  105. data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -1
  106. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
  107. data/lib/rubocop/cop/layout/space_around_operators.rb +23 -21
  108. data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -0
  109. data/lib/rubocop/cop/layout/space_before_brackets.rb +5 -5
  110. data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
  111. data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
  112. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +11 -1
  113. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +5 -0
  114. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +7 -0
  115. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +0 -1
  116. data/lib/rubocop/cop/layout/trailing_whitespace.rb +5 -3
  117. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
  118. data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +118 -0
  119. data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
  120. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +10 -12
  121. data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
  122. data/lib/rubocop/cop/lint/circular_argument_reference.rb +4 -1
  123. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
  124. data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
  125. data/lib/rubocop/cop/lint/cop_directive_syntax.rb +84 -0
  126. data/lib/rubocop/cop/lint/debugger.rb +3 -3
  127. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -1
  128. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +3 -2
  129. data/lib/rubocop/cop/lint/duplicate_branch.rb +39 -4
  130. data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
  131. data/lib/rubocop/cop/lint/duplicate_methods.rb +46 -19
  132. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -1
  133. data/lib/rubocop/cop/lint/duplicate_set_element.rb +20 -7
  134. data/lib/rubocop/cop/lint/empty_conditional_body.rb +14 -64
  135. data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
  136. data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
  137. data/lib/rubocop/cop/lint/empty_file.rb +0 -2
  138. data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
  139. data/lib/rubocop/cop/lint/erb_new_arguments.rb +0 -6
  140. data/lib/rubocop/cop/lint/float_comparison.rb +20 -14
  141. data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -4
  142. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
  143. data/lib/rubocop/cop/lint/hash_new_with_keyword_arguments_as_default.rb +55 -0
  144. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  145. data/lib/rubocop/cop/lint/interpolation_check.rb +9 -0
  146. data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +3 -0
  147. data/lib/rubocop/cop/lint/literal_as_condition.rb +118 -9
  148. data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +1 -1
  149. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +24 -6
  150. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +1 -1
  151. data/lib/rubocop/cop/lint/missing_super.rb +2 -2
  152. data/lib/rubocop/cop/lint/mixed_case_range.rb +5 -8
  153. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  154. data/lib/rubocop/cop/lint/nested_method_definition.rb +10 -6
  155. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  156. data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +2 -2
  157. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +12 -3
  158. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +3 -3
  159. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
  160. data/lib/rubocop/cop/lint/number_conversion.rb +0 -1
  161. data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -2
  162. data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +93 -0
  163. data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -3
  164. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +3 -2
  165. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -5
  166. data/lib/rubocop/cop/lint/raise_exception.rb +29 -10
  167. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +1 -1
  168. data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
  169. data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -21
  170. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +12 -7
  171. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +8 -7
  172. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
  173. data/lib/rubocop/cop/lint/redundant_type_conversion.rb +261 -0
  174. data/lib/rubocop/cop/lint/redundant_with_index.rb +3 -0
  175. data/lib/rubocop/cop/lint/redundant_with_object.rb +3 -0
  176. data/lib/rubocop/cop/lint/refinement_import_methods.rb +1 -1
  177. data/lib/rubocop/cop/lint/regexp_as_condition.rb +0 -1
  178. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  179. data/lib/rubocop/cop/lint/rescue_type.rb +3 -7
  180. data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -11
  181. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +17 -1
  182. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +5 -1
  183. data/lib/rubocop/cop/lint/self_assignment.rb +8 -10
  184. data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
  185. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +8 -1
  186. data/lib/rubocop/cop/lint/shared_mutable_default.rb +76 -0
  187. data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
  188. data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
  189. data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
  190. data/lib/rubocop/cop/lint/syntax.rb +4 -1
  191. data/lib/rubocop/cop/lint/to_enum_arguments.rb +1 -1
  192. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
  193. data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +88 -0
  194. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +3 -1
  195. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -1
  196. data/lib/rubocop/cop/lint/unreachable_code.rb +52 -2
  197. data/lib/rubocop/cop/lint/unreachable_loop.rb +6 -6
  198. data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
  199. data/lib/rubocop/cop/lint/useless_access_modifier.rb +5 -4
  200. data/lib/rubocop/cop/lint/useless_assignment.rb +3 -1
  201. data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
  202. data/lib/rubocop/cop/lint/useless_defined.rb +55 -0
  203. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +4 -0
  204. data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
  205. data/lib/rubocop/cop/lint/useless_numeric_operation.rb +2 -1
  206. data/lib/rubocop/cop/lint/useless_rescue.rb +2 -2
  207. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +2 -2
  208. data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -25
  209. data/lib/rubocop/cop/lint/void.rb +16 -12
  210. data/lib/rubocop/cop/message_annotator.rb +7 -3
  211. data/lib/rubocop/cop/metrics/block_length.rb +1 -0
  212. data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
  213. data/lib/rubocop/cop/metrics/class_length.rb +9 -9
  214. data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
  215. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +5 -2
  216. data/lib/rubocop/cop/metrics/method_length.rb +9 -1
  217. data/lib/rubocop/cop/metrics/module_length.rb +1 -1
  218. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
  219. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
  220. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +3 -4
  221. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
  222. data/lib/rubocop/cop/mixin/alignment.rb +2 -2
  223. data/lib/rubocop/cop/mixin/allowed_pattern.rb +4 -4
  224. data/lib/rubocop/cop/mixin/check_assignment.rb +4 -12
  225. data/lib/rubocop/cop/mixin/check_line_breakable.rb +22 -12
  226. data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +49 -0
  227. data/lib/rubocop/cop/mixin/comments_help.rb +8 -3
  228. data/lib/rubocop/cop/mixin/def_node.rb +1 -1
  229. data/lib/rubocop/cop/mixin/dig_help.rb +27 -0
  230. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
  231. data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +24 -0
  232. data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
  233. data/lib/rubocop/cop/mixin/forbidden_pattern.rb +16 -0
  234. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +3 -2
  235. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +15 -14
  236. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +22 -22
  237. data/lib/rubocop/cop/mixin/hash_subset.rb +203 -0
  238. data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
  239. data/lib/rubocop/cop/mixin/line_length_help.rb +5 -4
  240. data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
  241. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +7 -9
  242. data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
  243. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +68 -30
  244. data/lib/rubocop/cop/mixin/range_help.rb +15 -4
  245. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
  246. data/lib/rubocop/cop/mixin/statement_modifier.rb +8 -3
  247. data/lib/rubocop/cop/mixin/string_help.rb +2 -2
  248. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  249. data/lib/rubocop/cop/mixin/target_ruby_version.rb +17 -1
  250. data/lib/rubocop/cop/mixin/trailing_comma.rb +21 -5
  251. data/lib/rubocop/cop/naming/accessor_method_name.rb +6 -6
  252. data/lib/rubocop/cop/naming/block_forwarding.rb +20 -16
  253. data/lib/rubocop/cop/naming/constant_name.rb +6 -7
  254. data/lib/rubocop/cop/naming/file_name.rb +0 -2
  255. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +12 -13
  256. data/lib/rubocop/cop/naming/method_name.rb +64 -8
  257. data/lib/rubocop/cop/naming/predicate_name.rb +44 -0
  258. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +6 -14
  259. data/lib/rubocop/cop/naming/variable_name.rb +50 -6
  260. data/lib/rubocop/cop/naming/variable_number.rb +2 -3
  261. data/lib/rubocop/cop/offense.rb +2 -3
  262. data/lib/rubocop/cop/registry.rb +9 -6
  263. data/lib/rubocop/cop/security/compound_hash.rb +2 -0
  264. data/lib/rubocop/cop/security/yaml_load.rb +3 -2
  265. data/lib/rubocop/cop/style/access_modifier_declarations.rb +86 -28
  266. data/lib/rubocop/cop/style/accessor_grouping.rb +19 -5
  267. data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +79 -0
  268. data/lib/rubocop/cop/style/and_or.rb +1 -1
  269. data/lib/rubocop/cop/style/arguments_forwarding.rb +47 -28
  270. data/lib/rubocop/cop/style/array_first_last.rb +18 -2
  271. data/lib/rubocop/cop/style/array_intersect.rb +42 -30
  272. data/lib/rubocop/cop/style/bitwise_predicate.rb +100 -0
  273. data/lib/rubocop/cop/style/block_delimiters.rb +43 -25
  274. data/lib/rubocop/cop/style/case_like_if.rb +8 -11
  275. data/lib/rubocop/cop/style/class_and_module_children.rb +52 -11
  276. data/lib/rubocop/cop/style/class_equality_comparison.rb +1 -1
  277. data/lib/rubocop/cop/style/collection_methods.rb +2 -1
  278. data/lib/rubocop/cop/style/combinable_defined.rb +115 -0
  279. data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
  280. data/lib/rubocop/cop/style/commented_keyword.rb +20 -3
  281. data/lib/rubocop/cop/style/comparable_between.rb +78 -0
  282. data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
  283. data/lib/rubocop/cop/style/conditional_assignment.rb +39 -27
  284. data/lib/rubocop/cop/style/constant_visibility.rb +3 -12
  285. data/lib/rubocop/cop/style/data_inheritance.rb +7 -0
  286. data/lib/rubocop/cop/style/dig_chain.rb +89 -0
  287. data/lib/rubocop/cop/style/documentation.rb +1 -1
  288. data/lib/rubocop/cop/style/double_negation.rb +4 -4
  289. data/lib/rubocop/cop/style/each_for_simple_loop.rb +4 -7
  290. data/lib/rubocop/cop/style/each_with_object.rb +2 -3
  291. data/lib/rubocop/cop/style/empty_else.rb +4 -2
  292. data/lib/rubocop/cop/style/empty_literal.rb +5 -1
  293. data/lib/rubocop/cop/style/empty_method.rb +1 -1
  294. data/lib/rubocop/cop/style/endless_method.rb +150 -18
  295. data/lib/rubocop/cop/style/eval_with_location.rb +4 -4
  296. data/lib/rubocop/cop/style/exact_regexp_match.rb +2 -3
  297. data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
  298. data/lib/rubocop/cop/style/explicit_block_argument.rb +16 -3
  299. data/lib/rubocop/cop/style/exponential_notation.rb +3 -3
  300. data/lib/rubocop/cop/style/fetch_env_var.rb +2 -1
  301. data/lib/rubocop/cop/style/file_null.rb +89 -0
  302. data/lib/rubocop/cop/style/file_touch.rb +75 -0
  303. data/lib/rubocop/cop/style/float_division.rb +8 -4
  304. data/lib/rubocop/cop/style/for.rb +1 -1
  305. data/lib/rubocop/cop/style/format_string_token.rb +38 -11
  306. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -2
  307. data/lib/rubocop/cop/style/global_std_stream.rb +3 -0
  308. data/lib/rubocop/cop/style/global_vars.rb +1 -3
  309. data/lib/rubocop/cop/style/guard_clause.rb +17 -3
  310. data/lib/rubocop/cop/style/hash_conversion.rb +1 -2
  311. data/lib/rubocop/cop/style/hash_each_methods.rb +6 -8
  312. data/lib/rubocop/cop/style/hash_except.rb +35 -147
  313. data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
  314. data/lib/rubocop/cop/style/hash_slice.rb +80 -0
  315. data/lib/rubocop/cop/style/hash_syntax.rb +9 -3
  316. data/lib/rubocop/cop/style/hash_transform_keys.rb +2 -2
  317. data/lib/rubocop/cop/style/hash_transform_values.rb +2 -2
  318. data/lib/rubocop/cop/style/identical_conditional_branches.rb +25 -6
  319. data/lib/rubocop/cop/style/if_inside_else.rb +10 -14
  320. data/lib/rubocop/cop/style/if_unless_modifier.rb +25 -5
  321. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +3 -4
  322. data/lib/rubocop/cop/style/if_with_semicolon.rb +20 -9
  323. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  324. data/lib/rubocop/cop/style/inverse_methods.rb +15 -12
  325. data/lib/rubocop/cop/style/invertible_unless_condition.rb +2 -2
  326. data/lib/rubocop/cop/style/ip_addresses.rb +2 -2
  327. data/lib/rubocop/cop/style/it_assignment.rb +36 -0
  328. data/lib/rubocop/cop/style/it_block_parameter.rb +100 -0
  329. data/lib/rubocop/cop/style/keyword_arguments_merging.rb +67 -0
  330. data/lib/rubocop/cop/style/keyword_parameters_order.rb +14 -8
  331. data/lib/rubocop/cop/style/lambda.rb +1 -0
  332. data/lib/rubocop/cop/style/lambda_call.rb +10 -4
  333. data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
  334. data/lib/rubocop/cop/style/map_into_array.rb +11 -3
  335. data/lib/rubocop/cop/style/map_to_hash.rb +1 -1
  336. data/lib/rubocop/cop/style/map_to_set.rb +3 -2
  337. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +27 -17
  338. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -0
  339. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -11
  340. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -4
  341. data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
  342. data/lib/rubocop/cop/style/missing_else.rb +2 -0
  343. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +33 -3
  344. data/lib/rubocop/cop/style/multiline_block_chain.rb +3 -2
  345. data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -0
  346. data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
  347. data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -9
  348. data/lib/rubocop/cop/style/multiple_comparison.rb +52 -51
  349. data/lib/rubocop/cop/style/mutable_constant.rb +7 -8
  350. data/lib/rubocop/cop/style/negated_if_else_condition.rb +7 -5
  351. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +1 -1
  352. data/lib/rubocop/cop/style/nested_ternary_operator.rb +5 -4
  353. data/lib/rubocop/cop/style/next.rb +44 -0
  354. data/lib/rubocop/cop/style/not.rb +1 -1
  355. data/lib/rubocop/cop/style/object_then.rb +15 -15
  356. data/lib/rubocop/cop/style/one_line_conditional.rb +25 -4
  357. data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
  358. data/lib/rubocop/cop/style/operator_method_call.rb +5 -6
  359. data/lib/rubocop/cop/style/or_assignment.rb +3 -6
  360. data/lib/rubocop/cop/style/parallel_assignment.rb +9 -18
  361. data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
  362. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  363. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
  364. data/lib/rubocop/cop/style/proc.rb +2 -2
  365. data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
  366. data/lib/rubocop/cop/style/raise_args.rb +15 -13
  367. data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
  368. data/lib/rubocop/cop/style/redundant_argument.rb +3 -1
  369. data/lib/rubocop/cop/style/redundant_assignment.rb +1 -1
  370. data/lib/rubocop/cop/style/redundant_begin.rb +2 -1
  371. data/lib/rubocop/cop/style/redundant_condition.rb +95 -23
  372. data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +16 -5
  373. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +6 -10
  374. data/lib/rubocop/cop/style/redundant_each.rb +1 -1
  375. data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
  376. data/lib/rubocop/cop/style/redundant_format.rb +257 -0
  377. data/lib/rubocop/cop/style/redundant_freeze.rb +3 -3
  378. data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
  379. data/lib/rubocop/cop/style/redundant_line_continuation.rb +54 -18
  380. data/lib/rubocop/cop/style/redundant_parentheses.rb +56 -26
  381. data/lib/rubocop/cop/style/redundant_regexp_argument.rb +4 -0
  382. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
  383. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -1
  384. data/lib/rubocop/cop/style/redundant_return.rb +2 -2
  385. data/lib/rubocop/cop/style/redundant_self.rb +9 -15
  386. data/lib/rubocop/cop/style/redundant_self_assignment.rb +20 -32
  387. data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +4 -4
  388. data/lib/rubocop/cop/style/redundant_sort.rb +3 -3
  389. data/lib/rubocop/cop/style/redundant_sort_by.rb +17 -1
  390. data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -2
  391. data/lib/rubocop/cop/style/rescue_modifier.rb +5 -3
  392. data/lib/rubocop/cop/style/return_nil.rb +2 -2
  393. data/lib/rubocop/cop/style/safe_navigation.rb +32 -5
  394. data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
  395. data/lib/rubocop/cop/style/select_by_regexp.rb +5 -2
  396. data/lib/rubocop/cop/style/self_assignment.rb +11 -17
  397. data/lib/rubocop/cop/style/semicolon.rb +1 -1
  398. data/lib/rubocop/cop/style/send_with_literal_method_name.rb +2 -1
  399. data/lib/rubocop/cop/style/signal_exception.rb +2 -3
  400. data/lib/rubocop/cop/style/single_argument_dig.rb +9 -5
  401. data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
  402. data/lib/rubocop/cop/style/single_line_do_end_block.rb +15 -4
  403. data/lib/rubocop/cop/style/single_line_methods.rb +6 -7
  404. data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
  405. data/lib/rubocop/cop/style/sole_nested_conditional.rb +42 -106
  406. data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
  407. data/lib/rubocop/cop/style/string_concatenation.rb +15 -15
  408. data/lib/rubocop/cop/style/string_literals.rb +1 -1
  409. data/lib/rubocop/cop/style/string_methods.rb +1 -1
  410. data/lib/rubocop/cop/style/struct_inheritance.rb +8 -1
  411. data/lib/rubocop/cop/style/super_arguments.rb +66 -19
  412. data/lib/rubocop/cop/style/swap_values.rb +4 -15
  413. data/lib/rubocop/cop/style/symbol_proc.rb +2 -0
  414. data/lib/rubocop/cop/style/ternary_parentheses.rb +25 -4
  415. data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -1
  416. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +11 -2
  417. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
  418. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
  419. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -4
  420. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  421. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -2
  422. data/lib/rubocop/cop/style/while_until_modifier.rb +0 -1
  423. data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
  424. data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
  425. data/lib/rubocop/cop/util.rb +12 -5
  426. data/lib/rubocop/cop/utils/format_string.rb +10 -5
  427. data/lib/rubocop/cop/variable_force/assignment.rb +18 -3
  428. data/lib/rubocop/cop/variable_force/branch.rb +1 -1
  429. data/lib/rubocop/cop/variable_force/scope.rb +1 -1
  430. data/lib/rubocop/cop/variable_force/variable.rb +14 -3
  431. data/lib/rubocop/cop/variable_force/variable_table.rb +5 -5
  432. data/lib/rubocop/cop/variable_force.rb +5 -11
  433. data/lib/rubocop/cops_documentation_generator.rb +50 -25
  434. data/lib/rubocop/directive_comment.rb +45 -11
  435. data/lib/rubocop/ext/regexp_node.rb +0 -1
  436. data/lib/rubocop/formatter/disabled_config_formatter.rb +3 -2
  437. data/lib/rubocop/formatter/formatter_set.rb +1 -1
  438. data/lib/rubocop/formatter/html_formatter.rb +1 -1
  439. data/lib/rubocop/formatter/pacman_formatter.rb +1 -1
  440. data/lib/rubocop/lsp/diagnostic.rb +189 -0
  441. data/lib/rubocop/lsp/logger.rb +2 -2
  442. data/lib/rubocop/lsp/routes.rb +7 -23
  443. data/lib/rubocop/lsp/runtime.rb +18 -50
  444. data/lib/rubocop/lsp/server.rb +0 -2
  445. data/lib/rubocop/lsp/stdin_runner.rb +85 -0
  446. data/lib/rubocop/magic_comment.rb +11 -3
  447. data/lib/rubocop/options.rb +28 -12
  448. data/lib/rubocop/path_util.rb +15 -8
  449. data/lib/rubocop/plugin/configuration_integrator.rb +143 -0
  450. data/lib/rubocop/plugin/load_error.rb +26 -0
  451. data/lib/rubocop/plugin/loader.rb +100 -0
  452. data/lib/rubocop/plugin/not_supported_error.rb +29 -0
  453. data/lib/rubocop/plugin.rb +46 -0
  454. data/lib/rubocop/rake_task.rb +4 -1
  455. data/lib/rubocop/result_cache.rb +13 -13
  456. data/lib/rubocop/rspec/cop_helper.rb +13 -1
  457. data/lib/rubocop/rspec/expect_offense.rb +6 -2
  458. data/lib/rubocop/rspec/shared_contexts.rb +38 -1
  459. data/lib/rubocop/rspec/support.rb +4 -2
  460. data/lib/rubocop/runner.rb +26 -15
  461. data/lib/rubocop/server/cache.rb +47 -11
  462. data/lib/rubocop/server/cli.rb +2 -2
  463. data/lib/rubocop/target_finder.rb +7 -2
  464. data/lib/rubocop/target_ruby.rb +17 -2
  465. data/lib/rubocop/version.rb +53 -12
  466. data/lib/rubocop.rb +32 -1
  467. data/lib/ruby_lsp/rubocop/addon.rb +75 -0
  468. data/lib/ruby_lsp/rubocop/runtime_adapter.rb +65 -0
  469. metadata +79 -20
  470. data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
  471. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -52,7 +52,7 @@ module RuboCop
52
52
  each_missing_enable do |cop, line_range|
53
53
  next if acceptable_range?(cop, line_range)
54
54
 
55
- range = source_range(processed_source.buffer, line_range.min, (0..0))
55
+ range = source_range(processed_source.buffer, line_range.min, 0..0)
56
56
  comment = processed_source.comment_at_line(line_range.begin)
57
57
 
58
58
  add_offense(range, message: message(cop, comment))
@@ -97,7 +97,7 @@ module RuboCop
97
97
 
98
98
  # @!method class_new_block(node)
99
99
  def_node_matcher :class_new_block, <<~RUBY
100
- ({block numblock}
100
+ (any_block
101
101
  (send
102
102
  (const {nil? cbase} :Class) :new $_) ...)
103
103
  RUBY
@@ -135,7 +135,7 @@ module RuboCop
135
135
  end
136
136
 
137
137
  def inside_class_with_stateful_parent?(node)
138
- if (block_node = node.each_ancestor(:block, :numblock).first)
138
+ if (block_node = node.each_ancestor(:any_block).first)
139
139
  return false unless (super_class = class_new_block(block_node))
140
140
 
141
141
  !allowed_class?(super_class)
@@ -8,7 +8,7 @@ module RuboCop
8
8
  # Offenses are registered for regexp character classes like `/[A-z]/`
9
9
  # as well as range objects like `('A'..'z')`.
10
10
  #
11
- # NOTE: Range objects cannot be autocorrected.
11
+ # NOTE: `Range` objects cannot be autocorrected.
12
12
  #
13
13
  # @safety
14
14
  # The cop autocorrects regexp character classes
@@ -36,12 +36,9 @@ module RuboCop
36
36
 
37
37
  def on_irange(node)
38
38
  return unless node.children.compact.all?(&:str_type?)
39
+ return if node.begin.nil? || node.end.nil?
39
40
 
40
- range_start, range_end = node.children
41
-
42
- return if range_start.nil? || range_end.nil?
43
-
44
- add_offense(node) if unsafe_range?(range_start.value, range_end.value)
41
+ add_offense(node) if unsafe_range?(node.begin.value, node.end.value)
45
42
  end
46
43
  alias on_erange on_irange
47
44
 
@@ -82,7 +79,7 @@ module RuboCop
82
79
  end
83
80
 
84
81
  def range_pairs(expr)
85
- RuboCop::Cop::Utils::RegexpRanges.new(expr).pairs
82
+ expr.expressions.filter_map { |e| [e.expressions[0], e.expressions[1]] if e.type == :set }
86
83
  end
87
84
 
88
85
  def unsafe_range?(range_start, range_end)
@@ -97,7 +94,7 @@ module RuboCop
97
94
 
98
95
  def skip_range?(range_start, range_end)
99
96
  [range_start, range_end].any? do |bound|
100
- bound.type != :literal
97
+ bound&.type != :literal
101
98
  end
102
99
  end
103
100
 
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Lint
6
- # Do not mix named captures and numbered captures in a Regexp literal
6
+ # Do not mix named captures and numbered captures in a `Regexp` literal
7
7
  # because numbered capture is ignored if they're mixed.
8
8
  # Replace numbered captures with non-capturing groupings or
9
9
  # named captures.
@@ -95,14 +95,14 @@ module RuboCop
95
95
  MSG = 'Method definitions must not be nested. Use `lambda` instead.'
96
96
 
97
97
  def on_def(node)
98
- subject, = *node
99
- return if node.defs_type? && subject.variable?
98
+ subject, = *node # rubocop:disable InternalAffairs/NodeDestructuring
99
+ return if node.defs_type? && allowed_subject_type?(subject)
100
100
 
101
- def_ancestor = node.each_ancestor(:def, :defs).first
101
+ def_ancestor = node.each_ancestor(:any_def).first
102
102
  return unless def_ancestor
103
103
 
104
104
  within_scoping_def =
105
- node.each_ancestor(:block, :numblock, :sclass).any? do |ancestor|
105
+ node.each_ancestor(:any_block, :sclass).any? do |ancestor|
106
106
  scoping_method_call?(ancestor)
107
107
  end
108
108
 
@@ -117,6 +117,10 @@ module RuboCop
117
117
  child.class_constructor? || allowed_method_name?(child)
118
118
  end
119
119
 
120
+ def allowed_subject_type?(subject)
121
+ subject.variable? || subject.const_type? || subject.call_type?
122
+ end
123
+
120
124
  def allowed_method_name?(node)
121
125
  name = node.method_name
122
126
 
@@ -125,12 +129,12 @@ module RuboCop
125
129
 
126
130
  # @!method eval_call?(node)
127
131
  def_node_matcher :eval_call?, <<~PATTERN
128
- ({block numblock} (send _ {:instance_eval :class_eval :module_eval} ...) ...)
132
+ (any_block (send _ {:instance_eval :class_eval :module_eval} ...) ...)
129
133
  PATTERN
130
134
 
131
135
  # @!method exec_call?(node)
132
136
  def_node_matcher :exec_call?, <<~PATTERN
133
- ({block numblock} (send _ {:instance_exec :class_exec :module_exec} ...) ...)
137
+ (any_block (send _ {:instance_exec :class_exec :module_exec} ...) ...)
134
138
  PATTERN
135
139
  end
136
140
  end
@@ -43,7 +43,7 @@ module RuboCop
43
43
  PATTERN
44
44
 
45
45
  def parent_block_node(node)
46
- node.each_ancestor(:block, :numblock).first
46
+ node.each_ancestor(:any_block).first
47
47
  end
48
48
  end
49
49
  end
@@ -45,8 +45,8 @@ module RuboCop
45
45
  end
46
46
  end
47
47
  end
48
- alias on_or_asgn on_lvasgn
49
- alias on_op_asgn on_lvasgn
48
+ alias on_or_asgn on_lvasgn
49
+ alias on_op_asgn on_lvasgn
50
50
  end
51
51
  end
52
52
  end
@@ -59,12 +59,12 @@ module RuboCop
59
59
 
60
60
  # @!method send_exist_node(node)
61
61
  def_node_search :send_exist_node, <<~PATTERN
62
- $(send (const nil? {:FileTest :File :Dir :Shell}) {:exist? :exists?} ...)
62
+ $(send (const {cbase nil?} {:FileTest :File :Dir :Shell}) {:exist? :exists?} ...)
63
63
  PATTERN
64
64
 
65
65
  # @!method receiver_and_method_name(node)
66
66
  def_node_matcher :receiver_and_method_name, <<~PATTERN
67
- (send (const nil? $_) $_ ...)
67
+ (send (const {cbase nil?} $_) $_ ...)
68
68
  PATTERN
69
69
 
70
70
  # @!method force?(node)
@@ -78,6 +78,7 @@ module RuboCop
78
78
  PATTERN
79
79
 
80
80
  def on_send(node)
81
+ return unless node.receiver&.const_type?
81
82
  return unless if_node_child?(node)
82
83
  return if explicit_not_force?(node)
83
84
  return unless (exist_node = send_exist_node(node.parent).first)
@@ -95,7 +96,7 @@ module RuboCop
95
96
  end
96
97
 
97
98
  def allowable_use_with_if?(if_node)
98
- if_node.condition.and_type? || if_node.condition.or_type? || if_node.else_branch
99
+ if_node.condition.operator_keyword? || if_node.else_branch
99
100
  end
100
101
 
101
102
  def register_offense(node, exist_node)
@@ -115,6 +116,7 @@ module RuboCop
115
116
 
116
117
  def message_remove_file_exist_check(node)
117
118
  receiver, method_name = receiver_and_method_name(node)
119
+
118
120
  format(MSG_REMOVE_FILE_EXIST_CHECK, receiver: receiver, method_name: method_name)
119
121
  end
120
122
 
@@ -134,6 +136,7 @@ module RuboCop
134
136
 
135
137
  corrector.replace(node.child_nodes.first.loc.name, 'FileUtils')
136
138
  corrector.replace(node.loc.selector, replacement_method(node))
139
+ corrector.insert_before(node.last_argument, 'mode: ') if require_mode_keyword?(node)
137
140
  end
138
141
 
139
142
  def replacement_method(node)
@@ -152,6 +155,12 @@ module RuboCop
152
155
  force_method_name?(node) || force_option?(node)
153
156
  end
154
157
 
158
+ def require_mode_keyword?(node)
159
+ return false unless node.receiver.const_name == 'Dir'
160
+
161
+ replacement_method(node) == 'mkdir_p' && node.arguments.length == 2
162
+ end
163
+
155
164
  def force_option?(node)
156
165
  node.arguments.any? { |arg| force?(arg) }
157
166
  end
@@ -59,11 +59,13 @@ module RuboCop
59
59
  #
60
60
  class NonDeterministicRequireOrder < Base
61
61
  extend AutoCorrector
62
+ extend TargetRubyVersion
62
63
 
63
64
  MSG = 'Sort files before requiring them.'
64
65
 
66
+ maximum_target_ruby_version 2.7
67
+
65
68
  def on_block(node)
66
- return if target_ruby_version >= 3.0
67
69
  return unless node.body
68
70
  return unless unsorted_dir_loop?(node.send_node)
69
71
 
@@ -75,7 +77,6 @@ module RuboCop
75
77
  end
76
78
 
77
79
  def on_numblock(node)
78
- return if target_ruby_version >= 3.0
79
80
  return unless node.body
80
81
  return unless unsorted_dir_loop?(node.send_node)
81
82
 
@@ -87,7 +88,6 @@ module RuboCop
87
88
  end
88
89
 
89
90
  def on_block_pass(node)
90
- return if target_ruby_version >= 3.0
91
91
  return unless method_require?(node)
92
92
  return unless unsorted_dir_pass?(node.parent)
93
93
 
@@ -46,7 +46,7 @@ module RuboCop
46
46
  def on_return(return_node)
47
47
  return if return_value?(return_node)
48
48
 
49
- return_node.each_ancestor(:block, :def, :defs) do |node|
49
+ return_node.each_ancestor(:any_block, :any_def) do |node|
50
50
  break if scoped_node?(node)
51
51
 
52
52
  # if a proc is passed to `Module#define_method` or
@@ -54,7 +54,7 @@ module RuboCop
54
54
  # non-local exit error
55
55
  break if define_method?(node.send_node)
56
56
 
57
- next unless node.arguments?
57
+ next if node.argument_list.empty?
58
58
 
59
59
  if chained_send?(node.send_node)
60
60
  add_offense(return_node.loc.keyword)
@@ -66,7 +66,7 @@ module RuboCop
66
66
  private
67
67
 
68
68
  def scoped_node?(node)
69
- node.def_type? || node.defs_type? || node.lambda?
69
+ node.any_def_type? || node.lambda?
70
70
  end
71
71
 
72
72
  def return_value?(return_node)
@@ -74,7 +74,6 @@ module RuboCop
74
74
  extend AutoCorrector
75
75
  include AllowedMethods
76
76
  include AllowedPattern
77
- include IgnoredNode
78
77
 
79
78
  CONVERSION_METHOD_CLASS_MAPPING = {
80
79
  to_i: "#{Integer.name}(%<number_object>s, 10)",
@@ -33,8 +33,7 @@ module RuboCop
33
33
  NUMBERED_PARAMETER_RANGE = (1..9).freeze
34
34
 
35
35
  def on_lvasgn(node)
36
- lhs, _rhs = *node
37
- return unless /\A_(\d+)\z/ =~ lhs
36
+ return unless /\A_(\d+)\z/ =~ node.name
38
37
 
39
38
  number = Regexp.last_match(1).to_i
40
39
  template = NUMBERED_PARAMETER_RANGE.include?(number) ? NUM_PARAM_MSG : LVAR_MSG
@@ -0,0 +1,93 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ # Certain numeric operations have a constant result, usually 0 or 1.
7
+ # Multiplying a number by 0 will always return 0.
8
+ # Dividing a number by itself or raising it to the power of 0 will always return 1.
9
+ # As such, they can be replaced with that result.
10
+ # These are probably leftover from debugging, or are mistakes.
11
+ # Other numeric operations that are similarly leftover from debugging or mistakes
12
+ # are handled by `Lint/UselessNumericOperation`.
13
+ #
14
+ # NOTE: This cop doesn't detect offenses for the `-` and `%` operator because it
15
+ # can't determine the type of `x`. If `x` is an `Array` or `String`, it doesn't perform
16
+ # a numeric operation.
17
+ #
18
+ # @example
19
+ #
20
+ # # bad
21
+ # x * 0
22
+ #
23
+ # # good
24
+ # 0
25
+ #
26
+ # # bad
27
+ # x *= 0
28
+ #
29
+ # # good
30
+ # x = 0
31
+ #
32
+ # # bad
33
+ # x / x
34
+ # x ** 0
35
+ #
36
+ # # good
37
+ # 1
38
+ #
39
+ # # bad
40
+ # x /= x
41
+ # x **= 0
42
+ #
43
+ # # good
44
+ # x = 1
45
+ #
46
+ class NumericOperationWithConstantResult < Base
47
+ extend AutoCorrector
48
+ MSG = 'Numeric operation with a constant result detected.'
49
+ RESTRICT_ON_SEND = %i[* / **].freeze
50
+
51
+ # @!method operation_with_constant_result?(node)
52
+ def_node_matcher :operation_with_constant_result?,
53
+ '(call (call nil? $_lhs) $_operation ({int | call nil?} $_rhs))'
54
+
55
+ # @!method abbreviated_assignment_with_constant_result?(node)
56
+ def_node_matcher :abbreviated_assignment_with_constant_result?,
57
+ '(op-asgn (lvasgn $_lhs) $_operation ({int lvar} $_rhs))'
58
+
59
+ def on_send(node)
60
+ return unless (lhs, operation, rhs = operation_with_constant_result?(node))
61
+ return unless (result = constant_result?(lhs, operation, rhs))
62
+
63
+ add_offense(node) do |corrector|
64
+ corrector.replace(node, result.to_s)
65
+ end
66
+ end
67
+ alias on_csend on_send
68
+
69
+ def on_op_asgn(node)
70
+ return unless (lhs, operation, rhs = abbreviated_assignment_with_constant_result?(node))
71
+ return unless (result = constant_result?(lhs, operation, rhs))
72
+
73
+ add_offense(node) do |corrector|
74
+ corrector.replace(node, "#{lhs} = #{result}")
75
+ end
76
+ end
77
+
78
+ private
79
+
80
+ def constant_result?(lhs, operation, rhs)
81
+ if rhs.to_s == '0'
82
+ return 0 if operation == :*
83
+ return 1 if operation == :**
84
+ elsif rhs == lhs
85
+ return 1 if operation == :/
86
+ end
87
+ # If we weren't able to find any matches, return false so we can bail out.
88
+ false
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -27,11 +27,10 @@ module RuboCop
27
27
  MSG = 'Avoid using or-assignment with constants.'
28
28
 
29
29
  def on_or_asgn(node)
30
- lhs, _rhs = *node
31
- return unless lhs&.casgn_type?
30
+ return unless node.lhs&.casgn_type?
32
31
 
33
32
  add_offense(node.loc.operator) do |corrector|
34
- next if node.each_ancestor(:def, :defs).any?
33
+ next if node.each_ancestor(:any_def).any?
35
34
 
36
35
  corrector.replace(node.loc.operator, '=')
37
36
  end
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Lint
6
- # Looks for references of Regexp captures that are out of range
6
+ # Looks for references of `Regexp` captures that are out of range
7
7
  # and thus always returns nil.
8
8
  #
9
9
  # @safety
@@ -61,6 +61,7 @@ module RuboCop
61
61
  check_regexp(node.receiver)
62
62
  end
63
63
  end
64
+ alias after_csend after_send
64
65
 
65
66
  def on_when(node)
66
67
  regexp_conditions = node.conditions.select(&:regexp_type?)
@@ -75,7 +76,7 @@ module RuboCop
75
76
  end
76
77
 
77
78
  def on_nth_ref(node)
78
- backref, = *node
79
+ backref = node.children.first
79
80
  return if @valid_ref.nil? || backref <= @valid_ref
80
81
 
81
82
  message = format(
@@ -38,16 +38,12 @@ module RuboCop
38
38
 
39
39
  def valid_context?(node)
40
40
  return true unless node.arguments.one? && node.first_argument.parenthesized_call?
41
- return true if first_argument_block_type?(node.first_argument)
41
+ return true if node.first_argument.any_block_type?
42
42
 
43
43
  node.operator_method? || node.setter_method? || chained_calls?(node) ||
44
44
  valid_first_argument?(node.first_argument)
45
45
  end
46
46
 
47
- def first_argument_block_type?(first_arg)
48
- first_arg.block_type? || first_arg.numblock_type?
49
- end
50
-
51
47
  def valid_first_argument?(first_arg)
52
48
  first_arg.operator_keyword? || first_arg.hash_type? || ternary_expression?(first_arg) ||
53
49
  compound_range?(first_arg)
@@ -3,15 +3,18 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Lint
6
- # Checks for `raise` or `fail` statements which are
7
- # raising `Exception` class.
6
+ # Checks for `raise` or `fail` statements which raise `Exception` or
7
+ # `Exception.new`. Use `StandardError` or a specific exception class instead.
8
8
  #
9
- # You can specify a module name that will be an implicit namespace
10
- # using `AllowedImplicitNamespaces` option. The cop cause a false positive
11
- # for namespaced `Exception` when a namespace is omitted. This option can
12
- # prevent the false positive by specifying a namespace to be omitted for
13
- # `Exception`. Alternatively, make `Exception` a fully qualified class
14
- # name with an explicit namespace.
9
+ # If you have defined your own namespaced `Exception` class, it is possible
10
+ # to configure the cop to allow it by setting `AllowedImplicitNamespaces` to
11
+ # an array with the names of the namespaces to allow. By default, this is set to
12
+ # `['Gem']`, which allows `Gem::Exception` to be raised without an explicit namespace.
13
+ # If not allowed, a false positive may be registered if `raise Exception` is called
14
+ # within the namespace.
15
+ #
16
+ # Alternatively, use a fully qualified name with `raise`/`fail`
17
+ # (eg. `raise Namespace::Exception`).
15
18
  #
16
19
  # @safety
17
20
  # This cop is unsafe because it will change the exception class being
@@ -20,15 +23,31 @@ module RuboCop
20
23
  # @example
21
24
  # # bad
22
25
  # raise Exception, 'Error message here'
26
+ # raise Exception.new('Error message here')
23
27
  #
24
28
  # # good
25
29
  # raise StandardError, 'Error message here'
30
+ # raise MyError.new, 'Error message here'
31
+ #
32
+ # @example AllowedImplicitNamespaces: ['Gem'] (default)
33
+ # # bad - `Foo` is not an allowed implicit namespace
34
+ # module Foo
35
+ # def self.foo
36
+ # raise Exception # This is qualified to `Foo::Exception`.
37
+ # end
38
+ # end
26
39
  #
27
- # @example AllowedImplicitNamespaces: ['Gem']
28
40
  # # good
29
41
  # module Gem
30
42
  # def self.foo
31
- # raise Exception # This exception means `Gem::Exception`.
43
+ # raise Exception # This is qualified to `Gem::Exception`.
44
+ # end
45
+ # end
46
+ #
47
+ # # good
48
+ # module Foo
49
+ # def self.foo
50
+ # raise Foo::Exception
32
51
  # end
33
52
  # end
34
53
  class RaiseException < Base
@@ -111,7 +111,7 @@ module RuboCop
111
111
  range_between(start + begin_pos - 1, start + end_pos)
112
112
  end
113
113
 
114
- # If the list of cops is comma-separated, but without a empty space after the comma,
114
+ # If the list of cops is comma-separated, but without an empty space after the comma,
115
115
  # we should **not** remove the prepending empty space, thus begin_pos += 1
116
116
  def range_with_comma_after(comment, start, begin_pos, end_pos)
117
117
  begin_pos += 1 if comment.source[end_pos + 1] != ' '
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Lint
6
- # Checks for redundant quantifiers inside Regexp literals.
6
+ # Checks for redundant quantifiers inside `Regexp` literals.
7
7
  #
8
8
  # It is always allowed when interpolation is used in a regexp literal,
9
9
  # because it's unknown what kind of string will be expanded as a result:
@@ -17,17 +17,12 @@ module RuboCop
17
17
  # * 2.0+ ... `enumerator`
18
18
  # * 2.1+ ... `thread`
19
19
  # * 2.2+ ... Add `rational` and `complex` above
20
- # * 2.5+ ... Add `pp` above
21
20
  # * 2.7+ ... Add `ruby2_keywords` above
22
21
  # * 3.1+ ... Add `fiber` above
23
22
  # * 3.2+ ... `set`
24
23
  #
25
24
  # This cop target those features.
26
25
  #
27
- # @safety
28
- # This cop's autocorrection is unsafe because if `require 'pp'` is removed from one file,
29
- # `NameError` can be encountered when another file uses `PP.pp`.
30
- #
31
26
  # @example
32
27
  # # bad
33
28
  # require 'unloaded_feature'
@@ -42,10 +37,6 @@ module RuboCop
42
37
  MSG = 'Remove unnecessary `require` statement.'
43
38
  RESTRICT_ON_SEND = %i[require].freeze
44
39
  RUBY_22_LOADED_FEATURES = %w[rational complex].freeze
45
- PRETTY_PRINT_METHODS = %i[
46
- pretty_inspect pretty_print pretty_print_cycle
47
- pretty_print_inspect pretty_print_instance_variables
48
- ].freeze
49
40
 
50
41
  # @!method redundant_require_statement?(node)
51
42
  def_node_matcher :redundant_require_statement?, <<~PATTERN
@@ -53,11 +44,6 @@ module RuboCop
53
44
  (str #redundant_feature?))
54
45
  PATTERN
55
46
 
56
- # @!method pp_const?(node)
57
- def_node_matcher :pp_const?, <<~PATTERN
58
- (const {nil? cbase} :PP)
59
- PATTERN
60
-
61
47
  def on_send(node)
62
48
  return unless redundant_require_statement?(node)
63
49
 
@@ -81,18 +67,11 @@ module RuboCop
81
67
  feature_name == 'enumerator' ||
82
68
  (target_ruby_version >= 2.1 && feature_name == 'thread') ||
83
69
  (target_ruby_version >= 2.2 && RUBY_22_LOADED_FEATURES.include?(feature_name)) ||
84
- (target_ruby_version >= 2.5 && feature_name == 'pp' && !need_to_require_pp?) ||
85
70
  (target_ruby_version >= 2.7 && feature_name == 'ruby2_keywords') ||
86
71
  (target_ruby_version >= 3.1 && feature_name == 'fiber') ||
87
72
  (target_ruby_version >= 3.2 && feature_name == 'set')
88
73
  end
89
74
  # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
90
-
91
- def need_to_require_pp?
92
- processed_source.ast.each_descendant(:send).any? do |node|
93
- pp_const?(node.receiver) || PRETTY_PRINT_METHODS.include?(node.method_name)
94
- end
95
- end
96
75
  end
97
76
  end
98
77
  end
@@ -6,7 +6,7 @@ module RuboCop
6
6
  # Checks for redundant safe navigation calls.
7
7
  # Use cases where a constant, named in camel case for classes and modules is `nil` are rare,
8
8
  # and an offense is not detected when the receiver is a constant. The detection also applies
9
- # to literal receivers, except for `nil`.
9
+ # to `self`, and to literal receivers, except for `nil`.
10
10
  #
11
11
  # For all receivers, the `instance_of?`, `kind_of?`, `is_a?`, `eql?`, `respond_to?`,
12
12
  # and `equal?` methods are checked by default.
@@ -29,6 +29,9 @@ module RuboCop
29
29
  # # bad
30
30
  # CamelCaseConst&.do_something
31
31
  #
32
+ # # good
33
+ # CamelCaseConst.do_something
34
+ #
32
35
  # # bad
33
36
  # do_something if attrs&.respond_to?(:[])
34
37
  #
@@ -41,9 +44,6 @@ module RuboCop
41
44
  # end
42
45
  #
43
46
  # # good
44
- # CamelCaseConst.do_something
45
- #
46
- # # good
47
47
  # while node.is_a?(BeginNode)
48
48
  # node = node.parent
49
49
  # end
@@ -67,6 +67,12 @@ module RuboCop
67
67
  # foo.to_f
68
68
  # foo.to_s
69
69
  #
70
+ # # bad
71
+ # self&.foo
72
+ #
73
+ # # good
74
+ # self.foo
75
+ #
70
76
  # @example AllowedMethods: [nil_safe_method]
71
77
  # # bad
72
78
  # do_something if attrs&.nil_safe_method(:[])
@@ -133,7 +139,7 @@ module RuboCop
133
139
  def assume_receiver_instance_exists?(receiver)
134
140
  return true if receiver.const_type? && !receiver.short_name.match?(SNAKE_CASE)
135
141
 
136
- receiver.literal? && !receiver.nil_type?
142
+ receiver.self_type? || (receiver.literal? && !receiver.nil_type?)
137
143
  end
138
144
 
139
145
  def check?(node)
@@ -141,8 +147,7 @@ module RuboCop
141
147
  return false unless parent
142
148
 
143
149
  condition?(parent, node) ||
144
- parent.and_type? ||
145
- parent.or_type? ||
150
+ parent.operator_keyword? ||
146
151
  (parent.send_type? && parent.negation_method?)
147
152
  end
148
153