rubocop 1.69.2 → 1.72.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +2 -2
  4. data/config/default.yml +66 -2
  5. data/lib/rubocop/cli/command/execute_runner.rb +3 -3
  6. data/lib/rubocop/cli/command/show_cops.rb +24 -2
  7. data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
  8. data/lib/rubocop/comment_config.rb +2 -2
  9. data/lib/rubocop/config.rb +17 -4
  10. data/lib/rubocop/config_loader.rb +48 -8
  11. data/lib/rubocop/config_loader_resolver.rb +33 -8
  12. data/lib/rubocop/config_validator.rb +18 -8
  13. data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
  14. data/lib/rubocop/cop/base.rb +6 -0
  15. data/lib/rubocop/cop/bundler/duplicated_gem.rb +1 -1
  16. data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
  17. data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
  18. data/lib/rubocop/cop/internal_affairs/example_description.rb +4 -2
  19. data/lib/rubocop/cop/internal_affairs/location_exists.rb +116 -0
  20. data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
  21. data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +3 -2
  22. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -1
  23. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
  24. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
  25. data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +229 -0
  26. data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
  27. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
  28. data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
  29. data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
  30. data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +3 -1
  31. data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
  32. data/lib/rubocop/cop/internal_affairs/undefined_config.rb +7 -1
  33. data/lib/rubocop/cop/internal_affairs.rb +5 -16
  34. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -1
  35. data/lib/rubocop/cop/layout/argument_alignment.rb +2 -8
  36. data/lib/rubocop/cop/layout/block_alignment.rb +3 -1
  37. data/lib/rubocop/cop/layout/class_structure.rb +9 -9
  38. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  39. data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
  40. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +1 -1
  41. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +7 -11
  42. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +1 -0
  43. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +1 -1
  44. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +22 -2
  45. data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
  46. data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
  47. data/lib/rubocop/cop/layout/first_argument_indentation.rb +3 -8
  48. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +2 -7
  49. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
  50. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
  51. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
  52. data/lib/rubocop/cop/layout/hash_alignment.rb +6 -4
  53. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -1
  54. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +7 -1
  55. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
  56. data/lib/rubocop/cop/layout/line_length.rb +1 -0
  57. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
  58. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
  59. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +1 -0
  60. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
  61. data/lib/rubocop/cop/layout/redundant_line_break.rb +7 -6
  62. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +1 -1
  63. data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -1
  64. data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
  65. data/lib/rubocop/cop/layout/space_after_comma.rb +1 -1
  66. data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
  67. data/lib/rubocop/cop/layout/space_after_semicolon.rb +1 -1
  68. data/lib/rubocop/cop/layout/space_around_keyword.rb +1 -0
  69. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
  70. data/lib/rubocop/cop/layout/space_around_operators.rb +3 -3
  71. data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
  72. data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
  73. data/lib/rubocop/cop/layout/trailing_whitespace.rb +5 -3
  74. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
  75. data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +119 -0
  76. data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
  77. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +1 -1
  78. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
  79. data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
  80. data/lib/rubocop/cop/lint/cop_directive_syntax.rb +84 -0
  81. data/lib/rubocop/cop/lint/debugger.rb +1 -1
  82. data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
  83. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -1
  84. data/lib/rubocop/cop/lint/duplicate_set_element.rb +20 -7
  85. data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
  86. data/lib/rubocop/cop/lint/float_comparison.rb +5 -2
  87. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  88. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
  89. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  90. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +24 -6
  91. data/lib/rubocop/cop/lint/missing_super.rb +2 -2
  92. data/lib/rubocop/cop/lint/mixed_case_range.rb +1 -1
  93. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  94. data/lib/rubocop/cop/lint/nested_method_definition.rb +8 -4
  95. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  96. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +4 -3
  97. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +1 -1
  98. data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +18 -31
  99. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +2 -1
  100. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -5
  101. data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
  102. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
  103. data/lib/rubocop/cop/lint/redundant_type_conversion.rb +231 -0
  104. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  105. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +8 -1
  106. data/lib/rubocop/cop/lint/shared_mutable_default.rb +65 -0
  107. data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
  108. data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
  109. data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
  110. data/lib/rubocop/cop/lint/syntax.rb +4 -1
  111. data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +1 -4
  112. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +1 -1
  113. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -1
  114. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  115. data/lib/rubocop/cop/lint/unreachable_loop.rb +1 -1
  116. data/lib/rubocop/cop/lint/useless_access_modifier.rb +4 -4
  117. data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
  118. data/lib/rubocop/cop/lint/useless_constant_scoping.rb +80 -0
  119. data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
  120. data/lib/rubocop/cop/lint/useless_numeric_operation.rb +2 -1
  121. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +2 -2
  122. data/lib/rubocop/cop/lint/void.rb +5 -9
  123. data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
  124. data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
  125. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -1
  126. data/lib/rubocop/cop/metrics/method_length.rb +8 -1
  127. data/lib/rubocop/cop/metrics/module_length.rb +1 -1
  128. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
  129. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
  130. data/lib/rubocop/cop/mixin/alignment.rb +2 -2
  131. data/lib/rubocop/cop/mixin/allowed_pattern.rb +4 -4
  132. data/lib/rubocop/cop/mixin/check_line_breakable.rb +11 -11
  133. data/lib/rubocop/cop/mixin/comments_help.rb +4 -2
  134. data/lib/rubocop/cop/mixin/dig_help.rb +1 -1
  135. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -1
  136. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +22 -22
  137. data/lib/rubocop/cop/mixin/hash_subset.rb +188 -0
  138. data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
  139. data/lib/rubocop/cop/mixin/method_complexity.rb +1 -1
  140. data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
  141. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +48 -24
  142. data/lib/rubocop/cop/mixin/range_help.rb +3 -3
  143. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
  144. data/lib/rubocop/cop/mixin/statement_modifier.rb +8 -3
  145. data/lib/rubocop/cop/mixin/string_help.rb +2 -2
  146. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  147. data/lib/rubocop/cop/mixin/trailing_comma.rb +3 -3
  148. data/lib/rubocop/cop/naming/block_forwarding.rb +19 -15
  149. data/lib/rubocop/cop/naming/predicate_name.rb +44 -0
  150. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +3 -3
  151. data/lib/rubocop/cop/security/compound_hash.rb +1 -0
  152. data/lib/rubocop/cop/style/access_modifier_declarations.rb +34 -5
  153. data/lib/rubocop/cop/style/and_or.rb +1 -1
  154. data/lib/rubocop/cop/style/arguments_forwarding.rb +39 -23
  155. data/lib/rubocop/cop/style/array_first_last.rb +18 -2
  156. data/lib/rubocop/cop/style/block_delimiters.rb +7 -20
  157. data/lib/rubocop/cop/style/class_and_module_children.rb +6 -3
  158. data/lib/rubocop/cop/style/collection_methods.rb +1 -1
  159. data/lib/rubocop/cop/style/combinable_defined.rb +1 -1
  160. data/lib/rubocop/cop/style/combinable_loops.rb +2 -2
  161. data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
  162. data/lib/rubocop/cop/style/conditional_assignment.rb +6 -4
  163. data/lib/rubocop/cop/style/documentation.rb +1 -1
  164. data/lib/rubocop/cop/style/double_negation.rb +3 -3
  165. data/lib/rubocop/cop/style/each_for_simple_loop.rb +4 -7
  166. data/lib/rubocop/cop/style/each_with_object.rb +2 -3
  167. data/lib/rubocop/cop/style/empty_else.rb +4 -2
  168. data/lib/rubocop/cop/style/empty_literal.rb +1 -1
  169. data/lib/rubocop/cop/style/empty_method.rb +1 -1
  170. data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
  171. data/lib/rubocop/cop/style/exact_regexp_match.rb +3 -10
  172. data/lib/rubocop/cop/style/explicit_block_argument.rb +15 -2
  173. data/lib/rubocop/cop/style/exponential_notation.rb +1 -1
  174. data/lib/rubocop/cop/style/fetch_env_var.rb +1 -1
  175. data/lib/rubocop/cop/style/float_division.rb +8 -4
  176. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
  177. data/lib/rubocop/cop/style/hash_each_methods.rb +3 -6
  178. data/lib/rubocop/cop/style/hash_except.rb +24 -148
  179. data/lib/rubocop/cop/style/hash_slice.rb +80 -0
  180. data/lib/rubocop/cop/style/hash_syntax.rb +6 -3
  181. data/lib/rubocop/cop/style/identical_conditional_branches.rb +22 -3
  182. data/lib/rubocop/cop/style/if_unless_modifier.rb +3 -3
  183. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +1 -1
  184. data/lib/rubocop/cop/style/if_with_semicolon.rb +2 -2
  185. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  186. data/lib/rubocop/cop/style/inverse_methods.rb +6 -6
  187. data/lib/rubocop/cop/style/it_assignment.rb +36 -0
  188. data/lib/rubocop/cop/style/keyword_parameters_order.rb +1 -1
  189. data/lib/rubocop/cop/style/map_into_array.rb +1 -1
  190. data/lib/rubocop/cop/style/map_to_hash.rb +1 -1
  191. data/lib/rubocop/cop/style/map_to_set.rb +3 -2
  192. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +19 -12
  193. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -0
  194. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +2 -1
  195. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -4
  196. data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
  197. data/lib/rubocop/cop/style/missing_else.rb +2 -0
  198. data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -1
  199. data/lib/rubocop/cop/style/multiple_comparison.rb +26 -20
  200. data/lib/rubocop/cop/style/mutable_constant.rb +3 -3
  201. data/lib/rubocop/cop/style/negated_if_else_condition.rb +1 -1
  202. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +1 -1
  203. data/lib/rubocop/cop/style/object_then.rb +13 -15
  204. data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
  205. data/lib/rubocop/cop/style/parallel_assignment.rb +1 -5
  206. data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
  207. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  208. data/lib/rubocop/cop/style/proc.rb +1 -2
  209. data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
  210. data/lib/rubocop/cop/style/raise_args.rb +6 -4
  211. data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
  212. data/lib/rubocop/cop/style/redundant_begin.rb +1 -1
  213. data/lib/rubocop/cop/style/redundant_condition.rb +2 -2
  214. data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +2 -1
  215. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +6 -10
  216. data/lib/rubocop/cop/style/redundant_each.rb +1 -1
  217. data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
  218. data/lib/rubocop/cop/style/redundant_format.rb +238 -0
  219. data/lib/rubocop/cop/style/redundant_freeze.rb +2 -2
  220. data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
  221. data/lib/rubocop/cop/style/redundant_line_continuation.rb +34 -13
  222. data/lib/rubocop/cop/style/redundant_parentheses.rb +28 -14
  223. data/lib/rubocop/cop/style/redundant_regexp_argument.rb +3 -0
  224. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
  225. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -1
  226. data/lib/rubocop/cop/style/redundant_self_assignment.rb +14 -28
  227. data/lib/rubocop/cop/style/redundant_sort.rb +2 -2
  228. data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -2
  229. data/lib/rubocop/cop/style/return_nil.rb +1 -1
  230. data/lib/rubocop/cop/style/safe_navigation.rb +2 -2
  231. data/lib/rubocop/cop/style/semicolon.rb +1 -1
  232. data/lib/rubocop/cop/style/send_with_literal_method_name.rb +2 -1
  233. data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
  234. data/lib/rubocop/cop/style/single_line_do_end_block.rb +1 -2
  235. data/lib/rubocop/cop/style/single_line_methods.rb +3 -4
  236. data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
  237. data/lib/rubocop/cop/style/sole_nested_conditional.rb +2 -2
  238. data/lib/rubocop/cop/style/string_concatenation.rb +1 -1
  239. data/lib/rubocop/cop/style/string_literals.rb +1 -1
  240. data/lib/rubocop/cop/style/string_methods.rb +1 -1
  241. data/lib/rubocop/cop/style/super_arguments.rb +65 -17
  242. data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
  243. data/lib/rubocop/cop/style/top_level_method_definition.rb +1 -1
  244. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +4 -1
  245. data/lib/rubocop/cop/style/while_until_modifier.rb +0 -1
  246. data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
  247. data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
  248. data/lib/rubocop/cop/util.rb +12 -5
  249. data/lib/rubocop/cop/utils/format_string.rb +7 -5
  250. data/lib/rubocop/cop/variable_force/variable.rb +14 -2
  251. data/lib/rubocop/cop/variable_force/variable_table.rb +3 -3
  252. data/lib/rubocop/cops_documentation_generator.rb +13 -13
  253. data/lib/rubocop/directive_comment.rb +44 -10
  254. data/lib/rubocop/formatter/formatter_set.rb +1 -1
  255. data/lib/rubocop/lsp/diagnostic.rb +189 -0
  256. data/lib/rubocop/lsp/logger.rb +2 -2
  257. data/lib/rubocop/lsp/routes.rb +7 -23
  258. data/lib/rubocop/lsp/runtime.rb +17 -49
  259. data/lib/rubocop/lsp/server.rb +0 -2
  260. data/lib/rubocop/lsp/stdin_runner.rb +83 -0
  261. data/lib/rubocop/options.rb +28 -12
  262. data/lib/rubocop/path_util.rb +15 -8
  263. data/lib/rubocop/plugin/configuration_integrator.rb +143 -0
  264. data/lib/rubocop/plugin/load_error.rb +26 -0
  265. data/lib/rubocop/plugin/loader.rb +100 -0
  266. data/lib/rubocop/plugin/not_supported_error.rb +29 -0
  267. data/lib/rubocop/plugin.rb +39 -0
  268. data/lib/rubocop/rake_task.rb +4 -1
  269. data/lib/rubocop/result_cache.rb +13 -13
  270. data/lib/rubocop/rspec/cop_helper.rb +9 -0
  271. data/lib/rubocop/rspec/expect_offense.rb +6 -2
  272. data/lib/rubocop/rspec/shared_contexts.rb +4 -1
  273. data/lib/rubocop/rspec/support.rb +1 -2
  274. data/lib/rubocop/runner.rb +5 -6
  275. data/lib/rubocop/server/cache.rb +35 -2
  276. data/lib/rubocop/server/cli.rb +2 -2
  277. data/lib/rubocop/target_finder.rb +1 -0
  278. data/lib/rubocop/target_ruby.rb +15 -0
  279. data/lib/rubocop/version.rb +17 -2
  280. data/lib/rubocop.rb +11 -0
  281. data/lib/ruby_lsp/rubocop/addon.rb +75 -0
  282. data/lib/ruby_lsp/rubocop/runtime_adapter.rb +47 -0
  283. metadata +53 -15
  284. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -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
@@ -117,7 +117,7 @@ module RuboCop
117
117
  end
118
118
 
119
119
  def instance_eval_block?(node)
120
- node.block_type? && node.method?(:instance_eval)
120
+ node.any_block_type? && node.method?(:instance_eval)
121
121
  end
122
122
 
123
123
  def report_on_flow_command?(node)
@@ -108,7 +108,7 @@ module RuboCop
108
108
  private
109
109
 
110
110
  def loop_method?(node)
111
- return false unless node.block_type? || node.numblock_type?
111
+ return false unless node.any_block_type?
112
112
 
113
113
  send_node = node.send_node
114
114
  loopable = send_node.enumerable_method? || send_node.enumerator_method? ||
@@ -159,12 +159,12 @@ module RuboCop
159
159
 
160
160
  # @!method dynamic_method_definition?(node)
161
161
  def_node_matcher :dynamic_method_definition?, <<~PATTERN
162
- {(send nil? :define_method ...) ({block numblock} (send nil? :define_method ...) ...)}
162
+ {(send nil? :define_method ...) (any_block (send nil? :define_method ...) ...)}
163
163
  PATTERN
164
164
 
165
165
  # @!method class_or_instance_eval?(node)
166
166
  def_node_matcher :class_or_instance_eval?, <<~PATTERN
167
- ({block numblock} (send _ {:class_eval :instance_eval}) ...)
167
+ (any_block (send _ {:class_eval :instance_eval}) ...)
168
168
  PATTERN
169
169
 
170
170
  def check_node(node)
@@ -268,7 +268,7 @@ module RuboCop
268
268
  end
269
269
 
270
270
  def start_of_new_scope?(child)
271
- child.module_type? || child.class_type? || child.sclass_type? || eval_call?(child)
271
+ child.type?(:module, :class, :sclass) || eval_call?(child)
272
272
  end
273
273
 
274
274
  def eval_call?(child)
@@ -282,7 +282,7 @@ module RuboCop
282
282
  matcher_name = :"#{m}_block?"
283
283
  unless respond_to?(matcher_name)
284
284
  self.class.def_node_matcher matcher_name, <<~PATTERN
285
- ({block numblock} (send {nil? const} {:#{m}} ...) ...)
285
+ (any_block (send {nil? const} {:#{m}} ...) ...)
286
286
  PATTERN
287
287
  end
288
288
 
@@ -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,80 @@
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` or `class << self`. Even if `private` access modifier is used,
8
+ # it is public scope despite 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
+ # class << self
30
+ # private
31
+ # PRIVATE_CONST = 42
32
+ # end
33
+ # end
34
+ #
35
+ # # good
36
+ # class Foo
37
+ # PUBLIC_CONST = 42 # If private scope is not intended.
38
+ # end
39
+ #
40
+ class UselessConstantScoping < Base
41
+ MSG = 'Useless `private` access modifier for constant scope.'
42
+
43
+ # @!method private_constants(node)
44
+ def_node_matcher :private_constants, <<~PATTERN
45
+ (send nil? :private_constant $...)
46
+ PATTERN
47
+
48
+ def on_casgn(node)
49
+ return if node.each_ancestor(:sclass).any?
50
+ return unless after_private_modifier?(node.left_siblings)
51
+ return if private_constantize?(node.right_siblings, node.name)
52
+
53
+ add_offense(node)
54
+ end
55
+
56
+ private
57
+
58
+ def after_private_modifier?(left_siblings)
59
+ access_modifier_candidates = left_siblings.compact.select do |left_sibling|
60
+ left_sibling.respond_to?(:send_type?) && left_sibling.send_type?
61
+ end
62
+
63
+ access_modifier_candidates.any? do |candidate|
64
+ candidate.command?(:private) && candidate.arguments.none?
65
+ end
66
+ end
67
+
68
+ def private_constantize?(right_siblings, const_value)
69
+ private_constant_arguments = right_siblings.map { |node| private_constants(node) }
70
+
71
+ private_constant_values = private_constant_arguments.flatten.filter_map do |constant|
72
+ constant.value.to_sym if constant.respond_to?(:value)
73
+ end
74
+
75
+ private_constant_values.include?(const_value)
76
+ end
77
+ end
78
+ end
79
+ end
80
+ 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)
@@ -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)
@@ -103,7 +103,7 @@ module RuboCop
103
103
  expressions.pop unless in_void_context?(node)
104
104
  expressions.each do |expr|
105
105
  check_void_op(expr) do
106
- block_node = node.each_ancestor(:block).first
106
+ block_node = node.each_ancestor(:any_block).first
107
107
 
108
108
  block_node&.method?(:each)
109
109
  end
@@ -113,7 +113,8 @@ module RuboCop
113
113
  end
114
114
 
115
115
  def check_expression(expr)
116
- expr = expr.body if expr.if_type? && expr.modifier_form?
116
+ expr = expr.body if expr.if_type?
117
+ return unless expr
117
118
 
118
119
  check_literal(expr)
119
120
  check_var(expr)
@@ -178,7 +179,7 @@ module RuboCop
178
179
  end
179
180
 
180
181
  def check_nonmutating(node)
181
- return if !node.send_type? && !node.block_type? && !node.numblock_type?
182
+ return unless node.type?(:send, :any_block)
182
183
 
183
184
  method_name = node.method_name
184
185
  return unless NONMUTATING_METHODS.include?(method_name)
@@ -200,11 +201,6 @@ module RuboCop
200
201
  # NOTE: the `begin` node case is already handled via `on_begin`
201
202
  return if body.begin_type?
202
203
 
203
- check_void_op(body) do
204
- block_node = node.each_ancestor(:block).first
205
- block_node&.method?(:each)
206
- end
207
-
208
204
  check_expression(body)
209
205
  end
210
206
 
@@ -229,7 +225,7 @@ module RuboCop
229
225
  end
230
226
 
231
227
  def autocorrect_void_expression(corrector, node)
232
- return if node.parent.if_type? && node.parent.modifier_form?
228
+ return if node.parent.if_type?
233
229
 
234
230
  corrector.remove(range_with_surrounding_space(range: node.source_range, side: :left))
235
231
  end
@@ -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,6 +57,9 @@ 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,6 +69,10 @@ module RuboCop
66
69
  def cop_label
67
70
  LABEL
68
71
  end
72
+
73
+ def allowed?(method_name)
74
+ allowed_method?(method_name) || matches_allowed_pattern?(method_name)
75
+ end
69
76
  end
70
77
  end
71
78
  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
 
@@ -26,6 +26,13 @@ module RuboCop
26
26
  extend NodePattern::Macros
27
27
  include RuboCop::AST::Sexp
28
28
 
29
+ VAR_SETTER_TO_GETTER = {
30
+ lvasgn: :lvar,
31
+ ivasgn: :ivar,
32
+ cvasgn: :cvar,
33
+ gvasgn: :gvar
34
+ }.freeze
35
+
29
36
  # Plug into the calculator
30
37
  def initialize(node, discount_repeated_attributes: false)
31
38
  super(node)
@@ -114,13 +121,6 @@ module RuboCop
114
121
  calls.fetch(value) { yield [calls, value] }
115
122
  end
116
123
 
117
- VAR_SETTER_TO_GETTER = {
118
- lvasgn: :lvar,
119
- ivasgn: :ivar,
120
- cvasgn: :cvar,
121
- gvasgn: :gvar
122
- }.freeze
123
-
124
124
  # @returns `[receiver, method | nil]` for the given setter `node`
125
125
  # or `nil` if it is not a setter.
126
126
  def setter_to_getter(node)
@@ -5,10 +5,10 @@ module RuboCop
5
5
  # This module checks for nodes that should be aligned to the left or right.
6
6
  # This amount is determined by the instance variable @column_delta.
7
7
  module Alignment
8
- private
9
-
10
8
  SPACE = ' '
11
9
 
10
+ private
11
+
12
12
  attr_reader :column_delta
13
13
 
14
14
  def configured_indentation_width
@@ -18,12 +18,12 @@ module RuboCop
18
18
  end
19
19
 
20
20
  # @deprecated Use allowed_line? instead
21
- def ignored_line?
21
+ def ignored_line?(line)
22
22
  warn Rainbow(<<~WARNING).yellow, uplevel: 1
23
23
  `ignored_line?` is deprecated. Use `allowed_line?` instead.
24
24
  WARNING
25
25
 
26
- allowed_line?
26
+ allowed_line?(line)
27
27
  end
28
28
 
29
29
  def matches_allowed_pattern?(line)
@@ -31,12 +31,12 @@ module RuboCop
31
31
  end
32
32
 
33
33
  # @deprecated Use matches_allowed_pattern? instead
34
- def matches_ignored_pattern?
34
+ def matches_ignored_pattern?(line)
35
35
  warn Rainbow(<<~WARNING).yellow, uplevel: 1
36
36
  `matches_ignored_pattern?` is deprecated. Use `matches_allowed_pattern?` instead.
37
37
  WARNING
38
38
 
39
- matches_allowed_pattern?
39
+ matches_allowed_pattern?(line)
40
40
  end
41
41
 
42
42
  def allowed_patterns
@@ -43,14 +43,14 @@ module RuboCop
43
43
  # (Note: Passes may not happen exactly in this sequence.)
44
44
  module CheckLineBreakable
45
45
  def extract_breakable_node(node, max)
46
- if node.send_type?
46
+ if node.call_type?
47
47
  return if chained_to_heredoc?(node)
48
48
 
49
49
  args = process_args(node.arguments)
50
50
  return extract_breakable_node_from_elements(node, args, max)
51
51
  elsif node.def_type?
52
52
  return extract_breakable_node_from_elements(node, node.arguments, max)
53
- elsif node.array_type? || node.hash_type?
53
+ elsif node.type?(:array, :hash)
54
54
  return extract_breakable_node_from_elements(node, node.children, max)
55
55
  end
56
56
  nil
@@ -74,9 +74,9 @@ module RuboCop
74
74
  def extract_first_element_over_column_limit(node, elements, max)
75
75
  line = node.first_line
76
76
 
77
- # If a `send` node is not parenthesized, don't move the first element, because it
77
+ # If a `send` or `csend` node is not parenthesized, don't move the first element, because it
78
78
  # can result in changed behavior or a syntax error.
79
- if node.send_type? && !node.parenthesized? && !first_argument_is_heredoc?(node)
79
+ if node.call_type? && !node.parenthesized? && !first_argument_is_heredoc?(node)
80
80
  elements = elements.drop(1)
81
81
  end
82
82
 
@@ -98,10 +98,10 @@ module RuboCop
98
98
  end
99
99
 
100
100
  # @api private
101
- # If a send node contains a heredoc argument, splitting cannot happen
101
+ # If a `send` or `csend` node contains a heredoc argument, splitting cannot happen
102
102
  # after the heredoc or else it will cause a syntax error.
103
103
  def shift_elements_for_heredoc_arg(node, elements, index)
104
- return index unless node.send_type? || node.array_type?
104
+ return index unless node.type?(:call, :array)
105
105
 
106
106
  heredoc_index = elements.index { |arg| arg.respond_to?(:heredoc?) && arg.heredoc? }
107
107
  return index unless heredoc_index
@@ -154,9 +154,9 @@ module RuboCop
154
154
  # Ignore ancestors on different lines.
155
155
  break if ancestor.first_line != node.first_line
156
156
 
157
- if ancestor.hash_type? || ancestor.array_type?
157
+ if ancestor.type?(:hash, :array)
158
158
  elements = ancestor.children
159
- elsif ancestor.send_type?
159
+ elsif ancestor.call_type?
160
160
  elements = process_args(ancestor.arguments)
161
161
  else
162
162
  next
@@ -171,12 +171,12 @@ module RuboCop
171
171
  # @api private
172
172
  def contained_by_multiline_collection_that_could_be_broken_up?(node)
173
173
  node.each_ancestor.find do |ancestor|
174
- if (ancestor.hash_type? || ancestor.array_type?) &&
174
+ if ancestor.type?(:hash, :array) &&
175
175
  breakable_collection?(ancestor, ancestor.children)
176
176
  return children_could_be_broken_up?(ancestor.children)
177
177
  end
178
178
 
179
- next unless ancestor.send_type?
179
+ next unless ancestor.call_type?
180
180
 
181
181
  args = process_args(ancestor.arguments)
182
182
  return children_could_be_broken_up?(args) if breakable_collection?(ancestor, args)
@@ -227,7 +227,7 @@ module RuboCop
227
227
 
228
228
  def chained_to_heredoc?(node)
229
229
  while (node = node.receiver)
230
- return true if (node.str_type? || node.dstr_type? || node.xstr_type?) && node.heredoc?
230
+ return true if node.type?(:str, :dstr, :xstr) && node.heredoc?
231
231
  end
232
232
 
233
233
  false
@@ -73,14 +73,16 @@ module RuboCop
73
73
  node.else_branch.loc.line
74
74
  elsif node.elsif?
75
75
  node.each_ancestor(:if).find(&:if?).loc.end.line
76
+ elsif node.if? && node.parent && parentheses?(node.parent)
77
+ node.parent.loc.end.line
76
78
  end
77
- elsif node.block_type? || node.numblock_type?
79
+ elsif node.any_block_type?
78
80
  node.loc.end.line
79
81
  elsif (next_sibling = node.right_sibling) && next_sibling.is_a?(AST::Node) &&
80
82
  next_sibling.source_range
81
83
  next_sibling.loc.line
82
84
  elsif (parent = node.parent)
83
- if parent.loc.respond_to?(:end) && parent.loc.end
85
+ if parent.loc?(:end)
84
86
  parent.loc.end.line
85
87
  else
86
88
  parent.loc.line
@@ -20,7 +20,7 @@ module RuboCop
20
20
  private
21
21
 
22
22
  def dig_chain_enabled?
23
- @config.for_cop('Style/DigChain')['Enabled']
23
+ @config.cop_enabled?('Style/DigChain')
24
24
  end
25
25
  end
26
26
  end
@@ -6,7 +6,7 @@ module RuboCop
6
6
  module FrozenStringLiteral
7
7
  module_function
8
8
 
9
- FROZEN_STRING_LITERAL = '# frozen_string_literal:'
9
+ FROZEN_STRING_LITERAL_REGEXP = /#\s*frozen[-_]?string[-_]?literal:/i.freeze
10
10
  FROZEN_STRING_LITERAL_ENABLED = '# frozen_string_literal: true'
11
11
  FROZEN_STRING_LITERAL_TYPES_RUBY27 = %i[str dstr].freeze
12
12
 
@@ -11,6 +11,24 @@ module RuboCop
11
11
  DO_NOT_MIX_OMIT_VALUE_MSG = "#{DO_NOT_MIX_MSG_PREFIX} #{OMIT_HASH_VALUE_MSG}"
12
12
  DO_NOT_MIX_EXPLICIT_VALUE_MSG = "#{DO_NOT_MIX_MSG_PREFIX} #{EXPLICIT_HASH_VALUE_MSG}"
13
13
 
14
+ DefNode = Struct.new(:node) do
15
+ def selector
16
+ if node.loc.respond_to?(:selector)
17
+ node.loc.selector
18
+ else
19
+ node.loc.keyword
20
+ end
21
+ end
22
+
23
+ def first_argument
24
+ node.first_argument
25
+ end
26
+
27
+ def last_argument
28
+ node.last_argument
29
+ end
30
+ end
31
+
14
32
  def on_hash_for_mixed_shorthand(hash_node)
15
33
  return if ignore_mixed_hash_shorthand_syntax?(hash_node)
16
34
 
@@ -86,7 +104,7 @@ module RuboCop
86
104
  return true if !node.key.sym_type? || require_hash_value_for_around_hash_literal?(node)
87
105
 
88
106
  hash_value = node.value
89
- return true unless hash_value.send_type? || hash_value.lvar_type?
107
+ return true unless hash_value.type?(:send, :lvar)
90
108
 
91
109
  hash_key_source != hash_value.source || hash_key_source.end_with?('!', '?')
92
110
  end
@@ -109,7 +127,7 @@ module RuboCop
109
127
  return if dispatch_node.parent && parentheses?(dispatch_node.parent)
110
128
  return if last_expression?(dispatch_node) && !method_dispatch_as_argument?(dispatch_node)
111
129
 
112
- def_node = node.each_ancestor(:send, :csend, :super, :yield).first
130
+ def_node = node.each_ancestor(:call, :super, :yield).first
113
131
 
114
132
  DefNode.new(def_node) unless def_node && def_node.arguments.empty?
115
133
  end
@@ -117,7 +135,7 @@ module RuboCop
117
135
 
118
136
  def find_ancestor_method_dispatch_node(node)
119
137
  return unless (ancestor = node.parent.parent)
120
- return unless ancestor.call_type? || ancestor.super_type? || ancestor.yield_type?
138
+ return unless ancestor.type?(:call, :super, :yield)
121
139
  return if brackets?(ancestor)
122
140
 
123
141
  ancestor
@@ -150,7 +168,7 @@ module RuboCop
150
168
  parent = method_dispatch_node.parent
151
169
  return false unless parent
152
170
 
153
- parent.call_type? || parent.super_type? || parent.yield_type?
171
+ parent.type?(:call, :super, :yield)
154
172
  end
155
173
 
156
174
  def breakdown_value_types_of_hash(hash_node)
@@ -212,24 +230,6 @@ module RuboCop
212
230
  register_offense(pair_node, OMIT_HASH_VALUE_MSG, replacement)
213
231
  end
214
232
  end
215
-
216
- DefNode = Struct.new(:node) do
217
- def selector
218
- if node.loc.respond_to?(:selector)
219
- node.loc.selector
220
- else
221
- node.loc.keyword
222
- end
223
- end
224
-
225
- def first_argument
226
- node.first_argument
227
- end
228
-
229
- def last_argument
230
- node.last_argument
231
- end
232
- end
233
233
  end
234
234
  end
235
235
  # rubocop:enable Metrics/ModuleLength