rubocop 1.69.0 → 1.76.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 (416) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +22 -16
  4. data/config/default.yml +234 -47
  5. data/config/internal_affairs.yml +20 -0
  6. data/config/obsoletion.yml +8 -3
  7. data/lib/rubocop/cli/command/execute_runner.rb +3 -3
  8. data/lib/rubocop/cli/command/show_cops.rb +24 -2
  9. data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
  10. data/lib/rubocop/cli.rb +1 -1
  11. data/lib/rubocop/comment_config.rb +2 -2
  12. data/lib/rubocop/config.rb +52 -10
  13. data/lib/rubocop/config_loader.rb +52 -9
  14. data/lib/rubocop/config_loader_resolver.rb +36 -10
  15. data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -3
  16. data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
  17. data/lib/rubocop/config_obsoletion.rb +46 -2
  18. data/lib/rubocop/config_validator.rb +25 -14
  19. data/lib/rubocop/cop/autocorrect_logic.rb +44 -39
  20. data/lib/rubocop/cop/base.rb +6 -0
  21. data/lib/rubocop/cop/bundler/duplicated_gem.rb +2 -2
  22. data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
  23. data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -1
  24. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +50 -6
  25. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
  26. data/lib/rubocop/cop/generator.rb +6 -0
  27. data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
  28. data/lib/rubocop/cop/internal_affairs/example_description.rb +8 -4
  29. data/lib/rubocop/cop/internal_affairs/location_exists.rb +116 -0
  30. data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
  31. data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +1 -0
  32. data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +3 -2
  33. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -1
  34. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
  35. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
  36. data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +231 -0
  37. data/lib/rubocop/cop/internal_affairs/node_type_group.rb +91 -0
  38. data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
  39. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
  40. data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
  41. data/lib/rubocop/cop/internal_affairs/operator_keyword.rb +4 -2
  42. data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
  43. data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +6 -5
  44. data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +3 -1
  45. data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
  46. data/lib/rubocop/cop/internal_affairs/undefined_config.rb +13 -2
  47. data/lib/rubocop/cop/internal_affairs.rb +6 -16
  48. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -1
  49. data/lib/rubocop/cop/layout/argument_alignment.rb +2 -8
  50. data/lib/rubocop/cop/layout/block_alignment.rb +3 -1
  51. data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
  52. data/lib/rubocop/cop/layout/class_structure.rb +44 -9
  53. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +4 -4
  54. data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
  55. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  56. data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
  57. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +2 -2
  58. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +7 -11
  59. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +34 -3
  60. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
  61. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +1 -0
  62. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +1 -1
  63. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +22 -2
  64. data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
  65. data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
  66. data/lib/rubocop/cop/layout/first_argument_indentation.rb +4 -9
  67. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +2 -7
  68. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
  69. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
  70. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
  71. data/lib/rubocop/cop/layout/hash_alignment.rb +8 -6
  72. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -1
  73. data/lib/rubocop/cop/layout/indentation_width.rb +1 -0
  74. data/lib/rubocop/cop/layout/leading_comment_space.rb +13 -1
  75. data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +11 -2
  76. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +7 -1
  77. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
  78. data/lib/rubocop/cop/layout/line_length.rb +9 -4
  79. data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -0
  80. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
  81. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
  82. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +1 -0
  83. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
  84. data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
  85. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +1 -1
  86. data/lib/rubocop/cop/layout/redundant_line_break.rb +16 -11
  87. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +3 -5
  88. data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -1
  89. data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
  90. data/lib/rubocop/cop/layout/space_after_comma.rb +1 -1
  91. data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
  92. data/lib/rubocop/cop/layout/space_after_semicolon.rb +11 -1
  93. data/lib/rubocop/cop/layout/space_around_keyword.rb +1 -0
  94. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
  95. data/lib/rubocop/cop/layout/space_around_operators.rb +7 -4
  96. data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -0
  97. data/lib/rubocop/cop/layout/space_before_brackets.rb +6 -32
  98. data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
  99. data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
  100. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +5 -1
  101. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -0
  102. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +3 -0
  103. data/lib/rubocop/cop/layout/trailing_whitespace.rb +5 -3
  104. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
  105. data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +118 -0
  106. data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
  107. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +2 -3
  108. data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
  109. data/lib/rubocop/cop/lint/circular_argument_reference.rb +4 -3
  110. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
  111. data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
  112. data/lib/rubocop/cop/lint/cop_directive_syntax.rb +84 -0
  113. data/lib/rubocop/cop/lint/debugger.rb +3 -3
  114. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -1
  115. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +2 -1
  116. data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
  117. data/lib/rubocop/cop/lint/duplicate_methods.rb +86 -19
  118. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -1
  119. data/lib/rubocop/cop/lint/duplicate_set_element.rb +20 -7
  120. data/lib/rubocop/cop/lint/empty_conditional_body.rb +14 -64
  121. data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
  122. data/lib/rubocop/cop/lint/empty_interpolation.rb +3 -1
  123. data/lib/rubocop/cop/lint/erb_new_arguments.rb +0 -6
  124. data/lib/rubocop/cop/lint/float_comparison.rb +33 -8
  125. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  126. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
  127. data/lib/rubocop/cop/lint/identity_comparison.rb +19 -15
  128. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  129. data/lib/rubocop/cop/lint/literal_as_condition.rb +110 -9
  130. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +24 -6
  131. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +1 -1
  132. data/lib/rubocop/cop/lint/missing_super.rb +2 -2
  133. data/lib/rubocop/cop/lint/mixed_case_range.rb +3 -3
  134. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  135. data/lib/rubocop/cop/lint/nested_method_definition.rb +9 -5
  136. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  137. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +4 -2
  138. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +3 -3
  139. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
  140. data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +18 -31
  141. data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +1 -1
  142. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +2 -1
  143. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -5
  144. data/lib/rubocop/cop/lint/raise_exception.rb +29 -10
  145. data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
  146. data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -21
  147. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
  148. data/lib/rubocop/cop/lint/redundant_type_conversion.rb +261 -0
  149. data/lib/rubocop/cop/lint/redundant_with_index.rb +3 -0
  150. data/lib/rubocop/cop/lint/redundant_with_object.rb +3 -0
  151. data/lib/rubocop/cop/lint/refinement_import_methods.rb +1 -1
  152. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  153. data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -11
  154. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +8 -1
  155. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +13 -1
  156. data/lib/rubocop/cop/lint/shared_mutable_default.rb +76 -0
  157. data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
  158. data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
  159. data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
  160. data/lib/rubocop/cop/lint/syntax.rb +4 -1
  161. data/lib/rubocop/cop/lint/to_enum_arguments.rb +1 -1
  162. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
  163. data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +1 -1
  164. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +3 -1
  165. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -1
  166. data/lib/rubocop/cop/lint/unreachable_code.rb +52 -2
  167. data/lib/rubocop/cop/lint/unreachable_loop.rb +6 -6
  168. data/lib/rubocop/cop/lint/useless_access_modifier.rb +5 -4
  169. data/lib/rubocop/cop/lint/useless_assignment.rb +3 -1
  170. data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
  171. data/lib/rubocop/cop/lint/useless_default_value_argument.rb +87 -0
  172. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +4 -0
  173. data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
  174. data/lib/rubocop/cop/lint/useless_numeric_operation.rb +2 -1
  175. data/lib/rubocop/cop/lint/useless_or.rb +98 -0
  176. data/lib/rubocop/cop/lint/useless_rescue.rb +1 -1
  177. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +2 -2
  178. data/lib/rubocop/cop/lint/void.rb +14 -11
  179. data/lib/rubocop/cop/message_annotator.rb +7 -3
  180. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  181. data/lib/rubocop/cop/metrics/block_length.rb +1 -0
  182. data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
  183. data/lib/rubocop/cop/metrics/class_length.rb +9 -9
  184. data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
  185. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -1
  186. data/lib/rubocop/cop/metrics/method_length.rb +9 -1
  187. data/lib/rubocop/cop/metrics/module_length.rb +1 -1
  188. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
  189. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +2 -2
  190. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
  191. data/lib/rubocop/cop/mixin/alignment.rb +2 -2
  192. data/lib/rubocop/cop/mixin/allowed_pattern.rb +4 -4
  193. data/lib/rubocop/cop/mixin/check_line_breakable.rb +13 -13
  194. data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +2 -2
  195. data/lib/rubocop/cop/mixin/comments_help.rb +8 -3
  196. data/lib/rubocop/cop/mixin/def_node.rb +1 -1
  197. data/lib/rubocop/cop/mixin/dig_help.rb +1 -1
  198. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
  199. data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
  200. data/lib/rubocop/cop/mixin/forbidden_pattern.rb +16 -0
  201. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +0 -1
  202. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +15 -14
  203. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +22 -22
  204. data/lib/rubocop/cop/mixin/hash_subset.rb +203 -0
  205. data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
  206. data/lib/rubocop/cop/mixin/line_length_help.rb +5 -4
  207. data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
  208. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +2 -0
  209. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
  210. data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
  211. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +68 -30
  212. data/lib/rubocop/cop/mixin/range_help.rb +15 -3
  213. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
  214. data/lib/rubocop/cop/mixin/statement_modifier.rb +8 -3
  215. data/lib/rubocop/cop/mixin/string_help.rb +2 -2
  216. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  217. data/lib/rubocop/cop/mixin/target_ruby_version.rb +1 -1
  218. data/lib/rubocop/cop/mixin/trailing_comma.rb +21 -5
  219. data/lib/rubocop/cop/naming/accessor_method_name.rb +6 -6
  220. data/lib/rubocop/cop/naming/block_forwarding.rb +19 -15
  221. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1 -1
  222. data/lib/rubocop/cop/naming/method_name.rb +64 -8
  223. data/lib/rubocop/cop/naming/predicate_method.rb +216 -0
  224. data/lib/rubocop/cop/naming/{predicate_name.rb → predicate_prefix.rb} +46 -2
  225. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +4 -4
  226. data/lib/rubocop/cop/naming/variable_name.rb +51 -6
  227. data/lib/rubocop/cop/registry.rb +9 -6
  228. data/lib/rubocop/cop/security/compound_hash.rb +2 -0
  229. data/lib/rubocop/cop/security/yaml_load.rb +3 -2
  230. data/lib/rubocop/cop/style/access_modifier_declarations.rb +66 -15
  231. data/lib/rubocop/cop/style/accessor_grouping.rb +19 -5
  232. data/lib/rubocop/cop/style/and_or.rb +1 -1
  233. data/lib/rubocop/cop/style/arguments_forwarding.rb +47 -28
  234. data/lib/rubocop/cop/style/array_first_last.rb +18 -2
  235. data/lib/rubocop/cop/style/array_intersect.rb +39 -28
  236. data/lib/rubocop/cop/style/block_delimiters.rb +26 -23
  237. data/lib/rubocop/cop/style/class_and_module_children.rb +52 -11
  238. data/lib/rubocop/cop/style/class_equality_comparison.rb +1 -1
  239. data/lib/rubocop/cop/style/collection_methods.rb +2 -1
  240. data/lib/rubocop/cop/style/combinable_defined.rb +1 -1
  241. data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
  242. data/lib/rubocop/cop/style/command_literal.rb +1 -1
  243. data/lib/rubocop/cop/style/commented_keyword.rb +12 -5
  244. data/lib/rubocop/cop/style/comparable_between.rb +78 -0
  245. data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
  246. data/lib/rubocop/cop/style/conditional_assignment.rb +20 -6
  247. data/lib/rubocop/cop/style/data_inheritance.rb +7 -0
  248. data/lib/rubocop/cop/style/def_with_parentheses.rb +18 -5
  249. data/lib/rubocop/cop/style/dig_chain.rb +5 -6
  250. data/lib/rubocop/cop/style/documentation.rb +1 -1
  251. data/lib/rubocop/cop/style/double_negation.rb +4 -4
  252. data/lib/rubocop/cop/style/each_for_simple_loop.rb +4 -7
  253. data/lib/rubocop/cop/style/each_with_object.rb +2 -3
  254. data/lib/rubocop/cop/style/empty_else.rb +4 -2
  255. data/lib/rubocop/cop/style/empty_literal.rb +5 -1
  256. data/lib/rubocop/cop/style/empty_method.rb +1 -1
  257. data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +100 -0
  258. data/lib/rubocop/cop/style/endless_method.rb +163 -18
  259. data/lib/rubocop/cop/style/eval_with_location.rb +4 -4
  260. data/lib/rubocop/cop/style/exact_regexp_match.rb +2 -3
  261. data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
  262. data/lib/rubocop/cop/style/explicit_block_argument.rb +16 -3
  263. data/lib/rubocop/cop/style/exponential_notation.rb +3 -3
  264. data/lib/rubocop/cop/style/fetch_env_var.rb +2 -1
  265. data/lib/rubocop/cop/style/file_null.rb +20 -4
  266. data/lib/rubocop/cop/style/float_division.rb +8 -4
  267. data/lib/rubocop/cop/style/for.rb +1 -0
  268. data/lib/rubocop/cop/style/format_string_token.rb +38 -11
  269. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -2
  270. data/lib/rubocop/cop/style/global_std_stream.rb +3 -0
  271. data/lib/rubocop/cop/style/guard_clause.rb +2 -1
  272. data/lib/rubocop/cop/style/hash_each_methods.rb +6 -8
  273. data/lib/rubocop/cop/style/hash_except.rb +35 -147
  274. data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
  275. data/lib/rubocop/cop/style/hash_slice.rb +80 -0
  276. data/lib/rubocop/cop/style/hash_syntax.rb +9 -3
  277. data/lib/rubocop/cop/style/hash_transform_keys.rb +2 -2
  278. data/lib/rubocop/cop/style/hash_transform_values.rb +2 -2
  279. data/lib/rubocop/cop/style/identical_conditional_branches.rb +25 -6
  280. data/lib/rubocop/cop/style/if_inside_else.rb +10 -13
  281. data/lib/rubocop/cop/style/if_unless_modifier.rb +25 -7
  282. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +4 -7
  283. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +2 -2
  284. data/lib/rubocop/cop/style/if_with_semicolon.rb +7 -5
  285. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  286. data/lib/rubocop/cop/style/inverse_methods.rb +15 -11
  287. data/lib/rubocop/cop/style/invertible_unless_condition.rb +2 -2
  288. data/lib/rubocop/cop/style/ip_addresses.rb +2 -2
  289. data/lib/rubocop/cop/style/it_assignment.rb +36 -0
  290. data/lib/rubocop/cop/style/it_block_parameter.rb +119 -0
  291. data/lib/rubocop/cop/style/keyword_parameters_order.rb +14 -8
  292. data/lib/rubocop/cop/style/lambda.rb +1 -0
  293. data/lib/rubocop/cop/style/lambda_call.rb +10 -3
  294. data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
  295. data/lib/rubocop/cop/style/map_into_array.rb +5 -2
  296. data/lib/rubocop/cop/style/map_to_hash.rb +12 -1
  297. data/lib/rubocop/cop/style/map_to_set.rb +3 -2
  298. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +26 -16
  299. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -0
  300. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +3 -2
  301. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -4
  302. data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
  303. data/lib/rubocop/cop/style/missing_else.rb +2 -0
  304. data/lib/rubocop/cop/style/multiline_block_chain.rb +3 -2
  305. data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -0
  306. data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -9
  307. data/lib/rubocop/cop/style/multiple_comparison.rb +34 -22
  308. data/lib/rubocop/cop/style/mutable_constant.rb +3 -3
  309. data/lib/rubocop/cop/style/negated_if_else_condition.rb +1 -1
  310. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +1 -1
  311. data/lib/rubocop/cop/style/next.rb +44 -0
  312. data/lib/rubocop/cop/style/object_then.rb +15 -15
  313. data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
  314. data/lib/rubocop/cop/style/parallel_assignment.rb +1 -5
  315. data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
  316. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  317. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
  318. data/lib/rubocop/cop/style/proc.rb +2 -2
  319. data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
  320. data/lib/rubocop/cop/style/raise_args.rb +14 -12
  321. data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
  322. data/lib/rubocop/cop/style/redundant_argument.rb +3 -1
  323. data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
  324. data/lib/rubocop/cop/style/redundant_begin.rb +2 -1
  325. data/lib/rubocop/cop/style/redundant_condition.rb +59 -2
  326. data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +16 -5
  327. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +6 -10
  328. data/lib/rubocop/cop/style/redundant_each.rb +1 -1
  329. data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
  330. data/lib/rubocop/cop/style/redundant_format.rb +262 -0
  331. data/lib/rubocop/cop/style/redundant_freeze.rb +3 -3
  332. data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
  333. data/lib/rubocop/cop/style/redundant_line_continuation.rb +38 -21
  334. data/lib/rubocop/cop/style/redundant_parentheses.rb +61 -17
  335. data/lib/rubocop/cop/style/redundant_regexp_argument.rb +3 -0
  336. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
  337. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -1
  338. data/lib/rubocop/cop/style/redundant_self.rb +2 -1
  339. data/lib/rubocop/cop/style/redundant_self_assignment.rb +14 -28
  340. data/lib/rubocop/cop/style/redundant_sort.rb +2 -2
  341. data/lib/rubocop/cop/style/redundant_sort_by.rb +17 -1
  342. data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -2
  343. data/lib/rubocop/cop/style/regexp_literal.rb +1 -1
  344. data/lib/rubocop/cop/style/rescue_modifier.rb +3 -0
  345. data/lib/rubocop/cop/style/return_nil.rb +2 -2
  346. data/lib/rubocop/cop/style/safe_navigation.rb +44 -16
  347. data/lib/rubocop/cop/style/select_by_regexp.rb +4 -1
  348. data/lib/rubocop/cop/style/semicolon.rb +1 -1
  349. data/lib/rubocop/cop/style/send_with_literal_method_name.rb +2 -1
  350. data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
  351. data/lib/rubocop/cop/style/single_line_do_end_block.rb +4 -3
  352. data/lib/rubocop/cop/style/single_line_methods.rb +6 -7
  353. data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
  354. data/lib/rubocop/cop/style/sole_nested_conditional.rb +42 -105
  355. data/lib/rubocop/cop/style/string_concatenation.rb +15 -14
  356. data/lib/rubocop/cop/style/string_literals.rb +1 -1
  357. data/lib/rubocop/cop/style/string_methods.rb +1 -1
  358. data/lib/rubocop/cop/style/struct_inheritance.rb +8 -1
  359. data/lib/rubocop/cop/style/super_arguments.rb +66 -19
  360. data/lib/rubocop/cop/style/symbol_proc.rb +2 -0
  361. data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
  362. data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -1
  363. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +11 -2
  364. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
  365. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
  366. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  367. data/lib/rubocop/cop/style/while_until_modifier.rb +0 -1
  368. data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
  369. data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
  370. data/lib/rubocop/cop/team.rb +1 -1
  371. data/lib/rubocop/cop/util.rb +12 -5
  372. data/lib/rubocop/cop/utils/format_string.rb +10 -5
  373. data/lib/rubocop/cop/variable_force/assignment.rb +7 -3
  374. data/lib/rubocop/cop/variable_force/scope.rb +1 -1
  375. data/lib/rubocop/cop/variable_force/variable.rb +10 -3
  376. data/lib/rubocop/cop/variable_force/variable_table.rb +3 -3
  377. data/lib/rubocop/cop/variable_force.rb +1 -1
  378. data/lib/rubocop/cops_documentation_generator.rb +31 -16
  379. data/lib/rubocop/directive_comment.rb +45 -11
  380. data/lib/rubocop/ext/regexp_node.rb +0 -1
  381. data/lib/rubocop/formatter/disabled_config_formatter.rb +2 -1
  382. data/lib/rubocop/formatter/formatter_set.rb +1 -1
  383. data/lib/rubocop/formatter/html_formatter.rb +1 -1
  384. data/lib/rubocop/formatter/pacman_formatter.rb +1 -1
  385. data/lib/rubocop/lsp/diagnostic.rb +189 -0
  386. data/lib/rubocop/lsp/logger.rb +2 -2
  387. data/lib/rubocop/lsp/routes.rb +7 -23
  388. data/lib/rubocop/lsp/runtime.rb +18 -50
  389. data/lib/rubocop/lsp/server.rb +0 -2
  390. data/lib/rubocop/lsp/stdin_runner.rb +85 -0
  391. data/lib/rubocop/magic_comment.rb +11 -3
  392. data/lib/rubocop/options.rb +28 -12
  393. data/lib/rubocop/path_util.rb +15 -8
  394. data/lib/rubocop/plugin/configuration_integrator.rb +143 -0
  395. data/lib/rubocop/plugin/load_error.rb +26 -0
  396. data/lib/rubocop/plugin/loader.rb +100 -0
  397. data/lib/rubocop/plugin/not_supported_error.rb +29 -0
  398. data/lib/rubocop/plugin.rb +46 -0
  399. data/lib/rubocop/rake_task.rb +4 -1
  400. data/lib/rubocop/result_cache.rb +13 -13
  401. data/lib/rubocop/rspec/cop_helper.rb +13 -1
  402. data/lib/rubocop/rspec/expect_offense.rb +15 -5
  403. data/lib/rubocop/rspec/shared_contexts.rb +38 -1
  404. data/lib/rubocop/rspec/support.rb +4 -2
  405. data/lib/rubocop/runner.rb +10 -7
  406. data/lib/rubocop/server/cache.rb +47 -11
  407. data/lib/rubocop/server/cli.rb +2 -2
  408. data/lib/rubocop/target_finder.rb +7 -2
  409. data/lib/rubocop/target_ruby.rb +16 -1
  410. data/lib/rubocop/version.rb +30 -8
  411. data/lib/rubocop.rb +22 -2
  412. data/lib/ruby_lsp/rubocop/addon.rb +75 -0
  413. data/lib/ruby_lsp/rubocop/runtime_adapter.rb +65 -0
  414. metadata +67 -19
  415. data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
  416. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -23,6 +23,10 @@ module RuboCop
23
23
  # `define_method`, therefore, `super` used within these blocks will be allowed.
24
24
  # This approach might result in false negatives, yet ensuring safe detection takes precedence.
25
25
  #
26
+ # NOTE: When forwarding the same arguments but replacing the block argument with a new inline
27
+ # block, it is not necessary to explicitly list the non-block arguments. As such, an offense
28
+ # will be registered in this case.
29
+ #
26
30
  # @example
27
31
  # # bad
28
32
  # def method(*args, **kwargs)
@@ -44,6 +48,16 @@ module RuboCop
44
48
  # super()
45
49
  # end
46
50
  #
51
+ # # bad - forwarding with overridden block
52
+ # def method(*args, **kwargs, &block)
53
+ # super(*args, **kwargs) { do_something }
54
+ # end
55
+ #
56
+ # # good - implicitly passing all non-block arguments
57
+ # def method(*args, **kwargs, &block)
58
+ # super { do_something }
59
+ # end
60
+ #
47
61
  # # good - assigning to the block variable before calling super
48
62
  # def method(&block)
49
63
  # # Assigning to the block variable would pass the old value to super,
@@ -54,50 +68,80 @@ module RuboCop
54
68
  class SuperArguments < Base
55
69
  extend AutoCorrector
56
70
 
57
- DEF_TYPES = %i[def defs].freeze
58
71
  ASSIGN_TYPES = %i[or_asgn lvasgn].freeze
59
72
 
60
73
  MSG = 'Call `super` without arguments and parentheses when the signature is identical.'
74
+ MSG_INLINE_BLOCK = 'Call `super` without arguments and parentheses when all positional ' \
75
+ 'and keyword arguments are forwarded.'
61
76
 
62
77
  def on_super(super_node)
63
- def_node = super_node.ancestors.find do |node|
78
+ return unless (def_node = find_def_node(super_node))
79
+
80
+ def_node_args = def_node.arguments.argument_list
81
+ super_args = preprocess_super_args(super_node.arguments)
82
+
83
+ return unless arguments_identical?(def_node, super_node, def_node_args, super_args)
84
+
85
+ # If the number of arguments to the def node and super node are different here,
86
+ # it's because the block argument is not forwarded.
87
+ message = def_node_args.size == super_args.size ? MSG : MSG_INLINE_BLOCK
88
+ add_offense(super_node, message: message) do |corrector|
89
+ corrector.replace(super_node, 'super')
90
+ end
91
+ end
92
+
93
+ private
94
+
95
+ def find_def_node(super_node)
96
+ super_node.ancestors.find do |node|
64
97
  # When defining dynamic methods, implicitly calling `super` is not possible.
65
98
  # Since there is a possibility of delegation to `define_method`,
66
99
  # `super` used within the block is always allowed.
67
- break if node.block_type?
100
+ break if node.any_block_type? && !block_sends_to_super?(super_node, node)
68
101
 
69
- break node if DEF_TYPES.include?(node.type)
102
+ break node if node.any_def_type?
70
103
  end
71
- return unless def_node
72
- return unless arguments_identical?(def_node, def_node.arguments.argument_list,
73
- super_node.arguments)
74
-
75
- add_offense(super_node) { |corrector| corrector.replace(super_node, 'super') }
76
104
  end
77
105
 
78
- private
79
-
80
106
  # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
81
- def arguments_identical?(def_node, def_args, super_args)
82
- super_args = preprocess_super_args(super_args)
83
- return false if def_args.size != super_args.size
107
+ def arguments_identical?(def_node, super_node, def_args, super_args)
108
+ return false if argument_list_size_differs?(def_args, super_args, super_node)
84
109
 
85
110
  def_args.zip(super_args).each do |def_arg, super_arg|
86
111
  next if positional_arg_same?(def_arg, super_arg)
87
112
  next if positional_rest_arg_same(def_arg, super_arg)
88
113
  next if keyword_arg_same?(def_arg, super_arg)
89
114
  next if keyword_rest_arg_same?(def_arg, super_arg)
90
- next if block_arg_same?(def_node, def_arg, super_arg)
115
+ next if block_arg_same?(def_node, super_node, def_arg, super_arg)
91
116
  next if forward_arg_same?(def_arg, super_arg)
92
117
 
93
118
  return false
94
119
  end
120
+
95
121
  true
96
122
  end
97
123
  # rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
98
124
 
125
+ def argument_list_size_differs?(def_args, super_args, super_node)
126
+ # If the def node has a block argument and the super node has an explicit block,
127
+ # the number of arguments is the same, so ignore the def node block arg.
128
+ def_args_size = def_args.size
129
+ def_args_size -= 1 if def_args.any?(&:blockarg_type?) && block_sends_to_super?(super_node)
130
+
131
+ def_args_size != super_args.size
132
+ end
133
+
134
+ def block_sends_to_super?(super_node, parent_node = super_node.parent)
135
+ # Checks if the send node of a block is the given super node,
136
+ # or a method chain containing it.
137
+ return false unless parent_node
138
+ return false unless parent_node.any_block_type?
139
+
140
+ parent_node.send_node.each_node(:super).any?(super_node)
141
+ end
142
+
99
143
  def positional_arg_same?(def_arg, super_arg)
100
- return false unless def_arg.arg_type? || def_arg.optarg_type?
144
+ return false unless def_arg.type?(:arg, :optarg)
101
145
  return false unless super_arg.lvar_type?
102
146
 
103
147
  def_arg.name == super_arg.children.first
@@ -114,7 +158,7 @@ module RuboCop
114
158
  end
115
159
 
116
160
  def keyword_arg_same?(def_arg, super_arg)
117
- return false unless def_arg.kwarg_type? || def_arg.kwoptarg_type?
161
+ return false unless def_arg.type?(:kwarg, :kwoptarg)
118
162
  return false unless (pair_node = super_arg).pair_type?
119
163
  return false unless (sym_node = pair_node.key).sym_type?
120
164
  return false unless (lvar_node = pair_node.value).lvar_type?
@@ -133,8 +177,11 @@ module RuboCop
133
177
  def_arg.name == lvar_node.children.first
134
178
  end
135
179
 
136
- def block_arg_same?(def_node, def_arg, super_arg)
137
- return false unless def_arg.blockarg_type? && super_arg.block_pass_type?
180
+ def block_arg_same?(def_node, super_node, def_arg, super_arg)
181
+ return false unless def_arg.blockarg_type?
182
+ return true if block_sends_to_super?(super_node)
183
+ return false unless super_arg.block_pass_type?
184
+
138
185
  # anonymous forwarding
139
186
  return true if (block_pass_child = super_arg.children.first).nil? && def_arg.name.nil?
140
187
 
@@ -159,6 +159,7 @@ module RuboCop
159
159
  {
160
160
  (block $#symbol_proc_receiver? $(args (arg _var)) (send (lvar _var) $_))
161
161
  (numblock $#symbol_proc_receiver? $1 (send (lvar :_1) $_))
162
+ (itblock $#symbol_proc_receiver? $_ (send (lvar :it) $_))
162
163
  }
163
164
  PATTERN
164
165
 
@@ -185,6 +186,7 @@ module RuboCop
185
186
  end
186
187
  # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
187
188
  alias on_numblock on_block
189
+ alias on_itblock on_block
188
190
 
189
191
  def destructuring_block_argument?(argument_node)
190
192
  argument_node.one? && argument_node.source.include?(',')
@@ -232,7 +232,7 @@ module RuboCop
232
232
  end
233
233
 
234
234
  def node_with_args?(node)
235
- node.call_type? || node.defined_type?
235
+ node.type?(:call, :defined?)
236
236
  end
237
237
  end
238
238
  end
@@ -64,6 +64,7 @@ module RuboCop
64
64
  end
65
65
 
66
66
  alias on_numblock on_block
67
+ alias on_itblock on_block
67
68
 
68
69
  private
69
70
 
@@ -77,7 +78,7 @@ module RuboCop
77
78
 
78
79
  # @!method define_method_block?(node)
79
80
  def_node_matcher :define_method_block?, <<~PATTERN
80
- ({block numblock} (send _ :define_method _) ...)
81
+ (any_block (send _ :define_method _) ...)
81
82
  PATTERN
82
83
  end
83
84
  end
@@ -7,12 +7,15 @@ module RuboCop
7
7
  # The supported styles are:
8
8
  #
9
9
  # * `consistent_comma`: Requires a comma after the last argument,
10
- # for all parenthesized method calls with arguments.
10
+ # for all parenthesized multi-line method calls with arguments.
11
11
  # * `comma`: Requires a comma after the last argument, but only for
12
12
  # parenthesized method calls where each argument is on its own line.
13
13
  # * `no_comma`: Requires that there is no comma after the last
14
14
  # argument.
15
15
  #
16
+ # Regardless of style, trailing commas are not allowed in
17
+ # single-line method calls.
18
+ #
16
19
  # @example EnforcedStyleForMultiline: consistent_comma
17
20
  # # bad
18
21
  # method(1, 2,)
@@ -76,10 +79,16 @@ module RuboCop
76
79
  # # bad
77
80
  # method(1, 2,)
78
81
  #
82
+ # # bad
83
+ # object[1, 2,]
84
+ #
79
85
  # # good
80
86
  # method(1, 2)
81
87
  #
82
88
  # # good
89
+ # object[1, 2]
90
+ #
91
+ # # good
83
92
  # method(
84
93
  # 1,
85
94
  # 2
@@ -93,7 +102,7 @@ module RuboCop
93
102
  end
94
103
 
95
104
  def on_send(node)
96
- return unless node.arguments? && node.parenthesized?
105
+ return unless node.arguments? && (node.parenthesized? || node.method?(:[]))
97
106
 
98
107
  check(node, node.arguments, 'parameter of %<article>s method call',
99
108
  node.last_argument.source_range.end_pos,
@@ -6,12 +6,13 @@ module RuboCop
6
6
  # Checks for trailing comma in array literals.
7
7
  # The configuration options are:
8
8
  #
9
- # * `consistent_comma`: Requires a comma after the
10
- # last item of all non-empty, multiline array literals.
11
- # * `comma`: Requires a comma after last item in an array,
12
- # but only when each item is on its own line.
13
- # * `no_comma`: Does not require a comma after the
14
- # last item in an array
9
+ # * `consistent_comma`: Requires a comma after the last item of all non-empty, multiline array
10
+ # literals.
11
+ # * `comma`: Requires a comma after the last item in an array, but only when each item is on
12
+ # its own line.
13
+ # * `diff_comma`: Requires a comma after the last item in an array, but only when that item is
14
+ # followed by an immediate newline, even if there is an inline comment on the same line.
15
+ # * `no_comma`: Does not require a comma after the last item in an array
15
16
  #
16
17
  # @example EnforcedStyleForMultiline: consistent_comma
17
18
  # # bad
@@ -37,6 +38,14 @@ module RuboCop
37
38
  # 2,
38
39
  # ]
39
40
  #
41
+ # # bad
42
+ # a = [1, 2,
43
+ # 3, 4]
44
+ #
45
+ # # good
46
+ # a = [1, 2,
47
+ # 3, 4,]
48
+ #
40
49
  # @example EnforcedStyleForMultiline: comma
41
50
  # # bad
42
51
  # a = [1, 2,]
@@ -72,6 +81,38 @@ module RuboCop
72
81
  # 2,
73
82
  # ]
74
83
  #
84
+ # @example EnforcedStyleForMultiline: diff_comma
85
+ # # bad
86
+ # a = [1, 2,]
87
+ #
88
+ # # good
89
+ # a = [1, 2]
90
+ #
91
+ # # good
92
+ # a = [
93
+ # 1, 2,
94
+ # 3,
95
+ # ]
96
+ #
97
+ # # good
98
+ # a = [
99
+ # 1, 2, 3,
100
+ # ]
101
+ #
102
+ # # good
103
+ # a = [
104
+ # 1,
105
+ # 2,
106
+ # ]
107
+ #
108
+ # # bad
109
+ # a = [1, 2,
110
+ # 3, 4,]
111
+ #
112
+ # # good
113
+ # a = [1, 2,
114
+ # 3, 4]
115
+ #
75
116
  # @example EnforcedStyleForMultiline: no_comma (default)
76
117
  # # bad
77
118
  # a = [1, 2,]
@@ -6,12 +6,13 @@ module RuboCop
6
6
  # Checks for trailing comma in hash literals.
7
7
  # The configuration options are:
8
8
  #
9
- # * `consistent_comma`: Requires a comma after the
10
- # last item of all non-empty, multiline hash literals.
11
- # * `comma`: Requires a comma after the last item in a hash,
12
- # but only when each item is on its own line.
13
- # * `no_comma`: Does not require a comma after the
14
- # last item in a hash
9
+ # * `consistent_comma`: Requires a comma after the last item of all non-empty, multiline hash
10
+ # literals.
11
+ # * `comma`: Requires a comma after the last item in a hash, but only when each item is on its
12
+ # own line.
13
+ # * `diff_comma`: Requires a comma after the last item in a hash, but only when that item is
14
+ # followed by an immediate newline, even if there is an inline comment on the same line.
15
+ # * `no_comma`: Does not require a comma after the last item in a hash
15
16
  #
16
17
  # @example EnforcedStyleForMultiline: consistent_comma
17
18
  #
@@ -38,6 +39,14 @@ module RuboCop
38
39
  # bar: 2,
39
40
  # }
40
41
  #
42
+ # # bad
43
+ # a = { foo: 1, bar: 2,
44
+ # baz: 3, qux: 4 }
45
+ #
46
+ # # good
47
+ # a = { foo: 1, bar: 2,
48
+ # baz: 3, qux: 4, }
49
+ #
41
50
  # @example EnforcedStyleForMultiline: comma
42
51
  #
43
52
  # # bad
@@ -74,6 +83,39 @@ module RuboCop
74
83
  # bar: 2,
75
84
  # }
76
85
  #
86
+ # @example EnforcedStyleForMultiline: diff_comma
87
+ #
88
+ # # bad
89
+ # a = { foo: 1, bar: 2, }
90
+ #
91
+ # # good
92
+ # a = { foo: 1, bar: 2 }
93
+ #
94
+ # # good
95
+ # a = {
96
+ # foo: 1, bar: 2,
97
+ # qux: 3,
98
+ # }
99
+ #
100
+ # # good
101
+ # a = {
102
+ # foo: 1, bar: 2, qux: 3,
103
+ # }
104
+ #
105
+ # # good
106
+ # a = {
107
+ # foo: 1,
108
+ # bar: 2,
109
+ # }
110
+ #
111
+ # # bad
112
+ # a = { foo: 1, bar: 2,
113
+ # baz: 3, qux: 4, }
114
+ #
115
+ # # good
116
+ # a = { foo: 1, bar: 2,
117
+ # baz: 3, qux: 4 }
118
+ #
77
119
  # @example EnforcedStyleForMultiline: no_comma (default)
78
120
  #
79
121
  # # bad
@@ -113,7 +113,7 @@ module RuboCop
113
113
  private
114
114
 
115
115
  def in_module_or_instance_eval?(node)
116
- node.each_ancestor(:block, :class, :sclass, :module).each do |pnode|
116
+ node.each_ancestor(:any_block, :class, :sclass, :module).each do |pnode|
117
117
  case pnode.type
118
118
  when :class, :sclass
119
119
  return false
@@ -24,7 +24,6 @@ module RuboCop
24
24
  # # good
25
25
  # x += 1 until x > 10
26
26
  #
27
- # @example
28
27
  # # bad
29
28
  # x += 100 while x < 500 # a long comment that makes code too long if it were a single line
30
29
  #
@@ -85,6 +85,12 @@ module RuboCop
85
85
  NONCOMMUTATIVE_OPERATORS = %i[===].freeze
86
86
  PROGRAM_NAMES = %i[$0 $PROGRAM_NAME].freeze
87
87
  RESTRICT_ON_SEND = RuboCop::AST::Node::COMPARISON_OPERATORS
88
+ ENFORCE_YODA_STYLES = %i[
89
+ require_for_all_comparison_operators require_for_equality_operators_only
90
+ ].freeze
91
+ EQUALITY_ONLY_STYLES = %i[
92
+ forbid_for_equality_operators_only require_for_equality_operators_only
93
+ ].freeze
88
94
 
89
95
  # @!method file_constant_equal_program_name?(node)
90
96
  def_node_matcher :file_constant_equal_program_name?, <<~PATTERN
@@ -105,13 +111,11 @@ module RuboCop
105
111
  private
106
112
 
107
113
  def enforce_yoda?
108
- style == :require_for_all_comparison_operators ||
109
- style == :require_for_equality_operators_only
114
+ ENFORCE_YODA_STYLES.include?(style)
110
115
  end
111
116
 
112
117
  def equality_only?
113
- style == :forbid_for_equality_operators_only ||
114
- style == :require_for_equality_operators_only
118
+ EQUALITY_ONLY_STYLES.include?(style)
115
119
  end
116
120
 
117
121
  def yoda_compatible_condition?(node)
@@ -50,6 +50,7 @@ module RuboCop
50
50
 
51
51
  def on_send(node)
52
52
  return unless supported_operators.include?(node.method_name.to_s)
53
+ return unless node.arguments?
53
54
 
54
55
  lhs = node.receiver
55
56
  rhs = node.first_argument
@@ -71,7 +72,7 @@ module RuboCop
71
72
  end
72
73
 
73
74
  def constant_portion?(node)
74
- node.numeric_type? || node.const_type?
75
+ node.type?(:numeric, :const)
75
76
  end
76
77
 
77
78
  def supported_operators
@@ -279,7 +279,7 @@ module RuboCop
279
279
  @errors << message
280
280
  warn message
281
281
  if debug?
282
- puts error.message, error.backtrace
282
+ puts error.full_message
283
283
  else
284
284
  warn 'To see the complete backtrace run rubocop -d.'
285
285
  end
@@ -32,7 +32,7 @@ module RuboCop
32
32
  end
33
33
 
34
34
  def parentheses?(node)
35
- node.loc.respond_to?(:end) && node.loc.end&.is?(')')
35
+ node.loc_is?(:end, ')')
36
36
  end
37
37
 
38
38
  # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
@@ -74,9 +74,9 @@ module RuboCop
74
74
 
75
75
  def args_begin(node)
76
76
  loc = node.loc
77
- selector = if node.super_type? || node.yield_type?
77
+ selector = if node.type?(:super, :yield)
78
78
  loc.keyword
79
- elsif node.def_type? || node.defs_type?
79
+ elsif node.any_def_type?
80
80
  loc.name
81
81
  else
82
82
  loc.selector
@@ -193,11 +193,18 @@ module RuboCop
193
193
  enforced_style.sub(/^Enforced/, 'Supported').sub('Style', 'Styles')
194
194
  end
195
195
 
196
+ def parse_regexp(text)
197
+ Regexp::Parser.parse(text)
198
+ rescue Regexp::Parser::Error
199
+ # Upon encountering an invalid regular expression,
200
+ # we aim to proceed and identify any remaining potential offenses.
201
+ nil
202
+ end
203
+
196
204
  private
197
205
 
198
206
  def compatible_external_encoding_for?(src)
199
- src = src.dup if RUBY_ENGINE == 'jruby'
200
- src.force_encoding(Encoding.default_external).valid_encoding?
207
+ src.dup.force_encoding(Encoding.default_external).valid_encoding?
201
208
  end
202
209
 
203
210
  def include_or_equal?(source, target)
@@ -5,15 +5,19 @@ module RuboCop
5
5
  module Utils
6
6
  # Parses {Kernel#sprintf} format strings.
7
7
  class FormatString
8
- DIGIT_DOLLAR = /(\d+)\$/.freeze
8
+ # Escaping the `#` in `INTERPOLATION` and `TEMPLATE_NAME` is necessary to
9
+ # avoid a bug in Ruby 3.2.0
10
+ # See: https://bugs.ruby-lang.org/issues/19379
11
+ DIGIT_DOLLAR = /(?<arg_number>\d+)\$/.freeze
12
+ INTERPOLATION = /\#\{.*?\}/.freeze
9
13
  FLAG = /[ #0+-]|#{DIGIT_DOLLAR}/.freeze
10
14
  NUMBER_ARG = /\*#{DIGIT_DOLLAR}?/.freeze
11
- NUMBER = /\d+|#{NUMBER_ARG}/.freeze
15
+ NUMBER = /\d+|#{NUMBER_ARG}|#{INTERPOLATION}/.freeze
12
16
  WIDTH = /(?<width>#{NUMBER})/.freeze
13
- PRECISION = /\.(?<precision>#{NUMBER})/.freeze
17
+ PRECISION = /\.(?<precision>#{NUMBER}?)/.freeze
14
18
  TYPE = /(?<type>[bBdiouxXeEfgGaAcps])/.freeze
15
19
  NAME = /<(?<name>\w+)>/.freeze
16
- TEMPLATE_NAME = /\{(?<name>\w+)\}/.freeze
20
+ TEMPLATE_NAME = /(?<!\#)\{(?<name>\w+)\}/.freeze
17
21
 
18
22
  SEQUENCE = /
19
23
  % (?<type>%)
@@ -41,7 +45,7 @@ module RuboCop
41
45
  #
42
46
  # @see https://ruby-doc.org/core-2.6.3/Kernel.html#method-i-format
43
47
  class FormatSequence
44
- attr_reader :begin_pos, :end_pos, :flags, :width, :precision, :name, :type
48
+ attr_reader :begin_pos, :end_pos, :flags, :width, :precision, :name, :type, :arg_number
45
49
 
46
50
  def initialize(match)
47
51
  @source = match[0]
@@ -52,6 +56,7 @@ module RuboCop
52
56
  @precision = match[:precision]
53
57
  @name = match[:name]
54
58
  @type = match[:type]
59
+ @arg_number = match[:arg_number]
55
60
  end
56
61
 
57
62
  def percent?
@@ -110,8 +110,13 @@ module RuboCop
110
110
  end
111
111
 
112
112
  def multiple_assignment_node
113
- return nil unless node.parent&.mlhs_type?
114
- return nil unless (grandparent_node = node.parent&.parent)
113
+ return nil unless (candidate_mlhs_node = node.parent)
114
+
115
+ # In `(foo, bar), *baz`, the splat node must be traversed as well.
116
+ candidate_mlhs_node = candidate_mlhs_node.parent if candidate_mlhs_node.splat_type?
117
+
118
+ return nil unless candidate_mlhs_node.mlhs_type?
119
+ return nil unless (grandparent_node = node.parent.parent)
115
120
  if (node = find_multiple_assignment_node(grandparent_node))
116
121
  return node
117
122
  end
@@ -139,7 +144,6 @@ module RuboCop
139
144
 
140
145
  def find_multiple_assignment_node(grandparent_node)
141
146
  return unless grandparent_node.type == MULTIPLE_LEFT_HAND_SIDE_TYPE
142
- return if grandparent_node.children.any?(&:splat_type?)
143
147
 
144
148
  parent = grandparent_node.parent
145
149
  return parent if parent.type == MULTIPLE_ASSIGNMENT_TYPE
@@ -46,7 +46,7 @@ module RuboCop
46
46
  else
47
47
  child_index = case node.type
48
48
  when :module, :sclass then 1
49
- when :def, :class, :block, :numblock then 2
49
+ when :def, :class, :block, :numblock, :itblock then 2
50
50
  when :defs then 3
51
51
  end
52
52
 
@@ -31,11 +31,18 @@ module RuboCop
31
31
  def assign(node)
32
32
  assignment = Assignment.new(node, self)
33
33
 
34
- @assignments.last&.reassigned! unless captured_by_block?
34
+ mark_last_as_reassigned!(assignment)
35
35
 
36
36
  @assignments << assignment
37
37
  end
38
38
 
39
+ def mark_last_as_reassigned!(assignment)
40
+ return if captured_by_block?
41
+ return unless assignment.branch == @assignments.last&.branch
42
+
43
+ @assignments.last&.reassigned!
44
+ end
45
+
39
46
  def referenced?
40
47
  !@references.empty?
41
48
  end
@@ -72,7 +79,7 @@ module RuboCop
72
79
  parent = parent.parent if parent&.begin_type?
73
80
  return false if parent.nil?
74
81
 
75
- (parent.if_type? || parent.while_type? || parent.until_type?) && parent.modifier_form?
82
+ parent.type?(:if, :while, :until) && parent.modifier_form?
76
83
  end
77
84
 
78
85
  def capture_with_block!
@@ -100,7 +107,7 @@ module RuboCop
100
107
  end
101
108
 
102
109
  def method_argument?
103
- argument? && %i[def defs].include?(@scope.node.type)
110
+ argument? && @scope.node.any_def_type?
104
111
  end
105
112
 
106
113
  def block_argument?
@@ -100,7 +100,7 @@ module RuboCop
100
100
 
101
101
  # Only block scope allows referencing outer scope variables.
102
102
  node = scope.node
103
- return nil unless node.block_type? || node.numblock_type?
103
+ return nil unless node.any_block_type?
104
104
  end
105
105
 
106
106
  nil
@@ -113,14 +113,14 @@ module RuboCop
113
113
  def accessible_variables
114
114
  scope_stack.reverse_each.with_object([]) do |scope, variables|
115
115
  variables.concat(scope.variables.values)
116
- break variables unless scope.node.block_type? || scope.node.numblock_type?
116
+ break variables unless scope.node.any_block_type?
117
117
  end
118
118
  end
119
119
 
120
120
  private
121
121
 
122
122
  def mark_variable_as_captured_by_block_if_so(variable)
123
- return unless current_scope.node.block_type? || current_scope.node.numblock_type?
123
+ return unless current_scope.node.any_block_type?
124
124
  return if variable.scope == current_scope
125
125
 
126
126
  variable.capture_with_block!
@@ -54,7 +54,7 @@ module RuboCop
54
54
 
55
55
  ZERO_ARITY_SUPER_TYPE = :zsuper
56
56
 
57
- TWISTED_SCOPE_TYPES = %i[block numblock class sclass defs module].freeze
57
+ TWISTED_SCOPE_TYPES = %i[block numblock itblock class sclass defs module].freeze
58
58
  SCOPE_TYPES = (TWISTED_SCOPE_TYPES + [:def]).freeze
59
59
 
60
60
  SEND_TYPE = :send