rubocop 1.68.0 → 1.71.1

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 (356) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +2 -2
  4. data/config/default.yml +77 -8
  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/comment_config.rb +1 -1
  8. data/lib/rubocop/config.rb +13 -4
  9. data/lib/rubocop/config_loader.rb +4 -0
  10. data/lib/rubocop/config_loader_resolver.rb +14 -3
  11. data/lib/rubocop/config_validator.rb +18 -8
  12. data/lib/rubocop/cop/autocorrect_logic.rb +32 -35
  13. data/lib/rubocop/cop/base.rb +7 -1
  14. data/lib/rubocop/cop/bundler/duplicated_gem.rb +2 -2
  15. data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
  16. data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
  17. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
  18. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +1 -1
  19. data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +1 -2
  20. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +0 -2
  21. data/lib/rubocop/cop/generator.rb +6 -0
  22. data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
  23. data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
  24. data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +3 -4
  25. data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +3 -2
  26. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -1
  27. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
  28. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
  29. data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +229 -0
  30. data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
  31. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
  32. data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +1 -1
  33. data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
  34. data/lib/rubocop/cop/internal_affairs/operator_keyword.rb +48 -0
  35. data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +3 -1
  36. data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
  37. data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +0 -2
  38. data/lib/rubocop/cop/internal_affairs.rb +5 -0
  39. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -1
  40. data/lib/rubocop/cop/layout/argument_alignment.rb +2 -9
  41. data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
  42. data/lib/rubocop/cop/layout/begin_end_alignment.rb +0 -1
  43. data/lib/rubocop/cop/layout/block_alignment.rb +1 -2
  44. data/lib/rubocop/cop/layout/class_structure.rb +9 -9
  45. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  46. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +1 -1
  47. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +7 -5
  48. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +3 -3
  49. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
  50. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +4 -5
  51. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +3 -1
  52. data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
  53. data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
  54. data/lib/rubocop/cop/layout/first_argument_indentation.rb +3 -8
  55. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +2 -7
  56. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
  57. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
  58. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
  59. data/lib/rubocop/cop/layout/hash_alignment.rb +6 -4
  60. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +1 -0
  61. data/lib/rubocop/cop/layout/indentation_width.rb +7 -7
  62. data/lib/rubocop/cop/layout/leading_comment_space.rb +15 -0
  63. data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +11 -2
  64. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +7 -1
  65. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
  66. data/lib/rubocop/cop/layout/line_length.rb +119 -4
  67. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
  68. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
  69. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -1
  70. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +2 -2
  71. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
  72. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +2 -3
  73. data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
  74. data/lib/rubocop/cop/layout/redundant_line_break.rb +10 -41
  75. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +4 -3
  76. data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -1
  77. data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
  78. data/lib/rubocop/cop/layout/space_after_comma.rb +1 -1
  79. data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
  80. data/lib/rubocop/cop/layout/space_after_semicolon.rb +1 -1
  81. data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -1
  82. data/lib/rubocop/cop/layout/space_around_operators.rb +19 -20
  83. data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
  84. data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
  85. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +6 -0
  86. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +4 -0
  87. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +0 -1
  88. data/lib/rubocop/cop/layout/trailing_whitespace.rb +5 -3
  89. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
  90. data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +119 -0
  91. data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
  92. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +10 -12
  93. data/lib/rubocop/cop/lint/circular_argument_reference.rb +6 -0
  94. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
  95. data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
  96. data/lib/rubocop/cop/lint/debugger.rb +1 -1
  97. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +2 -1
  98. data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
  99. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -1
  100. data/lib/rubocop/cop/lint/duplicate_set_element.rb +20 -7
  101. data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
  102. data/lib/rubocop/cop/lint/empty_file.rb +0 -2
  103. data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
  104. data/lib/rubocop/cop/lint/float_comparison.rb +19 -8
  105. data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -4
  106. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +1 -1
  107. data/lib/rubocop/cop/lint/hash_new_with_keyword_arguments_as_default.rb +55 -0
  108. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  109. data/lib/rubocop/cop/lint/interpolation_check.rb +9 -0
  110. data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +3 -0
  111. data/lib/rubocop/cop/lint/literal_as_condition.rb +1 -0
  112. data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +1 -1
  113. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +24 -6
  114. data/lib/rubocop/cop/lint/missing_super.rb +2 -2
  115. data/lib/rubocop/cop/lint/mixed_case_range.rb +3 -6
  116. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  117. data/lib/rubocop/cop/lint/nested_method_definition.rb +9 -5
  118. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  119. data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +2 -2
  120. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +5 -3
  121. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +3 -3
  122. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +1 -1
  123. data/lib/rubocop/cop/lint/number_conversion.rb +0 -1
  124. data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -2
  125. data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +93 -0
  126. data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +1 -2
  127. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +3 -2
  128. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -5
  129. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +1 -1
  130. data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
  131. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +12 -7
  132. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +8 -7
  133. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
  134. data/lib/rubocop/cop/lint/refinement_import_methods.rb +1 -1
  135. data/lib/rubocop/cop/lint/regexp_as_condition.rb +0 -1
  136. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  137. data/lib/rubocop/cop/lint/rescue_type.rb +3 -7
  138. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +8 -1
  139. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +2 -0
  140. data/lib/rubocop/cop/lint/self_assignment.rb +8 -10
  141. data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
  142. data/lib/rubocop/cop/lint/shared_mutable_default.rb +65 -0
  143. data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
  144. data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
  145. data/lib/rubocop/cop/lint/syntax.rb +4 -1
  146. data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +1 -1
  147. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +1 -1
  148. data/lib/rubocop/cop/lint/unreachable_code.rb +51 -2
  149. data/lib/rubocop/cop/lint/unreachable_loop.rb +1 -1
  150. data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
  151. data/lib/rubocop/cop/lint/useless_access_modifier.rb +4 -4
  152. data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
  153. data/lib/rubocop/cop/lint/useless_defined.rb +55 -0
  154. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +4 -0
  155. data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
  156. data/lib/rubocop/cop/lint/useless_numeric_operation.rb +2 -1
  157. data/lib/rubocop/cop/lint/useless_rescue.rb +1 -1
  158. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +2 -2
  159. data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -25
  160. data/lib/rubocop/cop/lint/void.rb +7 -5
  161. data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
  162. data/lib/rubocop/cop/metrics/class_length.rb +9 -9
  163. data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
  164. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -1
  165. data/lib/rubocop/cop/metrics/method_length.rb +8 -1
  166. data/lib/rubocop/cop/metrics/module_length.rb +1 -1
  167. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
  168. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
  169. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +2 -3
  170. data/lib/rubocop/cop/mixin/check_assignment.rb +4 -12
  171. data/lib/rubocop/cop/mixin/check_line_breakable.rb +11 -11
  172. data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +49 -0
  173. data/lib/rubocop/cop/mixin/comments_help.rb +7 -2
  174. data/lib/rubocop/cop/mixin/dig_help.rb +27 -0
  175. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -1
  176. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +4 -4
  177. data/lib/rubocop/cop/mixin/hash_subset.rb +188 -0
  178. data/lib/rubocop/cop/mixin/line_length_help.rb +5 -4
  179. data/lib/rubocop/cop/mixin/method_complexity.rb +1 -1
  180. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +5 -9
  181. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +68 -30
  182. data/lib/rubocop/cop/mixin/range_help.rb +0 -1
  183. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
  184. data/lib/rubocop/cop/mixin/statement_modifier.rb +8 -3
  185. data/lib/rubocop/cop/mixin/string_help.rb +1 -1
  186. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  187. data/lib/rubocop/cop/mixin/target_ruby_version.rb +17 -1
  188. data/lib/rubocop/cop/mixin/trailing_comma.rb +3 -3
  189. data/lib/rubocop/cop/naming/accessor_method_name.rb +6 -6
  190. data/lib/rubocop/cop/naming/block_forwarding.rb +19 -15
  191. data/lib/rubocop/cop/naming/constant_name.rb +6 -7
  192. data/lib/rubocop/cop/naming/file_name.rb +0 -2
  193. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +11 -12
  194. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +6 -14
  195. data/lib/rubocop/cop/naming/variable_name.rb +3 -4
  196. data/lib/rubocop/cop/naming/variable_number.rb +2 -3
  197. data/lib/rubocop/cop/security/compound_hash.rb +2 -0
  198. data/lib/rubocop/cop/security/yaml_load.rb +3 -2
  199. data/lib/rubocop/cop/style/access_modifier_declarations.rb +86 -28
  200. data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +1 -1
  201. data/lib/rubocop/cop/style/and_or.rb +1 -1
  202. data/lib/rubocop/cop/style/arguments_forwarding.rb +39 -23
  203. data/lib/rubocop/cop/style/array_first_last.rb +18 -2
  204. data/lib/rubocop/cop/style/array_intersect.rb +5 -4
  205. data/lib/rubocop/cop/style/bitwise_predicate.rb +1 -1
  206. data/lib/rubocop/cop/style/block_delimiters.rb +24 -22
  207. data/lib/rubocop/cop/style/case_like_if.rb +8 -11
  208. data/lib/rubocop/cop/style/class_and_module_children.rb +6 -3
  209. data/lib/rubocop/cop/style/collection_methods.rb +1 -1
  210. data/lib/rubocop/cop/style/combinable_defined.rb +1 -1
  211. data/lib/rubocop/cop/style/combinable_loops.rb +2 -2
  212. data/lib/rubocop/cop/style/commented_keyword.rb +11 -1
  213. data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
  214. data/lib/rubocop/cop/style/conditional_assignment.rb +25 -25
  215. data/lib/rubocop/cop/style/constant_visibility.rb +3 -12
  216. data/lib/rubocop/cop/style/dig_chain.rb +89 -0
  217. data/lib/rubocop/cop/style/documentation.rb +1 -1
  218. data/lib/rubocop/cop/style/double_negation.rb +3 -3
  219. data/lib/rubocop/cop/style/each_for_simple_loop.rb +4 -7
  220. data/lib/rubocop/cop/style/empty_else.rb +4 -2
  221. data/lib/rubocop/cop/style/empty_literal.rb +1 -1
  222. data/lib/rubocop/cop/style/empty_method.rb +1 -1
  223. data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
  224. data/lib/rubocop/cop/style/exact_regexp_match.rb +2 -3
  225. data/lib/rubocop/cop/style/explicit_block_argument.rb +1 -1
  226. data/lib/rubocop/cop/style/exponential_notation.rb +1 -1
  227. data/lib/rubocop/cop/style/fetch_env_var.rb +2 -1
  228. data/lib/rubocop/cop/style/file_null.rb +89 -0
  229. data/lib/rubocop/cop/style/file_touch.rb +75 -0
  230. data/lib/rubocop/cop/style/float_division.rb +8 -4
  231. data/lib/rubocop/cop/style/for.rb +0 -1
  232. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
  233. data/lib/rubocop/cop/style/global_vars.rb +1 -3
  234. data/lib/rubocop/cop/style/guard_clause.rb +1 -1
  235. data/lib/rubocop/cop/style/hash_conversion.rb +1 -2
  236. data/lib/rubocop/cop/style/hash_each_methods.rb +3 -6
  237. data/lib/rubocop/cop/style/hash_except.rb +35 -147
  238. data/lib/rubocop/cop/style/hash_slice.rb +80 -0
  239. data/lib/rubocop/cop/style/hash_syntax.rb +6 -3
  240. data/lib/rubocop/cop/style/identical_conditional_branches.rb +22 -3
  241. data/lib/rubocop/cop/style/if_inside_else.rb +0 -1
  242. data/lib/rubocop/cop/style/if_unless_modifier.rb +3 -3
  243. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +2 -3
  244. data/lib/rubocop/cop/style/if_with_semicolon.rb +20 -9
  245. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  246. data/lib/rubocop/cop/style/inverse_methods.rb +6 -7
  247. data/lib/rubocop/cop/style/it_assignment.rb +36 -0
  248. data/lib/rubocop/cop/style/keyword_arguments_merging.rb +2 -2
  249. data/lib/rubocop/cop/style/keyword_parameters_order.rb +1 -1
  250. data/lib/rubocop/cop/style/lambda_call.rb +3 -2
  251. data/lib/rubocop/cop/style/map_into_array.rb +1 -1
  252. data/lib/rubocop/cop/style/map_to_hash.rb +1 -1
  253. data/lib/rubocop/cop/style/map_to_set.rb +3 -2
  254. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +20 -13
  255. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -0
  256. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -11
  257. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -4
  258. data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
  259. data/lib/rubocop/cop/style/missing_else.rb +2 -0
  260. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +33 -3
  261. data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -1
  262. data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
  263. data/lib/rubocop/cop/style/multiple_comparison.rb +34 -22
  264. data/lib/rubocop/cop/style/mutable_constant.rb +7 -8
  265. data/lib/rubocop/cop/style/negated_if_else_condition.rb +7 -5
  266. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +1 -1
  267. data/lib/rubocop/cop/style/nested_ternary_operator.rb +5 -4
  268. data/lib/rubocop/cop/style/not.rb +1 -1
  269. data/lib/rubocop/cop/style/object_then.rb +14 -15
  270. data/lib/rubocop/cop/style/one_line_conditional.rb +25 -4
  271. data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
  272. data/lib/rubocop/cop/style/operator_method_call.rb +5 -6
  273. data/lib/rubocop/cop/style/or_assignment.rb +3 -6
  274. data/lib/rubocop/cop/style/parallel_assignment.rb +9 -18
  275. data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
  276. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  277. data/lib/rubocop/cop/style/proc.rb +1 -2
  278. data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
  279. data/lib/rubocop/cop/style/raise_args.rb +7 -5
  280. data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
  281. data/lib/rubocop/cop/style/redundant_argument.rb +3 -1
  282. data/lib/rubocop/cop/style/redundant_assignment.rb +1 -1
  283. data/lib/rubocop/cop/style/redundant_begin.rb +1 -1
  284. data/lib/rubocop/cop/style/redundant_condition.rb +38 -23
  285. data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +2 -1
  286. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +6 -10
  287. data/lib/rubocop/cop/style/redundant_each.rb +1 -1
  288. data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
  289. data/lib/rubocop/cop/style/redundant_freeze.rb +2 -2
  290. data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
  291. data/lib/rubocop/cop/style/redundant_line_continuation.rb +44 -23
  292. data/lib/rubocop/cop/style/redundant_parentheses.rb +12 -12
  293. data/lib/rubocop/cop/style/redundant_regexp_argument.rb +4 -0
  294. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
  295. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -1
  296. data/lib/rubocop/cop/style/redundant_return.rb +2 -2
  297. data/lib/rubocop/cop/style/redundant_self.rb +8 -15
  298. data/lib/rubocop/cop/style/redundant_self_assignment.rb +20 -32
  299. data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +4 -4
  300. data/lib/rubocop/cop/style/redundant_sort.rb +3 -3
  301. data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -2
  302. data/lib/rubocop/cop/style/rescue_modifier.rb +2 -3
  303. data/lib/rubocop/cop/style/return_nil.rb +1 -1
  304. data/lib/rubocop/cop/style/safe_navigation.rb +2 -2
  305. data/lib/rubocop/cop/style/select_by_regexp.rb +1 -1
  306. data/lib/rubocop/cop/style/self_assignment.rb +11 -17
  307. data/lib/rubocop/cop/style/semicolon.rb +1 -1
  308. data/lib/rubocop/cop/style/send_with_literal_method_name.rb +2 -1
  309. data/lib/rubocop/cop/style/signal_exception.rb +2 -3
  310. data/lib/rubocop/cop/style/single_argument_dig.rb +9 -5
  311. data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
  312. data/lib/rubocop/cop/style/single_line_do_end_block.rb +12 -3
  313. data/lib/rubocop/cop/style/single_line_methods.rb +3 -4
  314. data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
  315. data/lib/rubocop/cop/style/sole_nested_conditional.rb +4 -5
  316. data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
  317. data/lib/rubocop/cop/style/string_concatenation.rb +14 -13
  318. data/lib/rubocop/cop/style/string_literals.rb +1 -1
  319. data/lib/rubocop/cop/style/string_methods.rb +1 -1
  320. data/lib/rubocop/cop/style/super_arguments.rb +65 -17
  321. data/lib/rubocop/cop/style/swap_values.rb +4 -15
  322. data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
  323. data/lib/rubocop/cop/style/top_level_method_definition.rb +1 -1
  324. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +4 -1
  325. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -4
  326. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -2
  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 +11 -4
  330. data/lib/rubocop/cop/variable_force/variable.rb +1 -1
  331. data/lib/rubocop/cop/variable_force/variable_table.rb +3 -3
  332. data/lib/rubocop/cop/variable_force.rb +4 -10
  333. data/lib/rubocop/cops_documentation_generator.rb +22 -14
  334. data/lib/rubocop/directive_comment.rb +9 -8
  335. data/lib/rubocop/formatter/formatter_set.rb +1 -1
  336. data/lib/rubocop/lsp/diagnostic.rb +189 -0
  337. data/lib/rubocop/lsp/logger.rb +2 -2
  338. data/lib/rubocop/lsp/routes.rb +7 -23
  339. data/lib/rubocop/lsp/runtime.rb +15 -49
  340. data/lib/rubocop/lsp/stdin_runner.rb +83 -0
  341. data/lib/rubocop/magic_comment.rb +3 -3
  342. data/lib/rubocop/options.rb +2 -1
  343. data/lib/rubocop/path_util.rb +11 -8
  344. data/lib/rubocop/result_cache.rb +13 -13
  345. data/lib/rubocop/rspec/expect_offense.rb +6 -2
  346. data/lib/rubocop/rspec/shared_contexts.rb +4 -1
  347. data/lib/rubocop/rspec/support.rb +1 -2
  348. data/lib/rubocop/runner.rb +5 -6
  349. data/lib/rubocop/target_finder.rb +1 -0
  350. data/lib/rubocop/target_ruby.rb +15 -0
  351. data/lib/rubocop/version.rb +1 -1
  352. data/lib/rubocop.rb +14 -0
  353. data/lib/ruby_lsp/rubocop/addon.rb +78 -0
  354. data/lib/ruby_lsp/rubocop/wraps_built_in_lsp_runtime.rb +50 -0
  355. metadata +36 -15
  356. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -0,0 +1,126 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module InternalAffairs
6
+ # Use `node.type?(:foo, :bar)` instead of `node.foo_type? || node.bar_type?`,
7
+ # and `!node.type?(:foo, :bar)` instead of `!node.foo_type? && !node.bar_type?`.
8
+ #
9
+ # @example
10
+ #
11
+ # # bad
12
+ # node.str_type? || node.sym_type?
13
+ #
14
+ # # good
15
+ # node.type?(:str, :sym)
16
+ #
17
+ # # bad
18
+ # node.type?(:str, :sym) || node.boolean_type?
19
+ #
20
+ # # good
21
+ # node.type?(:str, :sym, :boolean)
22
+ #
23
+ # # bad
24
+ # !node.str_type? && !node.sym_type?
25
+ #
26
+ # # good
27
+ # !node.type?(:str, :sym)
28
+ #
29
+ # # bad
30
+ # !node.type?(:str, :sym) && !node.boolean_type?
31
+ #
32
+ # # good
33
+ # !node.type?(:str, :sym, :boolean)
34
+ #
35
+ class NodeTypeMultiplePredicates < Base
36
+ extend AutoCorrector
37
+
38
+ MSG_OR = 'Use `%<replacement>s` instead of checking for multiple node types.'
39
+ MSG_AND = 'Use `%<replacement>s` instead of checking against multiple node types.'
40
+
41
+ # @!method one_of_node_types?(node)
42
+ def_node_matcher :one_of_node_types?, <<~PATTERN
43
+ (or $(call _receiver #type_predicate?) (call _receiver #type_predicate?))
44
+ PATTERN
45
+
46
+ # @!method or_another_type?(node)
47
+ def_node_matcher :or_another_type?, <<~PATTERN
48
+ (or {
49
+ $(call _receiver :type? sym+) (call _receiver #type_predicate?) |
50
+ (call _receiver #type_predicate?) $(call _receiver :type? sym+)
51
+ })
52
+ PATTERN
53
+
54
+ # @!method none_of_node_types?(node)
55
+ def_node_matcher :none_of_node_types?, <<~PATTERN
56
+ (and
57
+ (send $(call _receiver #type_predicate?) :!)
58
+ (send (call _receiver #type_predicate?) :!)
59
+ )
60
+ PATTERN
61
+
62
+ # @!method and_not_another_type?(node)
63
+ def_node_matcher :and_not_another_type?, <<~PATTERN
64
+ (and {
65
+ (send $(call _receiver :type? sym+) :!) (send (call _receiver #type_predicate?) :!) |
66
+ (send (call _receiver #type_predicate?) :!) (send $(call _receiver :type? sym+) :!)
67
+ })
68
+ PATTERN
69
+
70
+ def on_or(node)
71
+ return unless (send_node = one_of_node_types?(node) || or_another_type?(node))
72
+ return unless send_node.receiver
73
+
74
+ replacement = replacement(node, send_node)
75
+ add_offense(node, message: format(MSG_OR, replacement: replacement)) do |corrector|
76
+ corrector.replace(node, replacement)
77
+ end
78
+ end
79
+
80
+ def on_and(node)
81
+ return unless (send_node = none_of_node_types?(node) || and_not_another_type?(node))
82
+ return unless send_node.receiver
83
+
84
+ replacement = "!#{replacement(node, send_node)}"
85
+
86
+ add_offense(node, message: format(MSG_AND, replacement: replacement)) do |corrector|
87
+ corrector.replace(node, replacement)
88
+ end
89
+ end
90
+
91
+ private
92
+
93
+ def type_predicate?(method_name)
94
+ method_name.end_with?('_type?')
95
+ end
96
+
97
+ def replacement(node, send_node)
98
+ send_node = send_node.children.first if send_node.method?(:!)
99
+
100
+ types = types(node)
101
+ receiver = send_node.receiver.source
102
+ dot = send_node.loc.dot.source
103
+
104
+ "#{receiver}#{dot}type?(:#{types.join(', :')})"
105
+ end
106
+
107
+ def types(node)
108
+ [types_in_branch(node.lhs), types_in_branch(node.rhs)]
109
+ end
110
+
111
+ def types_in_branch(branch)
112
+ branch = branch.children.first if branch.method?(:!)
113
+
114
+ if branch.method?(:type?)
115
+ branch.arguments.map(&:value)
116
+ elsif branch.method?(:defined_type?)
117
+ # `node.defined_type?` relates to `node.type == :defined?`
118
+ 'defined?'
119
+ else
120
+ branch.method_name.to_s.delete_suffix('_type?')
121
+ end
122
+ end
123
+ end
124
+ end
125
+ end
126
+ end
@@ -21,16 +21,17 @@ module RuboCop
21
21
 
22
22
  # @!method node_type_check(node)
23
23
  def_node_matcher :node_type_check, <<~PATTERN
24
- (send (send $_ :type) :== (sym $_))
24
+ (send (call _ :type) :== (sym $_))
25
25
  PATTERN
26
26
 
27
27
  def on_send(node)
28
- node_type_check(node) do |receiver, node_type|
28
+ node_type_check(node) do |node_type|
29
29
  return unless Parser::Meta::NODE_TYPES.include?(node_type)
30
30
 
31
31
  message = format(MSG, type: node_type)
32
32
  add_offense(node, message: message) do |corrector|
33
- range = node.source_range.with(begin_pos: receiver.source_range.end_pos + 1)
33
+ range = node.receiver.loc.selector.join(node.source_range.end)
34
+
34
35
  corrector.replace(range, "#{node_type}_type?")
35
36
  end
36
37
  end
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module InternalAffairs
6
- # Checks for missing `numblock handlers. The blocks with numbered
6
+ # Checks for missing `numblock` handlers. The blocks with numbered
7
7
  # arguments introduced in Ruby 2.7 are parsed with a node type of
8
8
  # `numblock` instead of block. Cops that define `block` handlers
9
9
  # need to define `numblock` handlers or disable this cope for them.
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module InternalAffairs
6
+ # Checks for cops that define `on_send` without define `on_csend`.
7
+ #
8
+ # Although in some cases it can be predetermined that safe navigation
9
+ # will never be used with the code checked by a specific cop, in general
10
+ # it is good practice to handle safe navigation methods if handling any
11
+ # `send` node.
12
+ #
13
+ # NOTE: It is expected to disable this cop for cops that check for method calls
14
+ # on receivers that cannot be nil (`self`, a literal, a constant), and
15
+ # method calls that will never have a receiver (ruby keywords like `raise`,
16
+ # macros like `attr_reader`, DSL methods, etc.), and other checks that wouldn't
17
+ # make sense to support safe navigation.
18
+ #
19
+ # @example
20
+ # # bad
21
+ # class MyCop < RuboCop::Cop:Base
22
+ # def on_send(node)
23
+ # # ...
24
+ # end
25
+ # end
26
+ #
27
+ # # good - explicit method definition
28
+ # class MyCop < RuboCop::Cop:Base
29
+ # def on_send(node)
30
+ # # ...
31
+ # end
32
+ #
33
+ # def on_csend(node)
34
+ # # ...
35
+ # end
36
+ # end
37
+ #
38
+ # # good - alias
39
+ # class MyCop < RuboCop::Cop:Base
40
+ # def on_send(node)
41
+ # # ...
42
+ # end
43
+ # alias on_csend on_send
44
+ # end
45
+ #
46
+ # # good - alias_method
47
+ # class MyCop < RuboCop::Cop:Base
48
+ # def on_send(node)
49
+ # # ...
50
+ # end
51
+ # alias_method :on_csend, :on_send
52
+ # end
53
+ class OnSendWithoutOnCSend < Base
54
+ RESTRICT_ON_SEND = %i[alias_method].freeze
55
+ MSG = 'Cop defines `on_send` but not `on_csend`.'
56
+
57
+ def on_new_investigation
58
+ @on_send_definition = nil
59
+ @on_csend_definition = nil
60
+ end
61
+
62
+ def on_investigation_end
63
+ return unless @on_send_definition && !@on_csend_definition
64
+
65
+ add_offense(@on_send_definition)
66
+ end
67
+
68
+ def on_def(node)
69
+ @on_send_definition = node if node.method?(:on_send)
70
+ @on_csend_definition = node if node.method?(:on_csend)
71
+ end
72
+
73
+ def on_alias(node)
74
+ @on_send_definition = node if node.new_identifier.value == :on_send
75
+ @on_csend_definition = node if node.new_identifier.value == :on_csend
76
+ end
77
+
78
+ def on_send(node) # rubocop:disable InternalAffairs/OnSendWithoutOnCSend
79
+ new_identifier = node.first_argument
80
+ return unless new_identifier.basic_literal?
81
+
82
+ new_identifier = new_identifier.value
83
+
84
+ @on_send_definition = node if new_identifier == :on_send
85
+ @on_csend_definition = node if new_identifier == :on_csend
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module InternalAffairs
6
+ # Enforces the use of `node.operator_keyword?` instead of `node.and_type? || node.or_type?`.
7
+ #
8
+ # @example
9
+ # # bad
10
+ # node.and_type? || node.or_type?
11
+ # node.or_type? || node.and_type?
12
+ #
13
+ # # good
14
+ # node.operator_keyword?
15
+ #
16
+ class OperatorKeyword < Base
17
+ extend AutoCorrector
18
+
19
+ MSG = 'Use `%<prefer>s`.'
20
+ PREFERRED_METHOD = 'operator_keyword?'
21
+
22
+ # @!method and_or_type(node)
23
+ def_node_matcher :and_or_type, <<~PATTERN
24
+ {
25
+ (or $(send _node :and_type?) $(send _node :or_type?))
26
+ (or $(send _node :or_type?) $(send _node :and_type?))
27
+ (or
28
+ (or _ $(send _node :and_type?)) $(send _node :or_type?))
29
+ (or
30
+ (or _ $(send _node :or_type?)) $(send _node :and_type?))
31
+ }
32
+ PATTERN
33
+
34
+ def on_or(node)
35
+ return unless (lhs, rhs = and_or_type(node))
36
+
37
+ begin_range = lhs.receiver&.source_range || lhs.loc.selector
38
+ offense = begin_range.join(rhs.source_range.end)
39
+ prefer = lhs.receiver ? "#{lhs.receiver.source}.#{PREFERRED_METHOD}" : PREFERRED_METHOD
40
+
41
+ add_offense(offense, message: format(MSG, prefer: prefer)) do |corrector|
42
+ corrector.replace(offense, prefer)
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -47,7 +47,7 @@ module RuboCop
47
47
  # @!method redundant_source_range(node)
48
48
  def_node_matcher :redundant_source_range, <<~PATTERN
49
49
  {
50
- (send $(send _ :source_range) :source)
50
+ (call $(call _ :source_range) :source)
51
51
  (send nil? :add_offense $(send _ :source_range) ...)
52
52
  (send _ {
53
53
  :replace :insert_before :insert_before_multi :insert_after :insert_after_multi
@@ -59,6 +59,7 @@ module RuboCop
59
59
 
60
60
  def on_send(node)
61
61
  return unless (source_range = redundant_source_range(node))
62
+ return unless source_range.receiver
62
63
  return if source_range.receiver.send_type? && source_range.receiver.method?(:buffer)
63
64
 
64
65
  selector = source_range.loc.selector
@@ -67,6 +68,7 @@ module RuboCop
67
68
  corrector.remove(source_range.loc.dot.join(selector))
68
69
  end
69
70
  end
71
+ alias on_csend on_send
70
72
  end
71
73
  end
72
74
  end
@@ -34,8 +34,8 @@ module RuboCop
34
34
  # @!method single_line_comparison(node)
35
35
  def_node_matcher :single_line_comparison, <<~PATTERN
36
36
  {
37
- (send (send $_receiver {:line :first_line}) {:== :!=} (send _receiver :last_line))
38
- (send (send $_receiver :last_line) {:== :!=} (send _receiver {:line :first_line}))
37
+ (send (call $_receiver {:line :first_line}) {:== :!=} (call _receiver :last_line))
38
+ (send (call $_receiver :last_line) {:== :!=} (call _receiver {:line :first_line}))
39
39
  }
40
40
  PATTERN
41
41
 
@@ -43,7 +43,8 @@ module RuboCop
43
43
  return unless (receiver = single_line_comparison(node))
44
44
 
45
45
  bang = node.method?(:!=) ? '!' : ''
46
- preferred = "#{bang}#{extract_receiver(receiver)}.single_line?"
46
+ dot = receiver.parent.loc.dot.source
47
+ preferred = "#{bang}#{extract_receiver(receiver)}#{dot}single_line?"
47
48
 
48
49
  add_offense(node, message: format(MSG, preferred: preferred)) do |corrector|
49
50
  corrector.replace(node, preferred)
@@ -53,7 +54,7 @@ module RuboCop
53
54
  private
54
55
 
55
56
  def extract_receiver(node)
56
- node = node.receiver if node.send_type? && %i[loc source_range].include?(node.method_name)
57
+ node = node.receiver if node.call_type? && %i[loc source_range].include?(node.method_name)
57
58
  node.source
58
59
  end
59
60
  end
@@ -50,8 +50,6 @@ module RuboCop
50
50
  # end
51
51
  #
52
52
  class StyleDetectedApiUse < Base
53
- include RangeHelp
54
-
55
53
  MSG_FOR_POSITIVE_WITHOUT_NEGATIVE =
56
54
  '`correct_style_detected` method called without ' \
57
55
  'calling a negative `*_style_detected` method.'
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'internal_affairs/cop_description'
4
+ require_relative 'internal_affairs/cop_enabled'
4
5
  require_relative 'internal_affairs/create_empty_file'
5
6
  require_relative 'internal_affairs/empty_line_between_expect_offense_and_correction'
6
7
  require_relative 'internal_affairs/example_description'
@@ -14,9 +15,13 @@ require_relative 'internal_affairs/method_name_equal'
14
15
  require_relative 'internal_affairs/node_destructuring'
15
16
  require_relative 'internal_affairs/node_first_or_last_argument'
16
17
  require_relative 'internal_affairs/node_matcher_directive'
18
+ require_relative 'internal_affairs/node_pattern_groups'
19
+ require_relative 'internal_affairs/node_type_multiple_predicates'
17
20
  require_relative 'internal_affairs/node_type_predicate'
18
21
  require_relative 'internal_affairs/numblock_handler'
19
22
  require_relative 'internal_affairs/offense_location_keyword'
23
+ require_relative 'internal_affairs/on_send_without_on_csend'
24
+ require_relative 'internal_affairs/operator_keyword'
20
25
  require_relative 'internal_affairs/processed_source_buffer_name'
21
26
  require_relative 'internal_affairs/redundant_context_config_parameter'
22
27
  require_relative 'internal_affairs/redundant_described_class_as_subject'
@@ -4,7 +4,7 @@ module RuboCop
4
4
  module Cop
5
5
  module Layout
6
6
  # Bare access modifiers (those not applying to specific methods) should be
7
- # indented as deep as method definitions, or as deep as the class/module
7
+ # indented as deep as method definitions, or as deep as the `class`/`module`
8
8
  # keyword, depending on configuration.
9
9
  #
10
10
  # @example EnforcedStyle: indent (default)
@@ -3,8 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Layout
6
- # Here we check if the arguments on a multi-line method
7
- # definition are aligned.
6
+ # Check that the arguments on a multi-line method call are aligned.
8
7
  #
9
8
  # @example EnforcedStyle: with_first_argument (default)
10
9
  # # good
@@ -142,16 +141,10 @@ module RuboCop
142
141
  end
143
142
 
144
143
  def enforce_hash_argument_with_separator?
145
- return false unless hash_argument_config['Enabled']
146
-
147
144
  RuboCop::Cop::Layout::HashAlignment::SEPARATOR_ALIGNMENT_STYLES.any? do |style|
148
- hash_argument_config[style]&.include?('separator')
145
+ config.for_enabled_cop('Layout/HashAlignment')[style]&.include?('separator')
149
146
  end
150
147
  end
151
-
152
- def hash_argument_config
153
- config.for_cop('Layout/HashAlignment')
154
- end
155
148
  end
156
149
  end
157
150
  end
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Layout
6
- # Here we check if the elements of a multi-line array literal are
6
+ # Check that the elements of a multi-line array literal are
7
7
  # aligned.
8
8
  #
9
9
  # @example EnforcedStyle: with_first_element (default)
@@ -40,7 +40,6 @@ module RuboCop
40
40
  #
41
41
  class BeginEndAlignment < Base
42
42
  include EndKeywordAlignment
43
- include RangeHelp
44
43
  extend AutoCorrector
45
44
 
46
45
  MSG = '`end` at %d, %d is not aligned with `%s` at %d, %d.'
@@ -127,7 +127,6 @@ module RuboCop
127
127
  start_loc,
128
128
  end_loc,
129
129
  do_source_line_column)
130
-
131
130
  error_source_line_column = if style == :start_of_block
132
131
  do_source_line_column
133
132
  else
@@ -189,7 +188,7 @@ module RuboCop
189
188
  # In offense message, we want to show the assignment LHS rather than
190
189
  # the entire assignment.
191
190
  def find_lhs_node(node)
192
- node, = *node while node.op_asgn_type? || node.masgn_type?
191
+ node = node.lhs while node.type?(:op_asgn, :masgn)
193
192
  node
194
193
  end
195
194
 
@@ -3,23 +3,23 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Layout
6
- # Checks if the code style follows the ExpectedOrder configuration:
6
+ # Checks if the code style follows the `ExpectedOrder` configuration:
7
7
  #
8
8
  # `Categories` allows us to map macro names into a category.
9
9
  #
10
10
  # Consider an example of code style that covers the following order:
11
11
  #
12
- # * Module inclusion (include, prepend, extend)
12
+ # * Module inclusion (`include`, `prepend`, `extend`)
13
13
  # * Constants
14
- # * Associations (has_one, has_many)
15
- # * Public attribute macros (attr_accessor, attr_writer, attr_reader)
16
- # * Other macros (validates, validate)
14
+ # * Associations (`has_one`, `has_many`)
15
+ # * Public attribute macros (`attr_accessor`, `attr_writer`, `attr_reader`)
16
+ # * Other macros (`validates`, `validate`)
17
17
  # * Public class methods
18
18
  # * Initializer
19
19
  # * Public instance methods
20
- # * Protected attribute macros (attr_accessor, attr_writer, attr_reader)
20
+ # * Protected attribute macros (`attr_accessor`, `attr_writer`, `attr_reader`)
21
21
  # * Protected instance methods
22
- # * Private attribute macros (attr_accessor, attr_writer, attr_reader)
22
+ # * Private attribute macros (`attr_accessor`, `attr_writer`, `attr_reader`)
23
23
  # * Private instance methods
24
24
  #
25
25
  # You can configure the following order:
@@ -236,7 +236,7 @@ module RuboCop
236
236
 
237
237
  return [] unless class_def
238
238
 
239
- if class_def.def_type? || class_def.send_type?
239
+ if class_def.type?(:def, :send)
240
240
  [class_def]
241
241
  else
242
242
  class_def.children.compact
@@ -289,7 +289,7 @@ module RuboCop
289
289
  def marked_as_private_constant?(node, name)
290
290
  return false unless node.method?(:private_constant)
291
291
 
292
- node.arguments.any? { |arg| (arg.sym_type? || arg.str_type?) && arg.value == name }
292
+ node.arguments.any? { |arg| arg.type?(:sym, :str) && arg.value == name }
293
293
  end
294
294
 
295
295
  def end_position_for(node)
@@ -120,7 +120,7 @@ module RuboCop
120
120
  end
121
121
 
122
122
  def heredoc?(node)
123
- (node.str_type? || node.dstr_type?) && node.heredoc?
123
+ node.type?(:str, :dstr) && node.heredoc?
124
124
  end
125
125
 
126
126
  def end_range(node)
@@ -200,7 +200,7 @@ module RuboCop
200
200
  parent = node.parent
201
201
  return false unless parent
202
202
 
203
- parent.begin_type? && parent.single_line?
203
+ parent.begin_type? && same_line?(node, node.right_sibling)
204
204
  end
205
205
 
206
206
  # SimpleCov excludes code from the coverage report by wrapping it in `# :nocov:`:
@@ -162,7 +162,7 @@ module RuboCop
162
162
  private
163
163
 
164
164
  def def_location(correction_node)
165
- if correction_node.block_type?
165
+ if correction_node.any_block_type?
166
166
  correction_node.source_range.join(correction_node.children.first.source_range)
167
167
  else
168
168
  correction_node.loc.keyword.join(correction_node.loc.name)
@@ -181,12 +181,12 @@ module RuboCop
181
181
  end
182
182
 
183
183
  def macro_candidate?(node)
184
- node.block_type? && node.children.first.macro? &&
184
+ node.any_block_type? && node.children.first.macro? &&
185
185
  empty_line_between_macros.include?(node.children.first.method_name)
186
186
  end
187
187
 
188
188
  def method_candidate?(node)
189
- cop_config['EmptyLineBetweenMethodDefs'] && (node.def_type? || node.defs_type?)
189
+ cop_config['EmptyLineBetweenMethodDefs'] && node.type?(:def, :defs)
190
190
  end
191
191
 
192
192
  def class_candidate?(node)
@@ -246,7 +246,7 @@ module RuboCop
246
246
  end
247
247
 
248
248
  def def_start(node)
249
- if node.block_type? && node.children.first.send_type?
249
+ if node.any_block_type? && node.children.first.send_type?
250
250
  node.source_range.line
251
251
  else
252
252
  node.loc.keyword.line
@@ -258,7 +258,7 @@ module RuboCop
258
258
  end
259
259
 
260
260
  def end_loc(node)
261
- if (node.def_type? || node.defs_type?) && node.endless?
261
+ if node.type?(:def, :defs) && node.endless?
262
262
  node.source_range.end
263
263
  else
264
264
  node.loc.end
@@ -283,6 +283,8 @@ module RuboCop
283
283
  case node.type
284
284
  when :def, :defs
285
285
  :method
286
+ when :numblock
287
+ :block
286
288
  else
287
289
  node.type
288
290
  end
@@ -84,9 +84,9 @@ module RuboCop
84
84
 
85
85
  alias on_numblock on_block
86
86
 
87
- def on_send(node) # rubocop:disable Metrics/CyclomaticComplexity
88
- return unless node.bare_access_modifier? &&
89
- !(node.parent&.block_type? || node.parent&.numblock_type?)
87
+ def on_send(node)
88
+ return unless node.bare_access_modifier? && !node.block_literal?
89
+ return if same_line?(node, node.right_sibling)
90
90
  return if expected_empty_lines?(node)
91
91
 
92
92
  message = message(node)
@@ -8,19 +8,18 @@ module RuboCop
8
8
  #
9
9
  # @example
10
10
  #
11
- # # good
12
- #
11
+ # # bad
13
12
  # begin
13
+ #
14
14
  # # ...
15
- # end
16
15
  #
17
- # # bad
16
+ # end
18
17
  #
18
+ # # good
19
19
  # begin
20
- #
21
20
  # # ...
22
- #
23
21
  # end
22
+ #
24
23
  class EmptyLinesAroundBeginBody < Base
25
24
  include EmptyLinesAroundBody
26
25
  extend AutoCorrector
@@ -6,7 +6,7 @@ module RuboCop
6
6
  # Checks if empty lines exist around the bodies of `begin`
7
7
  # sections. This cop doesn't check empty lines at `begin` body
8
8
  # beginning/end and around method definition body.
9
- # `Style/EmptyLinesAroundBeginBody` or `Style/EmptyLinesAroundMethodBody`
9
+ # `Layout/EmptyLinesAroundBeginBody` or `Layout/EmptyLinesAroundMethodBody`
10
10
  # can be used for this purpose.
11
11
  #
12
12
  # @example
@@ -72,8 +72,7 @@ module RuboCop
72
72
  alias on_numblock on_def
73
73
 
74
74
  def on_kwbegin(node)
75
- body, = *node
76
- check_body(body, node.loc.line)
75
+ check_body(node.children.first, node.loc.line)
77
76
  end
78
77
 
79
78
  private
@@ -128,10 +127,10 @@ module RuboCop
128
127
  end
129
128
 
130
129
  def keyword_locations_in_ensure(node)
131
- ensure_body, = *node
130
+ rescue_body_without_ensure = node.children.first
132
131
  [
133
132
  node.loc.keyword,
134
- *keyword_locations(ensure_body)
133
+ *keyword_locations(rescue_body_without_ensure)
135
134
  ]
136
135
  end
137
136
  end
@@ -27,7 +27,9 @@ module RuboCop
27
27
  KIND = 'method'
28
28
 
29
29
  def on_def(node)
30
- check(node, node.body)
30
+ first_line = node.arguments.source_range&.last_line
31
+
32
+ check(node, node.body, adjusted_first_line: first_line)
31
33
  end
32
34
  alias on_defs on_def
33
35