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
@@ -83,16 +83,18 @@ module RuboCop
83
83
  end
84
84
 
85
85
  alias on_numblock on_block
86
+ alias on_itblock on_block
86
87
 
87
88
  def on_send(node)
88
89
  return unless node.bare_access_modifier? && !node.block_literal?
90
+ return if same_line?(node, node.right_sibling)
89
91
  return if expected_empty_lines?(node)
90
92
 
91
93
  message = message(node)
92
94
  add_offense(node, message: message) do |corrector|
93
95
  line = range_by_whole_lines(node.source_range)
94
96
 
95
- corrector.insert_before(line, "\n") unless previous_line_empty?(node.first_line)
97
+ corrector.insert_before(line, "\n") if should_insert_line_before?(node)
96
98
 
97
99
  correct_next_line_if_denied_style(corrector, node, line)
98
100
  end
@@ -114,18 +116,20 @@ module RuboCop
114
116
  def allowed_only_before_style?(node)
115
117
  if node.special_modifier?
116
118
  return true if processed_source[node.last_line] == 'end'
117
- return false if next_line_empty?(node.last_line)
119
+ return false if next_line_empty_and_exists?(node.last_line)
118
120
  end
119
121
 
120
122
  previous_line_empty?(node.first_line)
121
123
  end
122
124
 
123
125
  def correct_next_line_if_denied_style(corrector, node, line)
126
+ return unless should_insert_line_after?(node)
127
+
124
128
  case style
125
129
  when :around
126
130
  corrector.insert_after(line, "\n") unless next_line_empty?(node.last_line)
127
131
  when :only_before
128
- if next_line_empty?(node.last_line)
132
+ if next_line_empty_and_exists?(node.last_line)
129
133
  range = next_empty_line_range(node)
130
134
 
131
135
  corrector.remove(range)
@@ -150,6 +154,10 @@ module RuboCop
150
154
  body_end?(last_send_line) || next_line.blank?
151
155
  end
152
156
 
157
+ def next_line_empty_and_exists?(last_send_line)
158
+ next_line_empty?(last_send_line) && last_send_line.next != processed_source.lines.size
159
+ end
160
+
153
161
  def empty_lines_around?(node)
154
162
  previous_line_empty?(node.first_line) && next_line_empty?(node.last_line)
155
163
  end
@@ -204,6 +212,29 @@ module RuboCop
204
212
  format(MSG_BEFORE_FOR_ONLY_BEFORE, modifier: modifier)
205
213
  end
206
214
  end
215
+
216
+ def should_insert_line_before?(node)
217
+ return false if previous_line_empty?(node.first_line)
218
+ return true unless inside_block?(node) && no_empty_lines_around_block_body?
219
+ return true unless node.parent.begin_type?
220
+
221
+ node.parent.children.first != node
222
+ end
223
+
224
+ def should_insert_line_after?(node)
225
+ return true unless inside_block?(node) && no_empty_lines_around_block_body?
226
+
227
+ node.parent.children.last != node
228
+ end
229
+
230
+ def inside_block?(node)
231
+ node.parent.block_type? || (node.parent.begin_type? && node.parent.parent&.block_type?)
232
+ end
233
+
234
+ def no_empty_lines_around_block_body?
235
+ config.for_enabled_cop('Layout/EmptyLinesAroundBlockBody')['EnforcedStyle'] ==
236
+ 'no_empty_lines'
237
+ end
207
238
  end
208
239
  end
209
240
  end
@@ -8,19 +8,18 @@ module RuboCop
8
8
  #
9
9
  # @example
10
10
  #
11
- # # good
12
- #
11
+ # # bad
13
12
  # begin
13
+ #
14
14
  # # ...
15
- # end
16
15
  #
17
- # # bad
16
+ # end
18
17
  #
18
+ # # good
19
19
  # begin
20
- #
21
20
  # # ...
22
- #
23
21
  # end
22
+ #
24
23
  class EmptyLinesAroundBeginBody < Base
25
24
  include EmptyLinesAroundBody
26
25
  extend AutoCorrector
@@ -34,6 +34,7 @@ module RuboCop
34
34
  end
35
35
 
36
36
  alias on_numblock on_block
37
+ alias on_itblock on_block
37
38
  end
38
39
  end
39
40
  end
@@ -6,7 +6,7 @@ module RuboCop
6
6
  # Checks if empty lines exist around the bodies of `begin`
7
7
  # sections. This cop doesn't check empty lines at `begin` body
8
8
  # beginning/end and around method definition body.
9
- # `Style/EmptyLinesAroundBeginBody` or `Style/EmptyLinesAroundMethodBody`
9
+ # `Layout/EmptyLinesAroundBeginBody` or `Layout/EmptyLinesAroundMethodBody`
10
10
  # can be used for this purpose.
11
11
  #
12
12
  # @example
@@ -27,9 +27,14 @@ module RuboCop
27
27
  KIND = 'method'
28
28
 
29
29
  def on_def(node)
30
- first_line = node.arguments.source_range&.last_line
30
+ if node.endless?
31
+ return unless offending_endless_method?(node)
31
32
 
32
- check(node, node.body, adjusted_first_line: first_line)
33
+ register_offense_for_endless_method(node)
34
+ else
35
+ first_line = node.arguments.source_range&.last_line
36
+ check(node, node.body, adjusted_first_line: first_line)
37
+ end
33
38
  end
34
39
  alias on_defs on_def
35
40
 
@@ -38,6 +43,21 @@ module RuboCop
38
43
  def style
39
44
  :no_empty_lines
40
45
  end
46
+
47
+ def offending_endless_method?(node)
48
+ node.body.first_line > node.loc.assignment.line + 1 &&
49
+ processed_source.lines[node.loc.assignment.line].empty?
50
+ end
51
+
52
+ def register_offense_for_endless_method(node)
53
+ range = processed_source.buffer.line_range(node.loc.assignment.line + 1).resize(1)
54
+
55
+ msg = message(MSG_EXTRA, 'beginning')
56
+
57
+ add_offense(range, message: msg) do |corrector|
58
+ corrector.remove(range)
59
+ end
60
+ end
41
61
  end
42
62
  end
43
63
  end
@@ -182,7 +182,7 @@ module RuboCop
182
182
  end
183
183
 
184
184
  def alignment_node_for_variable_style(node)
185
- if (node.case_type? || node.case_match_type?) && node.argument? &&
185
+ if node.type?(:case, :case_match) && node.argument? &&
186
186
  same_line?(node, node.parent)
187
187
  return node.parent
188
188
  end
@@ -70,7 +70,7 @@ module RuboCop
70
70
  end
71
71
 
72
72
  def check_assignment(token)
73
- return unless aligned_with_preceding_assignment(token) == :no
73
+ return unless aligned_with_preceding_equals_operator(token) == :no
74
74
 
75
75
  message = format(MSG_UNALIGNED_ASGN, location: 'preceding')
76
76
  add_offense(token.pos, message: message) do |corrector|
@@ -155,7 +155,7 @@ module RuboCop
155
155
  def on_send(node)
156
156
  return unless should_check?(node)
157
157
  return if same_line?(node, node.first_argument)
158
- return if style != :consistent && enforce_first_argument_with_fixed_indentation? &&
158
+ return if enforce_first_argument_with_fixed_indentation? &&
159
159
  !enable_layout_first_method_argument_line_break?
160
160
 
161
161
  indent = base_indentation(node) + configured_indentation_width
@@ -225,7 +225,7 @@ module RuboCop
225
225
 
226
226
  def base_range(send_node, arg_node)
227
227
  parent = send_node.parent
228
- start_node = if parent && (parent.splat_type? || parent.kwsplat_type?)
228
+ start_node = if parent&.type?(:splat, :kwsplat)
229
229
  send_node.parent
230
230
  else
231
231
  send_node
@@ -269,17 +269,12 @@ module RuboCop
269
269
  end
270
270
 
271
271
  def enforce_first_argument_with_fixed_indentation?
272
- return false unless argument_alignment_config['Enabled']
273
-
272
+ argument_alignment_config = config.for_enabled_cop('Layout/ArgumentAlignment')
274
273
  argument_alignment_config['EnforcedStyle'] == 'with_fixed_indentation'
275
274
  end
276
275
 
277
276
  def enable_layout_first_method_argument_line_break?
278
- config.for_cop('Layout/FirstMethodArgumentLineBreak')['Enabled']
279
- end
280
-
281
- def argument_alignment_config
282
- config.for_cop('Layout/ArgumentAlignment')
277
+ config.cop_enabled?('Layout/FirstMethodArgumentLineBreak')
283
278
  end
284
279
  end
285
280
  end
@@ -180,13 +180,8 @@ module RuboCop
180
180
  end
181
181
 
182
182
  def enforce_first_argument_with_fixed_indentation?
183
- return false unless array_alignment_config['Enabled']
184
-
185
- array_alignment_config['EnforcedStyle'] == 'with_fixed_indentation'
186
- end
187
-
188
- def array_alignment_config
189
- config.for_cop('Layout/ArrayAlignment')
183
+ argument_alignment_config = config.for_enabled_cop('Layout/ArrayAlignment')
184
+ argument_alignment_config['EnforcedStyle'] == 'with_fixed_indentation'
190
185
  end
191
186
  end
192
187
  end
@@ -7,7 +7,7 @@ module RuboCop
7
7
  # where the opening brace and the first key are on separate lines. The
8
8
  # other keys' indentations are handled by the HashAlignment cop.
9
9
  #
10
- # By default, Hash literals that are arguments in a method call with
10
+ # By default, `Hash` literals that are arguments in a method call with
11
11
  # parentheses, and where the opening curly brace of the hash is on the
12
12
  # same line as the opening parenthesis of the method call, shall have
13
13
  # their first key indented one step (two spaces) more than the position
@@ -225,14 +225,9 @@ module RuboCop
225
225
  end
226
226
 
227
227
  def enforce_first_argument_with_fixed_indentation?
228
- return false unless argument_alignment_config['Enabled']
229
-
228
+ argument_alignment_config = config.for_enabled_cop('Layout/ArgumentAlignment')
230
229
  argument_alignment_config['EnforcedStyle'] == 'with_fixed_indentation'
231
230
  end
232
-
233
- def argument_alignment_config
234
- config.for_cop('Layout/ArgumentAlignment')
235
- end
236
231
  end
237
232
  end
238
233
  end
@@ -51,7 +51,7 @@ module RuboCop
51
51
 
52
52
  def on_hash(node)
53
53
  # node.loc.begin tells us whether the hash opens with a {
54
- # If it doesn't, Style/FirstMethodArgumentLineBreak will handle it
54
+ # If it doesn't, Layout/FirstMethodArgumentLineBreak will handle it
55
55
  return unless node.loc.begin
56
56
 
57
57
  check_children_line_break(node, node.children, ignore_last: ignore_last_element?)
@@ -5,10 +5,10 @@ module RuboCop
5
5
  module Layout
6
6
  # Checks the indentation of the first parameter in a method
7
7
  # definition. Parameters after the first one are checked by
8
- # Layout/ParameterAlignment, not by this cop.
8
+ # `Layout/ParameterAlignment`, not by this cop.
9
9
  #
10
10
  # For indenting the first argument of method _calls_, check out
11
- # Layout/FirstArgumentIndentation, which supports options related to
11
+ # `Layout/FirstArgumentIndentation`, which supports options related to
12
12
  # nesting that are irrelevant for method _definitions_.
13
13
  #
14
14
  # @example
@@ -19,7 +19,7 @@ module RuboCop
19
19
  # * ignore_implicit (without curly braces)
20
20
  #
21
21
  # Alternatively you can specify multiple allowed styles. That's done by
22
- # passing a list of styles to EnforcedStyles.
22
+ # passing a list of styles to EnforcedHashRocketStyle and EnforcedColonStyle.
23
23
  #
24
24
  # @example EnforcedHashRocketStyle: key (default)
25
25
  # # bad
@@ -202,6 +202,7 @@ module RuboCop
202
202
 
203
203
  ignore_node(last_argument)
204
204
  end
205
+ alias on_csend on_send
205
206
  alias on_super on_send
206
207
  alias on_yield on_send
207
208
 
@@ -227,6 +228,7 @@ module RuboCop
227
228
  left_sibling = argument_before_hash(node)
228
229
  parent_loc = node.parent.loc
229
230
  selector = left_sibling || parent_loc.selector || parent_loc.expression
231
+
230
232
  same_line?(selector, node.pairs.first)
231
233
  end
232
234
 
@@ -248,7 +250,7 @@ module RuboCop
248
250
  reset!
249
251
 
250
252
  alignment_for(first_pair).each do |alignment|
251
- delta = alignment.deltas_for_first_pair(first_pair, node)
253
+ delta = alignment.deltas_for_first_pair(first_pair)
252
254
  check_delta delta, node: first_pair, alignment: alignment
253
255
  end
254
256
 
@@ -382,13 +384,13 @@ module RuboCop
382
384
  end
383
385
 
384
386
  def enforce_first_argument_with_fixed_indentation?
385
- return false unless argument_alignment_config['Enabled']
386
-
387
+ argument_alignment_config = config.for_enabled_cop('Layout/ArgumentAlignment')
387
388
  argument_alignment_config['EnforcedStyle'] == 'with_fixed_indentation'
388
389
  end
389
390
 
390
- def argument_alignment_config
391
- config.for_cop('Layout/ArgumentAlignment')
391
+ def same_line?(node1, node2)
392
+ # Override `Util#same_line?`
393
+ super || node1.last_line == line(node2)
392
394
  end
393
395
  end
394
396
  end
@@ -75,6 +75,7 @@ module RuboCop
75
75
  autocorrect(corrector, outermost_send)
76
76
  end
77
77
  end
78
+ alias on_csend on_send
78
79
 
79
80
  private
80
81
 
@@ -161,7 +162,7 @@ module RuboCop
161
162
 
162
163
  def end_keyword_before_closing_parenthesis?(parenthesized_send_node)
163
164
  parenthesized_send_node.ancestors.any? do |ancestor|
164
- ancestor.loc.respond_to?(:end) && ancestor.loc.end&.source == 'end'
165
+ ancestor.loc_is?(:end, 'end')
165
166
  end
166
167
  end
167
168
 
@@ -91,6 +91,7 @@ module RuboCop
91
91
  end
92
92
 
93
93
  alias on_numblock on_block
94
+ alias on_itblock on_block
94
95
 
95
96
  def on_class(node)
96
97
  base = node.loc.keyword
@@ -58,6 +58,12 @@ module RuboCop
58
58
  # attr_reader :name #: String
59
59
  # attr_reader :age #: Integer?
60
60
  #
61
+ # #: (
62
+ # #| Integer,
63
+ # #| String
64
+ # #| ) -> void
65
+ # def foo; end
66
+ #
61
67
  # @example AllowRBSInlineAnnotation: true
62
68
  #
63
69
  # # good
@@ -67,6 +73,12 @@ module RuboCop
67
73
  # attr_reader :name #: String
68
74
  # attr_reader :age #: Integer?
69
75
  #
76
+ # #: (
77
+ # #| Integer,
78
+ # #| String
79
+ # #| ) -> void
80
+ # def foo; end
81
+ #
70
82
  # @example AllowSteepAnnotation: false (default)
71
83
  #
72
84
  # # bad
@@ -175,7 +187,7 @@ module RuboCop
175
187
  end
176
188
 
177
189
  def rbs_inline_annotation?(comment)
178
- allow_rbs_inline_annotation? && comment.text.start_with?(/#:|#\[.+\]/)
190
+ allow_rbs_inline_annotation? && comment.text.start_with?(/#:|#\[.+\]|#\|/)
179
191
  end
180
192
 
181
193
  def allow_steep_annotation?
@@ -51,6 +51,15 @@ module RuboCop
51
51
  private_constant :LINE_1_ENDING, :LINE_2_BEGINNING,
52
52
  :LEADING_STYLE_OFFENSE, :TRAILING_STYLE_OFFENSE
53
53
 
54
+ # When both cops are activated and run in the same iteration of the correction loop,
55
+ # `Style/StringLiterals` undoes the moving of spaces that
56
+ # `Layout/LineContinuationLeadingSpace` performs. This is because `Style/StringLiterals`
57
+ # takes the original string content and transforms it, rather than just modifying the
58
+ # delimiters, in order to handle escaping for quotes within the string.
59
+ def self.autocorrect_incompatible_with
60
+ [Style::StringLiterals]
61
+ end
62
+
54
63
  def on_dstr(node)
55
64
  # Quick check if we possibly have line continuations.
56
65
  return unless node.source.include?('\\')
@@ -129,9 +138,9 @@ module RuboCop
129
138
 
130
139
  def message(_range)
131
140
  if enforced_style_leading?
132
- 'Move trailing spaces to the start of next line.'
141
+ 'Move trailing spaces to the start of the next line.'
133
142
  else
134
- 'Move leading spaces to the end of previous line.'
143
+ 'Move leading spaces to the end of the previous line.'
135
144
  end
136
145
  end
137
146
 
@@ -101,7 +101,7 @@ module RuboCop
101
101
  ranges << loc.expression
102
102
  elsif literal.heredoc?
103
103
  ranges << loc.heredoc_body
104
- elsif loc.respond_to?(:begin) && loc.begin
104
+ elsif (loc.respond_to?(:begin) && loc.begin) || ignored_parent?(literal)
105
105
  ranges << loc.expression
106
106
  end
107
107
  end
@@ -127,6 +127,12 @@ module RuboCop
127
127
  comment_ranges(processed_source.comments)
128
128
  end
129
129
 
130
+ def ignored_parent?(node)
131
+ return false unless node.parent
132
+
133
+ node.parent.type?(:regexp, :xstr)
134
+ end
135
+
130
136
  def no_space_style?
131
137
  cop_config['EnforcedStyle'] == 'no_space'
132
138
  end
@@ -102,7 +102,7 @@ module RuboCop
102
102
 
103
103
  def strings_concatenated_with_backslash?(dstr_node)
104
104
  dstr_node.multiline? &&
105
- dstr_node.children.all? { |c| c.str_type? || c.dstr_type? } &&
105
+ dstr_node.children.all? { |c| c.type?(:str, :dstr) } &&
106
106
  dstr_node.children.none?(&:multiline?)
107
107
  end
108
108
 
@@ -127,7 +127,7 @@ module RuboCop
127
127
 
128
128
  def base_column(child)
129
129
  grandparent = child.parent.parent
130
- if grandparent&.type == :pair
130
+ if grandparent&.pair_type?
131
131
  grandparent.loc.column
132
132
  else
133
133
  child.source_range.source_line =~ /\S/
@@ -75,6 +75,7 @@ module RuboCop
75
75
  check_for_breakable_block(node)
76
76
  end
77
77
  alias on_numblock on_block
78
+ alias on_itblock on_block
78
79
 
79
80
  def on_str(node)
80
81
  check_for_breakable_str(node)
@@ -90,7 +91,9 @@ module RuboCop
90
91
  alias on_array on_potential_breakable_node
91
92
  alias on_hash on_potential_breakable_node
92
93
  alias on_send on_potential_breakable_node
94
+ alias on_csend on_potential_breakable_node
93
95
  alias on_def on_potential_breakable_node
96
+ alias on_defs on_potential_breakable_node
94
97
 
95
98
  def on_new_investigation
96
99
  return unless processed_source.raw_source.include?(';')
@@ -208,7 +211,7 @@ module RuboCop
208
211
  # are not bisected.
209
212
  # If the string contains spaces, use them to determine a place for a clean break;
210
213
  # otherwise, the string will be broken at the line length limit.
211
- def breakable_string_range(node) # rubocop:disable Metrics/AbcSize
214
+ def breakable_string_range(node)
212
215
  source_range = node.source_range
213
216
  relevant_substr = largest_possible_string(node)
214
217
 
@@ -220,13 +223,13 @@ module RuboCop
220
223
  adjustment = max - source_range.last_column - 3
221
224
  return if adjustment.abs > source_range.size
222
225
 
223
- source_range.adjust(end_pos: max - source_range.last_column - 3)
226
+ source_range.adjust(end_pos: adjustment)
224
227
  end
225
228
  end
226
229
 
227
230
  def breakable_dstr_begin_position(node)
228
231
  source_range = node.source_range
229
- source_range.begin_pos if source_range.begin_pos < max && source_range.end_pos >= max
232
+ source_range.begin_pos if source_range.column < max && source_range.last_column >= max
230
233
  end
231
234
 
232
235
  def breakable_range_by_line_index
@@ -369,7 +372,9 @@ module RuboCop
369
372
 
370
373
  def string_delimiter(node)
371
374
  delimiter = node.loc.begin
372
- delimiter ||= node.parent.loc.begin if node.parent&.dstr_type?
375
+ if node.parent&.dstr_type? && node.parent.loc.respond_to?(:begin)
376
+ delimiter ||= node.parent.loc.begin
377
+ end
373
378
  delimiter = delimiter&.source
374
379
 
375
380
  delimiter if %w[' "].include?(delimiter)
@@ -69,6 +69,7 @@ module RuboCop
69
69
  end
70
70
 
71
71
  alias on_numblock on_block
72
+ alias on_itblock on_block
72
73
 
73
74
  private
74
75
 
@@ -52,7 +52,7 @@ module RuboCop
52
52
  def on_hash(node)
53
53
  # This cop only deals with hashes wrapped by a set of curly
54
54
  # braces like {foo: 1}. That is, not a kwargs hashes.
55
- # Style/MultilineMethodArgumentLineBreaks handles those.
55
+ # Layout/MultilineMethodArgumentLineBreaks handles those.
56
56
  return unless starts_with_curly_brace?(node)
57
57
  return unless node.loc.begin
58
58
 
@@ -33,6 +33,18 @@ module RuboCop
33
33
  #
34
34
  # @example AllowMultilineFinalElement: false (default)
35
35
  #
36
+ # # bad
37
+ # foo(a, b,
38
+ # c
39
+ # )
40
+ #
41
+ # # bad
42
+ # foo(
43
+ # a, b, {
44
+ # foo: "bar",
45
+ # }
46
+ # )
47
+ #
36
48
  # # good
37
49
  # foo(
38
50
  # a,
@@ -44,6 +56,18 @@ module RuboCop
44
56
  #
45
57
  # @example AllowMultilineFinalElement: true
46
58
  #
59
+ # # bad
60
+ # foo(a, b,
61
+ # c
62
+ # )
63
+ #
64
+ # # good
65
+ # foo(
66
+ # a, b, {
67
+ # foo: "bar",
68
+ # }
69
+ # )
70
+ #
47
71
  # # good
48
72
  # foo(
49
73
  # a,
@@ -75,6 +99,7 @@ module RuboCop
75
99
 
76
100
  check_line_breaks(node, args, ignore_last: ignore_last_element?)
77
101
  end
102
+ alias on_csend on_send
78
103
 
79
104
  private
80
105
 
@@ -109,6 +109,7 @@ module RuboCop
109
109
  def on_send(node)
110
110
  check_brace_layout(node)
111
111
  end
112
+ alias on_csend on_send
112
113
 
113
114
  private
114
115
 
@@ -100,7 +100,7 @@ module RuboCop
100
100
 
101
101
  def extra_indentation(given_style, parent)
102
102
  if given_style == :indented_relative_to_receiver
103
- if parent && (parent.splat_type? || parent.kwsplat_type?)
103
+ if parent&.type?(:splat, :kwsplat)
104
104
  configured_indentation_width - parent.loc.operator.length
105
105
  else
106
106
  configured_indentation_width
@@ -216,7 +216,7 @@ module RuboCop
216
216
 
217
217
  def get_dot_right_above(node)
218
218
  node.each_ancestor.find do |a|
219
- dot = a.loc.respond_to?(:dot) && a.loc.dot
219
+ dot = a.loc.dot if a.loc?(:dot)
220
220
  next unless dot
221
221
 
222
222
  dot.line == node.loc.dot.line - 1 && dot.column == node.loc.dot.column
@@ -224,7 +224,7 @@ module RuboCop
224
224
  end
225
225
 
226
226
  def find_multiline_block_chain_node(node)
227
- return unless (block_node = node.each_descendant(:block, :numblock).first)
227
+ return unless (block_node = node.each_descendant(:any_block).first)
228
228
  return unless block_node.multiline? && block_node.parent.call_type?
229
229
 
230
230
  if node.receiver.call_type?
@@ -239,7 +239,7 @@ module RuboCop
239
239
  node = node.receiver while node.receiver
240
240
  # ascend to first call which has a dot
241
241
  node = node.parent
242
- node = node.parent until node.loc.respond_to?(:dot) && node.loc.dot
242
+ node = node.parent until node.loc?(:dot)
243
243
 
244
244
  node
245
245
  end
@@ -65,6 +65,7 @@ module RuboCop
65
65
 
66
66
  check_line_breaks(node, node.arguments, ignore_last: ignore_last_element?)
67
67
  end
68
+ alias on_defs on_def
68
69
 
69
70
  private
70
71
 
@@ -118,7 +118,7 @@ module RuboCop
118
118
  end
119
119
 
120
120
  def right_hand_side(send_node)
121
- send_node.first_argument.source_range
121
+ send_node.first_argument&.source_range
122
122
  end
123
123
  end
124
124
  end