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
@@ -96,11 +96,7 @@ module RuboCop
96
96
  end
97
97
 
98
98
  def autocorrect(corrector, node, if_branch)
99
- if node.condition.or_type? || node.condition.assignment?
100
- corrector.wrap(node.condition, '(', ')')
101
- end
102
-
103
- if outer_condition_modify_form?(node, if_branch)
99
+ if node.modifier_form?
104
100
  autocorrect_outer_condition_modify_form(corrector, node, if_branch)
105
101
  else
106
102
  autocorrect_outer_condition_basic(corrector, node, if_branch)
@@ -108,140 +104,104 @@ module RuboCop
108
104
  end
109
105
 
110
106
  def autocorrect_outer_condition_basic(corrector, node, if_branch)
111
- correct_from_unless_to_if(corrector, node) if node.unless?
107
+ correct_node(corrector, node)
112
108
 
113
- outer_condition = node.condition
114
- correct_outer_condition(corrector, outer_condition)
115
-
116
- and_operator = if_branch.unless? ? ' && !' : ' && '
117
109
  if if_branch.modifier_form?
118
- correct_for_guard_condition_style(corrector, outer_condition, if_branch, and_operator)
110
+ correct_for_guard_condition_style(corrector, node, if_branch)
119
111
  else
120
- correct_for_basic_condition_style(corrector, node, if_branch, and_operator)
112
+ correct_for_basic_condition_style(corrector, node, if_branch)
121
113
  correct_for_comment(corrector, node, if_branch)
122
114
  end
123
115
  end
124
116
 
125
- def autocorrect_outer_condition_modify_form(corrector, node, if_branch)
126
- correct_from_unless_to_if(corrector, if_branch, is_modify_form: true) if if_branch.unless?
127
- correct_for_outer_condition_modify_form_style(corrector, node, if_branch)
128
- end
129
-
130
- def correct_from_unless_to_if(corrector, node, is_modify_form: false)
131
- corrector.replace(node.loc.keyword, 'if')
132
-
133
- insert_bang(corrector, node, is_modify_form)
117
+ def correct_node(corrector, node)
118
+ corrector.replace(node.loc.keyword, 'if') if node.unless? && !part_of_ignored_node?(node)
119
+ corrector.replace(node.condition, chainable_condition(node))
120
+ ignore_node(node)
134
121
  end
135
122
 
136
- def correct_for_guard_condition_style(corrector, outer_condition, if_branch, and_operator)
137
- condition = if_branch.condition
138
- corrector.insert_after(outer_condition, "#{and_operator}#{replace_condition(condition)}")
123
+ def correct_for_guard_condition_style(corrector, node, if_branch)
124
+ corrector.insert_after(node.condition, " && #{chainable_condition(if_branch)}")
139
125
 
140
- range = range_between(if_branch.loc.keyword.begin_pos, condition.source_range.end_pos)
126
+ range = range_between(
127
+ if_branch.loc.keyword.begin_pos, if_branch.condition.source_range.end_pos
128
+ )
141
129
  corrector.remove(range_with_surrounding_space(range, newlines: false))
142
- corrector.remove(if_branch.loc.keyword)
143
130
  end
144
131
 
145
- def correct_for_basic_condition_style(corrector, node, if_branch, and_operator)
132
+ def correct_for_basic_condition_style(corrector, node, if_branch)
146
133
  range = range_between(
147
134
  node.condition.source_range.end_pos, if_branch.condition.source_range.begin_pos
148
135
  )
149
- corrector.replace(range, and_operator)
150
- corrector.remove(range_by_whole_lines(node.loc.end, include_final_newline: true))
151
-
152
- wrap_condition(corrector, if_branch.condition)
153
- end
136
+ corrector.replace(range, ' && ')
154
137
 
155
- def wrap_condition(corrector, condition)
156
- # Handle `send` and `block` nodes that need to be wrapped in parens
157
- # FIXME: autocorrection prevents syntax errors by wrapping the entire node in parens,
158
- # but wrapping the argument list would be a more ergonomic correction.
159
- node_to_check = condition&.block_type? ? condition.send_node : condition
160
- return unless wrap_condition?(node_to_check)
138
+ corrector.replace(if_branch.condition, chainable_condition(if_branch))
161
139
 
162
- corrector.wrap(condition, '(', ')')
140
+ corrector.remove(range_by_whole_lines(node.loc.end, include_final_newline: true))
163
141
  end
164
142
 
165
- def correct_for_outer_condition_modify_form_style(corrector, node, if_branch)
166
- condition = if_branch.condition
167
- corrector.insert_before(condition,
168
- "#{'!' if node.unless?}#{replace_condition(node.condition)} && ")
143
+ def autocorrect_outer_condition_modify_form(corrector, node, if_branch)
144
+ correct_node(corrector, if_branch)
145
+
146
+ corrector.insert_before(if_branch.condition, "#{chainable_condition(node)} && ")
169
147
 
170
- corrector.remove(node.condition.loc.expression)
171
- corrector.remove(range_with_surrounding_space(node.loc.keyword, newlines: false))
172
- corrector.replace(if_branch.loc.keyword, 'if')
148
+ range = range_between(node.loc.keyword.begin_pos, node.condition.source_range.end_pos)
149
+ corrector.remove(range_with_surrounding_space(range, newlines: false))
173
150
  end
174
151
 
175
152
  def correct_for_comment(corrector, node, if_branch)
176
- comments = processed_source.ast_with_comments[if_branch]
153
+ comments = processed_source.ast_with_comments[if_branch].select do |comment|
154
+ comment.loc.line < if_branch.condition.first_line
155
+ end
177
156
  comment_text = comments.map(&:text).join("\n") << "\n"
178
157
 
179
158
  corrector.insert_before(node.loc.keyword, comment_text) unless comments.empty?
180
159
  end
181
160
 
182
- def correct_outer_condition(corrector, condition)
183
- return unless require_parentheses?(condition)
161
+ def chainable_condition(node)
162
+ wrapped_condition = add_parentheses_if_needed(node.condition)
184
163
 
185
- end_pos = condition.loc.selector.end_pos
186
- begin_pos = condition.first_argument.source_range.begin_pos
187
- return if end_pos > begin_pos
164
+ return wrapped_condition if node.if?
188
165
 
189
- corrector.replace(range_between(end_pos, begin_pos), '(')
190
- corrector.insert_after(condition.last_argument.source_range, ')')
166
+ node.condition.and_type? ? "!(#{wrapped_condition})" : "!#{wrapped_condition}"
191
167
  end
192
168
 
193
- def insert_bang(corrector, node, is_modify_form)
194
- condition = node.condition
169
+ def add_parentheses_if_needed(condition)
170
+ # Handle `send` and `block` nodes that need to be wrapped in parens
171
+ # FIXME: autocorrection prevents syntax errors by wrapping the entire node in parens,
172
+ # but wrapping the argument list would be a more ergonomic correction.
173
+ node_to_check = condition&.any_block_type? ? condition.send_node : condition
174
+ return condition.source unless add_parentheses?(node_to_check)
195
175
 
196
- if (condition.send_type? && condition.comparison_method? && !condition.parenthesized?) ||
197
- (is_modify_form && wrap_condition?(condition))
198
- corrector.wrap(node.condition, '!(', ')')
199
- elsif condition.and_type?
200
- insert_bang_for_and(corrector, node)
176
+ if parenthesize_method?(condition)
177
+ parenthesized_method_arguments(condition)
201
178
  else
202
- corrector.insert_before(condition, '!')
179
+ "(#{condition.source})"
203
180
  end
204
181
  end
205
182
 
206
- def insert_bang_for_and(corrector, node)
207
- lhs, rhs = *node
208
-
209
- if lhs.and_type?
210
- insert_bang_for_and(corrector, lhs)
211
- corrector.insert_before(rhs, '!') if rhs
212
- else
213
- corrector.insert_before(lhs, '!')
214
- corrector.insert_before(rhs, '!')
215
- end
183
+ def parenthesize_method?(node)
184
+ node.call_type? && node.arguments.any? && !node.parenthesized? &&
185
+ !node.comparison_method? && !node.operator_method?
216
186
  end
217
187
 
218
- def require_parentheses?(condition)
219
- condition.call_type? && !condition.arguments.empty? && !condition.parenthesized? &&
220
- !condition.comparison_method?
221
- end
188
+ def add_parentheses?(node)
189
+ return true if node.assignment? || (node.operator_keyword? && !node.and_type?)
190
+ return false unless node.call_type?
222
191
 
223
- def arguments_range(node)
224
- range_between(
225
- node.first_argument.source_range.begin_pos, node.last_argument.source_range.end_pos
226
- )
192
+ (node.arguments.any? && !node.parenthesized?) || node.prefix_not?
227
193
  end
228
194
 
229
- def wrap_condition?(node)
230
- node.and_type? || node.or_type? ||
231
- (node.call_type? && node.arguments.any? && !node.parenthesized?)
232
- end
195
+ def parenthesized_method_arguments(node)
196
+ method_call = node.source_range.begin.join(node.loc.selector.end).source
197
+ arguments = node.first_argument.source_range.begin.join(node.source_range.end).source
233
198
 
234
- def replace_condition(condition)
235
- wrap_condition?(condition) ? "(#{condition.source})" : condition.source
199
+ "#{method_call}(#{arguments})"
236
200
  end
237
201
 
238
202
  def allow_modifier?
239
203
  cop_config['AllowModifier']
240
204
  end
241
-
242
- def outer_condition_modify_form?(node, if_branch)
243
- node.condition.loc.expression.begin_pos > if_branch.condition.loc.expression.begin_pos
244
- end
245
205
  end
246
206
  end
247
207
  end
@@ -3,8 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- #
7
- # This cop looks for uses of Perl-style global variables.
6
+ # Looks for uses of Perl-style global variables.
8
7
  # Correcting to global variables in the 'English' library
9
8
  # will add a require statement to the top of the file if
10
9
  # enabled by RequireEnglish config.
@@ -59,9 +58,8 @@ module RuboCop
59
58
  #
60
59
  # @example EnforcedStyle: use_builtin_english_names
61
60
  #
62
- # Like `use_perl_names` but allows builtin global vars.
63
- #
64
61
  # # good
62
+ # # Like `use_perl_names` but allows builtin global vars.
65
63
  # puts $LOAD_PATH
66
64
  # puts $LOADED_FEATURES
67
65
  # puts $PROGRAM_NAME
@@ -151,7 +149,7 @@ module RuboCop
151
149
  end
152
150
 
153
151
  def on_gvar(node)
154
- global_var, = *node
152
+ global_var = node.name
155
153
 
156
154
  return unless (preferred = preferred_names(global_var))
157
155
 
@@ -234,9 +232,9 @@ module RuboCop
234
232
  end
235
233
 
236
234
  def matching_styles(global)
237
- STYLE_VARS_MAP.map do |style, vars|
235
+ STYLE_VARS_MAP.filter_map do |style, vars|
238
236
  style if vars.values.flatten(1).include? global
239
- end.compact
237
+ end
240
238
  end
241
239
 
242
240
  def english_name_replacement(preferred_name, node)
@@ -49,7 +49,7 @@ module RuboCop
49
49
  end
50
50
 
51
51
  def stderr_puts_range(send)
52
- range_between(send.loc.expression.begin_pos, send.loc.selector.end_pos)
52
+ range_between(send.source_range.begin_pos, send.loc.selector.end_pos)
53
53
  end
54
54
  end
55
55
  end
@@ -35,6 +35,7 @@ module RuboCop
35
35
  corrector.replace(range, 'chars')
36
36
  end
37
37
  end
38
+ alias on_csend on_send
38
39
  end
39
40
  end
40
41
  end
@@ -51,8 +51,6 @@ module RuboCop
51
51
  # Pathname.new('/') + 'test'
52
52
  #
53
53
  class StringConcatenation < Base
54
- include Util
55
- include RangeHelp
56
54
  extend AutoCorrector
57
55
 
58
56
  MSG = 'Prefer string interpolation to string concatenation.'
@@ -129,11 +127,11 @@ module RuboCop
129
127
  end
130
128
 
131
129
  def uncorrectable?(part)
132
- part.multiline? || heredoc?(part) || part.each_descendant(:block).any?
130
+ part.multiline? || heredoc?(part) || part.each_descendant(:any_block).any?
133
131
  end
134
132
 
135
133
  def heredoc?(node)
136
- return false unless node.str_type? || node.dstr_type?
134
+ return false unless node.type?(:str, :dstr)
137
135
 
138
136
  node.heredoc?
139
137
  end
@@ -143,22 +141,24 @@ module RuboCop
143
141
  end
144
142
 
145
143
  def replacement(parts)
146
- interpolated_parts =
147
- parts.map do |part|
148
- case part.type
149
- when :str
150
- value = part.value
151
- single_quoted?(part) ? value.gsub(/(\\|")/, '\\\\\&') : value.inspect[1..-2]
152
- when :dstr
153
- contents_range(part).source
154
- else
155
- "\#{#{part.source}}"
156
- end
144
+ interpolated_parts = parts.map do |part|
145
+ case part.type
146
+ when :str
147
+ adjust_str(part)
148
+ when :dstr
149
+ part.children.all?(&:str_type?) ? adjust_str(part) : part.value
150
+ else
151
+ "\#{#{part.source}}"
157
152
  end
153
+ end
158
154
 
159
155
  "\"#{handle_quotes(interpolated_parts).join}\""
160
156
  end
161
157
 
158
+ def adjust_str(node)
159
+ single_quoted?(node) ? node.value.gsub(/(\\|")/, '\\\\\&') : node.value.inspect[1..-2]
160
+ end
161
+
162
162
  def handle_quotes(parts)
163
163
  parts.map do |part|
164
164
  part == '"' ? '\"' : part
@@ -69,7 +69,7 @@ module RuboCop
69
69
  end
70
70
 
71
71
  def all_string_literals?(nodes)
72
- nodes.all? { |n| n.str_type? || n.dstr_type? }
72
+ nodes.all? { |n| n.type?(:str, :dstr) }
73
73
  end
74
74
 
75
75
  def detect_quote_styles(node)
@@ -3,22 +3,42 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- # Checks that quotes inside the string interpolation
6
+ # Checks that quotes inside string, symbol, and regexp interpolations
7
7
  # match the configured preference.
8
8
  #
9
9
  # @example EnforcedStyle: single_quotes (default)
10
10
  # # bad
11
- # result = "Tests #{success ? "PASS" : "FAIL"}"
11
+ # string = "Tests #{success ? "PASS" : "FAIL"}"
12
+ # symbol = :"Tests #{success ? "PASS" : "FAIL"}"
13
+ # heredoc = <<~TEXT
14
+ # Tests #{success ? "PASS" : "FAIL"}
15
+ # TEXT
16
+ # regexp = /Tests #{success ? "PASS" : "FAIL"}/
12
17
  #
13
18
  # # good
14
- # result = "Tests #{success ? 'PASS' : 'FAIL'}"
19
+ # string = "Tests #{success ? 'PASS' : 'FAIL'}"
20
+ # symbol = :"Tests #{success ? 'PASS' : 'FAIL'}"
21
+ # heredoc = <<~TEXT
22
+ # Tests #{success ? 'PASS' : 'FAIL'}
23
+ # TEXT
24
+ # regexp = /Tests #{success ? 'PASS' : 'FAIL'}/
15
25
  #
16
26
  # @example EnforcedStyle: double_quotes
17
27
  # # bad
18
- # result = "Tests #{success ? 'PASS' : 'FAIL'}"
28
+ # string = "Tests #{success ? 'PASS' : 'FAIL'}"
29
+ # symbol = :"Tests #{success ? 'PASS' : 'FAIL'}"
30
+ # heredoc = <<~TEXT
31
+ # Tests #{success ? 'PASS' : 'FAIL'}
32
+ # TEXT
33
+ # regexp = /Tests #{success ? 'PASS' : 'FAIL'}/
19
34
  #
20
35
  # # good
21
- # result = "Tests #{success ? "PASS" : "FAIL"}"
36
+ # string = "Tests #{success ? "PASS" : "FAIL"}"
37
+ # symbol = :"Tests #{success ? "PASS" : "FAIL"}"
38
+ # heredoc = <<~TEXT
39
+ # Tests #{success ? "PASS" : "FAIL"}
40
+ # TEXT
41
+ # regexp = /Tests #{success ? "PASS" : "FAIL"}/
22
42
  class StringLiteralsInInterpolation < Base
23
43
  include ConfigurableEnforcedStyle
24
44
  include StringLiteralsHelp
@@ -29,6 +49,11 @@ module RuboCop
29
49
  StringLiteralCorrector.correct(corrector, node, style)
30
50
  end
31
51
 
52
+ # Cop classes that include the StringHelp module usually ignore regexp
53
+ # nodes. Not so for this cop, which is why we override the on_regexp
54
+ # definition with an empty one.
55
+ def on_regexp(node); end
56
+
32
57
  private
33
58
 
34
59
  def message(_node)
@@ -4,7 +4,7 @@ module RuboCop
4
4
  module Cop
5
5
  module Style
6
6
  # Enforces the use of consistent method names
7
- # from the String class.
7
+ # from the `String` class.
8
8
  #
9
9
  # @example
10
10
  # # bad
@@ -22,20 +22,23 @@ module RuboCop
22
22
 
23
23
  # @!method lstrip_rstrip(node)
24
24
  def_node_matcher :lstrip_rstrip, <<~PATTERN
25
- {(send $(send _ $:rstrip) $:lstrip)
26
- (send $(send _ $:lstrip) $:rstrip)}
25
+ {
26
+ (call $(call _ :rstrip) :lstrip)
27
+ (call $(call _ :lstrip) :rstrip)
28
+ }
27
29
  PATTERN
28
30
 
29
31
  def on_send(node)
30
- lstrip_rstrip(node) do |first_send, method_one, method_two|
32
+ lstrip_rstrip(node) do |first_send|
31
33
  range = range_between(first_send.loc.selector.begin_pos, node.source_range.end_pos)
32
- message = format(MSG, methods: "#{method_one}.#{method_two}")
34
+ message = format(MSG, methods: range.source)
33
35
 
34
36
  add_offense(range, message: message) do |corrector|
35
37
  corrector.replace(range, 'strip')
36
38
  end
37
39
  end
38
40
  end
41
+ alias on_csend on_send
39
42
  end
40
43
  end
41
44
  end
@@ -3,7 +3,8 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- # Checks for inheritance from Struct.new.
6
+ # Checks for inheritance from `Struct.new`. Inheriting from `Struct.new`
7
+ # adds a superfluous level in inheritance tree.
7
8
  #
8
9
  # @safety
9
10
  # Autocorrection is unsafe because it will change the inheritance
@@ -17,12 +18,18 @@ module RuboCop
17
18
  # end
18
19
  # end
19
20
  #
21
+ # Person.ancestors
22
+ # # => [Person, #<Class:0x000000010b4e14a0>, Struct, (...)]
23
+ #
20
24
  # # good
21
25
  # Person = Struct.new(:first_name, :last_name) do
22
26
  # def age
23
27
  # 42
24
28
  # end
25
29
  # end
30
+ #
31
+ # Person.ancestors
32
+ # # => [Person, Struct, (...)]
26
33
  class StructInheritance < Base
27
34
  include RangeHelp
28
35
  extend AutoCorrector
@@ -33,7 +40,7 @@ module RuboCop
33
40
  def on_class(node)
34
41
  return unless struct_constructor?(node.parent_class)
35
42
 
36
- add_offense(node.parent_class.source_range) do |corrector|
43
+ add_offense(node.parent_class) do |corrector|
37
44
  corrector.remove(range_with_surrounding_space(node.loc.keyword, newlines: false))
38
45
  corrector.replace(node.loc.operator, '=')
39
46
 
@@ -55,7 +62,7 @@ module RuboCop
55
62
  elsif (class_node = parent.parent).body.nil?
56
63
  corrector.remove(range_for_empty_class_body(class_node, parent))
57
64
  else
58
- corrector.insert_after(parent.loc.expression, ' do')
65
+ corrector.insert_after(parent, ' do')
59
66
  end
60
67
  end
61
68