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
@@ -0,0 +1,221 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # Checks for redundant argument forwarding when calling super with arguments identical to
7
+ # the method definition.
8
+ #
9
+ # Using zero arity `super` within a `define_method` block results in `RuntimeError`:
10
+ #
11
+ # [source,ruby]
12
+ # ----
13
+ # def m
14
+ # define_method(:foo) { super() } # => OK
15
+ # end
16
+ #
17
+ # def m
18
+ # define_method(:foo) { super } # => RuntimeError
19
+ # end
20
+ # ----
21
+ #
22
+ # Furthermore, any arguments accompanied by a block may potentially be delegating to
23
+ # `define_method`, therefore, `super` used within these blocks will be allowed.
24
+ # This approach might result in false negatives, yet ensuring safe detection takes precedence.
25
+ #
26
+ # NOTE: When forwarding the same arguments but replacing the block argument with a new inline
27
+ # block, it is not necessary to explicitly list the non-block arguments. As such, an offense
28
+ # will be registered in this case.
29
+ #
30
+ # @example
31
+ # # bad
32
+ # def method(*args, **kwargs)
33
+ # super(*args, **kwargs)
34
+ # end
35
+ #
36
+ # # good - implicitly passing all arguments
37
+ # def method(*args, **kwargs)
38
+ # super
39
+ # end
40
+ #
41
+ # # good - forwarding a subset of the arguments
42
+ # def method(*args, **kwargs)
43
+ # super(*args)
44
+ # end
45
+ #
46
+ # # good - forwarding no arguments
47
+ # def method(*args, **kwargs)
48
+ # super()
49
+ # end
50
+ #
51
+ # # bad - forwarding with overridden block
52
+ # def method(*args, **kwargs, &block)
53
+ # super(*args, **kwargs) { do_something }
54
+ # end
55
+ #
56
+ # # good - implicitly passing all non-block arguments
57
+ # def method(*args, **kwargs, &block)
58
+ # super { do_something }
59
+ # end
60
+ #
61
+ # # good - assigning to the block variable before calling super
62
+ # def method(&block)
63
+ # # Assigning to the block variable would pass the old value to super,
64
+ # # under this circumstance the block must be referenced explicitly.
65
+ # block ||= proc { 'fallback behavior' }
66
+ # super(&block)
67
+ # end
68
+ class SuperArguments < Base
69
+ extend AutoCorrector
70
+
71
+ ASSIGN_TYPES = %i[or_asgn lvasgn].freeze
72
+
73
+ MSG = 'Call `super` without arguments and parentheses when the signature is identical.'
74
+ MSG_INLINE_BLOCK = 'Call `super` without arguments and parentheses when all positional ' \
75
+ 'and keyword arguments are forwarded.'
76
+
77
+ def on_super(super_node)
78
+ return unless (def_node = find_def_node(super_node))
79
+
80
+ def_node_args = def_node.arguments.argument_list
81
+ super_args = preprocess_super_args(super_node.arguments)
82
+
83
+ return unless arguments_identical?(def_node, super_node, def_node_args, super_args)
84
+
85
+ # If the number of arguments to the def node and super node are different here,
86
+ # it's because the block argument is not forwarded.
87
+ message = def_node_args.size == super_args.size ? MSG : MSG_INLINE_BLOCK
88
+ add_offense(super_node, message: message) do |corrector|
89
+ corrector.replace(super_node, 'super')
90
+ end
91
+ end
92
+
93
+ private
94
+
95
+ def find_def_node(super_node)
96
+ super_node.ancestors.find do |node|
97
+ # When defining dynamic methods, implicitly calling `super` is not possible.
98
+ # Since there is a possibility of delegation to `define_method`,
99
+ # `super` used within the block is always allowed.
100
+ break if node.any_block_type? && !block_sends_to_super?(super_node, node)
101
+
102
+ break node if node.any_def_type?
103
+ end
104
+ end
105
+
106
+ # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
107
+ def arguments_identical?(def_node, super_node, def_args, super_args)
108
+ return false if argument_list_size_differs?(def_args, super_args, super_node)
109
+
110
+ def_args.zip(super_args).each do |def_arg, super_arg|
111
+ next if positional_arg_same?(def_arg, super_arg)
112
+ next if positional_rest_arg_same(def_arg, super_arg)
113
+ next if keyword_arg_same?(def_arg, super_arg)
114
+ next if keyword_rest_arg_same?(def_arg, super_arg)
115
+ next if block_arg_same?(def_node, super_node, def_arg, super_arg)
116
+ next if forward_arg_same?(def_arg, super_arg)
117
+
118
+ return false
119
+ end
120
+
121
+ true
122
+ end
123
+ # rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
124
+
125
+ def argument_list_size_differs?(def_args, super_args, super_node)
126
+ # If the def node has a block argument and the super node has an explicit block,
127
+ # the number of arguments is the same, so ignore the def node block arg.
128
+ def_args_size = def_args.size
129
+ def_args_size -= 1 if def_args.any?(&:blockarg_type?) && block_sends_to_super?(super_node)
130
+
131
+ def_args_size != super_args.size
132
+ end
133
+
134
+ def block_sends_to_super?(super_node, parent_node = super_node.parent)
135
+ # Checks if the send node of a block is the given super node,
136
+ # or a method chain containing it.
137
+ return false unless parent_node
138
+ return false unless parent_node.any_block_type?
139
+
140
+ parent_node.send_node.each_node(:super).any?(super_node)
141
+ end
142
+
143
+ def positional_arg_same?(def_arg, super_arg)
144
+ return false unless def_arg.type?(:arg, :optarg)
145
+ return false unless super_arg.lvar_type?
146
+
147
+ def_arg.name == super_arg.children.first
148
+ end
149
+
150
+ def positional_rest_arg_same(def_arg, super_arg)
151
+ return false unless def_arg.restarg_type?
152
+ # anonymous forwarding
153
+ return true if def_arg.name.nil? && super_arg.forwarded_restarg_type?
154
+ return false unless super_arg.splat_type?
155
+ return false unless (lvar_node = super_arg.children.first).lvar_type?
156
+
157
+ def_arg.name == lvar_node.children.first
158
+ end
159
+
160
+ def keyword_arg_same?(def_arg, super_arg)
161
+ return false unless def_arg.type?(:kwarg, :kwoptarg)
162
+ return false unless (pair_node = super_arg).pair_type?
163
+ return false unless (sym_node = pair_node.key).sym_type?
164
+ return false unless (lvar_node = pair_node.value).lvar_type?
165
+ return false unless sym_node.source == lvar_node.source
166
+
167
+ def_arg.name == sym_node.value
168
+ end
169
+
170
+ def keyword_rest_arg_same?(def_arg, super_arg)
171
+ return false unless def_arg.kwrestarg_type?
172
+ # anonymous forwarding
173
+ return true if def_arg.name.nil? && super_arg.forwarded_kwrestarg_type?
174
+ return false unless super_arg.kwsplat_type?
175
+ return false unless (lvar_node = super_arg.children.first).lvar_type?
176
+
177
+ def_arg.name == lvar_node.children.first
178
+ end
179
+
180
+ def block_arg_same?(def_node, super_node, def_arg, super_arg)
181
+ return false unless def_arg.blockarg_type?
182
+ return true if block_sends_to_super?(super_node)
183
+ return false unless super_arg.block_pass_type?
184
+
185
+ # anonymous forwarding
186
+ return true if (block_pass_child = super_arg.children.first).nil? && def_arg.name.nil?
187
+
188
+ block_arg_name = block_pass_child.children.first
189
+ def_arg.name == block_arg_name && !block_reassigned?(def_node, block_arg_name)
190
+ end
191
+
192
+ # Reassigning the block argument will still pass along the original block to super
193
+ # https://bugs.ruby-lang.org/issues/20505
194
+ def block_reassigned?(def_node, block_arg_name)
195
+ def_node.each_node(*ASSIGN_TYPES).any? do |assign_node|
196
+ # TODO: Since `Symbol#name` is supported from Ruby 3.0, the inheritance check for
197
+ # `AST::Node` can be removed when requiring Ruby 3.0+.
198
+ lhs = assign_node.node_parts[0]
199
+ next if lhs.is_a?(AST::Node) && !lhs.respond_to?(:name)
200
+
201
+ assign_node.name == block_arg_name
202
+ end
203
+ end
204
+
205
+ def forward_arg_same?(def_arg, super_arg)
206
+ def_arg.forward_arg_type? && super_arg.forwarded_args_type?
207
+ end
208
+
209
+ def preprocess_super_args(super_args)
210
+ super_args.flat_map do |node|
211
+ if node.hash_type? && !node.braces?
212
+ node.children
213
+ else
214
+ node
215
+ end
216
+ end
217
+ end
218
+ end
219
+ end
220
+ end
221
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # Enforces the presence of parentheses in `super` containing arguments.
7
+ #
8
+ # `super` is a keyword and is provided as a distinct cop from those designed for method call.
9
+ #
10
+ # @example
11
+ #
12
+ # # bad
13
+ # super name, age
14
+ #
15
+ # # good
16
+ # super(name, age)
17
+ #
18
+ class SuperWithArgsParentheses < Base
19
+ extend AutoCorrector
20
+
21
+ MSG = 'Use parentheses for `super` with arguments.'
22
+
23
+ def on_super(node)
24
+ return if node.parenthesized?
25
+
26
+ add_offense(node) do |corrector|
27
+ range = node.loc.keyword.end.join(node.first_argument.source_range.begin)
28
+ corrector.replace(range, '(')
29
+ corrector.insert_after(node.last_argument, ')')
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -79,26 +79,15 @@ module RuboCop
79
79
  end
80
80
 
81
81
  def lhs(node)
82
- case node.type
83
- when :casgn
84
- namespace, name, = *node
85
- if namespace
86
- "#{namespace.const_name}::#{name}"
87
- else
88
- name.to_s
89
- end
82
+ if node.casgn_type?
83
+ "#{'::' if node.absolute?}#{node.const_name}"
90
84
  else
91
- node.children[0].to_s
85
+ node.name.to_s
92
86
  end
93
87
  end
94
88
 
95
89
  def rhs(node)
96
- case node.type
97
- when :casgn
98
- node.children[2].source
99
- else
100
- node.children[1].source
101
- end
90
+ node.expression.source
102
91
  end
103
92
 
104
93
  def correction_range(tmp_assign, y_assign)
@@ -22,6 +22,15 @@ module RuboCop
22
22
  # # bad
23
23
  # [:foo, :bar, :baz]
24
24
  #
25
+ # # bad (contains spaces)
26
+ # %i[foo\ bar baz\ quux]
27
+ #
28
+ # # bad (contains [] with spaces)
29
+ # %i[foo \[ \]]
30
+ #
31
+ # # bad (contains () with spaces)
32
+ # %i(foo \( \))
33
+ #
25
34
  # @example EnforcedStyle: brackets
26
35
  # # good
27
36
  # [:foo, :bar, :baz]
@@ -40,6 +49,15 @@ module RuboCop
40
49
 
41
50
  PERCENT_MSG = 'Use `%i` or `%I` for an array of symbols.'
42
51
  ARRAY_MSG = 'Use %<prefer>s for an array of symbols.'
52
+ DELIMITERS = ['[', ']', '(', ')'].freeze
53
+ SPECIAL_GVARS = %w[
54
+ $! $" $$ $& $' $* $+ $, $/ $; $: $. $< $= $> $? $@ $\\ $_ $` $~ $0
55
+ $-0 $-F $-I $-K $-W $-a $-d $-i $-l $-p $-v $-w
56
+ ].freeze
57
+ REDEFINABLE_OPERATORS = %w(
58
+ | ^ & <=> == === =~ > >= < <= << >>
59
+ + - * / % ** ~ +@ -@ [] []= ` ! != !~
60
+ ).freeze
43
61
 
44
62
  class << self
45
63
  attr_accessor :largest_brackets
@@ -47,7 +65,7 @@ module RuboCop
47
65
 
48
66
  def on_array(node)
49
67
  if bracketed_array_of?(:sym, node)
50
- return if symbols_contain_spaces?(node)
68
+ return if complex_content?(node)
51
69
 
52
70
  check_bracketed_array(node, 'i')
53
71
  elsif node.percent_literal?(:symbol)
@@ -57,13 +75,24 @@ module RuboCop
57
75
 
58
76
  private
59
77
 
60
- def symbols_contain_spaces?(node)
78
+ def complex_content?(node)
61
79
  node.children.any? do |sym|
62
- content, = *sym
63
- / /.match?(content)
80
+ return false if DELIMITERS.include?(sym.source)
81
+
82
+ content = *sym
83
+ content = content.map { |c| c.is_a?(AST::Node) ? c.source : c }.join
84
+ content_without_delimiter_pairs = content.gsub(/(\[[^\s\[\]]*\])|(\([^\s\(\)]*\))/, '')
85
+
86
+ content.include?(' ') || DELIMITERS.any? do |delimiter|
87
+ content_without_delimiter_pairs.include?(delimiter)
88
+ end
64
89
  end
65
90
  end
66
91
 
92
+ def invalid_percent_array_contents?(node)
93
+ complex_content?(node)
94
+ end
95
+
67
96
  def build_bracketed_array(node)
68
97
  return '[]' if node.children.empty?
69
98
 
@@ -88,15 +117,6 @@ module RuboCop
88
117
  end
89
118
 
90
119
  def symbol_without_quote?(string)
91
- special_gvars = %w[
92
- $! $" $$ $& $' $* $+ $, $/ $; $: $. $< $= $> $? $@ $\\ $_ $` $~ $0
93
- $-0 $-F $-I $-K $-W $-a $-d $-i $-l $-p $-v $-w
94
- ]
95
- redefinable_operators = %w(
96
- | ^ & <=> == === =~ > >= < <= << >>
97
- + - * / % ** ~ +@ -@ [] []= ` ! != !~
98
- )
99
-
100
120
  # method name
101
121
  /\A[a-zA-Z_]\w*[!?]?\z/.match?(string) ||
102
122
  # instance / class variable
@@ -104,8 +124,8 @@ module RuboCop
104
124
  # global variable
105
125
  /\A\$[1-9]\d*\z/.match?(string) ||
106
126
  /\A\$[a-zA-Z_]\w*\z/.match?(string) ||
107
- special_gvars.include?(string) ||
108
- redefinable_operators.include?(string)
127
+ SPECIAL_GVARS.include?(string) ||
128
+ REDEFINABLE_OPERATORS.include?(string)
109
129
  end
110
130
  end
111
131
  end
@@ -37,6 +37,42 @@ module RuboCop
37
37
  # # ArgumentError: wrong number of arguments (given 1, expected 0)
38
38
  # ----
39
39
  #
40
+ # It is also unsafe because `Symbol#to_proc` does not work with
41
+ # `protected` methods which would otherwise be accessible.
42
+ #
43
+ # For example:
44
+ #
45
+ # [source,ruby]
46
+ # ----
47
+ # class Box
48
+ # def initialize
49
+ # @secret = rand
50
+ # end
51
+ #
52
+ # def normal_matches?(*others)
53
+ # others.map { |other| other.secret }.any?(secret)
54
+ # end
55
+ #
56
+ # def symbol_to_proc_matches?(*others)
57
+ # others.map(&:secret).any?(secret)
58
+ # end
59
+ #
60
+ # protected
61
+ #
62
+ # attr_reader :secret
63
+ # end
64
+ #
65
+ # boxes = [Box.new, Box.new]
66
+ # Box.new.normal_matches?(*boxes)
67
+ # # => false
68
+ # boxes.first.normal_matches?(*boxes)
69
+ # # => true
70
+ # Box.new.symbol_to_proc_matches?(*boxes)
71
+ # # => NoMethodError: protected method `secret' called for #<Box...>
72
+ # boxes.first.symbol_to_proc_matches?(*boxes)
73
+ # # => NoMethodError: protected method `secret' called for #<Box...>
74
+ # ----
75
+ #
40
76
  # @example
41
77
  # # bad
42
78
  # something.map { |s| s.upcase }
@@ -84,6 +120,23 @@ module RuboCop
84
120
  # # good
85
121
  # something.map { |s| s.upcase }
86
122
  #
123
+ # @example AllCops:ActiveSupportExtensionsEnabled: false (default)
124
+ # # bad
125
+ # ->(x) { x.foo }
126
+ # proc { |x| x.foo }
127
+ # Proc.new { |x| x.foo }
128
+ #
129
+ # # good
130
+ # lambda(&:foo)
131
+ # proc(&:foo)
132
+ # Proc.new(&:foo)
133
+ #
134
+ # @example AllCops:ActiveSupportExtensionsEnabled: true
135
+ # # good
136
+ # ->(x) { x.foo }
137
+ # proc { |x| x.foo }
138
+ # Proc.new { |x| x.foo }
139
+ #
87
140
  class SymbolProc < Base
88
141
  include CommentsHelp
89
142
  include RangeHelp
@@ -93,6 +146,7 @@ module RuboCop
93
146
 
94
147
  MSG = 'Pass `&:%<method>s` as an argument to `%<block_method>s` instead of a block.'
95
148
  SUPER_TYPES = %i[super zsuper].freeze
149
+ LAMBDA_OR_PROC = %i[lambda proc].freeze
96
150
 
97
151
  # @!method proc_node?(node)
98
152
  def_node_matcher :proc_node?, '(send (const {nil? cbase} :Proc) :new)'
@@ -105,6 +159,7 @@ module RuboCop
105
159
  {
106
160
  (block $#symbol_proc_receiver? $(args (arg _var)) (send (lvar _var) $_))
107
161
  (numblock $#symbol_proc_receiver? $1 (send (lvar :_1) $_))
162
+ (itblock $#symbol_proc_receiver? $_ (send (lvar :it) $_))
108
163
  }
109
164
  PATTERN
110
165
 
@@ -115,13 +170,12 @@ module RuboCop
115
170
  # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
116
171
  def on_block(node)
117
172
  symbol_proc?(node) do |dispatch_node, arguments_node, method_name|
118
- # TODO: Rails-specific handling that we should probably make
119
- # configurable - https://github.com/rubocop/rubocop/issues/1485
120
- # we should allow lambdas & procs
121
- return if proc_node?(dispatch_node)
173
+ if active_support_extensions_enabled?
174
+ return if proc_node?(dispatch_node)
175
+ return if LAMBDA_OR_PROC.include?(dispatch_node.method_name)
176
+ end
122
177
  return if unsafe_hash_usage?(dispatch_node)
123
178
  return if unsafe_array_usage?(dispatch_node)
124
- return if %i[lambda proc].include?(dispatch_node.method_name)
125
179
  return if allowed_method_name?(dispatch_node.method_name)
126
180
  return if allow_if_method_has_argument?(node.send_node)
127
181
  return if node.block_type? && destructuring_block_argument?(arguments_node)
@@ -132,6 +186,7 @@ module RuboCop
132
186
  end
133
187
  # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
134
188
  alias on_numblock on_block
189
+ alias on_itblock on_block
135
190
 
136
191
  def destructuring_block_argument?(argument_node)
137
192
  argument_node.one? && argument_node.source.include?(',')
@@ -170,6 +225,15 @@ module RuboCop
170
225
  end
171
226
 
172
227
  def autocorrect_without_args(corrector, node)
228
+ if node.send_node.lambda_literal?
229
+ if node.send_node.loc.selector.source == '->'
230
+ corrector.replace(node, "lambda(&:#{node.body.method_name})")
231
+ return
232
+ else
233
+ autocorrect_lambda_block(corrector, node)
234
+ end
235
+ end
236
+
173
237
  corrector.replace(block_range_with_space(node), "(&:#{node.body.method_name})")
174
238
  end
175
239
 
@@ -182,6 +246,14 @@ module RuboCop
182
246
  corrector.remove(block_range_with_space(node))
183
247
  end
184
248
 
249
+ def autocorrect_lambda_block(corrector, node)
250
+ send_node_loc = node.send_node.loc
251
+ corrector.replace(send_node_loc.selector, 'lambda')
252
+
253
+ range = range_between(send_node_loc.selector.end_pos, node.loc.begin.end_pos - 2)
254
+ corrector.remove(range)
255
+ end
256
+
185
257
  def block_range_with_space(node)
186
258
  block_range = range_between(begin_pos_for_replacement(node), node.loc.end.end_pos)
187
259
  range_with_surrounding_space(block_range, side: :left)
@@ -198,7 +270,7 @@ module RuboCop
198
270
  end
199
271
 
200
272
  def allow_if_method_has_argument?(send_node)
201
- !!cop_config.fetch('AllowMethodsWithArguments', false) && !send_node.arguments.count.zero?
273
+ !!cop_config.fetch('AllowMethodsWithArguments', false) && send_node.arguments.any?
202
274
  end
203
275
 
204
276
  def allow_comments?
@@ -75,7 +75,7 @@ module RuboCop
75
75
 
76
76
  message = message(node)
77
77
 
78
- add_offense(node.source_range, message: message) do |corrector|
78
+ add_offense(node, message: message) do |corrector|
79
79
  autocorrect(corrector, node)
80
80
  end
81
81
  end
@@ -171,9 +171,7 @@ module RuboCop
171
171
  end
172
172
 
173
173
  def unsafe_autocorrect?(condition)
174
- condition.children.any? do |child|
175
- unparenthesized_method_call?(child) || below_ternary_precedence?(child)
176
- end
174
+ condition.children.any? { |child| below_ternary_precedence?(child) }
177
175
  end
178
176
 
179
177
  def unparenthesized_method_call?(child)
@@ -192,7 +190,7 @@ module RuboCop
192
190
  # @!method method_name(node)
193
191
  def_node_matcher :method_name, <<~PATTERN
194
192
  {($:defined? _ ...)
195
- (send {_ nil?} $_ _ ...)}
193
+ (call {_ nil?} $_ _ ...)}
196
194
  PATTERN
197
195
 
198
196
  def correct_parenthesized(corrector, condition)
@@ -203,16 +201,39 @@ module RuboCop
203
201
  # If we remove the parentheses, we need to add a space or we'll
204
202
  # generate invalid code.
205
203
  corrector.insert_after(condition.loc.end, ' ') unless whitespace_after?(condition)
204
+
205
+ if (send_node = condition.child_nodes.last) && node_args_need_parens?(send_node)
206
+ parenthesize_condition_arguments(corrector, send_node)
207
+ end
206
208
  end
207
209
 
208
210
  def correct_unparenthesized(corrector, condition)
209
211
  corrector.wrap(condition, '(', ')')
210
212
  end
211
213
 
214
+ def parenthesize_condition_arguments(corrector, send_node)
215
+ range_start = send_node.defined_type? ? send_node.loc.keyword : send_node.loc.selector
216
+ opening_range = range_start.end.join(send_node.first_argument.source_range.begin)
217
+
218
+ corrector.replace(opening_range, '(')
219
+ corrector.insert_after(send_node.last_argument, ')')
220
+ end
221
+
212
222
  def whitespace_after?(node)
213
223
  last_token = processed_source.last_token_of(node)
214
224
  last_token.space_after?
215
225
  end
226
+
227
+ def node_args_need_parens?(send_node)
228
+ return false unless node_with_args?(send_node)
229
+ return false if send_node.arguments.none? || send_node.parenthesized?
230
+
231
+ send_node.dot? || send_node.safe_navigation? || unparenthesized_method_call?(send_node)
232
+ end
233
+
234
+ def node_with_args?(node)
235
+ node.type?(:call, :defined?)
236
+ end
216
237
  end
217
238
  end
218
239
  end
@@ -64,6 +64,7 @@ module RuboCop
64
64
  end
65
65
 
66
66
  alias on_numblock on_block
67
+ alias on_itblock on_block
67
68
 
68
69
  private
69
70
 
@@ -77,7 +78,7 @@ module RuboCop
77
78
 
78
79
  # @!method define_method_block?(node)
79
80
  def_node_matcher :define_method_block?, <<~PATTERN
80
- ({block numblock} (send _ {:define_method} _) ...)
81
+ (any_block (send _ :define_method _) ...)
81
82
  PATTERN
82
83
  end
83
84
  end
@@ -34,6 +34,7 @@ module RuboCop
34
34
  )
35
35
  end
36
36
  end
37
+ alias on_sclass on_class
37
38
  end
38
39
  end
39
40
  end
@@ -7,12 +7,15 @@ module RuboCop
7
7
  # The supported styles are:
8
8
  #
9
9
  # * `consistent_comma`: Requires a comma after the last argument,
10
- # for all parenthesized method calls with arguments.
10
+ # for all parenthesized multi-line method calls with arguments.
11
11
  # * `comma`: Requires a comma after the last argument, but only for
12
12
  # parenthesized method calls where each argument is on its own line.
13
13
  # * `no_comma`: Requires that there is no comma after the last
14
14
  # argument.
15
15
  #
16
+ # Regardless of style, trailing commas are not allowed in
17
+ # single-line method calls.
18
+ #
16
19
  # @example EnforcedStyleForMultiline: consistent_comma
17
20
  # # bad
18
21
  # method(1, 2,)
@@ -76,10 +79,16 @@ module RuboCop
76
79
  # # bad
77
80
  # method(1, 2,)
78
81
  #
82
+ # # bad
83
+ # object[1, 2,]
84
+ #
79
85
  # # good
80
86
  # method(1, 2)
81
87
  #
82
88
  # # good
89
+ # object[1, 2]
90
+ #
91
+ # # good
83
92
  # method(
84
93
  # 1,
85
94
  # 2
@@ -93,7 +102,7 @@ module RuboCop
93
102
  end
94
103
 
95
104
  def on_send(node)
96
- return unless node.arguments? && node.parenthesized?
105
+ return unless node.arguments? && (node.parenthesized? || node.method?(:[]))
97
106
 
98
107
  check(node, node.arguments, 'parameter of %<article>s method call',
99
108
  node.last_argument.source_range.end_pos,