rubocop 1.67.0 → 1.79.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (512) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +23 -19
  4. data/config/default.yml +371 -71
  5. data/config/internal_affairs.yml +20 -0
  6. data/config/obsoletion.yml +8 -3
  7. data/lib/rubocop/cached_data.rb +12 -4
  8. data/lib/rubocop/cli/command/execute_runner.rb +4 -4
  9. data/lib/rubocop/cli/command/show_cops.rb +24 -2
  10. data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
  11. data/lib/rubocop/cli/command/version.rb +2 -2
  12. data/lib/rubocop/cli.rb +13 -2
  13. data/lib/rubocop/comment_config.rb +2 -2
  14. data/lib/rubocop/config.rb +52 -10
  15. data/lib/rubocop/config_loader.rb +53 -47
  16. data/lib/rubocop/config_loader_resolver.rb +36 -10
  17. data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -3
  18. data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
  19. data/lib/rubocop/config_obsoletion.rb +46 -2
  20. data/lib/rubocop/config_validator.rb +25 -14
  21. data/lib/rubocop/cop/autocorrect_logic.rb +51 -26
  22. data/lib/rubocop/cop/base.rb +7 -1
  23. data/lib/rubocop/cop/bundler/duplicated_gem.rb +2 -2
  24. data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
  25. data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
  26. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
  27. data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -1
  28. data/lib/rubocop/cop/correctors/alignment_corrector.rb +1 -12
  29. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +1 -1
  30. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -2
  31. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +10 -0
  32. data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
  33. data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +1 -2
  34. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +37 -15
  35. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
  36. data/lib/rubocop/cop/gemspec/require_mfa.rb +15 -1
  37. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +0 -2
  38. data/lib/rubocop/cop/generator.rb +6 -0
  39. data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
  40. data/lib/rubocop/cop/internal_affairs/example_description.rb +9 -5
  41. data/lib/rubocop/cop/internal_affairs/location_exists.rb +116 -0
  42. data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
  43. data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +3 -4
  44. data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +3 -2
  45. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +5 -5
  46. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
  47. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
  48. data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +231 -0
  49. data/lib/rubocop/cop/internal_affairs/node_type_group.rb +92 -0
  50. data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
  51. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
  52. data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +1 -1
  53. data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
  54. data/lib/rubocop/cop/internal_affairs/operator_keyword.rb +48 -0
  55. data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
  56. data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +6 -5
  57. data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +3 -1
  58. data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
  59. data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +0 -2
  60. data/lib/rubocop/cop/internal_affairs/undefined_config.rb +13 -2
  61. data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
  62. data/lib/rubocop/cop/internal_affairs.rb +7 -16
  63. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -1
  64. data/lib/rubocop/cop/layout/argument_alignment.rb +2 -9
  65. data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
  66. data/lib/rubocop/cop/layout/begin_end_alignment.rb +0 -1
  67. data/lib/rubocop/cop/layout/block_alignment.rb +3 -2
  68. data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
  69. data/lib/rubocop/cop/layout/class_structure.rb +44 -9
  70. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
  71. data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
  72. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  73. data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
  74. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +3 -3
  75. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +7 -11
  76. data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +99 -0
  77. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +37 -7
  78. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
  79. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +1 -0
  80. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +4 -5
  81. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +23 -1
  82. data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
  83. data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
  84. data/lib/rubocop/cop/layout/first_argument_indentation.rb +4 -9
  85. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +2 -7
  86. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
  87. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
  88. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
  89. data/lib/rubocop/cop/layout/hash_alignment.rb +8 -6
  90. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -1
  91. data/lib/rubocop/cop/layout/indentation_width.rb +8 -7
  92. data/lib/rubocop/cop/layout/leading_comment_space.rb +57 -2
  93. data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +11 -2
  94. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +7 -1
  95. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
  96. data/lib/rubocop/cop/layout/line_length.rb +149 -9
  97. data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -0
  98. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
  99. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
  100. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -1
  101. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
  102. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
  103. data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
  104. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +3 -4
  105. data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
  106. data/lib/rubocop/cop/layout/redundant_line_break.rb +19 -46
  107. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +6 -7
  108. data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -1
  109. data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
  110. data/lib/rubocop/cop/layout/space_after_comma.rb +1 -1
  111. data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
  112. data/lib/rubocop/cop/layout/space_after_semicolon.rb +11 -1
  113. data/lib/rubocop/cop/layout/space_around_keyword.rb +8 -2
  114. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
  115. data/lib/rubocop/cop/layout/space_around_operators.rb +31 -21
  116. data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -0
  117. data/lib/rubocop/cop/layout/space_before_brackets.rb +7 -40
  118. data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
  119. data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
  120. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +18 -3
  121. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +5 -0
  122. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +7 -0
  123. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +0 -1
  124. data/lib/rubocop/cop/layout/trailing_whitespace.rb +5 -3
  125. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
  126. data/lib/rubocop/cop/lint/ambiguous_range.rb +5 -0
  127. data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +118 -0
  128. data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
  129. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +10 -12
  130. data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
  131. data/lib/rubocop/cop/lint/circular_argument_reference.rb +4 -1
  132. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
  133. data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
  134. data/lib/rubocop/cop/lint/cop_directive_syntax.rb +84 -0
  135. data/lib/rubocop/cop/lint/debugger.rb +3 -3
  136. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -1
  137. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +3 -2
  138. data/lib/rubocop/cop/lint/duplicate_branch.rb +39 -4
  139. data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
  140. data/lib/rubocop/cop/lint/duplicate_methods.rb +111 -23
  141. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -1
  142. data/lib/rubocop/cop/lint/duplicate_set_element.rb +20 -7
  143. data/lib/rubocop/cop/lint/empty_conditional_body.rb +14 -64
  144. data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
  145. data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
  146. data/lib/rubocop/cop/lint/empty_file.rb +0 -2
  147. data/lib/rubocop/cop/lint/empty_interpolation.rb +3 -1
  148. data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
  149. data/lib/rubocop/cop/lint/erb_new_arguments.rb +0 -6
  150. data/lib/rubocop/cop/lint/float_comparison.rb +51 -18
  151. data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -4
  152. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
  153. data/lib/rubocop/cop/lint/hash_new_with_keyword_arguments_as_default.rb +55 -0
  154. data/lib/rubocop/cop/lint/identity_comparison.rb +19 -15
  155. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  156. data/lib/rubocop/cop/lint/interpolation_check.rb +9 -0
  157. data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +3 -0
  158. data/lib/rubocop/cop/lint/literal_as_condition.rb +125 -10
  159. data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +1 -1
  160. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +24 -6
  161. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +1 -1
  162. data/lib/rubocop/cop/lint/missing_super.rb +2 -2
  163. data/lib/rubocop/cop/lint/mixed_case_range.rb +5 -8
  164. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  165. data/lib/rubocop/cop/lint/nested_method_definition.rb +10 -6
  166. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  167. data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +2 -2
  168. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +12 -3
  169. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +3 -3
  170. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
  171. data/lib/rubocop/cop/lint/number_conversion.rb +0 -1
  172. data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -2
  173. data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +94 -0
  174. data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -3
  175. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +3 -2
  176. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -5
  177. data/lib/rubocop/cop/lint/raise_exception.rb +29 -10
  178. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +1 -1
  179. data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +2 -2
  180. data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -21
  181. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +113 -9
  182. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +8 -7
  183. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
  184. data/lib/rubocop/cop/lint/redundant_type_conversion.rb +261 -0
  185. data/lib/rubocop/cop/lint/redundant_with_index.rb +3 -0
  186. data/lib/rubocop/cop/lint/redundant_with_object.rb +3 -0
  187. data/lib/rubocop/cop/lint/refinement_import_methods.rb +1 -1
  188. data/lib/rubocop/cop/lint/regexp_as_condition.rb +0 -1
  189. data/lib/rubocop/cop/lint/require_range_parentheses.rb +1 -1
  190. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  191. data/lib/rubocop/cop/lint/rescue_type.rb +4 -8
  192. data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -11
  193. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +17 -1
  194. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +5 -1
  195. data/lib/rubocop/cop/lint/self_assignment.rb +33 -10
  196. data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
  197. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +13 -1
  198. data/lib/rubocop/cop/lint/shared_mutable_default.rb +76 -0
  199. data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
  200. data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
  201. data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
  202. data/lib/rubocop/cop/lint/syntax.rb +4 -1
  203. data/lib/rubocop/cop/lint/to_enum_arguments.rb +1 -1
  204. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
  205. data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +88 -0
  206. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +3 -1
  207. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -1
  208. data/lib/rubocop/cop/lint/unreachable_code.rb +52 -2
  209. data/lib/rubocop/cop/lint/unreachable_loop.rb +6 -6
  210. data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
  211. data/lib/rubocop/cop/lint/useless_access_modifier.rb +34 -8
  212. data/lib/rubocop/cop/lint/useless_assignment.rb +3 -1
  213. data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
  214. data/lib/rubocop/cop/lint/useless_default_value_argument.rb +90 -0
  215. data/lib/rubocop/cop/lint/useless_defined.rb +55 -0
  216. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +4 -0
  217. data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
  218. data/lib/rubocop/cop/lint/useless_numeric_operation.rb +3 -1
  219. data/lib/rubocop/cop/lint/useless_or.rb +98 -0
  220. data/lib/rubocop/cop/lint/useless_rescue.rb +2 -2
  221. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +5 -5
  222. data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -25
  223. data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +121 -0
  224. data/lib/rubocop/cop/lint/void.rb +16 -12
  225. data/lib/rubocop/cop/message_annotator.rb +7 -3
  226. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  227. data/lib/rubocop/cop/metrics/block_length.rb +1 -0
  228. data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
  229. data/lib/rubocop/cop/metrics/class_length.rb +9 -9
  230. data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
  231. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +5 -2
  232. data/lib/rubocop/cop/metrics/method_length.rb +9 -1
  233. data/lib/rubocop/cop/metrics/module_length.rb +1 -1
  234. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
  235. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
  236. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +3 -4
  237. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
  238. data/lib/rubocop/cop/mixin/alignment.rb +3 -3
  239. data/lib/rubocop/cop/mixin/allowed_pattern.rb +4 -4
  240. data/lib/rubocop/cop/mixin/check_assignment.rb +4 -12
  241. data/lib/rubocop/cop/mixin/check_line_breakable.rb +22 -12
  242. data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +49 -0
  243. data/lib/rubocop/cop/mixin/comments_help.rb +8 -3
  244. data/lib/rubocop/cop/mixin/def_node.rb +1 -1
  245. data/lib/rubocop/cop/mixin/dig_help.rb +27 -0
  246. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
  247. data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +24 -0
  248. data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
  249. data/lib/rubocop/cop/mixin/forbidden_pattern.rb +16 -0
  250. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +4 -3
  251. data/lib/rubocop/cop/mixin/gemspec_help.rb +22 -0
  252. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +15 -14
  253. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +22 -22
  254. data/lib/rubocop/cop/mixin/hash_subset.rb +203 -0
  255. data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
  256. data/lib/rubocop/cop/mixin/line_length_help.rb +27 -10
  257. data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
  258. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +7 -9
  259. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
  260. data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
  261. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +68 -30
  262. data/lib/rubocop/cop/mixin/range_help.rb +15 -4
  263. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
  264. data/lib/rubocop/cop/mixin/statement_modifier.rb +8 -3
  265. data/lib/rubocop/cop/mixin/string_help.rb +2 -2
  266. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  267. data/lib/rubocop/cop/mixin/target_ruby_version.rb +17 -1
  268. data/lib/rubocop/cop/mixin/trailing_comma.rb +21 -5
  269. data/lib/rubocop/cop/naming/accessor_method_name.rb +6 -6
  270. data/lib/rubocop/cop/naming/block_forwarding.rb +20 -16
  271. data/lib/rubocop/cop/naming/constant_name.rb +6 -7
  272. data/lib/rubocop/cop/naming/file_name.rb +2 -4
  273. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +12 -13
  274. data/lib/rubocop/cop/naming/method_name.rb +185 -15
  275. data/lib/rubocop/cop/naming/predicate_method.rb +306 -0
  276. data/lib/rubocop/cop/naming/{predicate_name.rb → predicate_prefix.rb} +48 -4
  277. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +6 -14
  278. data/lib/rubocop/cop/naming/variable_name.rb +50 -6
  279. data/lib/rubocop/cop/naming/variable_number.rb +2 -3
  280. data/lib/rubocop/cop/offense.rb +2 -3
  281. data/lib/rubocop/cop/registry.rb +9 -6
  282. data/lib/rubocop/cop/security/compound_hash.rb +2 -0
  283. data/lib/rubocop/cop/security/eval.rb +2 -1
  284. data/lib/rubocop/cop/security/open.rb +1 -0
  285. data/lib/rubocop/cop/security/yaml_load.rb +3 -2
  286. data/lib/rubocop/cop/style/access_modifier_declarations.rb +114 -34
  287. data/lib/rubocop/cop/style/accessor_grouping.rb +32 -6
  288. data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +79 -0
  289. data/lib/rubocop/cop/style/and_or.rb +1 -1
  290. data/lib/rubocop/cop/style/arguments_forwarding.rb +57 -44
  291. data/lib/rubocop/cop/style/array_first_last.rb +18 -2
  292. data/lib/rubocop/cop/style/array_intersect.rb +84 -42
  293. data/lib/rubocop/cop/style/bitwise_predicate.rb +100 -0
  294. data/lib/rubocop/cop/style/block_delimiters.rb +44 -26
  295. data/lib/rubocop/cop/style/case_like_if.rb +9 -12
  296. data/lib/rubocop/cop/style/class_and_module_children.rb +52 -11
  297. data/lib/rubocop/cop/style/class_equality_comparison.rb +1 -1
  298. data/lib/rubocop/cop/style/collection_methods.rb +2 -1
  299. data/lib/rubocop/cop/style/collection_querying.rb +167 -0
  300. data/lib/rubocop/cop/style/combinable_defined.rb +115 -0
  301. data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
  302. data/lib/rubocop/cop/style/command_literal.rb +1 -1
  303. data/lib/rubocop/cop/style/commented_keyword.rb +20 -3
  304. data/lib/rubocop/cop/style/comparable_between.rb +78 -0
  305. data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
  306. data/lib/rubocop/cop/style/conditional_assignment.rb +42 -28
  307. data/lib/rubocop/cop/style/constant_visibility.rb +3 -12
  308. data/lib/rubocop/cop/style/data_inheritance.rb +7 -0
  309. data/lib/rubocop/cop/style/def_with_parentheses.rb +18 -5
  310. data/lib/rubocop/cop/style/dig_chain.rb +89 -0
  311. data/lib/rubocop/cop/style/documentation.rb +1 -1
  312. data/lib/rubocop/cop/style/double_negation.rb +4 -4
  313. data/lib/rubocop/cop/style/each_for_simple_loop.rb +4 -7
  314. data/lib/rubocop/cop/style/each_with_object.rb +2 -3
  315. data/lib/rubocop/cop/style/empty_else.rb +4 -2
  316. data/lib/rubocop/cop/style/empty_literal.rb +5 -1
  317. data/lib/rubocop/cop/style/empty_method.rb +1 -1
  318. data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +100 -0
  319. data/lib/rubocop/cop/style/endless_method.rb +150 -18
  320. data/lib/rubocop/cop/style/eval_with_location.rb +4 -4
  321. data/lib/rubocop/cop/style/exact_regexp_match.rb +2 -3
  322. data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
  323. data/lib/rubocop/cop/style/explicit_block_argument.rb +16 -3
  324. data/lib/rubocop/cop/style/exponential_notation.rb +6 -5
  325. data/lib/rubocop/cop/style/fetch_env_var.rb +34 -7
  326. data/lib/rubocop/cop/style/file_null.rb +89 -0
  327. data/lib/rubocop/cop/style/file_touch.rb +75 -0
  328. data/lib/rubocop/cop/style/float_division.rb +8 -4
  329. data/lib/rubocop/cop/style/for.rb +1 -1
  330. data/lib/rubocop/cop/style/format_string_token.rb +38 -11
  331. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -2
  332. data/lib/rubocop/cop/style/global_std_stream.rb +3 -0
  333. data/lib/rubocop/cop/style/global_vars.rb +1 -3
  334. data/lib/rubocop/cop/style/guard_clause.rb +17 -3
  335. data/lib/rubocop/cop/style/hash_conversion.rb +16 -9
  336. data/lib/rubocop/cop/style/hash_each_methods.rb +6 -8
  337. data/lib/rubocop/cop/style/hash_except.rb +35 -147
  338. data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
  339. data/lib/rubocop/cop/style/hash_slice.rb +80 -0
  340. data/lib/rubocop/cop/style/hash_syntax.rb +9 -3
  341. data/lib/rubocop/cop/style/hash_transform_keys.rb +2 -2
  342. data/lib/rubocop/cop/style/hash_transform_values.rb +2 -2
  343. data/lib/rubocop/cop/style/identical_conditional_branches.rb +25 -6
  344. data/lib/rubocop/cop/style/if_inside_else.rb +10 -14
  345. data/lib/rubocop/cop/style/if_unless_modifier.rb +36 -9
  346. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +4 -7
  347. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +3 -4
  348. data/lib/rubocop/cop/style/if_with_semicolon.rb +20 -9
  349. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  350. data/lib/rubocop/cop/style/inverse_methods.rb +16 -13
  351. data/lib/rubocop/cop/style/invertible_unless_condition.rb +2 -2
  352. data/lib/rubocop/cop/style/ip_addresses.rb +2 -2
  353. data/lib/rubocop/cop/style/it_assignment.rb +93 -0
  354. data/lib/rubocop/cop/style/it_block_parameter.rb +121 -0
  355. data/lib/rubocop/cop/style/keyword_arguments_merging.rb +67 -0
  356. data/lib/rubocop/cop/style/keyword_parameters_order.rb +14 -8
  357. data/lib/rubocop/cop/style/lambda.rb +1 -0
  358. data/lib/rubocop/cop/style/lambda_call.rb +10 -4
  359. data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
  360. data/lib/rubocop/cop/style/map_into_array.rb +11 -3
  361. data/lib/rubocop/cop/style/map_to_hash.rb +12 -1
  362. data/lib/rubocop/cop/style/map_to_set.rb +3 -2
  363. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +28 -20
  364. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +18 -0
  365. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -11
  366. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -4
  367. data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
  368. data/lib/rubocop/cop/style/min_max_comparison.rb +13 -5
  369. data/lib/rubocop/cop/style/missing_else.rb +2 -0
  370. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +33 -3
  371. data/lib/rubocop/cop/style/multiline_block_chain.rb +3 -2
  372. data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -0
  373. data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
  374. data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -9
  375. data/lib/rubocop/cop/style/multiple_comparison.rb +52 -51
  376. data/lib/rubocop/cop/style/mutable_constant.rb +7 -8
  377. data/lib/rubocop/cop/style/negated_if_else_condition.rb +7 -5
  378. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +1 -1
  379. data/lib/rubocop/cop/style/nested_ternary_operator.rb +5 -4
  380. data/lib/rubocop/cop/style/next.rb +44 -0
  381. data/lib/rubocop/cop/style/not.rb +1 -1
  382. data/lib/rubocop/cop/style/object_then.rb +15 -15
  383. data/lib/rubocop/cop/style/one_line_conditional.rb +25 -4
  384. data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
  385. data/lib/rubocop/cop/style/operator_method_call.rb +5 -6
  386. data/lib/rubocop/cop/style/or_assignment.rb +3 -6
  387. data/lib/rubocop/cop/style/parallel_assignment.rb +41 -38
  388. data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
  389. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  390. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
  391. data/lib/rubocop/cop/style/proc.rb +2 -2
  392. data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
  393. data/lib/rubocop/cop/style/raise_args.rb +15 -13
  394. data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
  395. data/lib/rubocop/cop/style/redundant_argument.rb +3 -1
  396. data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
  397. data/lib/rubocop/cop/style/redundant_assignment.rb +1 -1
  398. data/lib/rubocop/cop/style/redundant_begin.rb +2 -1
  399. data/lib/rubocop/cop/style/redundant_condition.rb +95 -23
  400. data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +16 -5
  401. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +6 -10
  402. data/lib/rubocop/cop/style/redundant_each.rb +1 -1
  403. data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
  404. data/lib/rubocop/cop/style/redundant_fetch_block.rb +1 -9
  405. data/lib/rubocop/cop/style/redundant_format.rb +262 -0
  406. data/lib/rubocop/cop/style/redundant_freeze.rb +4 -4
  407. data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
  408. data/lib/rubocop/cop/style/redundant_interpolation.rb +1 -1
  409. data/lib/rubocop/cop/style/redundant_line_continuation.rb +55 -19
  410. data/lib/rubocop/cop/style/redundant_parentheses.rb +86 -26
  411. data/lib/rubocop/cop/style/redundant_regexp_argument.rb +4 -0
  412. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
  413. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -1
  414. data/lib/rubocop/cop/style/redundant_return.rb +2 -2
  415. data/lib/rubocop/cop/style/redundant_self.rb +15 -18
  416. data/lib/rubocop/cop/style/redundant_self_assignment.rb +20 -32
  417. data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +4 -4
  418. data/lib/rubocop/cop/style/redundant_sort.rb +3 -3
  419. data/lib/rubocop/cop/style/redundant_sort_by.rb +17 -1
  420. data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -2
  421. data/lib/rubocop/cop/style/regexp_literal.rb +1 -1
  422. data/lib/rubocop/cop/style/rescue_modifier.rb +5 -3
  423. data/lib/rubocop/cop/style/return_nil.rb +2 -2
  424. data/lib/rubocop/cop/style/safe_navigation.rb +56 -16
  425. data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
  426. data/lib/rubocop/cop/style/select_by_regexp.rb +5 -2
  427. data/lib/rubocop/cop/style/self_assignment.rb +11 -17
  428. data/lib/rubocop/cop/style/semicolon.rb +1 -1
  429. data/lib/rubocop/cop/style/send_with_literal_method_name.rb +2 -1
  430. data/lib/rubocop/cop/style/signal_exception.rb +2 -3
  431. data/lib/rubocop/cop/style/single_argument_dig.rb +9 -5
  432. data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
  433. data/lib/rubocop/cop/style/single_line_do_end_block.rb +15 -4
  434. data/lib/rubocop/cop/style/single_line_methods.rb +13 -11
  435. data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
  436. data/lib/rubocop/cop/style/sole_nested_conditional.rb +68 -102
  437. data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
  438. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -1
  439. data/lib/rubocop/cop/style/string_concatenation.rb +15 -15
  440. data/lib/rubocop/cop/style/string_literals.rb +1 -1
  441. data/lib/rubocop/cop/style/string_methods.rb +1 -1
  442. data/lib/rubocop/cop/style/struct_inheritance.rb +8 -1
  443. data/lib/rubocop/cop/style/super_arguments.rb +66 -19
  444. data/lib/rubocop/cop/style/swap_values.rb +4 -15
  445. data/lib/rubocop/cop/style/symbol_proc.rb +3 -1
  446. data/lib/rubocop/cop/style/ternary_parentheses.rb +25 -4
  447. data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -1
  448. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +11 -2
  449. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
  450. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1 -1
  451. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
  452. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -4
  453. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  454. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -2
  455. data/lib/rubocop/cop/style/while_until_modifier.rb +0 -1
  456. data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
  457. data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
  458. data/lib/rubocop/cop/team.rb +1 -1
  459. data/lib/rubocop/cop/util.rb +12 -5
  460. data/lib/rubocop/cop/utils/format_string.rb +10 -5
  461. data/lib/rubocop/cop/variable_force/assignment.rb +24 -5
  462. data/lib/rubocop/cop/variable_force/branch.rb +1 -1
  463. data/lib/rubocop/cop/variable_force/scope.rb +1 -1
  464. data/lib/rubocop/cop/variable_force/variable.rb +14 -3
  465. data/lib/rubocop/cop/variable_force/variable_table.rb +5 -5
  466. data/lib/rubocop/cop/variable_force.rb +23 -18
  467. data/lib/rubocop/cops_documentation_generator.rb +51 -25
  468. data/lib/rubocop/directive_comment.rb +45 -11
  469. data/lib/rubocop/ext/regexp_node.rb +0 -1
  470. data/lib/rubocop/formatter/disabled_config_formatter.rb +3 -2
  471. data/lib/rubocop/formatter/formatter_set.rb +1 -1
  472. data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
  473. data/lib/rubocop/formatter/html_formatter.rb +1 -1
  474. data/lib/rubocop/formatter/markdown_formatter.rb +1 -0
  475. data/lib/rubocop/formatter/offense_count_formatter.rb +1 -1
  476. data/lib/rubocop/formatter/pacman_formatter.rb +2 -1
  477. data/lib/rubocop/lsp/diagnostic.rb +189 -0
  478. data/lib/rubocop/lsp/logger.rb +2 -2
  479. data/lib/rubocop/lsp/routes.rb +10 -26
  480. data/lib/rubocop/lsp/runtime.rb +18 -50
  481. data/lib/rubocop/lsp/server.rb +0 -2
  482. data/lib/rubocop/lsp/stdin_runner.rb +85 -0
  483. data/lib/rubocop/magic_comment.rb +11 -3
  484. data/lib/rubocop/options.rb +28 -12
  485. data/lib/rubocop/path_util.rb +15 -8
  486. data/lib/rubocop/pending_cops_reporter.rb +56 -0
  487. data/lib/rubocop/plugin/configuration_integrator.rb +143 -0
  488. data/lib/rubocop/plugin/load_error.rb +26 -0
  489. data/lib/rubocop/plugin/loader.rb +100 -0
  490. data/lib/rubocop/plugin/not_supported_error.rb +29 -0
  491. data/lib/rubocop/plugin.rb +46 -0
  492. data/lib/rubocop/rake_task.rb +4 -1
  493. data/lib/rubocop/result_cache.rb +13 -13
  494. data/lib/rubocop/rspec/cop_helper.rb +13 -1
  495. data/lib/rubocop/rspec/expect_offense.rb +15 -5
  496. data/lib/rubocop/rspec/shared_contexts.rb +38 -1
  497. data/lib/rubocop/rspec/support.rb +4 -2
  498. data/lib/rubocop/runner.rb +26 -15
  499. data/lib/rubocop/server/cache.rb +51 -13
  500. data/lib/rubocop/server/cli.rb +2 -2
  501. data/lib/rubocop/server/client_command/base.rb +10 -0
  502. data/lib/rubocop/server/client_command/exec.rb +2 -1
  503. data/lib/rubocop/server/client_command/start.rb +11 -1
  504. data/lib/rubocop/target_finder.rb +7 -2
  505. data/lib/rubocop/target_ruby.rb +17 -2
  506. data/lib/rubocop/version.rb +53 -12
  507. data/lib/rubocop.rb +43 -2
  508. data/lib/ruby_lsp/rubocop/addon.rb +75 -0
  509. data/lib/ruby_lsp/rubocop/runtime_adapter.rb +65 -0
  510. metadata +89 -17
  511. data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
  512. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -19,7 +19,7 @@ module RuboCop
19
19
  # acceptable value other than none, it will suppress the offenses
20
20
  # raised by this cop. It enforces frozen state.
21
21
  #
22
- # NOTE: Regexp and Range literals are frozen objects since Ruby 3.0.
22
+ # NOTE: `Regexp` and `Range` literals are frozen objects since Ruby 3.0.
23
23
  #
24
24
  # NOTE: From Ruby 3.0, interpolated strings are not frozen when
25
25
  # `# frozen-string-literal: true` is used, so this cop enforces explicit
@@ -125,15 +125,14 @@ module RuboCop
125
125
  MSG = 'Freeze mutable objects assigned to constants.'
126
126
 
127
127
  def on_casgn(node)
128
- _scope, _const_name, value = *node
129
- if value.nil? # This is only the case for `CONST += ...` or similarg66
128
+ if node.expression.nil? # This is only the case for `CONST += ...` or similarg66
130
129
  parent = node.parent
131
130
  return unless parent.or_asgn_type? # We only care about `CONST ||= ...`
132
131
 
133
- value = parent.children.last
132
+ on_assignment(parent.children.last)
133
+ else
134
+ on_assignment(node.expression)
134
135
  end
135
-
136
- on_assignment(value)
137
136
  end
138
137
 
139
138
  private
@@ -198,7 +197,7 @@ module RuboCop
198
197
  end
199
198
 
200
199
  def frozen_regexp_or_range_literals?(node)
201
- target_ruby_version >= 3.0 && (node.regexp_type? || node.range_type?)
200
+ target_ruby_version >= 3.0 && node.type?(:regexp, :range)
202
201
  end
203
202
 
204
203
  def requires_parentheses?(node)
@@ -239,7 +238,7 @@ module RuboCop
239
238
 
240
239
  # @!method range_enclosed_in_parentheses?(node)
241
240
  def_node_matcher :range_enclosed_in_parentheses?, <<~PATTERN
242
- (begin ({irange erange} _ _))
241
+ (begin (range _ _))
243
242
  PATTERN
244
243
  end
245
244
  end
@@ -46,10 +46,12 @@ module RuboCop
46
46
  @corrected_nodes = nil
47
47
  end
48
48
 
49
+ # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity
49
50
  def on_if(node)
50
51
  return unless if_else?(node)
51
52
  return unless (condition = unwrap_begin_nodes(node.condition))
52
53
  return if double_negation?(condition) || !negated_condition?(condition)
54
+ return unless condition.arguments.size < 2
53
55
 
54
56
  message = message(node)
55
57
  add_offense(node, message: message) do |corrector|
@@ -62,6 +64,7 @@ module RuboCop
62
64
  end
63
65
  end
64
66
  end
67
+ # rubocop:enable Metrics/AbcSize,Metrics/CyclomaticComplexity
65
68
 
66
69
  private
67
70
 
@@ -71,7 +74,7 @@ module RuboCop
71
74
  end
72
75
 
73
76
  def unwrap_begin_nodes(node)
74
- node = node.children.first while node && (node.begin_type? || node.kwbegin_type?)
77
+ node = node.children.first while node&.type?(:begin, :kwbegin)
75
78
 
76
79
  node
77
80
  end
@@ -92,13 +95,12 @@ module RuboCop
92
95
  end
93
96
 
94
97
  def correct_negated_condition(corrector, node)
95
- receiver, method_name, rhs = *node
96
98
  replacement =
97
99
  if node.negation_method?
98
- receiver.source
100
+ node.receiver.source
99
101
  else
100
- inverted_method = method_name.to_s.sub('!', '=')
101
- "#{receiver.source} #{inverted_method} #{rhs.source}"
102
+ inverted_method = node.method_name.to_s.sub('!', '=')
103
+ "#{node.receiver.source} #{inverted_method} #{node.first_argument.source}"
102
104
  end
103
105
 
104
106
  corrector.replace(node, replacement)
@@ -35,7 +35,7 @@ module RuboCop
35
35
  def on_send(node)
36
36
  return unless node.parenthesized?
37
37
 
38
- node.each_child_node(:send, :csend) do |nested|
38
+ node.each_child_node(:call) do |nested|
39
39
  next if allowed_omission?(nested)
40
40
 
41
41
  message = format(MSG, source: nested.source)
@@ -18,7 +18,6 @@ module RuboCop
18
18
  class NestedTernaryOperator < Base
19
19
  extend AutoCorrector
20
20
  include RangeHelp
21
- include IgnoredNode
22
21
 
23
22
  MSG = 'Ternary operators must not be nested. Prefer `if` or `else` constructs instead.'
24
23
 
@@ -45,9 +44,11 @@ module RuboCop
45
44
  end
46
45
 
47
46
  def remove_parentheses(source)
48
- return source unless source.start_with?('(')
49
-
50
- source.delete_prefix('(').delete_suffix(')')
47
+ if source.start_with?('(') && source.end_with?(')')
48
+ source.delete_prefix('(').delete_suffix(')')
49
+ else
50
+ source
51
+ end
51
52
  end
52
53
 
53
54
  def replace_loc_and_whitespace(corrector, range, replacement)
@@ -46,6 +46,38 @@ module RuboCop
46
46
  # next unless a == 1
47
47
  # puts a
48
48
  # end
49
+ #
50
+ # @example AllowConsecutiveConditionals: false (default)
51
+ # # bad
52
+ # [1, 2].each do |a|
53
+ # if a == 1
54
+ # puts a
55
+ # end
56
+ # if a == 2
57
+ # puts a
58
+ # end
59
+ # end
60
+ #
61
+ # # good
62
+ # [1, 2].each do |a|
63
+ # if a == 1
64
+ # puts a
65
+ # end
66
+ # next unless a == 2
67
+ # puts a
68
+ # end
69
+ #
70
+ # @example AllowConsecutiveConditionals: true
71
+ # # good
72
+ # [1, 2].each do |a|
73
+ # if a == 1
74
+ # puts a
75
+ # end
76
+ # if a == 2
77
+ # puts a
78
+ # end
79
+ # end
80
+ #
49
81
  class Next < Base
50
82
  include ConfigurableEnforcedStyle
51
83
  include MinBodyLength
@@ -72,6 +104,7 @@ module RuboCop
72
104
  end
73
105
 
74
106
  alias on_numblock on_block
107
+ alias on_itblock on_block
75
108
 
76
109
  def on_while(node)
77
110
  check(node)
@@ -86,6 +119,9 @@ module RuboCop
86
119
 
87
120
  offending_node = offense_node(node.body)
88
121
 
122
+ return if allowed_consecutive_conditionals? &&
123
+ consecutive_conditionals?(offending_node)
124
+
89
125
  add_offense(offense_location(offending_node)) do |corrector|
90
126
  if offending_node.modifier_form?
91
127
  autocorrect_modifier(corrector, offending_node)
@@ -227,6 +263,14 @@ module RuboCop
227
263
 
228
264
  corrector.remove_leading(buffer.line_range(lineno), adjustment) if adjustment.positive?
229
265
  end
266
+
267
+ def consecutive_conditionals?(if_node)
268
+ if_node.parent&.begin_type? && if_node.left_sibling&.if_type?
269
+ end
270
+
271
+ def allowed_consecutive_conditionals?
272
+ cop_config.fetch('AllowConsecutiveConditionals', false)
273
+ end
230
274
  end
231
275
  end
232
276
  end
@@ -52,7 +52,7 @@ module RuboCop
52
52
  end
53
53
 
54
54
  def requires_parens?(child)
55
- child.and_type? || child.or_type? ||
55
+ child.operator_keyword? ||
56
56
  (child.send_type? && child.binary_operation?) ||
57
57
  (child.if_type? && child.ternary?)
58
58
  end
@@ -30,41 +30,41 @@ module RuboCop
30
30
  minimum_target_ruby_version 2.6
31
31
 
32
32
  MSG = 'Prefer `%<prefer>s` over `%<current>s`.'
33
+ RESTRICT_ON_SEND = %i[then yield_self].freeze
33
34
 
34
35
  def on_block(node)
36
+ return unless RESTRICT_ON_SEND.include?(node.method_name)
37
+
35
38
  check_method_node(node.send_node)
36
39
  end
37
-
38
40
  alias on_numblock on_block
41
+ alias on_itblock on_block
39
42
 
40
43
  def on_send(node)
41
44
  return unless node.arguments.one? && node.first_argument.block_pass_type?
42
45
 
43
46
  check_method_node(node)
44
47
  end
48
+ alias on_csend on_send
45
49
 
46
50
  private
47
51
 
48
52
  def check_method_node(node)
49
- return unless preferred_method?(node)
50
-
51
- message = message(node)
52
- add_offense(node.loc.selector, message: message) do |corrector|
53
- prefer = style == :then && node.receiver.nil? ? 'self.then' : style
53
+ if preferred_method?(node)
54
+ correct_style_detected
55
+ else
56
+ opposite_style_detected
57
+ message = message(node)
58
+ add_offense(node.loc.selector, message: message) do |corrector|
59
+ prefer = style == :then && node.receiver.nil? ? 'self.then' : style
54
60
 
55
- corrector.replace(node.loc.selector, prefer)
61
+ corrector.replace(node.loc.selector, prefer)
62
+ end
56
63
  end
57
64
  end
58
65
 
59
66
  def preferred_method?(node)
60
- case style
61
- when :then
62
- node.method?(:yield_self)
63
- when :yield_self
64
- node.method?(:then)
65
- else
66
- false
67
- end
67
+ node.method?(style)
68
68
  end
69
69
 
70
70
  def message(node)
@@ -4,8 +4,8 @@ module RuboCop
4
4
  module Cop
5
5
  module Style
6
6
  # Checks for uses of if/then/else/end constructs on a single line.
7
- # AlwaysCorrectToMultiline config option can be set to true to auto-convert all offenses to
8
- # multi-line constructs. When AlwaysCorrectToMultiline is false (default case) the
7
+ # `AlwaysCorrectToMultiline` config option can be set to true to autocorrect all offenses to
8
+ # multi-line constructs. When `AlwaysCorrectToMultiline` is false (default case) the
9
9
  # autocorrect will first try converting them to ternary operators.
10
10
  #
11
11
  # @example
@@ -30,6 +30,25 @@ module RuboCop
30
30
  # else
31
31
  # baz
32
32
  # end
33
+ #
34
+ # @example AlwaysCorrectToMultiline: false (default)
35
+ # # bad
36
+ # if cond then run else dont end
37
+ #
38
+ # # good
39
+ # cond ? run : dont
40
+ #
41
+ # @example AlwaysCorrectToMultiline: true
42
+ # # bad
43
+ # if cond then run else dont end
44
+ #
45
+ # # good
46
+ # if cond
47
+ # run
48
+ # else
49
+ # dont
50
+ # end
51
+ #
33
52
  class OneLineConditional < Base
34
53
  include Alignment
35
54
  include ConfigurableEnforcedStyle
@@ -83,11 +102,13 @@ module RuboCop
83
102
  end
84
103
 
85
104
  def cannot_replace_to_ternary?(node)
86
- node.elsif_conditional?
105
+ return true if node.elsif_conditional?
106
+
107
+ node.else_branch.begin_type? && node.else_branch.children.compact.count >= 2
87
108
  end
88
109
 
89
110
  def ternary_replacement(node)
90
- condition, if_branch, else_branch = *node
111
+ condition, if_branch, else_branch = *node # rubocop:disable InternalAffairs/NodeDestructuring
91
112
 
92
113
  "#{expr_replacement(condition)} ? " \
93
114
  "#{expr_replacement(if_branch)} : " \
@@ -3,15 +3,15 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- # Flags uses of OpenStruct, as it is now officially discouraged
6
+ # Flags uses of `OpenStruct`, as it is now officially discouraged
7
7
  # to be used for performance, version compatibility, and potential security issues.
8
8
  #
9
9
  # @safety
10
- #
11
10
  # Note that this cop may flag false positives; for instance, the following legal
12
11
  # use of a hand-rolled `OpenStruct` type would be considered an offense:
13
12
  #
14
- # ```
13
+ # [source,ruby]
14
+ # -----
15
15
  # module MyNamespace
16
16
  # class OpenStruct # not the OpenStruct we're looking for
17
17
  # end
@@ -20,7 +20,7 @@ module RuboCop
20
20
  # OpenStruct.new # resolves to MyNamespace::OpenStruct
21
21
  # end
22
22
  # end
23
- # ```
23
+ # -----
24
24
  #
25
25
  # @example
26
26
  #
@@ -61,7 +61,7 @@ module RuboCop
61
61
  def custom_class_or_module_definition?(node)
62
62
  parent = node.parent
63
63
 
64
- (parent.class_type? || parent.module_type?) && node.left_siblings.empty?
64
+ parent.type?(:class, :module) && node.left_siblings.empty?
65
65
  end
66
66
  end
67
67
  end
@@ -31,10 +31,9 @@ module RuboCop
31
31
  return unless (dot = node.loc.dot)
32
32
  return if node.receiver.const_type? || !node.arguments.one?
33
33
 
34
- _lhs, _op, rhs = *node
35
- if !rhs || method_call_with_parenthesized_arg?(rhs) || invalid_syntax_argument?(rhs)
36
- return
37
- end
34
+ return unless (rhs = node.first_argument)
35
+ return if method_call_with_parenthesized_arg?(rhs)
36
+ return if invalid_syntax_argument?(rhs)
38
37
 
39
38
  add_offense(dot) do |corrector|
40
39
  wrap_in_parentheses_if_chained(corrector, node)
@@ -73,7 +72,7 @@ module RuboCop
73
72
  end
74
73
 
75
74
  def insert_space_after?(node)
76
- _lhs, op, rhs = *node
75
+ rhs = node.first_argument
77
76
  selector = node.loc.selector
78
77
 
79
78
  return true if selector.end_pos == rhs.source_range.begin_pos
@@ -82,7 +81,7 @@ module RuboCop
82
81
  # For `/` operations, if the RHS starts with a `(` without space,
83
82
  # add one to avoid a syntax error.
84
83
  range = selector.end.join(rhs.source_range.begin)
85
- return true if op == :/ && range.source == '('
84
+ return true if node.method?(:/) && range.source == '('
86
85
 
87
86
  false
88
87
  end
@@ -78,18 +78,15 @@ module RuboCop
78
78
  end
79
79
 
80
80
  def take_variable_and_default_from_ternary(node)
81
- variable, if_statement = *node
82
- [variable, if_statement.else_branch]
81
+ [node.name, node.expression.else_branch]
83
82
  end
84
83
 
85
84
  def take_variable_and_default_from_unless(node)
86
85
  if node.if_branch
87
- variable, default = *node.if_branch
86
+ [node.if_branch.name, node.if_branch.expression]
88
87
  else
89
- variable, default = *node.else_branch
88
+ [node.else_branch.name, node.else_branch.expression]
90
89
  end
91
-
92
- [variable, default]
93
90
  end
94
91
  end
95
92
  end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'tsort'
4
-
5
3
  module RuboCop
6
4
  module Cop
7
5
  module Style
@@ -28,28 +26,28 @@ module RuboCop
28
26
 
29
27
  MSG = 'Do not use parallel assignment.'
30
28
 
31
- def on_masgn(node)
32
- lhs, rhs = *node
33
- lhs_elements = *lhs
29
+ def on_masgn(node) # rubocop:disable Metrics/AbcSize
30
+ return if part_of_ignored_node?(node)
31
+
32
+ rhs = node.rhs
34
33
  rhs = rhs.body if rhs.rescue_type?
35
34
  rhs_elements = Array(rhs).compact # edge case for one constant
36
35
 
37
- return if allowed_lhs?(lhs) || allowed_rhs?(rhs) ||
38
- allowed_masign?(lhs_elements, rhs_elements)
36
+ return if allowed_lhs?(node.assignments) || allowed_rhs?(rhs) ||
37
+ allowed_masign?(node.assignments, rhs_elements)
39
38
 
40
39
  range = node.source_range.begin.join(rhs.source_range.end)
41
40
 
42
41
  add_offense(range) do |corrector|
43
- autocorrect(corrector, node, lhs, rhs)
42
+ autocorrect(corrector, node, rhs)
44
43
  end
44
+ ignore_node(node)
45
45
  end
46
46
 
47
47
  private
48
48
 
49
- def autocorrect(corrector, node, lhs, rhs)
50
- left_elements = *lhs
51
- right_elements = Array(rhs).compact
52
- order = find_valid_order(left_elements, right_elements)
49
+ def autocorrect(corrector, node, rhs)
50
+ order = find_valid_order(node.assignments, Array(rhs).compact)
53
51
  correction = assignment_corrector(node, rhs, order)
54
52
 
55
53
  corrector.replace(correction.correction_range, correction.correction)
@@ -61,9 +59,7 @@ module RuboCop
61
59
  add_self_to_getters(rhs_elements))
62
60
  end
63
61
 
64
- def allowed_lhs?(node)
65
- elements = *node
66
-
62
+ def allowed_lhs?(elements)
67
63
  # Account for edge cases using one variable with a comma
68
64
  # E.g.: `foo, = *bar`
69
65
  elements.one? || elements.any?(&:splat_type?)
@@ -74,11 +70,7 @@ module RuboCop
74
70
  elements = Array(node).compact
75
71
 
76
72
  # Account for edge case of `Constant::CONSTANT`
77
- !node.array_type? || return_of_method_call?(node) || elements.any?(&:splat_type?)
78
- end
79
-
80
- def return_of_method_call?(node)
81
- node.block_type? || node.send_type?
73
+ !node.array_type? || elements.any?(&:splat_type?)
82
74
  end
83
75
 
84
76
  def assignment_corrector(node, rhs, order)
@@ -100,15 +92,9 @@ module RuboCop
100
92
  def find_valid_order(left_elements, right_elements)
101
93
  # arrange left_elements in an order such that no corresponding right
102
94
  # element refers to a left element earlier in the sequence
103
- # this can be done using an algorithm called a "topological sort"
104
- # fortunately for us, Ruby's stdlib contains an implementation
105
95
  assignments = left_elements.zip(right_elements)
106
96
 
107
- begin
108
- AssignmentSorter.new(assignments).tsort
109
- rescue TSort::Cyclic
110
- nil
111
- end
97
+ AssignmentSorter.new(assignments).tsort
112
98
  end
113
99
 
114
100
  # Converts (send nil :something) nodes to (send (:self) :something).
@@ -123,10 +109,9 @@ module RuboCop
123
109
  # @!method implicit_self_getter?(node)
124
110
  def_node_matcher :implicit_self_getter?, '(send nil? $_)'
125
111
 
126
- # Helper class necessitated by silly design of TSort prior to Ruby 2.1
127
- # Newer versions have a better API, but that doesn't help us
112
+ # Topologically sorts the assignments with Kahn's algorithm.
113
+ # https://en.wikipedia.org/wiki/Topological_sorting#Kahn's_algorithm
128
114
  class AssignmentSorter
129
- include TSort
130
115
  extend RuboCop::NodePattern::Macros
131
116
 
132
117
  # @!method var_name(node)
@@ -142,21 +127,39 @@ module RuboCop
142
127
  @assignments = assignments
143
128
  end
144
129
 
145
- def tsort_each_node(...)
146
- @assignments.each(...)
130
+ def tsort
131
+ dependencies = @assignments.to_h do |assignment|
132
+ [assignment, dependencies_for_assignment(assignment)]
133
+ end
134
+ result = []
135
+
136
+ while (matched_node, = dependencies.find { |_node, edges| edges.empty? })
137
+ dependencies.delete(matched_node)
138
+ result.push(matched_node)
139
+
140
+ dependencies.each do |node, edges|
141
+ dependencies[node].delete(matched_node) if edges.include?(matched_node)
142
+ end
143
+ end
144
+ # Cyclic dependency
145
+ return nil if dependencies.any?
146
+
147
+ result
147
148
  end
148
149
 
149
- def tsort_each_child(assignment)
150
- # yield all the assignments which must come after `assignment`
151
- # (due to dependencies on the previous value of the assigned var)
150
+ # Returns all the assignments which must come after `assignment`
151
+ # (due to dependencies on the previous value of the assigned var)
152
+ def dependencies_for_assignment(assignment)
152
153
  my_lhs, _my_rhs = *assignment
153
154
 
154
- @assignments.each do |other|
155
- _other_lhs, other_rhs = *other
155
+ @assignments.filter_map do |other|
156
+ # Exclude self, there are no dependencies in cases such as `a, b = a, b`.
157
+ next if other == assignment
156
158
 
159
+ _other_lhs, other_rhs = *other
157
160
  next unless dependency?(my_lhs, other_rhs)
158
161
 
159
- yield other
162
+ other
160
163
  end
161
164
  end
162
165
 
@@ -94,8 +94,8 @@ module RuboCop
94
94
  end
95
95
 
96
96
  def require_parentheses?(node, condition_body)
97
- return false if !node.while_type? && !node.until_type?
98
- return false if !condition_body.block_type? && !condition_body.numblock_type?
97
+ return false unless node.type?(:while, :until)
98
+ return false unless condition_body.any_block_type?
99
99
 
100
100
  condition_body.send_node.block_literal? && condition_body.keywords?
101
101
  end
@@ -99,7 +99,7 @@ module RuboCop
99
99
  def string_source(node)
100
100
  if node.is_a?(String)
101
101
  node.scrub
102
- elsif node.respond_to?(:type) && (node.str_type? || node.sym_type?)
102
+ elsif node.respond_to?(:type) && node.type?(:str, :sym)
103
103
  node.source
104
104
  end
105
105
  end
@@ -45,7 +45,7 @@ module RuboCop
45
45
  # Report offense only if changing case doesn't change semantics,
46
46
  # i.e., if the string would become dynamic or has special characters.
47
47
  ast = parse(corrected(node.source)).ast
48
- return if node.children != ast.children
48
+ return if node.children != ast&.children
49
49
 
50
50
  add_offense(node.loc.begin) do |corrector|
51
51
  corrector.replace(node, corrected(node.source))
@@ -19,8 +19,7 @@ module RuboCop
19
19
  MSG = 'Use `proc` instead of `Proc.new`.'
20
20
 
21
21
  # @!method proc_new?(node)
22
- def_node_matcher :proc_new?,
23
- '({block numblock} $(send (const {nil? cbase} :Proc) :new) ...)'
22
+ def_node_matcher :proc_new?, '(any_block $(send (const {nil? cbase} :Proc) :new) ...)'
24
23
 
25
24
  def on_block(node)
26
25
  proc_new?(node) do |block_method|
@@ -31,6 +30,7 @@ module RuboCop
31
30
  end
32
31
 
33
32
  alias on_numblock on_block
33
+ alias on_itblock on_block
34
34
  end
35
35
  end
36
36
  end
@@ -98,7 +98,7 @@ module RuboCop
98
98
 
99
99
  def style
100
100
  return super unless super == :same_as_string_literals
101
- return :single_quotes unless string_literals_config['Enabled']
101
+ return :single_quotes unless config.cop_enabled?('Style/StringLiterals')
102
102
 
103
103
  string_literals_config['EnforcedStyle'].to_sym
104
104
  end