rubocop 1.69.2 → 1.74.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (312) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +4 -4
  4. data/config/default.yml +122 -17
  5. data/config/internal_affairs.yml +20 -0
  6. data/lib/rubocop/cli/command/execute_runner.rb +3 -3
  7. data/lib/rubocop/cli/command/show_cops.rb +24 -2
  8. data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
  9. data/lib/rubocop/comment_config.rb +2 -2
  10. data/lib/rubocop/config.rb +17 -4
  11. data/lib/rubocop/config_loader.rb +48 -9
  12. data/lib/rubocop/config_loader_resolver.rb +36 -10
  13. data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -3
  14. data/lib/rubocop/config_obsoletion.rb +1 -1
  15. data/lib/rubocop/config_validator.rb +19 -9
  16. data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
  17. data/lib/rubocop/cop/base.rb +6 -0
  18. data/lib/rubocop/cop/bundler/duplicated_gem.rb +1 -1
  19. data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
  20. data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
  21. data/lib/rubocop/cop/internal_affairs/example_description.rb +7 -3
  22. data/lib/rubocop/cop/internal_affairs/location_exists.rb +116 -0
  23. data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
  24. data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +3 -2
  25. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -1
  26. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
  27. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
  28. data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +229 -0
  29. data/lib/rubocop/cop/internal_affairs/node_type_group.rb +91 -0
  30. data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
  31. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
  32. data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
  33. data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
  34. data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +3 -1
  35. data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
  36. data/lib/rubocop/cop/internal_affairs/undefined_config.rb +7 -1
  37. data/lib/rubocop/cop/internal_affairs.rb +6 -16
  38. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -1
  39. data/lib/rubocop/cop/layout/argument_alignment.rb +2 -8
  40. data/lib/rubocop/cop/layout/block_alignment.rb +3 -1
  41. data/lib/rubocop/cop/layout/class_structure.rb +9 -9
  42. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +4 -4
  43. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  44. data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
  45. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +1 -1
  46. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +7 -11
  47. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +27 -1
  48. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +1 -1
  49. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +22 -2
  50. data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
  51. data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
  52. data/lib/rubocop/cop/layout/first_argument_indentation.rb +3 -8
  53. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +2 -7
  54. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
  55. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
  56. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
  57. data/lib/rubocop/cop/layout/hash_alignment.rb +6 -4
  58. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -1
  59. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +7 -1
  60. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
  61. data/lib/rubocop/cop/layout/line_length.rb +4 -3
  62. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
  63. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
  64. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +1 -0
  65. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
  66. data/lib/rubocop/cop/layout/redundant_line_break.rb +7 -6
  67. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +1 -1
  68. data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -1
  69. data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
  70. data/lib/rubocop/cop/layout/space_after_comma.rb +1 -1
  71. data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
  72. data/lib/rubocop/cop/layout/space_after_semicolon.rb +1 -1
  73. data/lib/rubocop/cop/layout/space_around_keyword.rb +1 -0
  74. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
  75. data/lib/rubocop/cop/layout/space_around_operators.rb +3 -3
  76. data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
  77. data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
  78. data/lib/rubocop/cop/layout/trailing_whitespace.rb +5 -3
  79. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
  80. data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +119 -0
  81. data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
  82. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +1 -1
  83. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
  84. data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
  85. data/lib/rubocop/cop/lint/cop_directive_syntax.rb +84 -0
  86. data/lib/rubocop/cop/lint/debugger.rb +1 -1
  87. data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
  88. data/lib/rubocop/cop/lint/duplicate_methods.rb +0 -14
  89. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -1
  90. data/lib/rubocop/cop/lint/duplicate_set_element.rb +20 -7
  91. data/lib/rubocop/cop/lint/empty_conditional_body.rb +14 -64
  92. data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
  93. data/lib/rubocop/cop/lint/erb_new_arguments.rb +0 -6
  94. data/lib/rubocop/cop/lint/float_comparison.rb +6 -8
  95. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  96. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
  97. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  98. data/lib/rubocop/cop/lint/literal_as_condition.rb +103 -9
  99. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +24 -6
  100. data/lib/rubocop/cop/lint/missing_super.rb +2 -2
  101. data/lib/rubocop/cop/lint/mixed_case_range.rb +3 -3
  102. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  103. data/lib/rubocop/cop/lint/nested_method_definition.rb +8 -4
  104. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  105. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +4 -3
  106. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
  107. data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +18 -31
  108. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +2 -1
  109. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -5
  110. data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
  111. data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -21
  112. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
  113. data/lib/rubocop/cop/lint/redundant_type_conversion.rb +258 -0
  114. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  115. data/lib/rubocop/cop/lint/return_in_void_context.rb +4 -11
  116. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +8 -1
  117. data/lib/rubocop/cop/lint/shared_mutable_default.rb +76 -0
  118. data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
  119. data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
  120. data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
  121. data/lib/rubocop/cop/lint/syntax.rb +4 -1
  122. data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +1 -4
  123. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +1 -1
  124. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -1
  125. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  126. data/lib/rubocop/cop/lint/unreachable_loop.rb +1 -1
  127. data/lib/rubocop/cop/lint/useless_access_modifier.rb +4 -4
  128. data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
  129. data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
  130. data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
  131. data/lib/rubocop/cop/lint/useless_numeric_operation.rb +2 -1
  132. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +2 -2
  133. data/lib/rubocop/cop/lint/void.rb +11 -9
  134. data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
  135. data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
  136. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -1
  137. data/lib/rubocop/cop/metrics/method_length.rb +8 -1
  138. data/lib/rubocop/cop/metrics/module_length.rb +1 -1
  139. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
  140. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
  141. data/lib/rubocop/cop/mixin/alignment.rb +2 -2
  142. data/lib/rubocop/cop/mixin/allowed_pattern.rb +4 -4
  143. data/lib/rubocop/cop/mixin/check_line_breakable.rb +11 -11
  144. data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +1 -1
  145. data/lib/rubocop/cop/mixin/comments_help.rb +4 -2
  146. data/lib/rubocop/cop/mixin/dig_help.rb +1 -1
  147. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -1
  148. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +22 -22
  149. data/lib/rubocop/cop/mixin/hash_subset.rb +203 -0
  150. data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
  151. data/lib/rubocop/cop/mixin/method_complexity.rb +1 -1
  152. data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
  153. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +48 -24
  154. data/lib/rubocop/cop/mixin/range_help.rb +15 -3
  155. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
  156. data/lib/rubocop/cop/mixin/statement_modifier.rb +8 -3
  157. data/lib/rubocop/cop/mixin/string_help.rb +2 -2
  158. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  159. data/lib/rubocop/cop/mixin/target_ruby_version.rb +1 -1
  160. data/lib/rubocop/cop/mixin/trailing_comma.rb +15 -3
  161. data/lib/rubocop/cop/naming/block_forwarding.rb +19 -15
  162. data/lib/rubocop/cop/naming/predicate_name.rb +44 -0
  163. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +3 -3
  164. data/lib/rubocop/cop/naming/variable_name.rb +64 -6
  165. data/lib/rubocop/cop/security/compound_hash.rb +1 -0
  166. data/lib/rubocop/cop/style/access_modifier_declarations.rb +34 -5
  167. data/lib/rubocop/cop/style/accessor_grouping.rb +19 -5
  168. data/lib/rubocop/cop/style/and_or.rb +1 -1
  169. data/lib/rubocop/cop/style/arguments_forwarding.rb +39 -23
  170. data/lib/rubocop/cop/style/array_first_last.rb +18 -2
  171. data/lib/rubocop/cop/style/block_delimiters.rb +7 -20
  172. data/lib/rubocop/cop/style/class_and_module_children.rb +35 -10
  173. data/lib/rubocop/cop/style/collection_methods.rb +1 -1
  174. data/lib/rubocop/cop/style/combinable_defined.rb +1 -1
  175. data/lib/rubocop/cop/style/combinable_loops.rb +2 -2
  176. data/lib/rubocop/cop/style/commented_keyword.rb +10 -3
  177. data/lib/rubocop/cop/style/comparable_between.rb +75 -0
  178. data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
  179. data/lib/rubocop/cop/style/conditional_assignment.rb +6 -4
  180. data/lib/rubocop/cop/style/documentation.rb +1 -1
  181. data/lib/rubocop/cop/style/double_negation.rb +4 -4
  182. data/lib/rubocop/cop/style/each_for_simple_loop.rb +4 -7
  183. data/lib/rubocop/cop/style/each_with_object.rb +2 -3
  184. data/lib/rubocop/cop/style/empty_else.rb +4 -2
  185. data/lib/rubocop/cop/style/empty_literal.rb +1 -1
  186. data/lib/rubocop/cop/style/empty_method.rb +1 -1
  187. data/lib/rubocop/cop/style/endless_method.rb +163 -18
  188. data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
  189. data/lib/rubocop/cop/style/exact_regexp_match.rb +3 -10
  190. data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
  191. data/lib/rubocop/cop/style/explicit_block_argument.rb +15 -2
  192. data/lib/rubocop/cop/style/exponential_notation.rb +3 -3
  193. data/lib/rubocop/cop/style/fetch_env_var.rb +1 -1
  194. data/lib/rubocop/cop/style/float_division.rb +8 -4
  195. data/lib/rubocop/cop/style/format_string_token.rb +38 -11
  196. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
  197. data/lib/rubocop/cop/style/hash_each_methods.rb +3 -6
  198. data/lib/rubocop/cop/style/hash_except.rb +24 -148
  199. data/lib/rubocop/cop/style/hash_slice.rb +80 -0
  200. data/lib/rubocop/cop/style/hash_syntax.rb +6 -3
  201. data/lib/rubocop/cop/style/identical_conditional_branches.rb +22 -3
  202. data/lib/rubocop/cop/style/if_unless_modifier.rb +5 -5
  203. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +1 -1
  204. data/lib/rubocop/cop/style/if_with_semicolon.rb +2 -2
  205. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  206. data/lib/rubocop/cop/style/inverse_methods.rb +14 -11
  207. data/lib/rubocop/cop/style/it_assignment.rb +36 -0
  208. data/lib/rubocop/cop/style/keyword_parameters_order.rb +14 -8
  209. data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
  210. data/lib/rubocop/cop/style/map_into_array.rb +1 -1
  211. data/lib/rubocop/cop/style/map_to_hash.rb +1 -1
  212. data/lib/rubocop/cop/style/map_to_set.rb +3 -2
  213. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +22 -15
  214. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -0
  215. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +2 -1
  216. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -4
  217. data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
  218. data/lib/rubocop/cop/style/missing_else.rb +2 -0
  219. data/lib/rubocop/cop/style/multiline_block_chain.rb +2 -2
  220. data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -9
  221. data/lib/rubocop/cop/style/multiple_comparison.rb +26 -20
  222. data/lib/rubocop/cop/style/mutable_constant.rb +3 -3
  223. data/lib/rubocop/cop/style/negated_if_else_condition.rb +1 -1
  224. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +1 -1
  225. data/lib/rubocop/cop/style/object_then.rb +13 -15
  226. data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
  227. data/lib/rubocop/cop/style/parallel_assignment.rb +1 -5
  228. data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
  229. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  230. data/lib/rubocop/cop/style/proc.rb +1 -2
  231. data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
  232. data/lib/rubocop/cop/style/raise_args.rb +6 -4
  233. data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
  234. data/lib/rubocop/cop/style/redundant_begin.rb +1 -1
  235. data/lib/rubocop/cop/style/redundant_condition.rb +47 -2
  236. data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +16 -5
  237. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +6 -10
  238. data/lib/rubocop/cop/style/redundant_each.rb +1 -1
  239. data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
  240. data/lib/rubocop/cop/style/redundant_format.rb +250 -0
  241. data/lib/rubocop/cop/style/redundant_freeze.rb +3 -3
  242. data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
  243. data/lib/rubocop/cop/style/redundant_line_continuation.rb +34 -13
  244. data/lib/rubocop/cop/style/redundant_parentheses.rb +28 -14
  245. data/lib/rubocop/cop/style/redundant_regexp_argument.rb +3 -0
  246. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
  247. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -1
  248. data/lib/rubocop/cop/style/redundant_self_assignment.rb +14 -28
  249. data/lib/rubocop/cop/style/redundant_sort.rb +2 -2
  250. data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -2
  251. data/lib/rubocop/cop/style/rescue_modifier.rb +3 -0
  252. data/lib/rubocop/cop/style/return_nil.rb +1 -1
  253. data/lib/rubocop/cop/style/safe_navigation.rb +2 -2
  254. data/lib/rubocop/cop/style/semicolon.rb +1 -1
  255. data/lib/rubocop/cop/style/send_with_literal_method_name.rb +2 -1
  256. data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
  257. data/lib/rubocop/cop/style/single_line_do_end_block.rb +1 -2
  258. data/lib/rubocop/cop/style/single_line_methods.rb +6 -7
  259. data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
  260. data/lib/rubocop/cop/style/sole_nested_conditional.rb +2 -8
  261. data/lib/rubocop/cop/style/string_concatenation.rb +2 -2
  262. data/lib/rubocop/cop/style/string_literals.rb +1 -1
  263. data/lib/rubocop/cop/style/string_methods.rb +1 -1
  264. data/lib/rubocop/cop/style/super_arguments.rb +65 -17
  265. data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
  266. data/lib/rubocop/cop/style/top_level_method_definition.rb +1 -1
  267. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +4 -1
  268. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
  269. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
  270. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  271. data/lib/rubocop/cop/style/while_until_modifier.rb +0 -1
  272. data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
  273. data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
  274. data/lib/rubocop/cop/util.rb +12 -5
  275. data/lib/rubocop/cop/utils/format_string.rb +10 -5
  276. data/lib/rubocop/cop/variable_force/variable.rb +14 -2
  277. data/lib/rubocop/cop/variable_force/variable_table.rb +3 -3
  278. data/lib/rubocop/cops_documentation_generator.rb +25 -14
  279. data/lib/rubocop/directive_comment.rb +45 -11
  280. data/lib/rubocop/ext/regexp_node.rb +0 -1
  281. data/lib/rubocop/formatter/formatter_set.rb +1 -1
  282. data/lib/rubocop/lsp/diagnostic.rb +189 -0
  283. data/lib/rubocop/lsp/logger.rb +2 -2
  284. data/lib/rubocop/lsp/routes.rb +7 -23
  285. data/lib/rubocop/lsp/runtime.rb +17 -49
  286. data/lib/rubocop/lsp/server.rb +0 -2
  287. data/lib/rubocop/lsp/stdin_runner.rb +83 -0
  288. data/lib/rubocop/options.rb +28 -12
  289. data/lib/rubocop/path_util.rb +15 -8
  290. data/lib/rubocop/plugin/configuration_integrator.rb +143 -0
  291. data/lib/rubocop/plugin/load_error.rb +26 -0
  292. data/lib/rubocop/plugin/loader.rb +100 -0
  293. data/lib/rubocop/plugin/not_supported_error.rb +29 -0
  294. data/lib/rubocop/plugin.rb +46 -0
  295. data/lib/rubocop/rake_task.rb +4 -1
  296. data/lib/rubocop/result_cache.rb +13 -13
  297. data/lib/rubocop/rspec/cop_helper.rb +9 -0
  298. data/lib/rubocop/rspec/expect_offense.rb +6 -2
  299. data/lib/rubocop/rspec/shared_contexts.rb +19 -1
  300. data/lib/rubocop/rspec/support.rb +2 -2
  301. data/lib/rubocop/runner.rb +5 -6
  302. data/lib/rubocop/server/cache.rb +35 -2
  303. data/lib/rubocop/server/cli.rb +2 -2
  304. data/lib/rubocop/target_finder.rb +1 -0
  305. data/lib/rubocop/target_ruby.rb +15 -0
  306. data/lib/rubocop/version.rb +17 -2
  307. data/lib/rubocop.rb +12 -1
  308. data/lib/ruby_lsp/rubocop/addon.rb +75 -0
  309. data/lib/ruby_lsp/rubocop/runtime_adapter.rb +47 -0
  310. metadata +55 -16
  311. data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
  312. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'lint_roller'
4
+
5
+ module RuboCop
6
+ module InternalAffairs
7
+ # A Plugin for `InternalAffairs` department, which has internal cops.
8
+ class Plugin < LintRoller::Plugin
9
+ def about
10
+ LintRoller::About.new(
11
+ name: 'rubocop-internal_affairs',
12
+ version: Version::STRING,
13
+ homepage: 'https://github.com/rubocop/rubocop/tree/master/lib/rubocop/cop/internal_affairs',
14
+ description: 'A collection of RuboCop cops to check for internal affairs.'
15
+ )
16
+ end
17
+
18
+ def supported?(context)
19
+ context.engine == :rubocop
20
+ end
21
+
22
+ def rules(_context)
23
+ require_relative '../internal_affairs'
24
+
25
+ LintRoller::Rules.new(
26
+ type: :path,
27
+ config_format: :rubocop,
28
+ value: Pathname.new(__dir__).join('../../../../config/internal_affairs.yml')
29
+ )
30
+ end
31
+ end
32
+ end
33
+ end
@@ -47,7 +47,7 @@ module RuboCop
47
47
  # @!method redundant_source_range(node)
48
48
  def_node_matcher :redundant_source_range, <<~PATTERN
49
49
  {
50
- (send $(send _ :source_range) :source)
50
+ (call $(call _ :source_range) :source)
51
51
  (send nil? :add_offense $(send _ :source_range) ...)
52
52
  (send _ {
53
53
  :replace :insert_before :insert_before_multi :insert_after :insert_after_multi
@@ -59,6 +59,7 @@ module RuboCop
59
59
 
60
60
  def on_send(node)
61
61
  return unless (source_range = redundant_source_range(node))
62
+ return unless source_range.receiver
62
63
  return if source_range.receiver.send_type? && source_range.receiver.method?(:buffer)
63
64
 
64
65
  selector = source_range.loc.selector
@@ -67,6 +68,7 @@ module RuboCop
67
68
  corrector.remove(source_range.loc.dot.join(selector))
68
69
  end
69
70
  end
71
+ alias on_csend on_send
70
72
  end
71
73
  end
72
74
  end
@@ -34,8 +34,8 @@ module RuboCop
34
34
  # @!method single_line_comparison(node)
35
35
  def_node_matcher :single_line_comparison, <<~PATTERN
36
36
  {
37
- (send (send $_receiver {:line :first_line}) {:== :!=} (send _receiver :last_line))
38
- (send (send $_receiver :last_line) {:== :!=} (send _receiver {:line :first_line}))
37
+ (send (call $_receiver {:line :first_line}) {:== :!=} (call _receiver :last_line))
38
+ (send (call $_receiver :last_line) {:== :!=} (call _receiver {:line :first_line}))
39
39
  }
40
40
  PATTERN
41
41
 
@@ -43,7 +43,8 @@ module RuboCop
43
43
  return unless (receiver = single_line_comparison(node))
44
44
 
45
45
  bang = node.method?(:!=) ? '!' : ''
46
- preferred = "#{bang}#{extract_receiver(receiver)}.single_line?"
46
+ dot = receiver.parent.loc.dot.source
47
+ preferred = "#{bang}#{extract_receiver(receiver)}#{dot}single_line?"
47
48
 
48
49
  add_offense(node, message: format(MSG, preferred: preferred)) do |corrector|
49
50
  corrector.replace(node, preferred)
@@ -53,7 +54,7 @@ module RuboCop
53
54
  private
54
55
 
55
56
  def extract_receiver(node)
56
- node = node.receiver if node.send_type? && %i[loc source_range].include?(node.method_name)
57
+ node = node.receiver if node.call_type? && %i[loc source_range].include?(node.method_name)
57
58
  node.source
58
59
  end
59
60
  end
@@ -17,7 +17,13 @@ module RuboCop
17
17
  'in `config/default.yml`.'
18
18
  CONFIG_PATH = find_file_upwards('config/default.yml', Dir.pwd)
19
19
  CONFIG = if CONFIG_PATH
20
- ConfigLoader.load_yaml_configuration(CONFIG_PATH)
20
+ begin
21
+ original_debug = ConfigLoader.debug
22
+ ConfigLoader.debug = false
23
+ ConfigLoader.load_yaml_configuration(CONFIG_PATH)
24
+ ensure
25
+ ConfigLoader.debug = original_debug
26
+ end
21
27
  else
22
28
  {}
23
29
  end
@@ -1,12 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'internal_affairs/cop_description'
4
+ require_relative 'internal_affairs/cop_enabled'
4
5
  require_relative 'internal_affairs/create_empty_file'
5
6
  require_relative 'internal_affairs/empty_line_between_expect_offense_and_correction'
6
7
  require_relative 'internal_affairs/example_description'
7
8
  require_relative 'internal_affairs/example_heredoc_delimiter'
8
9
  require_relative 'internal_affairs/inherit_deprecated_cop_class'
9
10
  require_relative 'internal_affairs/lambda_or_proc'
11
+ require_relative 'internal_affairs/location_exists'
10
12
  require_relative 'internal_affairs/location_expression'
11
13
  require_relative 'internal_affairs/location_line_equality_comparison'
12
14
  require_relative 'internal_affairs/method_name_end_with'
@@ -14,9 +16,13 @@ require_relative 'internal_affairs/method_name_equal'
14
16
  require_relative 'internal_affairs/node_destructuring'
15
17
  require_relative 'internal_affairs/node_first_or_last_argument'
16
18
  require_relative 'internal_affairs/node_matcher_directive'
19
+ require_relative 'internal_affairs/node_pattern_groups'
20
+ require_relative 'internal_affairs/node_type_group'
21
+ require_relative 'internal_affairs/node_type_multiple_predicates'
17
22
  require_relative 'internal_affairs/node_type_predicate'
18
23
  require_relative 'internal_affairs/numblock_handler'
19
24
  require_relative 'internal_affairs/offense_location_keyword'
25
+ require_relative 'internal_affairs/on_send_without_on_csend'
20
26
  require_relative 'internal_affairs/operator_keyword'
21
27
  require_relative 'internal_affairs/processed_source_buffer_name'
22
28
  require_relative 'internal_affairs/redundant_context_config_parameter'
@@ -32,19 +38,3 @@ require_relative 'internal_affairs/style_detected_api_use'
32
38
  require_relative 'internal_affairs/undefined_config'
33
39
  require_relative 'internal_affairs/useless_message_assertion'
34
40
  require_relative 'internal_affairs/useless_restrict_on_send'
35
-
36
- module RuboCop
37
- # Patch in the InternalAffairs specific config values
38
- module InternalAffairs
39
- def self.inject!
40
- path = File.join(ConfigLoader::RUBOCOP_HOME, 'config', 'internal_affairs.yml')
41
- hash = ConfigLoader.load_yaml_configuration(path)
42
- config = Config.new(hash, path)
43
- puts "configuration from #{path}" if ConfigLoader.debug?
44
- config = ConfigLoader.merge_with_default(config, path)
45
- ConfigLoader.instance_variable_set(:@default_configuration, config)
46
- end
47
- end
48
- end
49
-
50
- RuboCop::InternalAffairs.inject!
@@ -4,7 +4,7 @@ module RuboCop
4
4
  module Cop
5
5
  module Layout
6
6
  # Bare access modifiers (those not applying to specific methods) should be
7
- # indented as deep as method definitions, or as deep as the class/module
7
+ # indented as deep as method definitions, or as deep as the `class`/`module`
8
8
  # keyword, depending on configuration.
9
9
  #
10
10
  # @example EnforcedStyle: indent (default)
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Layout
6
- # Check that the arguments on a multi-line method definition are aligned.
6
+ # Check that the arguments on a multi-line method call are aligned.
7
7
  #
8
8
  # @example EnforcedStyle: with_first_argument (default)
9
9
  # # good
@@ -141,16 +141,10 @@ module RuboCop
141
141
  end
142
142
 
143
143
  def enforce_hash_argument_with_separator?
144
- return false unless hash_argument_config['Enabled']
145
-
146
144
  RuboCop::Cop::Layout::HashAlignment::SEPARATOR_ALIGNMENT_STYLES.any? do |style|
147
- hash_argument_config[style]&.include?('separator')
145
+ config.for_enabled_cop('Layout/HashAlignment')[style]&.include?('separator')
148
146
  end
149
147
  end
150
-
151
- def hash_argument_config
152
- config.for_cop('Layout/HashAlignment')
153
- end
154
148
  end
155
149
  end
156
150
  end
@@ -73,6 +73,8 @@ module RuboCop
73
73
  # @!method block_end_align_target?(node, child)
74
74
  def_node_matcher :block_end_align_target?, <<~PATTERN
75
75
  {assignment?
76
+ def
77
+ defs
76
78
  splat
77
79
  and
78
80
  or
@@ -188,7 +190,7 @@ module RuboCop
188
190
  # In offense message, we want to show the assignment LHS rather than
189
191
  # the entire assignment.
190
192
  def find_lhs_node(node)
191
- node = node.lhs while node.op_asgn_type? || node.masgn_type?
193
+ node = node.lhs while node.type?(:op_asgn, :masgn)
192
194
  node
193
195
  end
194
196
 
@@ -3,23 +3,23 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Layout
6
- # Checks if the code style follows the ExpectedOrder configuration:
6
+ # Checks if the code style follows the `ExpectedOrder` configuration:
7
7
  #
8
8
  # `Categories` allows us to map macro names into a category.
9
9
  #
10
10
  # Consider an example of code style that covers the following order:
11
11
  #
12
- # * Module inclusion (include, prepend, extend)
12
+ # * Module inclusion (`include`, `prepend`, `extend`)
13
13
  # * Constants
14
- # * Associations (has_one, has_many)
15
- # * Public attribute macros (attr_accessor, attr_writer, attr_reader)
16
- # * Other macros (validates, validate)
14
+ # * Associations (`has_one`, `has_many`)
15
+ # * Public attribute macros (`attr_accessor`, `attr_writer`, `attr_reader`)
16
+ # * Other macros (`validates`, `validate`)
17
17
  # * Public class methods
18
18
  # * Initializer
19
19
  # * Public instance methods
20
- # * Protected attribute macros (attr_accessor, attr_writer, attr_reader)
20
+ # * Protected attribute macros (`attr_accessor`, `attr_writer`, `attr_reader`)
21
21
  # * Protected instance methods
22
- # * Private attribute macros (attr_accessor, attr_writer, attr_reader)
22
+ # * Private attribute macros (`attr_accessor`, `attr_writer`, `attr_reader`)
23
23
  # * Private instance methods
24
24
  #
25
25
  # You can configure the following order:
@@ -236,7 +236,7 @@ module RuboCop
236
236
 
237
237
  return [] unless class_def
238
238
 
239
- if class_def.def_type? || class_def.send_type?
239
+ if class_def.type?(:def, :send)
240
240
  [class_def]
241
241
  else
242
242
  class_def.children.compact
@@ -289,7 +289,7 @@ module RuboCop
289
289
  def marked_as_private_constant?(node, name)
290
290
  return false unless node.method?(:private_constant)
291
291
 
292
- node.arguments.any? { |arg| (arg.sym_type? || arg.str_type?) && arg.value == name }
292
+ node.arguments.any? { |arg| arg.type?(:sym, :str) && arg.value == name }
293
293
  end
294
294
 
295
295
  def end_position_for(node)
@@ -155,10 +155,10 @@ module RuboCop
155
155
  end
156
156
 
157
157
  def all_elements_aligned?(elements)
158
- elements.flat_map do |e|
159
- if e.hash_type?
160
- e.each_child_node.map { |child| child.loc.column }
161
- else
158
+ if elements.first.hash_type?
159
+ elements.first.each_child_node.map { |child| child.loc.column }
160
+ else
161
+ elements.flat_map do |e|
162
162
  e.loc.column
163
163
  end
164
164
  end.uniq.count == 1
@@ -120,7 +120,7 @@ module RuboCop
120
120
  end
121
121
 
122
122
  def heredoc?(node)
123
- (node.str_type? || node.dstr_type?) && node.heredoc?
123
+ node.type?(:str, :dstr) && node.heredoc?
124
124
  end
125
125
 
126
126
  def end_range(node)
@@ -49,7 +49,7 @@ module RuboCop
49
49
  end
50
50
 
51
51
  def on_rescue(node)
52
- return unless node.loc.respond_to?(:else) && node.loc.else
52
+ return unless node.loc?(:else)
53
53
 
54
54
  check_alignment(base_range_of_rescue(node), node.loc.else)
55
55
  end
@@ -92,7 +92,7 @@ module RuboCop
92
92
  case parent.type
93
93
  when :def, :defs then base_for_method_definition(parent)
94
94
  when :kwbegin then parent.loc.begin
95
- when :block
95
+ when :block, :numblock
96
96
  assignment_node = assignment_node(parent)
97
97
  if same_line?(parent, assignment_node)
98
98
  assignment_node.source_range
@@ -189,7 +189,7 @@ module RuboCop
189
189
  end
190
190
 
191
191
  def offense_location(node)
192
- if node.loc.respond_to?(:end) && node.loc.end
192
+ if node.loc?(:end)
193
193
  node.loc.end
194
194
  else
195
195
  node
@@ -22,8 +22,6 @@ module RuboCop
22
22
  # def b
23
23
  # end
24
24
  #
25
- # @example
26
- #
27
25
  # # good
28
26
  # def a
29
27
  # end
@@ -42,8 +40,6 @@ module RuboCop
42
40
  # def b
43
41
  # end
44
42
  #
45
- # @example
46
- #
47
43
  # # good
48
44
  # class A
49
45
  # end
@@ -65,8 +61,6 @@ module RuboCop
65
61
  # def b
66
62
  # end
67
63
  #
68
- # @example
69
- #
70
64
  # # good
71
65
  # module A
72
66
  # end
@@ -162,7 +156,7 @@ module RuboCop
162
156
  private
163
157
 
164
158
  def def_location(correction_node)
165
- if correction_node.block_type?
159
+ if correction_node.any_block_type?
166
160
  correction_node.source_range.join(correction_node.children.first.source_range)
167
161
  else
168
162
  correction_node.loc.keyword.join(correction_node.loc.name)
@@ -181,12 +175,12 @@ module RuboCop
181
175
  end
182
176
 
183
177
  def macro_candidate?(node)
184
- node.block_type? && node.children.first.macro? &&
178
+ node.any_block_type? && node.children.first.macro? &&
185
179
  empty_line_between_macros.include?(node.children.first.method_name)
186
180
  end
187
181
 
188
182
  def method_candidate?(node)
189
- cop_config['EmptyLineBetweenMethodDefs'] && (node.def_type? || node.defs_type?)
183
+ cop_config['EmptyLineBetweenMethodDefs'] && node.type?(:def, :defs)
190
184
  end
191
185
 
192
186
  def class_candidate?(node)
@@ -246,7 +240,7 @@ module RuboCop
246
240
  end
247
241
 
248
242
  def def_start(node)
249
- if node.block_type? && node.children.first.send_type?
243
+ if node.any_block_type? && node.children.first.send_type?
250
244
  node.source_range.line
251
245
  else
252
246
  node.loc.keyword.line
@@ -258,7 +252,7 @@ module RuboCop
258
252
  end
259
253
 
260
254
  def end_loc(node)
261
- if (node.def_type? || node.defs_type?) && node.endless?
255
+ if node.type?(:def, :defs) && node.endless?
262
256
  node.source_range.end
263
257
  else
264
258
  node.loc.end
@@ -283,6 +277,8 @@ module RuboCop
283
277
  case node.type
284
278
  when :def, :defs
285
279
  :method
280
+ when :numblock
281
+ :block
286
282
  else
287
283
  node.type
288
284
  end
@@ -86,13 +86,14 @@ module RuboCop
86
86
 
87
87
  def on_send(node)
88
88
  return unless node.bare_access_modifier? && !node.block_literal?
89
+ return if same_line?(node, node.right_sibling)
89
90
  return if expected_empty_lines?(node)
90
91
 
91
92
  message = message(node)
92
93
  add_offense(node, message: message) do |corrector|
93
94
  line = range_by_whole_lines(node.source_range)
94
95
 
95
- corrector.insert_before(line, "\n") unless previous_line_empty?(node.first_line)
96
+ corrector.insert_before(line, "\n") if should_insert_line_before?(node)
96
97
 
97
98
  correct_next_line_if_denied_style(corrector, node, line)
98
99
  end
@@ -121,6 +122,8 @@ module RuboCop
121
122
  end
122
123
 
123
124
  def correct_next_line_if_denied_style(corrector, node, line)
125
+ return unless should_insert_line_after?(node)
126
+
124
127
  case style
125
128
  when :around
126
129
  corrector.insert_after(line, "\n") unless next_line_empty?(node.last_line)
@@ -204,6 +207,29 @@ module RuboCop
204
207
  format(MSG_BEFORE_FOR_ONLY_BEFORE, modifier: modifier)
205
208
  end
206
209
  end
210
+
211
+ def should_insert_line_before?(node)
212
+ return false if previous_line_empty?(node.first_line)
213
+ return true unless inside_block?(node) && no_empty_lines_around_block_body?
214
+ return true unless node.parent.begin_type?
215
+
216
+ node.parent.children.first != node
217
+ end
218
+
219
+ def should_insert_line_after?(node)
220
+ return true unless inside_block?(node) && no_empty_lines_around_block_body?
221
+
222
+ node.parent.children.last != node
223
+ end
224
+
225
+ def inside_block?(node)
226
+ node.parent.block_type? || (node.parent.begin_type? && node.parent.parent&.block_type?)
227
+ end
228
+
229
+ def no_empty_lines_around_block_body?
230
+ config.for_enabled_cop('Layout/EmptyLinesAroundBlockBody')['EnforcedStyle'] ==
231
+ 'no_empty_lines'
232
+ end
207
233
  end
208
234
  end
209
235
  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|
@@ -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
@@ -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
 
@@ -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