rubocop 1.44.1 → 1.78.0

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 (711) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +95 -88
  4. data/assets/output.css.erb +159 -0
  5. data/assets/output.html.erb +1 -160
  6. data/config/default.yml +660 -117
  7. data/config/internal_affairs.yml +31 -0
  8. data/config/obsoletion.yml +13 -3
  9. data/exe/rubocop +4 -3
  10. data/lib/rubocop/cached_data.rb +21 -5
  11. data/lib/rubocop/cli/command/auto_generate_config.rb +33 -13
  12. data/lib/rubocop/cli/command/execute_runner.rb +11 -6
  13. data/lib/rubocop/cli/command/lsp.rb +19 -0
  14. data/lib/rubocop/cli/command/show_cops.rb +24 -2
  15. data/lib/rubocop/cli/command/show_docs_url.rb +2 -2
  16. data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
  17. data/lib/rubocop/cli/command/version.rb +2 -2
  18. data/lib/rubocop/cli.rb +80 -11
  19. data/lib/rubocop/comment_config.rb +21 -2
  20. data/lib/rubocop/config.rb +99 -25
  21. data/lib/rubocop/config_finder.rb +14 -4
  22. data/lib/rubocop/config_loader.rb +68 -57
  23. data/lib/rubocop/config_loader_resolver.rb +48 -17
  24. data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -3
  25. data/lib/rubocop/config_obsoletion/parameter_rule.rb +9 -1
  26. data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
  27. data/lib/rubocop/config_obsoletion.rb +58 -11
  28. data/lib/rubocop/config_validator.rb +39 -20
  29. data/lib/rubocop/cop/autocorrect_logic.rb +69 -21
  30. data/lib/rubocop/cop/base.rb +112 -29
  31. data/lib/rubocop/cop/bundler/duplicated_gem.rb +3 -2
  32. data/lib/rubocop/cop/bundler/duplicated_group.rb +127 -0
  33. data/lib/rubocop/cop/bundler/gem_comment.rb +4 -4
  34. data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
  35. data/lib/rubocop/cop/bundler/gem_version.rb +6 -7
  36. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
  37. data/lib/rubocop/cop/bundler/ordered_gems.rb +10 -2
  38. data/lib/rubocop/cop/commissioner.rb +8 -2
  39. data/lib/rubocop/cop/cop.rb +55 -9
  40. data/lib/rubocop/cop/corrector.rb +1 -1
  41. data/lib/rubocop/cop/correctors/alignment_corrector.rb +4 -15
  42. data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +4 -8
  43. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +7 -15
  44. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +7 -4
  45. data/lib/rubocop/cop/correctors/line_break_corrector.rb +3 -1
  46. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +2 -2
  47. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +1 -1
  48. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +7 -4
  49. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +12 -2
  50. data/lib/rubocop/cop/documentation.rb +32 -5
  51. data/lib/rubocop/cop/exclude_limit.rb +1 -1
  52. data/lib/rubocop/cop/force.rb +12 -0
  53. data/lib/rubocop/cop/gemspec/add_runtime_dependency.rb +38 -0
  54. data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
  55. data/lib/rubocop/cop/gemspec/dependency_version.rb +6 -8
  56. data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +4 -5
  57. data/lib/rubocop/cop/gemspec/development_dependencies.rb +1 -1
  58. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +39 -17
  59. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +10 -2
  60. data/lib/rubocop/cop/gemspec/require_mfa.rb +15 -1
  61. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +5 -3
  62. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +3 -3
  63. data/lib/rubocop/cop/generator/require_file_injector.rb +1 -1
  64. data/lib/rubocop/cop/generator.rb +6 -0
  65. data/lib/rubocop/cop/internal_affairs/cop_description.rb +37 -17
  66. data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
  67. data/lib/rubocop/cop/internal_affairs/empty_line_between_expect_offense_and_correction.rb +2 -1
  68. data/lib/rubocop/cop/internal_affairs/example_description.rb +51 -25
  69. data/lib/rubocop/cop/internal_affairs/example_heredoc_delimiter.rb +3 -3
  70. data/lib/rubocop/cop/internal_affairs/inherit_deprecated_cop_class.rb +1 -1
  71. data/lib/rubocop/cop/internal_affairs/location_exists.rb +116 -0
  72. data/lib/rubocop/cop/internal_affairs/location_expression.rb +38 -0
  73. data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +6 -5
  74. data/lib/rubocop/cop/internal_affairs/method_name_end_with.rb +8 -6
  75. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +19 -20
  76. data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +54 -0
  77. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +129 -35
  78. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
  79. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
  80. data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +231 -0
  81. data/lib/rubocop/cop/internal_affairs/node_type_group.rb +91 -0
  82. data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
  83. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
  84. data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +1 -1
  85. data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
  86. data/lib/rubocop/cop/internal_affairs/operator_keyword.rb +48 -0
  87. data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
  88. data/lib/rubocop/cop/internal_affairs/processed_source_buffer_name.rb +42 -0
  89. data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +6 -5
  90. data/lib/rubocop/cop/internal_affairs/redundant_expect_offense_arguments.rb +34 -0
  91. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -1
  92. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +7 -22
  93. data/lib/rubocop/cop/internal_affairs/redundant_method_dispatch_node.rb +11 -2
  94. data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +75 -0
  95. data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
  96. data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +0 -2
  97. data/lib/rubocop/cop/internal_affairs/undefined_config.rb +23 -2
  98. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -5
  99. data/lib/rubocop/cop/internal_affairs.rb +12 -0
  100. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +6 -2
  101. data/lib/rubocop/cop/layout/argument_alignment.rb +3 -10
  102. data/lib/rubocop/cop/layout/array_alignment.rb +2 -2
  103. data/lib/rubocop/cop/layout/assignment_indentation.rb +3 -2
  104. data/lib/rubocop/cop/layout/begin_end_alignment.rb +0 -1
  105. data/lib/rubocop/cop/layout/block_alignment.rb +32 -13
  106. data/lib/rubocop/cop/layout/block_end_newline.rb +8 -21
  107. data/lib/rubocop/cop/layout/case_indentation.rb +1 -1
  108. data/lib/rubocop/cop/layout/class_structure.rb +59 -28
  109. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +2 -3
  110. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
  111. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  112. data/lib/rubocop/cop/layout/condition_position.rb +0 -4
  113. data/lib/rubocop/cop/layout/def_end_alignment.rb +2 -2
  114. data/lib/rubocop/cop/layout/dot_position.rb +2 -6
  115. data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
  116. data/lib/rubocop/cop/layout/empty_comment.rb +6 -4
  117. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +46 -13
  118. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +14 -7
  119. data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +1 -1
  120. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +34 -14
  121. data/lib/rubocop/cop/layout/empty_lines.rb +1 -1
  122. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +39 -7
  123. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
  124. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +1 -0
  125. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +14 -8
  126. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +23 -1
  127. data/lib/rubocop/cop/layout/end_alignment.rb +23 -3
  128. data/lib/rubocop/cop/layout/extra_spacing.rb +4 -5
  129. data/lib/rubocop/cop/layout/first_argument_indentation.rb +14 -14
  130. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +19 -10
  131. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +25 -34
  132. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
  133. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +8 -20
  134. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +50 -52
  135. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +38 -55
  136. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +3 -3
  137. data/lib/rubocop/cop/layout/hash_alignment.rb +8 -6
  138. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +13 -6
  139. data/lib/rubocop/cop/layout/heredoc_indentation.rb +7 -4
  140. data/lib/rubocop/cop/layout/indentation_style.rb +1 -1
  141. data/lib/rubocop/cop/layout/indentation_width.rb +16 -16
  142. data/lib/rubocop/cop/layout/initial_indentation.rb +1 -1
  143. data/lib/rubocop/cop/layout/leading_comment_space.rb +85 -3
  144. data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +29 -14
  145. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +19 -9
  146. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +4 -2
  147. data/lib/rubocop/cop/layout/line_length.rb +168 -28
  148. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +8 -27
  149. data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -0
  150. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +8 -27
  151. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +20 -12
  152. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -1
  153. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +21 -6
  154. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
  155. data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +7 -30
  156. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +3 -4
  157. data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
  158. data/lib/rubocop/cop/layout/redundant_line_break.rb +43 -48
  159. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +9 -10
  160. data/lib/rubocop/cop/layout/single_line_block_chain.rb +6 -1
  161. data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
  162. data/lib/rubocop/cop/layout/space_after_comma.rb +10 -2
  163. data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
  164. data/lib/rubocop/cop/layout/space_after_not.rb +1 -1
  165. data/lib/rubocop/cop/layout/space_after_semicolon.rb +11 -1
  166. data/lib/rubocop/cop/layout/space_around_keyword.rb +3 -2
  167. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +3 -3
  168. data/lib/rubocop/cop/layout/space_around_operators.rb +75 -38
  169. data/lib/rubocop/cop/layout/space_before_block_braces.rb +20 -10
  170. data/lib/rubocop/cop/layout/space_before_brackets.rb +7 -40
  171. data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
  172. data/lib/rubocop/cop/layout/space_before_first_arg.rb +1 -1
  173. data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
  174. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +2 -2
  175. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +28 -13
  176. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +8 -1
  177. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +8 -1
  178. data/lib/rubocop/cop/layout/space_inside_parens.rb +3 -3
  179. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +1 -1
  180. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +1 -1
  181. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +4 -4
  182. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +6 -7
  183. data/lib/rubocop/cop/layout/trailing_empty_lines.rb +5 -0
  184. data/lib/rubocop/cop/layout/trailing_whitespace.rb +6 -4
  185. data/lib/rubocop/cop/legacy/corrector.rb +12 -2
  186. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +14 -4
  187. data/lib/rubocop/cop/lint/ambiguous_operator.rb +0 -2
  188. data/lib/rubocop/cop/lint/ambiguous_range.rb +9 -1
  189. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +0 -2
  190. data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +118 -0
  191. data/lib/rubocop/cop/lint/assignment_in_condition.rb +7 -9
  192. data/lib/rubocop/cop/lint/big_decimal_new.rb +4 -7
  193. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +11 -13
  194. data/lib/rubocop/cop/lint/boolean_symbol.rb +2 -4
  195. data/lib/rubocop/cop/lint/circular_argument_reference.rb +4 -14
  196. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
  197. data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +1 -1
  198. data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
  199. data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
  200. data/lib/rubocop/cop/lint/cop_directive_syntax.rb +84 -0
  201. data/lib/rubocop/cop/lint/debugger.rb +49 -30
  202. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +6 -6
  203. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +4 -13
  204. data/lib/rubocop/cop/lint/duplicate_branch.rb +39 -4
  205. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -5
  206. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +2 -5
  207. data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +122 -0
  208. data/lib/rubocop/cop/lint/duplicate_methods.rb +112 -34
  209. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +48 -23
  210. data/lib/rubocop/cop/lint/duplicate_set_element.rb +87 -0
  211. data/lib/rubocop/cop/lint/each_with_object_argument.rb +0 -4
  212. data/lib/rubocop/cop/lint/else_layout.rb +1 -3
  213. data/lib/rubocop/cop/lint/empty_block.rb +2 -2
  214. data/lib/rubocop/cop/lint/empty_conditional_body.rb +31 -58
  215. data/lib/rubocop/cop/lint/empty_ensure.rb +2 -12
  216. data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
  217. data/lib/rubocop/cop/lint/empty_file.rb +0 -2
  218. data/lib/rubocop/cop/lint/empty_interpolation.rb +4 -6
  219. data/lib/rubocop/cop/lint/empty_when.rb +1 -3
  220. data/lib/rubocop/cop/lint/ensure_return.rb +2 -10
  221. data/lib/rubocop/cop/lint/erb_new_arguments.rb +27 -27
  222. data/lib/rubocop/cop/lint/float_comparison.rb +58 -15
  223. data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -8
  224. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +5 -12
  225. data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +2 -1
  226. data/lib/rubocop/cop/lint/hash_new_with_keyword_arguments_as_default.rb +55 -0
  227. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +1 -1
  228. data/lib/rubocop/cop/lint/identity_comparison.rb +19 -16
  229. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +24 -13
  230. data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +5 -3
  231. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -8
  232. data/lib/rubocop/cop/lint/inherit_exception.rb +9 -0
  233. data/lib/rubocop/cop/lint/interpolation_check.rb +9 -4
  234. data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +50 -0
  235. data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +1 -1
  236. data/lib/rubocop/cop/lint/literal_as_condition.rb +114 -11
  237. data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +85 -0
  238. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +96 -17
  239. data/lib/rubocop/cop/lint/loop.rb +6 -12
  240. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +1 -1
  241. data/lib/rubocop/cop/lint/missing_super.rb +63 -5
  242. data/lib/rubocop/cop/lint/mixed_case_range.rb +113 -0
  243. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  244. data/lib/rubocop/cop/lint/nested_method_definition.rb +11 -18
  245. data/lib/rubocop/cop/lint/next_without_accumulator.rb +6 -25
  246. data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +2 -7
  247. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +22 -10
  248. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +6 -8
  249. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
  250. data/lib/rubocop/cop/lint/number_conversion.rb +13 -4
  251. data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +3 -4
  252. data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +93 -0
  253. data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +3 -2
  254. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +0 -1
  255. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +11 -14
  256. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +6 -11
  257. data/lib/rubocop/cop/lint/percent_string_array.rb +1 -5
  258. data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -5
  259. data/lib/rubocop/cop/lint/raise_exception.rb +29 -10
  260. data/lib/rubocop/cop/lint/rand_one.rb +0 -4
  261. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +11 -5
  262. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +9 -7
  263. data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +130 -0
  264. data/lib/rubocop/cop/lint/redundant_require_statement.rb +1 -13
  265. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +79 -10
  266. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +10 -9
  267. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +36 -20
  268. data/lib/rubocop/cop/lint/redundant_type_conversion.rb +261 -0
  269. data/lib/rubocop/cop/lint/redundant_with_index.rb +10 -3
  270. data/lib/rubocop/cop/lint/redundant_with_object.rb +6 -3
  271. data/lib/rubocop/cop/lint/refinement_import_methods.rb +3 -2
  272. data/lib/rubocop/cop/lint/regexp_as_condition.rb +0 -1
  273. data/lib/rubocop/cop/lint/require_parentheses.rb +0 -4
  274. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -5
  275. data/lib/rubocop/cop/lint/rescue_type.rb +4 -10
  276. data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -13
  277. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +31 -13
  278. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +109 -41
  279. data/lib/rubocop/cop/lint/script_permission.rb +3 -3
  280. data/lib/rubocop/cop/lint/self_assignment.rb +71 -10
  281. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +1 -2
  282. data/lib/rubocop/cop/lint/shadowed_argument.rb +1 -0
  283. data/lib/rubocop/cop/lint/shadowed_exception.rb +7 -13
  284. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +26 -12
  285. data/lib/rubocop/cop/lint/shared_mutable_default.rb +76 -0
  286. data/lib/rubocop/cop/lint/struct_new_override.rb +12 -12
  287. data/lib/rubocop/cop/lint/suppressed_exception.rb +3 -3
  288. data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
  289. data/lib/rubocop/cop/lint/symbol_conversion.rb +9 -4
  290. data/lib/rubocop/cop/lint/syntax.rb +14 -4
  291. data/lib/rubocop/cop/lint/to_enum_arguments.rb +17 -7
  292. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +23 -9
  293. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1 -1
  294. data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +88 -0
  295. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +3 -1
  296. data/lib/rubocop/cop/lint/unified_integer.rb +0 -4
  297. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +4 -3
  298. data/lib/rubocop/cop/lint/unreachable_code.rb +56 -9
  299. data/lib/rubocop/cop/lint/unreachable_loop.rb +17 -11
  300. data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
  301. data/lib/rubocop/cop/lint/uri_regexp.rb +25 -7
  302. data/lib/rubocop/cop/lint/useless_access_modifier.rb +46 -17
  303. data/lib/rubocop/cop/lint/useless_assignment.rb +104 -15
  304. data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
  305. data/lib/rubocop/cop/lint/useless_default_value_argument.rb +90 -0
  306. data/lib/rubocop/cop/lint/useless_defined.rb +55 -0
  307. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +4 -4
  308. data/lib/rubocop/cop/lint/useless_method_definition.rb +11 -3
  309. data/lib/rubocop/cop/lint/useless_numeric_operation.rb +78 -0
  310. data/lib/rubocop/cop/lint/useless_or.rb +98 -0
  311. data/lib/rubocop/cop/lint/useless_rescue.rb +7 -3
  312. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +5 -5
  313. data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -29
  314. data/lib/rubocop/cop/lint/useless_times.rb +3 -3
  315. data/lib/rubocop/cop/lint/void.rb +140 -19
  316. data/lib/rubocop/cop/message_annotator.rb +7 -3
  317. data/lib/rubocop/cop/metrics/abc_size.rb +4 -4
  318. data/lib/rubocop/cop/metrics/block_length.rb +9 -7
  319. data/lib/rubocop/cop/metrics/block_nesting.rb +20 -8
  320. data/lib/rubocop/cop/metrics/class_length.rb +23 -16
  321. data/lib/rubocop/cop/metrics/collection_literal_length.rb +83 -0
  322. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +5 -2
  323. data/lib/rubocop/cop/metrics/method_length.rb +16 -7
  324. data/lib/rubocop/cop/metrics/module_length.rb +7 -6
  325. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
  326. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +2 -3
  327. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +40 -13
  328. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
  329. data/lib/rubocop/cop/migration/department_name.rb +3 -3
  330. data/lib/rubocop/cop/mixin/alignment.rb +8 -4
  331. data/lib/rubocop/cop/mixin/allowed_methods.rb +10 -2
  332. data/lib/rubocop/cop/mixin/allowed_pattern.rb +15 -3
  333. data/lib/rubocop/cop/mixin/allowed_receivers.rb +34 -0
  334. data/lib/rubocop/cop/mixin/annotation_comment.rb +1 -3
  335. data/lib/rubocop/cop/mixin/check_assignment.rb +4 -12
  336. data/lib/rubocop/cop/mixin/check_line_breakable.rb +22 -12
  337. data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +49 -0
  338. data/lib/rubocop/cop/mixin/code_length.rb +12 -1
  339. data/lib/rubocop/cop/mixin/comments_help.rb +26 -11
  340. data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -0
  341. data/lib/rubocop/cop/mixin/configurable_max.rb +5 -1
  342. data/lib/rubocop/cop/mixin/def_node.rb +1 -1
  343. data/lib/rubocop/cop/mixin/dig_help.rb +27 -0
  344. data/lib/rubocop/cop/mixin/documentation_comment.rb +1 -1
  345. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
  346. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -1
  347. data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +24 -0
  348. data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
  349. data/lib/rubocop/cop/mixin/forbidden_pattern.rb +16 -0
  350. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +23 -12
  351. data/lib/rubocop/cop/mixin/gemspec_help.rb +22 -0
  352. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +16 -15
  353. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +62 -43
  354. data/lib/rubocop/cop/mixin/hash_subset.rb +203 -0
  355. data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
  356. data/lib/rubocop/cop/mixin/heredoc.rb +6 -2
  357. data/lib/rubocop/cop/mixin/line_length_help.rb +34 -12
  358. data/lib/rubocop/cop/mixin/method_complexity.rb +17 -7
  359. data/lib/rubocop/cop/mixin/min_branches_count.rb +40 -0
  360. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +0 -3
  361. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +10 -11
  362. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +2 -2
  363. data/lib/rubocop/cop/mixin/percent_array.rb +1 -1
  364. data/lib/rubocop/cop/mixin/percent_literal.rb +2 -2
  365. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +71 -35
  366. data/lib/rubocop/cop/mixin/range_help.rb +16 -10
  367. data/lib/rubocop/cop/mixin/rescue_node.rb +4 -0
  368. data/lib/rubocop/cop/mixin/safe_assignment.rb +1 -1
  369. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +1 -1
  370. data/lib/rubocop/cop/mixin/statement_modifier.rb +13 -7
  371. data/lib/rubocop/cop/mixin/string_help.rb +5 -3
  372. data/lib/rubocop/cop/mixin/string_literals_help.rb +12 -0
  373. data/lib/rubocop/cop/mixin/surrounding_space.rb +3 -3
  374. data/lib/rubocop/cop/mixin/target_ruby_version.rb +17 -1
  375. data/lib/rubocop/cop/mixin/trailing_comma.rb +24 -8
  376. data/lib/rubocop/cop/naming/accessor_method_name.rb +11 -6
  377. data/lib/rubocop/cop/naming/ascii_identifiers.rb +1 -1
  378. data/lib/rubocop/cop/naming/block_forwarding.rb +40 -9
  379. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +1 -1
  380. data/lib/rubocop/cop/naming/constant_name.rb +8 -10
  381. data/lib/rubocop/cop/naming/file_name.rb +5 -7
  382. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +1 -1
  383. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +3 -1
  384. data/lib/rubocop/cop/naming/inclusive_language.rb +33 -6
  385. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +38 -24
  386. data/lib/rubocop/cop/naming/method_name.rb +146 -15
  387. data/lib/rubocop/cop/naming/predicate_method.rb +303 -0
  388. data/lib/rubocop/cop/naming/predicate_prefix.rb +204 -0
  389. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +26 -17
  390. data/lib/rubocop/cop/naming/variable_name.rb +56 -7
  391. data/lib/rubocop/cop/naming/variable_number.rb +2 -3
  392. data/lib/rubocop/cop/offense.rb +4 -5
  393. data/lib/rubocop/cop/registry.rb +12 -7
  394. data/lib/rubocop/cop/security/compound_hash.rb +4 -2
  395. data/lib/rubocop/cop/security/eval.rb +2 -1
  396. data/lib/rubocop/cop/security/open.rb +3 -2
  397. data/lib/rubocop/cop/security/yaml_load.rb +3 -2
  398. data/lib/rubocop/cop/style/access_modifier_declarations.rb +177 -30
  399. data/lib/rubocop/cop/style/accessor_grouping.rb +69 -21
  400. data/lib/rubocop/cop/style/alias.rb +11 -9
  401. data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +79 -0
  402. data/lib/rubocop/cop/style/and_or.rb +1 -1
  403. data/lib/rubocop/cop/style/arguments_forwarding.rb +478 -62
  404. data/lib/rubocop/cop/style/array_first_last.rb +80 -0
  405. data/lib/rubocop/cop/style/array_intersect.rb +54 -34
  406. data/lib/rubocop/cop/style/ascii_comments.rb +1 -1
  407. data/lib/rubocop/cop/style/attr.rb +11 -1
  408. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +21 -14
  409. data/lib/rubocop/cop/style/begin_block.rb +1 -2
  410. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +3 -3
  411. data/lib/rubocop/cop/style/bitwise_predicate.rb +100 -0
  412. data/lib/rubocop/cop/style/block_comments.rb +2 -2
  413. data/lib/rubocop/cop/style/block_delimiters.rb +60 -19
  414. data/lib/rubocop/cop/style/case_like_if.rb +34 -20
  415. data/lib/rubocop/cop/style/class_and_module_children.rb +55 -14
  416. data/lib/rubocop/cop/style/class_check.rb +1 -0
  417. data/lib/rubocop/cop/style/class_equality_comparison.rb +59 -41
  418. data/lib/rubocop/cop/style/class_vars.rb +3 -3
  419. data/lib/rubocop/cop/style/collection_compact.rb +35 -12
  420. data/lib/rubocop/cop/style/collection_methods.rb +4 -1
  421. data/lib/rubocop/cop/style/collection_querying.rb +167 -0
  422. data/lib/rubocop/cop/style/colon_method_call.rb +2 -2
  423. data/lib/rubocop/cop/style/combinable_defined.rb +115 -0
  424. data/lib/rubocop/cop/style/combinable_loops.rb +44 -8
  425. data/lib/rubocop/cop/style/command_literal.rb +2 -2
  426. data/lib/rubocop/cop/style/comment_annotation.rb +1 -1
  427. data/lib/rubocop/cop/style/commented_keyword.rb +32 -6
  428. data/lib/rubocop/cop/style/comparable_between.rb +78 -0
  429. data/lib/rubocop/cop/style/concat_array_literals.rb +13 -4
  430. data/lib/rubocop/cop/style/conditional_assignment.rb +57 -42
  431. data/lib/rubocop/cop/style/constant_visibility.rb +3 -12
  432. data/lib/rubocop/cop/style/copyright.rb +37 -24
  433. data/lib/rubocop/cop/style/data_inheritance.rb +82 -0
  434. data/lib/rubocop/cop/style/date_time.rb +5 -4
  435. data/lib/rubocop/cop/style/def_with_parentheses.rb +18 -7
  436. data/lib/rubocop/cop/style/dig_chain.rb +89 -0
  437. data/lib/rubocop/cop/style/dir.rb +1 -1
  438. data/lib/rubocop/cop/style/dir_empty.rb +54 -0
  439. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +2 -2
  440. data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +3 -3
  441. data/lib/rubocop/cop/style/documentation.rb +36 -30
  442. data/lib/rubocop/cop/style/documentation_method.rb +30 -4
  443. data/lib/rubocop/cop/style/double_negation.rb +6 -6
  444. data/lib/rubocop/cop/style/each_for_simple_loop.rb +11 -15
  445. data/lib/rubocop/cop/style/each_with_object.rb +4 -5
  446. data/lib/rubocop/cop/style/empty_block_parameter.rb +1 -1
  447. data/lib/rubocop/cop/style/empty_case_condition.rb +6 -1
  448. data/lib/rubocop/cop/style/empty_else.rb +10 -7
  449. data/lib/rubocop/cop/style/empty_heredoc.rb +1 -14
  450. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +1 -1
  451. data/lib/rubocop/cop/style/empty_literal.rb +36 -23
  452. data/lib/rubocop/cop/style/empty_method.rb +1 -1
  453. data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +100 -0
  454. data/lib/rubocop/cop/style/endless_method.rb +150 -18
  455. data/lib/rubocop/cop/style/eval_with_location.rb +27 -35
  456. data/lib/rubocop/cop/style/exact_regexp_match.rb +69 -0
  457. data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
  458. data/lib/rubocop/cop/style/explicit_block_argument.rb +19 -6
  459. data/lib/rubocop/cop/style/exponential_notation.rb +5 -5
  460. data/lib/rubocop/cop/style/fetch_env_var.rb +34 -7
  461. data/lib/rubocop/cop/style/file_empty.rb +71 -0
  462. data/lib/rubocop/cop/style/file_null.rb +89 -0
  463. data/lib/rubocop/cop/style/file_read.rb +5 -8
  464. data/lib/rubocop/cop/style/file_touch.rb +75 -0
  465. data/lib/rubocop/cop/style/file_write.rb +3 -6
  466. data/lib/rubocop/cop/style/float_division.rb +8 -4
  467. data/lib/rubocop/cop/style/for.rb +4 -2
  468. data/lib/rubocop/cop/style/format_string.rb +33 -12
  469. data/lib/rubocop/cop/style/format_string_token.rb +38 -11
  470. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +7 -4
  471. data/lib/rubocop/cop/style/global_std_stream.rb +10 -1
  472. data/lib/rubocop/cop/style/global_vars.rb +1 -3
  473. data/lib/rubocop/cop/style/guard_clause.rb +48 -4
  474. data/lib/rubocop/cop/style/hash_conversion.rb +26 -9
  475. data/lib/rubocop/cop/style/hash_each_methods.rb +111 -34
  476. data/lib/rubocop/cop/style/hash_except.rb +38 -135
  477. data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
  478. data/lib/rubocop/cop/style/hash_like_case.rb +3 -9
  479. data/lib/rubocop/cop/style/hash_slice.rb +80 -0
  480. data/lib/rubocop/cop/style/hash_syntax.rb +38 -7
  481. data/lib/rubocop/cop/style/hash_transform_keys.rb +2 -2
  482. data/lib/rubocop/cop/style/hash_transform_values.rb +2 -2
  483. data/lib/rubocop/cop/style/identical_conditional_branches.rb +57 -9
  484. data/lib/rubocop/cop/style/if_inside_else.rb +16 -14
  485. data/lib/rubocop/cop/style/if_unless_modifier.rb +140 -17
  486. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +4 -7
  487. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +10 -8
  488. data/lib/rubocop/cop/style/if_with_semicolon.rb +62 -8
  489. data/lib/rubocop/cop/style/in_pattern_then.rb +6 -2
  490. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  491. data/lib/rubocop/cop/style/inverse_methods.rb +21 -17
  492. data/lib/rubocop/cop/style/invertible_unless_condition.rb +58 -12
  493. data/lib/rubocop/cop/style/ip_addresses.rb +2 -2
  494. data/lib/rubocop/cop/style/it_assignment.rb +36 -0
  495. data/lib/rubocop/cop/style/it_block_parameter.rb +119 -0
  496. data/lib/rubocop/cop/style/keyword_arguments_merging.rb +67 -0
  497. data/lib/rubocop/cop/style/keyword_parameters_order.rb +14 -8
  498. data/lib/rubocop/cop/style/lambda.rb +5 -4
  499. data/lib/rubocop/cop/style/lambda_call.rb +14 -3
  500. data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
  501. data/lib/rubocop/cop/style/magic_comment_format.rb +1 -1
  502. data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +82 -50
  503. data/lib/rubocop/cop/style/map_into_array.rb +236 -0
  504. data/lib/rubocop/cop/style/map_to_hash.rb +31 -7
  505. data/lib/rubocop/cop/style/map_to_set.rb +6 -2
  506. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +62 -31
  507. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +65 -42
  508. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +30 -13
  509. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -4
  510. data/lib/rubocop/cop/style/method_def_parentheses.rb +2 -2
  511. data/lib/rubocop/cop/style/min_max.rb +3 -3
  512. data/lib/rubocop/cop/style/min_max_comparison.rb +13 -5
  513. data/lib/rubocop/cop/style/missing_else.rb +2 -4
  514. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +35 -5
  515. data/lib/rubocop/cop/style/mixin_grouping.rb +5 -5
  516. data/lib/rubocop/cop/style/multiline_block_chain.rb +3 -2
  517. data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -0
  518. data/lib/rubocop/cop/style/multiline_memoization.rb +2 -2
  519. data/lib/rubocop/cop/style/multiline_method_signature.rb +17 -13
  520. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +21 -4
  521. data/lib/rubocop/cop/style/multiline_when_then.rb +0 -4
  522. data/lib/rubocop/cop/style/multiple_comparison.rb +66 -59
  523. data/lib/rubocop/cop/style/mutable_constant.rb +7 -8
  524. data/lib/rubocop/cop/style/negated_if_else_condition.rb +18 -11
  525. data/lib/rubocop/cop/style/nested_modifier.rb +1 -1
  526. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +2 -2
  527. data/lib/rubocop/cop/style/nested_ternary_operator.rb +8 -15
  528. data/lib/rubocop/cop/style/next.rb +45 -1
  529. data/lib/rubocop/cop/style/nil_comparison.rb +2 -0
  530. data/lib/rubocop/cop/style/nil_lambda.rb +2 -2
  531. data/lib/rubocop/cop/style/not.rb +1 -1
  532. data/lib/rubocop/cop/style/numbered_parameters_limit.rb +11 -3
  533. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
  534. data/lib/rubocop/cop/style/numeric_literals.rb +1 -1
  535. data/lib/rubocop/cop/style/numeric_predicate.rb +12 -4
  536. data/lib/rubocop/cop/style/object_then.rb +16 -14
  537. data/lib/rubocop/cop/style/one_line_conditional.rb +31 -6
  538. data/lib/rubocop/cop/style/open_struct_use.rb +6 -6
  539. data/lib/rubocop/cop/style/operator_method_call.rb +33 -9
  540. data/lib/rubocop/cop/style/or_assignment.rb +3 -6
  541. data/lib/rubocop/cop/style/parallel_assignment.rb +38 -40
  542. data/lib/rubocop/cop/style/parentheses_around_condition.rb +8 -0
  543. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +3 -4
  544. data/lib/rubocop/cop/style/percent_q_literals.rb +2 -2
  545. data/lib/rubocop/cop/style/preferred_hash_methods.rb +1 -1
  546. data/lib/rubocop/cop/style/proc.rb +2 -2
  547. data/lib/rubocop/cop/style/quoted_symbols.rb +2 -4
  548. data/lib/rubocop/cop/style/raise_args.rb +19 -14
  549. data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
  550. data/lib/rubocop/cop/style/redundant_argument.rb +35 -4
  551. data/lib/rubocop/cop/style/redundant_array_constructor.rb +77 -0
  552. data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
  553. data/lib/rubocop/cop/style/redundant_assignment.rb +11 -3
  554. data/lib/rubocop/cop/style/redundant_begin.rb +17 -4
  555. data/lib/rubocop/cop/style/redundant_condition.rb +114 -27
  556. data/lib/rubocop/cop/style/redundant_conditional.rb +2 -10
  557. data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +50 -0
  558. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +91 -7
  559. data/lib/rubocop/cop/style/redundant_each.rb +7 -4
  560. data/lib/rubocop/cop/style/redundant_exception.rb +33 -13
  561. data/lib/rubocop/cop/style/redundant_fetch_block.rb +10 -16
  562. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -1
  563. data/lib/rubocop/cop/style/redundant_filter_chain.rb +118 -0
  564. data/lib/rubocop/cop/style/redundant_format.rb +262 -0
  565. data/lib/rubocop/cop/style/redundant_freeze.rb +3 -3
  566. data/lib/rubocop/cop/style/redundant_heredoc_delimiter_quotes.rb +58 -0
  567. data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
  568. data/lib/rubocop/cop/style/redundant_interpolation.rb +3 -3
  569. data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +46 -0
  570. data/lib/rubocop/cop/style/redundant_line_continuation.rb +236 -0
  571. data/lib/rubocop/cop/style/redundant_parentheses.rb +140 -40
  572. data/lib/rubocop/cop/style/redundant_percent_q.rb +2 -2
  573. data/lib/rubocop/cop/style/redundant_regexp_argument.rb +107 -0
  574. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +8 -9
  575. data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +46 -0
  576. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +20 -28
  577. data/lib/rubocop/cop/style/redundant_return.rb +16 -5
  578. data/lib/rubocop/cop/style/redundant_self.rb +32 -20
  579. data/lib/rubocop/cop/style/redundant_self_assignment.rb +20 -32
  580. data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +12 -5
  581. data/lib/rubocop/cop/style/redundant_sort.rb +14 -13
  582. data/lib/rubocop/cop/style/redundant_sort_by.rb +19 -3
  583. data/lib/rubocop/cop/style/redundant_string_escape.rb +8 -7
  584. data/lib/rubocop/cop/style/regexp_literal.rb +12 -3
  585. data/lib/rubocop/cop/style/require_order.rb +13 -9
  586. data/lib/rubocop/cop/style/rescue_modifier.rb +19 -7
  587. data/lib/rubocop/cop/style/rescue_standard_error.rb +2 -2
  588. data/lib/rubocop/cop/style/return_nil.rb +8 -4
  589. data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +137 -0
  590. data/lib/rubocop/cop/style/safe_navigation.rb +145 -63
  591. data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
  592. data/lib/rubocop/cop/style/sample.rb +3 -4
  593. data/lib/rubocop/cop/style/select_by_regexp.rb +33 -16
  594. data/lib/rubocop/cop/style/self_assignment.rb +12 -18
  595. data/lib/rubocop/cop/style/semicolon.rb +22 -6
  596. data/lib/rubocop/cop/style/send.rb +4 -4
  597. data/lib/rubocop/cop/style/send_with_literal_method_name.rb +105 -0
  598. data/lib/rubocop/cop/style/signal_exception.rb +3 -4
  599. data/lib/rubocop/cop/style/single_argument_dig.rb +16 -8
  600. data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
  601. data/lib/rubocop/cop/style/single_line_do_end_block.rb +78 -0
  602. data/lib/rubocop/cop/style/single_line_methods.rb +10 -8
  603. data/lib/rubocop/cop/style/slicing_with_range.rb +106 -11
  604. data/lib/rubocop/cop/style/sole_nested_conditional.rb +50 -90
  605. data/lib/rubocop/cop/style/special_global_vars.rb +5 -7
  606. data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
  607. data/lib/rubocop/cop/style/string_chars.rb +1 -0
  608. data/lib/rubocop/cop/style/string_concatenation.rb +15 -15
  609. data/lib/rubocop/cop/style/string_literals.rb +1 -1
  610. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +30 -5
  611. data/lib/rubocop/cop/style/string_methods.rb +1 -1
  612. data/lib/rubocop/cop/style/strip.rb +7 -4
  613. data/lib/rubocop/cop/style/struct_inheritance.rb +10 -3
  614. data/lib/rubocop/cop/style/super_arguments.rb +221 -0
  615. data/lib/rubocop/cop/style/super_with_args_parentheses.rb +35 -0
  616. data/lib/rubocop/cop/style/swap_values.rb +4 -15
  617. data/lib/rubocop/cop/style/symbol_array.rb +35 -15
  618. data/lib/rubocop/cop/style/symbol_proc.rb +78 -6
  619. data/lib/rubocop/cop/style/ternary_parentheses.rb +26 -5
  620. data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -1
  621. data/lib/rubocop/cop/style/trailing_body_on_class.rb +1 -0
  622. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +11 -2
  623. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
  624. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1 -1
  625. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
  626. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +5 -5
  627. data/lib/rubocop/cop/style/trivial_accessors.rb +3 -3
  628. data/lib/rubocop/cop/style/unless_logical_operators.rb +1 -0
  629. data/lib/rubocop/cop/style/unpack_first.rb +11 -14
  630. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -2
  631. data/lib/rubocop/cop/style/while_until_do.rb +0 -2
  632. data/lib/rubocop/cop/style/while_until_modifier.rb +0 -2
  633. data/lib/rubocop/cop/style/word_array.rb +18 -6
  634. data/lib/rubocop/cop/style/yaml_file_read.rb +66 -0
  635. data/lib/rubocop/cop/style/yoda_condition.rb +25 -12
  636. data/lib/rubocop/cop/style/yoda_expression.rb +20 -9
  637. data/lib/rubocop/cop/style/zero_length_predicate.rb +41 -29
  638. data/lib/rubocop/cop/team.rb +58 -26
  639. data/lib/rubocop/cop/util.rb +33 -11
  640. data/lib/rubocop/cop/utils/format_string.rb +10 -5
  641. data/lib/rubocop/cop/variable_force/assignment.rb +66 -6
  642. data/lib/rubocop/cop/variable_force/branch.rb +1 -1
  643. data/lib/rubocop/cop/variable_force/scope.rb +3 -3
  644. data/lib/rubocop/cop/variable_force/variable.rb +18 -5
  645. data/lib/rubocop/cop/variable_force/variable_table.rb +5 -5
  646. data/lib/rubocop/cop/variable_force.rb +19 -12
  647. data/lib/rubocop/cops_documentation_generator.rb +138 -55
  648. data/lib/rubocop/core_ext/string.rb +2 -6
  649. data/lib/rubocop/directive_comment.rb +57 -21
  650. data/lib/rubocop/ext/comment.rb +18 -0
  651. data/lib/rubocop/ext/regexp_node.rb +17 -35
  652. data/lib/rubocop/ext/regexp_parser.rb +7 -21
  653. data/lib/rubocop/file_finder.rb +11 -9
  654. data/lib/rubocop/formatter/clang_style_formatter.rb +3 -7
  655. data/lib/rubocop/formatter/disabled_config_formatter.rb +26 -10
  656. data/lib/rubocop/formatter/formatter_set.rb +8 -2
  657. data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
  658. data/lib/rubocop/formatter/html_formatter.rb +38 -15
  659. data/lib/rubocop/formatter/json_formatter.rb +0 -1
  660. data/lib/rubocop/formatter/junit_formatter.rb +74 -24
  661. data/lib/rubocop/formatter/offense_count_formatter.rb +13 -3
  662. data/lib/rubocop/formatter/pacman_formatter.rb +1 -1
  663. data/lib/rubocop/formatter/simple_text_formatter.rb +1 -1
  664. data/lib/rubocop/formatter/tap_formatter.rb +3 -7
  665. data/lib/rubocop/formatter.rb +1 -1
  666. data/lib/rubocop/lockfile.rb +58 -7
  667. data/lib/rubocop/lsp/diagnostic.rb +189 -0
  668. data/lib/rubocop/lsp/logger.rb +22 -0
  669. data/lib/rubocop/lsp/routes.rb +227 -0
  670. data/lib/rubocop/lsp/runtime.rb +69 -0
  671. data/lib/rubocop/lsp/server.rb +70 -0
  672. data/lib/rubocop/lsp/severity.rb +27 -0
  673. data/lib/rubocop/lsp/stdin_runner.rb +85 -0
  674. data/lib/rubocop/lsp.rb +36 -0
  675. data/lib/rubocop/magic_comment.rb +24 -14
  676. data/lib/rubocop/options.rb +78 -23
  677. data/lib/rubocop/path_util.rb +21 -10
  678. data/lib/rubocop/pending_cops_reporter.rb +56 -0
  679. data/lib/rubocop/plugin/configuration_integrator.rb +143 -0
  680. data/lib/rubocop/plugin/load_error.rb +26 -0
  681. data/lib/rubocop/plugin/loader.rb +100 -0
  682. data/lib/rubocop/plugin/not_supported_error.rb +29 -0
  683. data/lib/rubocop/plugin.rb +46 -0
  684. data/lib/rubocop/rake_task.rb +5 -2
  685. data/lib/rubocop/remote_config.rb +5 -1
  686. data/lib/rubocop/result_cache.rb +20 -23
  687. data/lib/rubocop/rspec/cop_helper.rb +21 -3
  688. data/lib/rubocop/rspec/expect_offense.rb +31 -12
  689. data/lib/rubocop/rspec/shared_contexts.rb +118 -21
  690. data/lib/rubocop/rspec/support.rb +8 -2
  691. data/lib/rubocop/runner.rb +80 -17
  692. data/lib/rubocop/server/cache.rb +66 -8
  693. data/lib/rubocop/server/cli.rb +39 -20
  694. data/lib/rubocop/server/client_command/base.rb +10 -0
  695. data/lib/rubocop/server/client_command/exec.rb +6 -5
  696. data/lib/rubocop/server/client_command/start.rb +17 -2
  697. data/lib/rubocop/server/core.rb +29 -9
  698. data/lib/rubocop/server/helper.rb +1 -1
  699. data/lib/rubocop/server/server_command/exec.rb +1 -2
  700. data/lib/rubocop/string_interpreter.rb +3 -3
  701. data/lib/rubocop/target_finder.rb +97 -82
  702. data/lib/rubocop/target_ruby.rb +105 -79
  703. data/lib/rubocop/version.rb +74 -12
  704. data/lib/rubocop/yaml_duplication_checker.rb +20 -26
  705. data/lib/rubocop.rb +81 -2
  706. data/lib/ruby_lsp/rubocop/addon.rb +75 -0
  707. data/lib/ruby_lsp/rubocop/runtime_adapter.rb +65 -0
  708. metadata +152 -63
  709. data/lib/rubocop/cop/naming/predicate_name.rb +0 -134
  710. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
  711. /data/lib/rubocop/formatter/{git_hub_actions_formatter.rb → github_actions_formatter.rb} +0 -0
@@ -160,7 +160,7 @@ module RuboCop
160
160
  end
161
161
 
162
162
  def two_alternatives?(line)
163
- /^\s*(else|elsif|when|rescue|ensure)\b/.match?(line)
163
+ /^\s*(else|elsif|when|in|rescue|ensure)\b/.match?(line)
164
164
  end
165
165
  end
166
166
  end
@@ -9,16 +9,12 @@ module RuboCop
9
9
  # @example
10
10
  #
11
11
  # # bad
12
- #
13
12
  # if
14
13
  # some_condition
15
14
  # do_something
16
15
  # end
17
16
  #
18
- # @example
19
- #
20
17
  # # good
21
- #
22
18
  # if some_condition
23
19
  # do_something
24
20
  # end
@@ -48,7 +48,7 @@ module RuboCop
48
48
  def on_send(node)
49
49
  return unless node.def_modifier?
50
50
 
51
- method_def = node.each_descendant(:def, :defs).first
51
+ method_def = node.each_descendant(:any_def).first
52
52
  expr = node.source_range
53
53
 
54
54
  line_start = range_between(expr.begin_pos, method_def.loc.keyword.end_pos)
@@ -61,7 +61,7 @@ module RuboCop
61
61
  private
62
62
 
63
63
  def autocorrect(corrector, node)
64
- if style == :start_of_line && node.parent && node.parent.send_type?
64
+ if style == :start_of_line && node.parent&.send_type?
65
65
  AlignmentCorrector.align_end(corrector, processed_source, node, node.parent)
66
66
  else
67
67
  AlignmentCorrector.align_end(corrector, processed_source, node, node)
@@ -32,7 +32,7 @@ module RuboCop
32
32
  end
33
33
 
34
34
  def on_send(node)
35
- return unless node.dot? || ampersand_dot?(node)
35
+ return unless node.dot? || node.safe_navigation?
36
36
 
37
37
  return correct_style_detected if proper_dot_position?(node)
38
38
 
@@ -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)
@@ -133,10 +133,6 @@ module RuboCop
133
133
  # l.(1) has no selector, so we use the opening parenthesis instead
134
134
  node.loc.selector || node.loc.begin
135
135
  end
136
-
137
- def ampersand_dot?(node)
138
- node.loc.respond_to?(:dot) && node.loc.dot && node.loc.dot.is?('&.')
139
- end
140
136
  end
141
137
  end
142
138
  end
@@ -49,7 +49,7 @@ module RuboCop
49
49
  end
50
50
 
51
51
  def on_rescue(node)
52
- return unless node.loc.respond_to?(:else) && node.loc.else
52
+ return unless node.loc?(:else)
53
53
 
54
54
  check_alignment(base_range_of_rescue(node), node.loc.else)
55
55
  end
@@ -92,7 +92,7 @@ module RuboCop
92
92
  case parent.type
93
93
  when :def, :defs then base_for_method_definition(parent)
94
94
  when :kwbegin then parent.loc.begin
95
- when :block
95
+ when :block, :numblock, :itblock
96
96
  assignment_node = assignment_node(parent)
97
97
  if same_line?(parent, assignment_node)
98
98
  assignment_node.source_range
@@ -97,16 +97,18 @@ module RuboCop
97
97
  def autocorrect(corrector, node)
98
98
  previous_token = previous_token(node)
99
99
  range = if previous_token && same_line?(node, previous_token)
100
- range_with_surrounding_space(node.loc.expression, newlines: false)
100
+ range_with_surrounding_space(node.source_range, newlines: false)
101
101
  else
102
- range_by_whole_lines(node.loc.expression, include_final_newline: true)
102
+ range_by_whole_lines(node.source_range, include_final_newline: true)
103
103
  end
104
104
 
105
105
  corrector.remove(range)
106
106
  end
107
107
 
108
108
  def concat_consecutive_comments(comments)
109
- consecutive_comments = comments.chunk_while { |i, j| i.loc.line.succ == j.loc.line }
109
+ consecutive_comments = comments.chunk_while do |i, j|
110
+ i.loc.line.succ == j.loc.line && i.loc.column == j.loc.column
111
+ end
110
112
 
111
113
  consecutive_comments.map do |chunk|
112
114
  joined_text = chunk.map { |c| comment_text(c) }.join
@@ -137,7 +139,7 @@ module RuboCop
137
139
  end
138
140
 
139
141
  def current_token(comment)
140
- processed_source.find_token { |token| token.pos == comment.loc.expression }
142
+ processed_source.tokens.find { |token| token.pos == comment.source_range }
141
143
  end
142
144
 
143
145
  def previous_token(node)
@@ -3,7 +3,23 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Layout
6
- # Enforces empty line after guard clause
6
+ # Enforces empty line after guard clause.
7
+ #
8
+ # This cop allows `# :nocov:` directive after guard clause because
9
+ # SimpleCov excludes code from the coverage report by wrapping it in `# :nocov:`:
10
+ #
11
+ # [source,ruby]
12
+ # ----
13
+ # def foo
14
+ # # :nocov:
15
+ # return if condition
16
+ # # :nocov:
17
+ # bar
18
+ # end
19
+ # ----
20
+ #
21
+ # Refer to SimpleCov's documentation for more details:
22
+ # https://github.com/simplecov-ruby/simplecov#ignoringskipping-code
7
23
  #
8
24
  # @example
9
25
  #
@@ -42,19 +58,22 @@ module RuboCop
42
58
 
43
59
  MSG = 'Add empty line after guard clause.'
44
60
  END_OF_HEREDOC_LINE = 1
61
+ SIMPLE_DIRECTIVE_COMMENT_PATTERN = /\A# *:nocov:\z/.freeze
45
62
 
46
63
  def on_if(node)
47
64
  return if correct_style?(node)
48
65
  return if multiple_statements_on_line?(node)
49
66
 
50
67
  if node.modifier_form? && (heredoc_node = last_heredoc_argument(node))
51
- return if next_line_empty_or_enable_directive_comment?(heredoc_line(node, heredoc_node))
68
+ if next_line_empty_or_allowed_directive_comment?(heredoc_line(node, heredoc_node))
69
+ return
70
+ end
52
71
 
53
72
  add_offense(heredoc_node.loc.heredoc_end) do |corrector|
54
73
  autocorrect(corrector, heredoc_node)
55
74
  end
56
75
  else
57
- return if next_line_empty_or_enable_directive_comment?(node.last_line)
76
+ return if next_line_empty_or_allowed_directive_comment?(node.last_line)
58
77
 
59
78
  add_offense(offense_location(node)) { |corrector| autocorrect(corrector, node) }
60
79
  end
@@ -70,7 +89,7 @@ module RuboCop
70
89
  end
71
90
 
72
91
  next_line = node_range.last_line + 1
73
- if next_line_enable_directive_comment?(next_line)
92
+ if next_line_allowed_directive_comment?(next_line)
74
93
  node_range = processed_source.comment_at_line(next_line)
75
94
  end
76
95
 
@@ -88,21 +107,21 @@ module RuboCop
88
107
  node.if_branch&.guard_clause?
89
108
  end
90
109
 
91
- def next_line_empty_or_enable_directive_comment?(line)
110
+ def next_line_empty_or_allowed_directive_comment?(line)
92
111
  return true if next_line_empty?(line)
93
112
 
94
113
  next_line = line + 1
95
- next_line_enable_directive_comment?(next_line) && next_line_empty?(next_line)
114
+ next_line_allowed_directive_comment?(next_line) && next_line_empty?(next_line)
96
115
  end
97
116
 
98
117
  def next_line_empty?(line)
99
118
  processed_source[line].blank?
100
119
  end
101
120
 
102
- def next_line_enable_directive_comment?(line)
121
+ def next_line_allowed_directive_comment?(line)
103
122
  return false unless (comment = processed_source.comment_at_line(line))
104
123
 
105
- DirectiveComment.new(comment).enabled?
124
+ DirectiveComment.new(comment).enabled? || simplecov_directive_comment?(comment)
106
125
  end
107
126
 
108
127
  def next_line_rescue_or_ensure?(node)
@@ -112,11 +131,11 @@ module RuboCop
112
131
 
113
132
  def next_sibling_parent_empty_or_else?(node)
114
133
  next_sibling = node.right_sibling
115
- return true if next_sibling.nil?
134
+ return true unless next_sibling.is_a?(AST::Node)
116
135
 
117
136
  parent = next_sibling.parent
118
137
 
119
- parent&.if_type? && parent&.else?
138
+ parent&.if_type? && parent.else?
120
139
  end
121
140
 
122
141
  def next_sibling_empty_or_guard_clause?(node)
@@ -137,7 +156,7 @@ module RuboCop
137
156
  return node if node
138
157
  end
139
158
 
140
- return last_heredoc_argument(n.receiver) if n.respond_to?(:receiver)
159
+ last_heredoc_argument(n.receiver) if n.respond_to?(:receiver)
141
160
  end
142
161
 
143
162
  def last_heredoc_argument_node(node)
@@ -145,6 +164,8 @@ module RuboCop
145
164
 
146
165
  if node.if_branch.and_type?
147
166
  node.if_branch.children.first
167
+ elsif use_heredoc_in_condition?(node.condition)
168
+ node.condition
148
169
  else
149
170
  node.if_branch.children.last
150
171
  end
@@ -161,8 +182,14 @@ module RuboCop
161
182
  node.respond_to?(:heredoc?) && node.heredoc?
162
183
  end
163
184
 
185
+ def use_heredoc_in_condition?(condition)
186
+ condition.descendants.any? do |descendant|
187
+ descendant.respond_to?(:heredoc?) && descendant.heredoc?
188
+ end
189
+ end
190
+
164
191
  def offense_location(node)
165
- if node.loc.respond_to?(:end) && node.loc.end
192
+ if node.loc?(:end)
166
193
  node.loc.end
167
194
  else
168
195
  node
@@ -173,7 +200,13 @@ module RuboCop
173
200
  parent = node.parent
174
201
  return false unless parent
175
202
 
176
- parent.begin_type? && parent.single_line?
203
+ parent.begin_type? && same_line?(node, node.right_sibling)
204
+ end
205
+
206
+ # SimpleCov excludes code from the coverage report by wrapping it in `# :nocov:`:
207
+ # https://github.com/simplecov-ruby/simplecov#ignoringskipping-code
208
+ def simplecov_directive_comment?(comment)
209
+ SIMPLE_DIRECTIVE_COMMENT_PATTERN.match?(comment.text)
177
210
  end
178
211
  end
179
212
  end
@@ -27,9 +27,9 @@ module RuboCop
27
27
  MSG = 'Add an empty line after magic comments.'
28
28
 
29
29
  def on_new_investigation
30
- return unless processed_source.ast &&
31
- (last_magic_comment = last_magic_comment(processed_source))
32
- return if processed_source[last_magic_comment.loc.line].strip.empty?
30
+ return unless (last_magic_comment = last_magic_comment(processed_source))
31
+ return unless (next_line = processed_source[last_magic_comment.loc.line])
32
+ return if next_line.strip.empty?
33
33
 
34
34
  offending_range = offending_range(last_magic_comment)
35
35
 
@@ -46,18 +46,25 @@ module RuboCop
46
46
 
47
47
  # Find the last magic comment in the source file.
48
48
  #
49
- # Take all comments that precede the first line of code, select the
49
+ # Take all comments that precede the first line of code (or just take
50
+ # them all in the case when there is no code), select the
50
51
  # magic comments, and return the last magic comment in the file.
51
52
  #
52
53
  # @return [Parser::Source::Comment] if magic comments exist before code
53
54
  # @return [nil] otherwise
54
55
  def last_magic_comment(source)
55
- source
56
- .comments
57
- .take_while { |comment| comment.loc.line < source.ast.loc.line }
56
+ comments_before_code(source)
58
57
  .reverse
59
58
  .find { |comment| MagicComment.parse(comment.text).any? }
60
59
  end
60
+
61
+ def comments_before_code(source)
62
+ if source.ast
63
+ source.comments.take_while { |comment| comment.loc.line < source.ast.loc.line }
64
+ else
65
+ source.comments
66
+ end
67
+ end
61
68
  end
62
69
  end
63
70
  end
@@ -80,7 +80,7 @@ module RuboCop
80
80
  alias on_until_post on_while_post
81
81
 
82
82
  def on_case(node)
83
- node.each_when do |when_node|
83
+ node.when_branches.each do |when_node|
84
84
  last_condition = when_node.conditions.last
85
85
 
86
86
  next if !multiline_when_condition?(when_node) ||
@@ -22,8 +22,6 @@ module RuboCop
22
22
  # def b
23
23
  # end
24
24
  #
25
- # @example
26
- #
27
25
  # # good
28
26
  # def a
29
27
  # end
@@ -42,8 +40,6 @@ module RuboCop
42
40
  # def b
43
41
  # end
44
42
  #
45
- # @example
46
- #
47
43
  # # good
48
44
  # class A
49
45
  # end
@@ -65,8 +61,6 @@ module RuboCop
65
61
  # def b
66
62
  # end
67
63
  #
68
- # @example
69
- #
70
64
  # # good
71
65
  # module A
72
66
  # end
@@ -135,7 +129,8 @@ module RuboCop
135
129
  return if nodes.all?(&:single_line?) && cop_config['AllowAdjacentOneLineDefs']
136
130
 
137
131
  correction_node = nodes.last
138
- location = correction_node.loc.keyword.join(correction_node.loc.name)
132
+
133
+ location = def_location(correction_node)
139
134
  add_offense(location, message: message(correction_node, count: count)) do |corrector|
140
135
  autocorrect(corrector, *nodes, count)
141
136
  end
@@ -148,7 +143,8 @@ module RuboCop
148
143
  newline_pos = source_buffer.source.index("\n", end_pos)
149
144
 
150
145
  # Handle the case when multiple one-liners are on the same line.
151
- newline_pos = end_pos + 1 if newline_pos > node.source_range.begin_pos
146
+ begin_pos = node.source_range.begin_pos
147
+ newline_pos = begin_pos - 1 if newline_pos > begin_pos
152
148
 
153
149
  if count > maximum_empty_lines
154
150
  autocorrect_remove_lines(corrector, newline_pos, count)
@@ -159,14 +155,32 @@ module RuboCop
159
155
 
160
156
  private
161
157
 
158
+ def def_location(correction_node)
159
+ if correction_node.any_block_type?
160
+ correction_node.source_range.join(correction_node.children.first.source_range)
161
+ else
162
+ correction_node.loc.keyword.join(correction_node.loc.name)
163
+ end
164
+ end
165
+
162
166
  def candidate?(node)
163
- return unless node
167
+ return false unless node
168
+
169
+ method_candidate?(node) || class_candidate?(node) || module_candidate?(node) ||
170
+ macro_candidate?(node)
171
+ end
164
172
 
165
- method_candidate?(node) || class_candidate?(node) || module_candidate?(node)
173
+ def empty_line_between_macros
174
+ cop_config.fetch('DefLikeMacros', []).map(&:to_sym)
175
+ end
176
+
177
+ def macro_candidate?(node)
178
+ node.any_block_type? && node.children.first.macro? &&
179
+ empty_line_between_macros.include?(node.children.first.method_name)
166
180
  end
167
181
 
168
182
  def method_candidate?(node)
169
- cop_config['EmptyLineBetweenMethodDefs'] && (node.def_type? || node.defs_type?)
183
+ cop_config['EmptyLineBetweenMethodDefs'] && node.any_def_type?
170
184
  end
171
185
 
172
186
  def class_candidate?(node)
@@ -226,7 +240,11 @@ module RuboCop
226
240
  end
227
241
 
228
242
  def def_start(node)
229
- node.loc.keyword.line
243
+ if node.any_block_type? && node.children.first.send_type?
244
+ node.source_range.line
245
+ else
246
+ node.loc.keyword.line
247
+ end
230
248
  end
231
249
 
232
250
  def def_end(node)
@@ -234,8 +252,8 @@ module RuboCop
234
252
  end
235
253
 
236
254
  def end_loc(node)
237
- if (node.def_type? || node.defs_type?) && node.endless?
238
- node.loc.expression.end
255
+ if node.any_def_type? && node.endless?
256
+ node.source_range.end
239
257
  else
240
258
  node.loc.end
241
259
  end
@@ -259,6 +277,8 @@ module RuboCop
259
277
  case node.type
260
278
  when :def, :defs
261
279
  :method
280
+ when :numblock, :itblock
281
+ :block
262
282
  else
263
283
  node.type
264
284
  end
@@ -31,7 +31,7 @@ module RuboCop
31
31
  return unless processed_source.raw_source.include?("\n\n\n")
32
32
 
33
33
  lines = Set.new
34
- processed_source.each_token { |token| lines << token.line }
34
+ processed_source.tokens.each { |token| lines << token.line }
35
35
 
36
36
  each_extra_empty_line(lines.sort) do |range|
37
37
  add_offense(range) do |corrector|
@@ -51,6 +51,8 @@ module RuboCop
51
51
  MSG_BEFORE_FOR_ONLY_BEFORE = 'Keep a blank line before `%<modifier>s`.'
52
52
  MSG_AFTER_FOR_ONLY_BEFORE = 'Remove a blank line after `%<modifier>s`.'
53
53
 
54
+ RESTRICT_ON_SEND = %i[public protected private module_function].freeze
55
+
54
56
  def initialize(config = nil, options = nil)
55
57
  super
56
58
 
@@ -81,17 +83,18 @@ module RuboCop
81
83
  end
82
84
 
83
85
  alias on_numblock on_block
86
+ alias on_itblock on_block
84
87
 
85
- def on_send(node) # rubocop:disable Metrics/CyclomaticComplexity
86
- return unless node.bare_access_modifier? &&
87
- !(node.parent&.block_type? || node.parent&.numblock_type?)
88
+ def on_send(node)
89
+ return unless node.bare_access_modifier? && !node.block_literal?
90
+ return if same_line?(node, node.right_sibling)
88
91
  return if expected_empty_lines?(node)
89
92
 
90
93
  message = message(node)
91
94
  add_offense(node, message: message) do |corrector|
92
95
  line = range_by_whole_lines(node.source_range)
93
96
 
94
- corrector.insert_before(line, "\n") unless previous_line_empty?(node.first_line)
97
+ corrector.insert_before(line, "\n") if should_insert_line_before?(node)
95
98
 
96
99
  correct_next_line_if_denied_style(corrector, node, line)
97
100
  end
@@ -113,18 +116,20 @@ module RuboCop
113
116
  def allowed_only_before_style?(node)
114
117
  if node.special_modifier?
115
118
  return true if processed_source[node.last_line] == 'end'
116
- return false if next_line_empty?(node.last_line)
119
+ return false if next_line_empty_and_exists?(node.last_line)
117
120
  end
118
121
 
119
122
  previous_line_empty?(node.first_line)
120
123
  end
121
124
 
122
125
  def correct_next_line_if_denied_style(corrector, node, line)
126
+ return unless should_insert_line_after?(node)
127
+
123
128
  case style
124
129
  when :around
125
130
  corrector.insert_after(line, "\n") unless next_line_empty?(node.last_line)
126
131
  when :only_before
127
- if next_line_empty?(node.last_line)
132
+ if next_line_empty_and_exists?(node.last_line)
128
133
  range = next_empty_line_range(node)
129
134
 
130
135
  corrector.remove(range)
@@ -133,7 +138,7 @@ module RuboCop
133
138
  end
134
139
 
135
140
  def previous_line_ignoring_comments(processed_source, send_line)
136
- processed_source[0..send_line - 2].reverse.find { |line| !comment_line?(line) }
141
+ processed_source[0..(send_line - 2)].reverse.find { |line| !comment_line?(line) }
137
142
  end
138
143
 
139
144
  def previous_line_empty?(send_line)
@@ -149,6 +154,10 @@ module RuboCop
149
154
  body_end?(last_send_line) || next_line.blank?
150
155
  end
151
156
 
157
+ def next_line_empty_and_exists?(last_send_line)
158
+ next_line_empty?(last_send_line) && last_send_line.next != processed_source.lines.size
159
+ end
160
+
152
161
  def empty_lines_around?(node)
153
162
  previous_line_empty?(node.first_line) && next_line_empty?(node.last_line)
154
163
  end
@@ -203,6 +212,29 @@ module RuboCop
203
212
  format(MSG_BEFORE_FOR_ONLY_BEFORE, modifier: modifier)
204
213
  end
205
214
  end
215
+
216
+ def should_insert_line_before?(node)
217
+ return false if previous_line_empty?(node.first_line)
218
+ return true unless inside_block?(node) && no_empty_lines_around_block_body?
219
+ return true unless node.parent.begin_type?
220
+
221
+ node.parent.children.first != node
222
+ end
223
+
224
+ def should_insert_line_after?(node)
225
+ return true unless inside_block?(node) && no_empty_lines_around_block_body?
226
+
227
+ node.parent.children.last != node
228
+ end
229
+
230
+ def inside_block?(node)
231
+ node.parent.block_type? || (node.parent.begin_type? && node.parent.parent&.block_type?)
232
+ end
233
+
234
+ def no_empty_lines_around_block_body?
235
+ config.for_enabled_cop('Layout/EmptyLinesAroundBlockBody')['EnforcedStyle'] ==
236
+ 'no_empty_lines'
237
+ end
206
238
  end
207
239
  end
208
240
  end
@@ -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
@@ -34,6 +34,7 @@ module RuboCop
34
34
  end
35
35
 
36
36
  alias on_numblock on_block
37
+ alias on_itblock on_block
37
38
  end
38
39
  end
39
40
  end
@@ -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
@@ -68,10 +68,11 @@ module RuboCop
68
68
  check_body(node.body, node.loc.line)
69
69
  end
70
70
  alias on_defs on_def
71
+ alias on_block on_def
72
+ alias on_numblock on_def
71
73
 
72
74
  def on_kwbegin(node)
73
- body, = *node
74
- check_body(body, node.loc.line)
75
+ check_body(node.children.first, node.loc.line)
75
76
  end
76
77
 
77
78
  private
@@ -81,7 +82,7 @@ module RuboCop
81
82
 
82
83
  locations.each do |loc|
83
84
  line = loc.line
84
- next if line == line_of_def_or_kwbegin || last_rescue_and_end_on_same_line(body)
85
+ next if line == line_of_def_or_kwbegin || last_body_and_end_on_same_line?(body)
85
86
 
86
87
  keyword = loc.source
87
88
  # below the keyword
@@ -91,8 +92,13 @@ module RuboCop
91
92
  end
92
93
  end
93
94
 
94
- def last_rescue_and_end_on_same_line(body)
95
- body.rescue_type? && body.resbody_branches.last.loc.line == body.parent.loc.end.line
95
+ def last_body_and_end_on_same_line?(body)
96
+ end_keyword_line = body.parent.loc.end.line
97
+ return body.loc.last_line == end_keyword_line unless body.rescue_type?
98
+
99
+ last_body_line = body.else? ? body.loc.else.line : body.resbody_branches.last.loc.line
100
+
101
+ last_body_line == end_keyword_line
96
102
  end
97
103
 
98
104
  def message(location, keyword)
@@ -121,10 +127,10 @@ module RuboCop
121
127
  end
122
128
 
123
129
  def keyword_locations_in_ensure(node)
124
- ensure_body, = *node
130
+ rescue_body_without_ensure = node.children.first
125
131
  [
126
132
  node.loc.keyword,
127
- *keyword_locations(ensure_body)
133
+ *keyword_locations(rescue_body_without_ensure)
128
134
  ]
129
135
  end
130
136
  end
@@ -27,7 +27,14 @@ module RuboCop
27
27
  KIND = 'method'
28
28
 
29
29
  def on_def(node)
30
- check(node, node.body)
30
+ if node.endless?
31
+ return unless offending_endless_method?(node)
32
+
33
+ register_offense_for_endless_method(node)
34
+ else
35
+ first_line = node.arguments.source_range&.last_line
36
+ check(node, node.body, adjusted_first_line: first_line)
37
+ end
31
38
  end
32
39
  alias on_defs on_def
33
40
 
@@ -36,6 +43,21 @@ module RuboCop
36
43
  def style
37
44
  :no_empty_lines
38
45
  end
46
+
47
+ def offending_endless_method?(node)
48
+ node.body.first_line > node.loc.assignment.line + 1 &&
49
+ processed_source.lines[node.loc.assignment.line].empty?
50
+ end
51
+
52
+ def register_offense_for_endless_method(node)
53
+ range = processed_source.buffer.line_range(node.loc.assignment.line + 1).resize(1)
54
+
55
+ msg = message(MSG_EXTRA, 'beginning')
56
+
57
+ add_offense(range, message: msg) do |corrector|
58
+ corrector.remove(range)
59
+ end
60
+ end
39
61
  end
40
62
  end
41
63
  end