rubocop 1.80.2 → 1.86.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 (310) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +2 -2
  4. data/config/default.yml +170 -19
  5. data/config/obsoletion.yml +9 -0
  6. data/lib/rubocop/cache_config.rb +29 -0
  7. data/lib/rubocop/cli/command/auto_generate_config.rb +3 -3
  8. data/lib/rubocop/cli/command/lsp.rb +1 -1
  9. data/lib/rubocop/cli/command/mcp.rb +19 -0
  10. data/lib/rubocop/cli/command/show_cops.rb +2 -2
  11. data/lib/rubocop/cli/command/show_docs_url.rb +1 -1
  12. data/lib/rubocop/cli.rb +28 -6
  13. data/lib/rubocop/comment_config.rb +62 -17
  14. data/lib/rubocop/config.rb +14 -10
  15. data/lib/rubocop/config_finder.rb +1 -1
  16. data/lib/rubocop/config_loader.rb +20 -21
  17. data/lib/rubocop/config_loader_resolver.rb +9 -7
  18. data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -2
  19. data/lib/rubocop/config_store.rb +6 -1
  20. data/lib/rubocop/config_validator.rb +1 -1
  21. data/lib/rubocop/cop/autocorrect_logic.rb +8 -4
  22. data/lib/rubocop/cop/bundler/gem_version.rb +28 -28
  23. data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -2
  24. data/lib/rubocop/cop/correctors/alignment_corrector.rb +22 -6
  25. data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -1
  26. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
  27. data/lib/rubocop/cop/documentation.rb +2 -3
  28. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -2
  29. data/lib/rubocop/cop/gemspec/require_mfa.rb +1 -1
  30. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +10 -5
  31. data/lib/rubocop/cop/internal_affairs/example_heredoc_delimiter.rb +8 -8
  32. data/lib/rubocop/cop/internal_affairs/itblock_handler.rb +69 -0
  33. data/lib/rubocop/cop/internal_affairs/location_exists.rb +28 -2
  34. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +9 -9
  35. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +1 -1
  36. data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +3 -1
  37. data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +1 -1
  38. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +4 -4
  39. data/lib/rubocop/cop/internal_affairs.rb +1 -0
  40. data/lib/rubocop/cop/layout/argument_alignment.rb +2 -2
  41. data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
  42. data/lib/rubocop/cop/layout/case_indentation.rb +3 -1
  43. data/lib/rubocop/cop/layout/class_structure.rb +13 -6
  44. data/lib/rubocop/cop/layout/dot_position.rb +2 -2
  45. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +12 -2
  46. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +31 -13
  47. data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +1 -1
  48. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +1 -0
  49. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +12 -2
  50. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +16 -2
  51. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +16 -2
  52. data/lib/rubocop/cop/layout/end_alignment.rb +8 -1
  53. data/lib/rubocop/cop/layout/first_argument_indentation.rb +34 -1
  54. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +26 -0
  55. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +7 -1
  56. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +25 -25
  57. data/lib/rubocop/cop/layout/hash_alignment.rb +3 -6
  58. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -2
  59. data/lib/rubocop/cop/layout/heredoc_indentation.rb +33 -3
  60. data/lib/rubocop/cop/layout/indentation_style.rb +1 -1
  61. data/lib/rubocop/cop/layout/indentation_width.rb +111 -7
  62. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +1 -1
  63. data/lib/rubocop/cop/layout/line_length.rb +26 -9
  64. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +57 -57
  65. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +9 -2
  66. data/lib/rubocop/cop/layout/multiline_block_layout.rb +2 -0
  67. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +56 -56
  68. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +204 -39
  69. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +6 -4
  70. data/lib/rubocop/cop/layout/parameter_alignment.rb +1 -1
  71. data/lib/rubocop/cop/layout/redundant_line_break.rb +1 -1
  72. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +13 -3
  73. data/lib/rubocop/cop/layout/space_after_comma.rb +2 -10
  74. data/lib/rubocop/cop/layout/space_after_semicolon.rb +1 -1
  75. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +1 -1
  76. data/lib/rubocop/cop/layout/space_around_keyword.rb +4 -2
  77. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -8
  78. data/lib/rubocop/cop/layout/trailing_whitespace.rb +1 -1
  79. data/lib/rubocop/cop/lint/circular_argument_reference.rb +47 -3
  80. data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +3 -2
  81. data/lib/rubocop/cop/lint/constant_reassignment.rb +59 -9
  82. data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
  83. data/lib/rubocop/cop/lint/cop_directive_syntax.rb +14 -8
  84. data/lib/rubocop/cop/lint/data_define_override.rb +63 -0
  85. data/lib/rubocop/cop/lint/debugger.rb +0 -2
  86. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +4 -1
  87. data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +4 -4
  88. data/lib/rubocop/cop/lint/duplicate_methods.rb +111 -12
  89. data/lib/rubocop/cop/lint/else_layout.rb +19 -0
  90. data/lib/rubocop/cop/lint/empty_block.rb +1 -1
  91. data/lib/rubocop/cop/lint/empty_conditional_body.rb +6 -1
  92. data/lib/rubocop/cop/lint/empty_in_pattern.rb +8 -1
  93. data/lib/rubocop/cop/lint/empty_interpolation.rb +11 -0
  94. data/lib/rubocop/cop/lint/empty_when.rb +8 -1
  95. data/lib/rubocop/cop/lint/float_comparison.rb +1 -1
  96. data/lib/rubocop/cop/lint/interpolation_check.rb +7 -2
  97. data/lib/rubocop/cop/lint/literal_as_condition.rb +5 -1
  98. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
  99. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +16 -6
  100. data/lib/rubocop/cop/lint/next_without_accumulator.rb +2 -0
  101. data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +4 -0
  102. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +3 -1
  103. data/lib/rubocop/cop/lint/number_conversion.rb +1 -1
  104. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +23 -9
  105. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +0 -9
  106. data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -2
  107. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +23 -6
  108. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +8 -2
  109. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -4
  110. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +17 -0
  111. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +7 -1
  112. data/lib/rubocop/cop/lint/self_assignment.rb +10 -2
  113. data/lib/rubocop/cop/lint/shadowed_argument.rb +7 -7
  114. data/lib/rubocop/cop/lint/struct_new_override.rb +17 -1
  115. data/lib/rubocop/cop/lint/syntax.rb +25 -1
  116. data/lib/rubocop/cop/lint/to_json.rb +12 -16
  117. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1 -0
  118. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -0
  119. data/lib/rubocop/cop/lint/unreachable_code.rb +5 -3
  120. data/lib/rubocop/cop/lint/unreachable_pattern_branch.rb +113 -0
  121. data/lib/rubocop/cop/lint/unused_method_argument.rb +10 -0
  122. data/lib/rubocop/cop/lint/useless_assignment.rb +45 -17
  123. data/lib/rubocop/cop/lint/useless_constant_scoping.rb +4 -4
  124. data/lib/rubocop/cop/lint/useless_default_value_argument.rb +2 -0
  125. data/lib/rubocop/cop/lint/useless_or.rb +15 -2
  126. data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +24 -9
  127. data/lib/rubocop/cop/lint/void.rb +39 -12
  128. data/lib/rubocop/cop/message_annotator.rb +1 -1
  129. data/lib/rubocop/cop/metrics/block_nesting.rb +23 -0
  130. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +4 -3
  131. data/lib/rubocop/cop/migration/department_name.rb +12 -1
  132. data/lib/rubocop/cop/mixin/check_line_breakable.rb +2 -2
  133. data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +4 -6
  134. data/lib/rubocop/cop/mixin/code_length.rb +1 -1
  135. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +5 -5
  136. data/lib/rubocop/cop/mixin/hash_transform_method/autocorrection.rb +63 -0
  137. data/lib/rubocop/cop/mixin/hash_transform_method.rb +10 -60
  138. data/lib/rubocop/cop/mixin/line_length_help.rb +21 -2
  139. data/lib/rubocop/cop/mixin/method_complexity.rb +1 -1
  140. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1 -1
  141. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -1
  142. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +5 -4
  143. data/lib/rubocop/cop/mixin/statement_modifier.rb +0 -6
  144. data/lib/rubocop/cop/mixin/trailing_comma.rb +8 -5
  145. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  146. data/lib/rubocop/cop/naming/method_name.rb +4 -2
  147. data/lib/rubocop/cop/naming/predicate_method.rb +27 -4
  148. data/lib/rubocop/cop/naming/predicate_prefix.rb +11 -11
  149. data/lib/rubocop/cop/offense.rb +9 -1
  150. data/lib/rubocop/cop/registry.rb +20 -13
  151. data/lib/rubocop/cop/security/eval.rb +15 -2
  152. data/lib/rubocop/cop/security/json_load.rb +33 -11
  153. data/lib/rubocop/cop/style/access_modifier_declarations.rb +15 -4
  154. data/lib/rubocop/cop/style/accessor_grouping.rb +4 -2
  155. data/lib/rubocop/cop/style/alias.rb +4 -1
  156. data/lib/rubocop/cop/style/and_or.rb +1 -0
  157. data/lib/rubocop/cop/style/arguments_forwarding.rb +25 -7
  158. data/lib/rubocop/cop/style/array_intersect.rb +2 -2
  159. data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +47 -0
  160. data/lib/rubocop/cop/style/array_join.rb +4 -2
  161. data/lib/rubocop/cop/style/ascii_comments.rb +6 -3
  162. data/lib/rubocop/cop/style/attr.rb +5 -2
  163. data/lib/rubocop/cop/style/bare_percent_literals.rb +4 -3
  164. data/lib/rubocop/cop/style/begin_block.rb +3 -1
  165. data/lib/rubocop/cop/style/block_delimiters.rb +27 -34
  166. data/lib/rubocop/cop/style/case_equality.rb +15 -13
  167. data/lib/rubocop/cop/style/class_and_module_children.rb +11 -2
  168. data/lib/rubocop/cop/style/collection_compact.rb +36 -16
  169. data/lib/rubocop/cop/style/colon_method_call.rb +3 -1
  170. data/lib/rubocop/cop/style/concat_array_literals.rb +2 -0
  171. data/lib/rubocop/cop/style/conditional_assignment.rb +8 -18
  172. data/lib/rubocop/cop/style/constant_visibility.rb +17 -12
  173. data/lib/rubocop/cop/style/copyright.rb +1 -1
  174. data/lib/rubocop/cop/style/documentation.rb +6 -6
  175. data/lib/rubocop/cop/style/documentation_method.rb +8 -8
  176. data/lib/rubocop/cop/style/double_negation.rb +1 -1
  177. data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
  178. data/lib/rubocop/cop/style/each_with_object.rb +2 -0
  179. data/lib/rubocop/cop/style/empty_block_parameter.rb +1 -1
  180. data/lib/rubocop/cop/style/empty_class_definition.rb +119 -0
  181. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +1 -1
  182. data/lib/rubocop/cop/style/empty_method.rb +0 -6
  183. data/lib/rubocop/cop/style/encoding.rb +7 -1
  184. data/lib/rubocop/cop/style/end_block.rb +3 -1
  185. data/lib/rubocop/cop/style/endless_method.rb +23 -5
  186. data/lib/rubocop/cop/style/explicit_block_argument.rb +1 -1
  187. data/lib/rubocop/cop/style/file_open.rb +84 -0
  188. data/lib/rubocop/cop/style/float_division.rb +15 -1
  189. data/lib/rubocop/cop/style/for.rb +3 -0
  190. data/lib/rubocop/cop/style/format_string_token.rb +49 -5
  191. data/lib/rubocop/cop/style/global_vars.rb +5 -2
  192. data/lib/rubocop/cop/style/guard_clause.rb +27 -22
  193. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +27 -9
  194. data/lib/rubocop/cop/style/hash_lookup_method.rb +101 -0
  195. data/lib/rubocop/cop/style/hash_syntax.rb +1 -1
  196. data/lib/rubocop/cop/style/hash_transform_keys.rb +17 -7
  197. data/lib/rubocop/cop/style/hash_transform_values.rb +17 -7
  198. data/lib/rubocop/cop/style/if_inside_else.rb +1 -5
  199. data/lib/rubocop/cop/style/if_unless_modifier.rb +57 -17
  200. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +12 -12
  201. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +4 -1
  202. data/lib/rubocop/cop/style/if_with_semicolon.rb +7 -5
  203. data/lib/rubocop/cop/style/inline_comment.rb +4 -1
  204. data/lib/rubocop/cop/style/ip_addresses.rb +1 -2
  205. data/lib/rubocop/cop/style/lambda_call.rb +8 -8
  206. data/lib/rubocop/cop/style/magic_comment_format.rb +2 -2
  207. data/lib/rubocop/cop/style/map_join.rb +123 -0
  208. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +15 -2
  209. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +17 -4
  210. data/lib/rubocop/cop/style/method_def_parentheses.rb +2 -4
  211. data/lib/rubocop/cop/style/module_member_existence_check.rb +107 -0
  212. data/lib/rubocop/cop/style/multiline_if_then.rb +4 -4
  213. data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -4
  214. data/lib/rubocop/cop/style/mutable_constant.rb +1 -1
  215. data/lib/rubocop/cop/style/negative_array_index.rb +220 -0
  216. data/lib/rubocop/cop/style/nil_comparison.rb +11 -10
  217. data/lib/rubocop/cop/style/nil_lambda.rb +1 -1
  218. data/lib/rubocop/cop/style/non_nil_check.rb +5 -11
  219. data/lib/rubocop/cop/style/not.rb +2 -0
  220. data/lib/rubocop/cop/style/numeric_literals.rb +3 -2
  221. data/lib/rubocop/cop/style/one_class_per_file.rb +115 -0
  222. data/lib/rubocop/cop/style/one_line_conditional.rb +21 -12
  223. data/lib/rubocop/cop/style/operator_method_call.rb +11 -2
  224. data/lib/rubocop/cop/style/parallel_assignment.rb +6 -2
  225. data/lib/rubocop/cop/style/partition_instead_of_double_select.rb +270 -0
  226. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +2 -0
  227. data/lib/rubocop/cop/style/predicate_with_kind.rb +84 -0
  228. data/lib/rubocop/cop/style/preferred_hash_methods.rb +12 -12
  229. data/lib/rubocop/cop/style/proc.rb +3 -2
  230. data/lib/rubocop/cop/style/raise_args.rb +1 -1
  231. data/lib/rubocop/cop/style/reduce_to_hash.rb +184 -0
  232. data/lib/rubocop/cop/style/redundant_argument.rb +2 -0
  233. data/lib/rubocop/cop/style/redundant_begin.rb +3 -3
  234. data/lib/rubocop/cop/style/redundant_condition.rb +5 -2
  235. data/lib/rubocop/cop/style/redundant_each.rb +3 -3
  236. data/lib/rubocop/cop/style/redundant_exception.rb +1 -1
  237. data/lib/rubocop/cop/style/redundant_fetch_block.rb +1 -1
  238. data/lib/rubocop/cop/style/redundant_format.rb +26 -5
  239. data/lib/rubocop/cop/style/redundant_interpolation.rb +11 -2
  240. data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +26 -10
  241. data/lib/rubocop/cop/style/redundant_line_continuation.rb +16 -0
  242. data/lib/rubocop/cop/style/redundant_min_max_by.rb +93 -0
  243. data/lib/rubocop/cop/style/redundant_parentheses.rb +26 -22
  244. data/lib/rubocop/cop/style/redundant_percent_q.rb +5 -3
  245. data/lib/rubocop/cop/style/redundant_regexp_argument.rb +9 -0
  246. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +8 -0
  247. data/lib/rubocop/cop/style/redundant_return.rb +3 -1
  248. data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +0 -5
  249. data/lib/rubocop/cop/style/redundant_sort.rb +7 -7
  250. data/lib/rubocop/cop/style/redundant_struct_keyword_init.rb +114 -0
  251. data/lib/rubocop/cop/style/reverse_find.rb +51 -0
  252. data/lib/rubocop/cop/style/safe_navigation.rb +7 -7
  253. data/lib/rubocop/cop/style/select_by_kind.rb +158 -0
  254. data/lib/rubocop/cop/style/select_by_range.rb +197 -0
  255. data/lib/rubocop/cop/style/select_by_regexp.rb +51 -21
  256. data/lib/rubocop/cop/style/semicolon.rb +25 -7
  257. data/lib/rubocop/cop/style/single_line_block_params.rb +2 -2
  258. data/lib/rubocop/cop/style/single_line_do_end_block.rb +1 -1
  259. data/lib/rubocop/cop/style/single_line_methods.rb +3 -1
  260. data/lib/rubocop/cop/style/sole_nested_conditional.rb +8 -1
  261. data/lib/rubocop/cop/style/special_global_vars.rb +6 -1
  262. data/lib/rubocop/cop/style/super_arguments.rb +2 -2
  263. data/lib/rubocop/cop/style/symbol_proc.rb +4 -3
  264. data/lib/rubocop/cop/style/tally_method.rb +181 -0
  265. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +45 -0
  266. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1 -1
  267. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -0
  268. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +11 -11
  269. data/lib/rubocop/cop/style/unless_else.rb +10 -9
  270. data/lib/rubocop/cop/style/yoda_expression.rb +1 -1
  271. data/lib/rubocop/cop/team.rb +4 -4
  272. data/lib/rubocop/cop/util.rb +2 -3
  273. data/lib/rubocop/cop/utils/format_string.rb +10 -0
  274. data/lib/rubocop/cop/variable_force/branch.rb +30 -6
  275. data/lib/rubocop/cops_documentation_generator.rb +4 -4
  276. data/lib/rubocop/directive_comment.rb +48 -4
  277. data/lib/rubocop/formatter/clang_style_formatter.rb +5 -2
  278. data/lib/rubocop/formatter/disabled_config_formatter.rb +2 -1
  279. data/lib/rubocop/formatter/formatter_set.rb +2 -2
  280. data/lib/rubocop/formatter/junit_formatter.rb +1 -1
  281. data/lib/rubocop/formatter/simple_text_formatter.rb +0 -2
  282. data/lib/rubocop/formatter/tap_formatter.rb +5 -2
  283. data/lib/rubocop/formatter/worst_offenders_formatter.rb +1 -1
  284. data/lib/rubocop/formatter.rb +22 -21
  285. data/lib/rubocop/lsp/diagnostic.rb +18 -33
  286. data/lib/rubocop/lsp/disable_comment_edits.rb +135 -0
  287. data/lib/rubocop/lsp/routes.rb +12 -5
  288. data/lib/rubocop/lsp/runtime.rb +13 -3
  289. data/lib/rubocop/lsp/stdin_runner.rb +8 -17
  290. data/lib/rubocop/magic_comment.rb +20 -0
  291. data/lib/rubocop/mcp/server.rb +200 -0
  292. data/lib/rubocop/options.rb +10 -1
  293. data/lib/rubocop/path_util.rb +14 -2
  294. data/lib/rubocop/plugin/loader.rb +1 -1
  295. data/lib/rubocop/rake_task.rb +1 -1
  296. data/lib/rubocop/remote_config.rb +10 -8
  297. data/lib/rubocop/result_cache.rb +60 -37
  298. data/lib/rubocop/rspec/cop_helper.rb +8 -0
  299. data/lib/rubocop/rspec/shared_contexts.rb +18 -5
  300. data/lib/rubocop/rspec/support.rb +2 -1
  301. data/lib/rubocop/runner.rb +12 -3
  302. data/lib/rubocop/server/cache.rb +6 -29
  303. data/lib/rubocop/server/core.rb +2 -0
  304. data/lib/rubocop/target_finder.rb +1 -1
  305. data/lib/rubocop/target_ruby.rb +31 -14
  306. data/lib/rubocop/version.rb +2 -2
  307. data/lib/rubocop.rb +20 -0
  308. data/lib/ruby_lsp/rubocop/addon.rb +23 -8
  309. data/lib/ruby_lsp/rubocop/runtime_adapter.rb +49 -15
  310. metadata +33 -9
@@ -46,10 +46,12 @@ module RuboCop
46
46
  # .a
47
47
  # .b
48
48
  # .c
49
- class MultilineMethodCallIndentation < Base
49
+ #
50
+ class MultilineMethodCallIndentation < Base # rubocop:disable Metrics/ClassLength
50
51
  include ConfigurableEnforcedStyle
51
52
  include Alignment
52
53
  include MultilineExpressionIndentation
54
+ include RangeHelp
53
55
  extend AutoCorrector
54
56
 
55
57
  def validate_config
@@ -64,8 +66,39 @@ module RuboCop
64
66
 
65
67
  private
66
68
 
69
+ def find_base_receiver(node)
70
+ base_receiver = node
71
+ base_receiver = base_receiver.receiver while base_receiver.receiver
72
+ base_receiver
73
+ end
74
+
75
+ def find_pair_ancestor(node)
76
+ node.each_ancestor.find(&:pair_type?)
77
+ end
78
+
79
+ def unwrap_block_node(node)
80
+ node&.any_block_type? ? node.send_node : node
81
+ end
82
+
67
83
  def autocorrect(corrector, node)
68
- AlignmentCorrector.correct(corrector, processed_source, node, @column_delta)
84
+ if @send_node.block_node
85
+ correct_selector_only(corrector, node)
86
+ correct_block(corrector, @send_node.block_node)
87
+ else
88
+ AlignmentCorrector.correct(corrector, processed_source, node, @column_delta)
89
+ end
90
+ end
91
+
92
+ def correct_selector_only(corrector, node)
93
+ selector_line = processed_source.buffer.line_range(node.first_line)
94
+ selector_range = range_between(selector_line.begin_pos, selector_line.end_pos)
95
+ AlignmentCorrector.correct(corrector, processed_source, selector_range, @column_delta)
96
+ end
97
+
98
+ def correct_block(corrector, block_node)
99
+ AlignmentCorrector.correct(corrector, processed_source, block_node.body, @column_delta)
100
+ end_range = range_by_whole_lines(block_node.loc.end, include_final_newline: false)
101
+ AlignmentCorrector.correct(corrector, processed_source, end_range, @column_delta)
69
102
  end
70
103
 
71
104
  def relevant_node?(send_node)
@@ -86,27 +119,113 @@ module RuboCop
86
119
 
87
120
  def offending_range(node, lhs, rhs, given_style)
88
121
  return false unless begins_its_line?(rhs)
89
- return false if not_for_this_cop?(node)
90
122
 
123
+ @send_node = node # Store for use in autocorrect
124
+ pair_ancestor = find_pair_ancestor(node)
125
+ if hash_pair_aligned?(pair_ancestor, given_style)
126
+ return check_hash_pair_indentation(node, lhs, rhs)
127
+ end
128
+ if hash_pair_indented?(node, pair_ancestor, given_style)
129
+ return check_hash_pair_indented_style(rhs, pair_ancestor)
130
+ end
131
+ return false if skip_for_context?(node, pair_ancestor)
132
+
133
+ check_regular_indentation(node, lhs, rhs, given_style)
134
+ end
135
+
136
+ def skip_for_context?(node, pair_ancestor)
137
+ pair_ancestor ? inside_multiline_chain_arg?(node) : not_for_this_cop?(node)
138
+ end
139
+
140
+ def hash_pair_aligned?(pair_ancestor, given_style)
141
+ pair_ancestor && given_style == :aligned
142
+ end
143
+
144
+ def hash_pair_indented?(node, pair_ancestor, given_style)
145
+ pair_ancestor && given_style == :indented && find_base_receiver(node).hash_type?
146
+ end
147
+
148
+ def check_hash_pair_indented_style(rhs, pair_ancestor)
149
+ pair_key = pair_ancestor.key
150
+ double_indentation = configured_indentation_width * 2
151
+ correct_column = pair_key.source_range.column + double_indentation
152
+ @hash_pair_base_column = pair_key.source_range.column + configured_indentation_width
153
+
154
+ calculate_column_delta_offense(rhs, correct_column)
155
+ end
156
+
157
+ def check_hash_pair_indentation(node, lhs, rhs)
158
+ @base = find_hash_pair_alignment_base(node)
159
+ return false if !@base && inside_multiline_chain_arg?(node)
160
+
161
+ @base ||= lhs.source_range
162
+ return if aligned_with_first_line_dot?(node, rhs)
163
+
164
+ calculate_column_delta_offense(rhs, @base.column)
165
+ end
166
+
167
+ def find_hash_pair_alignment_base(node)
168
+ base_receiver = find_base_receiver(node.receiver)
169
+ return unless base_receiver.hash_type?
170
+
171
+ first_call = first_call_has_a_dot(node)
172
+ first_call.loc.dot.join(first_call.loc.selector)
173
+ end
174
+
175
+ def inside_multiline_chain_arg?(node)
176
+ enclosing_call = find_enclosing_chain_call(node)
177
+ return false unless enclosing_call
178
+
179
+ !same_line?(enclosing_call.loc.selector, enclosing_call.receiver.source_range)
180
+ end
181
+
182
+ def find_enclosing_chain_call(node)
183
+ hash_ancestor = find_pair_ancestor(node).parent
184
+ enclosing_call = hash_ancestor.parent
185
+ return unless hash_arg_in_chain?(enclosing_call, hash_ancestor)
186
+
187
+ enclosing_call
188
+ end
189
+
190
+ def hash_arg_in_chain?(call, hash_node)
191
+ call&.call_type? && call.receiver != hash_node && call.loc?(:dot)
192
+ end
193
+
194
+ def aligned_with_first_line_dot?(node, rhs)
195
+ return false unless rhs.source.start_with?('.', '&.')
196
+
197
+ first_call = first_call_has_a_dot(node)
198
+ return false if first_call == node.receiver
199
+
200
+ dot = first_call.loc.dot
201
+ dot.line == node.first_line && dot.column == rhs.column
202
+ end
203
+
204
+ def check_regular_indentation(node, lhs, rhs, given_style)
91
205
  @base = alignment_base(node, rhs, given_style)
92
206
  correct_column = if @base
93
- @base.column + extra_indentation(given_style, node.parent)
207
+ parent = node.parent
208
+ parent = parent.parent if parent&.any_block_type?
209
+ @base.column + extra_indentation(given_style, parent)
94
210
  else
95
211
  indentation(lhs) + correct_indentation(node)
96
212
  end
213
+
214
+ calculate_column_delta_offense(rhs, correct_column)
215
+ end
216
+
217
+ def calculate_column_delta_offense(rhs, correct_column)
97
218
  @column_delta = correct_column - rhs.column
98
219
  rhs if @column_delta.nonzero?
99
220
  end
100
221
 
101
222
  def extra_indentation(given_style, parent)
102
- if given_style == :indented_relative_to_receiver
103
- if parent&.type?(:splat, :kwsplat)
104
- configured_indentation_width - parent.loc.operator.length
105
- else
106
- configured_indentation_width
107
- end
223
+ return 0 unless given_style == :indented_relative_to_receiver
224
+
225
+ if parent&.type?(:splat, :kwsplat)
226
+ configured_indentation_width - parent.loc.operator.length
108
227
  else
109
- 0
228
+ configured_indentation_width
110
229
  end
111
230
  end
112
231
 
@@ -125,7 +244,7 @@ module RuboCop
125
244
  end
126
245
 
127
246
  def should_align_with_base?
128
- @base && style != :indented_relative_to_receiver
247
+ @base && style == :aligned
129
248
  end
130
249
 
131
250
  def relative_to_receiver_message(rhs)
@@ -142,10 +261,16 @@ module RuboCop
142
261
  end
143
262
 
144
263
  def no_base_message(lhs, rhs, node)
145
- used_indentation = rhs.column - indentation(lhs)
264
+ if @hash_pair_base_column
265
+ used_indentation = rhs.column - @hash_pair_base_column
266
+ expected_indentation = configured_indentation_width
267
+ else
268
+ used_indentation = rhs.column - indentation(lhs)
269
+ expected_indentation = correct_indentation(node)
270
+ end
146
271
  what = operation_description(node, rhs)
147
272
 
148
- "Use #{correct_indentation(node)} (not #{used_indentation}) " \
273
+ "Use #{expected_indentation} (not #{used_indentation}) " \
149
274
  "spaces for indenting #{what} spanning multiple lines."
150
275
  end
151
276
 
@@ -153,8 +278,6 @@ module RuboCop
153
278
  case given_style
154
279
  when :aligned
155
280
  semantic_alignment_base(node, rhs) || syntactic_alignment_base(node, rhs)
156
- when :indented
157
- nil
158
281
  when :indented_relative_to_receiver
159
282
  receiver_alignment_base(node)
160
283
  end
@@ -182,7 +305,7 @@ module RuboCop
182
305
  return unless rhs.source.start_with?('.', '&.')
183
306
 
184
307
  node = semantic_alignment_node(node)
185
- return unless node&.loc&.selector && node.loc.dot
308
+ return unless node&.loc?(:selector) && node.loc.dot
186
309
 
187
310
  node.loc.dot.join(node.loc.selector)
188
311
  end
@@ -191,29 +314,55 @@ module RuboCop
191
314
  # .b
192
315
  # .c
193
316
  def receiver_alignment_base(node)
194
- node = node.receiver while node.receiver
195
- node = node.parent
196
- node = node.parent until node.loc.dot
317
+ hash_method_base = find_hash_method_base_in_receiver_chain(node)
318
+ return hash_method_base if hash_method_base
319
+
320
+ first_call = first_call_has_a_dot(node)
321
+ first_call.receiver.source_range
322
+ end
323
+
324
+ def find_hash_method_base_in_receiver_chain(node)
325
+ receiver_chain = unwrap_block_node(node.receiver)
326
+ while receiver_chain&.call_type?
327
+ base_receiver = unwrap_block_node(receiver_chain.receiver)
328
+ if alignment_base_for_chained_receiver?(receiver_chain, base_receiver)
329
+ return receiver_chain.loc.dot.join(receiver_chain.loc.selector)
330
+ end
331
+
332
+ receiver_chain = base_receiver
333
+ end
334
+ end
197
335
 
198
- node&.receiver&.source_range
336
+ def alignment_base_for_chained_receiver?(receiver_chain, base_receiver)
337
+ base_receiver&.hash_type? ||
338
+ method_on_receiver_last_line?(receiver_chain, base_receiver, :begin)
199
339
  end
200
340
 
201
341
  def semantic_alignment_node(node)
202
342
  return if argument_in_method_call(node, :with_parentheses)
203
343
 
204
- dot_right_above = get_dot_right_above(node)
205
- return dot_right_above if dot_right_above
206
-
207
- if (multiline_block_chain_node = find_multiline_block_chain_node(node))
208
- return multiline_block_chain_node
209
- end
344
+ get_dot_right_above(node) ||
345
+ find_multiline_block_chain_node(node) ||
346
+ first_call_alignment_node(node)
347
+ end
210
348
 
349
+ def first_call_alignment_node(node)
211
350
  node = first_call_has_a_dot(node)
351
+ base_receiver = find_base_receiver(node)
352
+
353
+ return node if method_on_receiver_last_line?(node, base_receiver, :array)
212
354
  return if node.loc.dot.line != node.first_line
355
+ return if method_on_receiver_last_line?(node, base_receiver, :begin)
213
356
 
214
357
  node
215
358
  end
216
359
 
360
+ def method_on_receiver_last_line?(node, base_receiver, type)
361
+ return false unless base_receiver
362
+
363
+ same_line?(node.loc.dot, base_receiver.source_range.end) && base_receiver.type?(type)
364
+ end
365
+
217
366
  def get_dot_right_above(node)
218
367
  node.each_ancestor.find do |a|
219
368
  dot = a.loc.dot if a.loc?(:dot)
@@ -224,23 +373,39 @@ module RuboCop
224
373
  end
225
374
 
226
375
  def find_multiline_block_chain_node(node)
227
- return unless (block_node = node.each_descendant(:any_block).first)
228
- return unless block_node.multiline? && block_node.parent.call_type?
376
+ return find_continuation_node(node) if node.block_node
229
377
 
230
- if node.receiver.call_type?
231
- node.receiver
232
- else
233
- block_node.parent
234
- end
378
+ handle_descendant_block(node)
379
+ end
380
+
381
+ def find_continuation_node(node)
382
+ receiver = node.receiver
383
+ return receiver.send_node if single_line_block_receiver?(receiver)
384
+ return unless receiver.call_type? && receiver.loc.dot
385
+ return receiver if receiver.receiver.begin_type? && node.block_node.single_line?
386
+ return unless receiver.loc.dot.line > receiver.receiver.last_line
387
+
388
+ receiver
389
+ end
390
+
391
+ def single_line_block_receiver?(receiver)
392
+ receiver.single_line? && receiver.any_block_type?
393
+ end
394
+
395
+ def handle_descendant_block(node)
396
+ receiver = node.receiver
397
+ return receiver.send_node if single_line_block_receiver?(receiver)
398
+
399
+ block_node = node.each_descendant(:any_block).first
400
+ return unless block_node&.multiline?
401
+
402
+ receiver.call_type? ? receiver : block_node.parent
235
403
  end
236
404
 
237
405
  def first_call_has_a_dot(node)
238
- # descend to root of method chain
239
- node = node.receiver while node.receiver
240
- # ascend to first call which has a dot
241
- node = node.parent
406
+ base = find_base_receiver(node)
407
+ node = base.parent
242
408
  node = node.parent until node.loc?(:dot)
243
-
244
409
  node
245
410
  end
246
411
 
@@ -102,10 +102,12 @@ module RuboCop
102
102
  return true if begins_its_line?(assignment_rhs.source_range)
103
103
  end
104
104
 
105
- given_style == :aligned &&
106
- (kw_node_with_special_indentation(node) ||
107
- assignment_node ||
108
- argument_in_method_call(node, :with_or_without_parentheses))
105
+ return false unless given_style == :aligned
106
+ return true if kw_node_with_special_indentation(node) || assignment_node
107
+
108
+ node = argument_in_method_call(node, :with_or_without_parentheses)
109
+
110
+ node.respond_to?(:def_modifier?) && !node.def_modifier?
109
111
  end
110
112
 
111
113
  def message(node, lhs, rhs)
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Layout
6
- # Check that the parameters on a multi-line method call or definition are aligned.
6
+ # Checks that the parameters on a multi-line method call or definition are aligned.
7
7
  #
8
8
  # To set the alignment of the first argument, use the
9
9
  # `Layout/FirstParameterIndentation` cop.
@@ -114,7 +114,7 @@ module RuboCop
114
114
 
115
115
  def other_cop_takes_precedence?(node)
116
116
  single_line_block_chain_enabled? && any_descendant?(node, :any_block) do |block_node|
117
- block_node.parent.send_type? && block_node.parent.loc.dot && !block_node.multiline?
117
+ block_node.parent.send_type? && block_node.parent.loc.dot && block_node.single_line?
118
118
  end
119
119
  end
120
120
 
@@ -29,7 +29,7 @@ module RuboCop
29
29
  MSG = '`%<kw_loc>s` at %<kw_loc_line>d, %<kw_loc_column>d is not ' \
30
30
  'aligned with `%<beginning>s` at ' \
31
31
  '%<begin_loc_line>d, %<begin_loc_column>d.'
32
- ANCESTOR_TYPES = %i[kwbegin any_def class module any_block].freeze
32
+ ANCESTOR_TYPES = %i[kwbegin any_def class module sclass any_block].freeze
33
33
  ALTERNATIVE_ACCESS_MODIFIERS = %i[public_class_method private_class_method].freeze
34
34
 
35
35
  def on_resbody(node)
@@ -91,7 +91,7 @@ module RuboCop
91
91
  )
92
92
  end
93
93
 
94
- # rubocop:disable Metrics/AbcSize
94
+ # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
95
95
  def alignment_source(node, starting_loc)
96
96
  ending_loc =
97
97
  case node.type
@@ -100,6 +100,8 @@ module RuboCop
100
100
  when :def, :defs, :class, :module,
101
101
  :lvasgn, :ivasgn, :cvasgn, :gvasgn, :casgn
102
102
  node.loc.name
103
+ when :sclass
104
+ node.identifier.source_range
103
105
  when :masgn
104
106
  node.lhs.source_range
105
107
  else
@@ -109,7 +111,7 @@ module RuboCop
109
111
 
110
112
  range_between(starting_loc.begin_pos, ending_loc.end_pos).source
111
113
  end
112
- # rubocop:enable Metrics/AbcSize
114
+ # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
113
115
 
114
116
  # We will use ancestor or wrapper with access modifier.
115
117
 
@@ -194,6 +196,14 @@ module RuboCop
194
196
  def alignment_location(alignment_node)
195
197
  if begin_end_alignment_style == 'start_of_line'
196
198
  start_line_range(alignment_node)
199
+ elsif alignment_node.any_block_type?
200
+ # If the alignment node is a block, the `rescue`/`ensure` keyword should
201
+ # be aligned to the start of the block. It is possible that the block's
202
+ # `send_node` spans multiple lines, in which case it should align to the
203
+ # start of the last line.
204
+ send_node = alignment_node.send_node
205
+ range = processed_source.buffer.line_range(send_node.last_line)
206
+ range.adjust(begin_pos: range.source =~ /\S/)
197
207
  else
198
208
  alignment_node.source_range
199
209
  end
@@ -23,16 +23,8 @@ module RuboCop
23
23
  cfg['EnforcedStyle'] || 'space'
24
24
  end
25
25
 
26
- def kind(token)
27
- 'comma' if token.comma? && !before_semicolon?(token)
28
- end
29
-
30
- private
31
-
32
- def before_semicolon?(token)
33
- tokens = processed_source.tokens
34
-
35
- tokens[tokens.index(token) + 1].semicolon?
26
+ def kind(token, next_token)
27
+ 'comma' if token.comma? && !next_token.semicolon?
36
28
  end
37
29
  end
38
30
  end
@@ -20,7 +20,7 @@ module RuboCop
20
20
  cfg['EnforcedStyle'] || 'space'
21
21
  end
22
22
 
23
- def kind(token)
23
+ def kind(token, _next_token)
24
24
  'semicolon' if token.semicolon?
25
25
  end
26
26
 
@@ -29,7 +29,7 @@ module RuboCop
29
29
  include RangeHelp
30
30
  extend AutoCorrector
31
31
 
32
- def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler
32
+ def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler, InternalAffairs/ItblockHandler
33
33
  arguments = node.arguments
34
34
 
35
35
  return unless node.arguments? && pipes?(arguments)
@@ -47,9 +47,11 @@ module RuboCop
47
47
  check(node, [:operator].freeze) if node.keyword?
48
48
  end
49
49
 
50
- def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler
50
+ def on_block(node)
51
51
  check(node, %i[begin end].freeze)
52
52
  end
53
+ alias on_numblock on_block
54
+ alias on_itblock on_block
53
55
 
54
56
  def on_break(node)
55
57
  check(node, [:keyword].freeze)
@@ -167,7 +169,7 @@ module RuboCop
167
169
 
168
170
  def check(node, locations, begin_keyword = DO)
169
171
  locations.each do |loc|
170
- next unless node.loc.respond_to?(loc)
172
+ next unless node.loc?(loc)
171
173
 
172
174
  range = node.loc.public_send(loc)
173
175
  next unless range
@@ -7,18 +7,18 @@ module RuboCop
7
7
  # parenthesis (`(`) in lambda literals.
8
8
  #
9
9
  # @example EnforcedStyle: require_no_space (default)
10
- # # bad
11
- # a = -> (x, y) { x + y }
10
+ # # bad
11
+ # a = -> (x, y) { x + y }
12
12
  #
13
- # # good
14
- # a = ->(x, y) { x + y }
13
+ # # good
14
+ # a = ->(x, y) { x + y }
15
15
  #
16
16
  # @example EnforcedStyle: require_space
17
- # # bad
18
- # a = ->(x, y) { x + y }
17
+ # # bad
18
+ # a = ->(x, y) { x + y }
19
19
  #
20
- # # good
21
- # a = -> (x, y) { x + y }
20
+ # # good
21
+ # a = -> (x, y) { x + y }
22
22
  class SpaceInLambdaLiteral < Base
23
23
  include ConfigurableEnforcedStyle
24
24
  include RangeHelp
@@ -26,6 +26,7 @@ module RuboCop
26
26
 
27
27
  MSG_REQUIRE_SPACE = 'Use a space between `->` and `(` in lambda literals.'
28
28
  MSG_REQUIRE_NO_SPACE = 'Do not use spaces between `->` and `(` in lambda literals.'
29
+ RESTRICT_ON_SEND = %i[lambda].freeze
29
30
 
30
31
  def on_send(node)
31
32
  return unless arrow_lambda_with_args?(node)
@@ -113,7 +113,7 @@ module RuboCop
113
113
  return [] unless ast
114
114
 
115
115
  heredocs = []
116
- ast.each_node(:str, :dstr, :xstr) do |node|
116
+ ast.each_node(:any_str) do |node|
117
117
  next unless node.heredoc?
118
118
 
119
119
  body = node.location.heredoc_body
@@ -35,6 +35,26 @@ module RuboCop
35
35
  # def cook(dry_ingredients = self.dry_ingredients)
36
36
  # dry_ingredients.combine
37
37
  # end
38
+ #
39
+ # # bad
40
+ # def foo(pie = pie = pie)
41
+ # pie.heat_up
42
+ # end
43
+ #
44
+ # # good
45
+ # def foo(pie)
46
+ # pie.heat_up
47
+ # end
48
+ #
49
+ # # bad
50
+ # def foo(pie = cake = pie)
51
+ # [pie, cake].each(&:heat_up)
52
+ # end
53
+ #
54
+ # # good
55
+ # def foo(cake = pie)
56
+ # [pie, cake].each(&:heat_up)
57
+ # end
38
58
  class CircularArgumentReference < Base
39
59
  extend TargetRubyVersion
40
60
 
@@ -51,11 +71,35 @@ module RuboCop
51
71
  private
52
72
 
53
73
  def check_for_circular_argument_references(arg_name, arg_value)
54
- return unless arg_value.lvar_type?
55
- return unless arg_value.to_a == [arg_name]
74
+ if arg_value.lvar_type? && arg_value.to_a == [arg_name]
75
+ add_offense(arg_value, message: format(MSG, arg_name: arg_name))
76
+
77
+ return
78
+ end
79
+
80
+ check_assignment_chain(arg_name, arg_value)
81
+ end
82
+
83
+ # rubocop:disable Metrics/AbcSize
84
+ def check_assignment_chain(arg_name, node)
85
+ return unless node.lvasgn_type?
86
+
87
+ seen_variables = Set[]
88
+ current_node = node
89
+
90
+ while current_node.lvasgn_type?
91
+ seen_variables << current_node.children.first if current_node.lvasgn_type?
92
+ current_node = current_node.children.last
93
+ end
94
+
95
+ return unless current_node.lvar_type?
96
+
97
+ variable_node = current_node.children.first
98
+ return unless seen_variables.include?(variable_node) || variable_node == arg_name
56
99
 
57
- add_offense(arg_value, message: format(MSG, arg_name: arg_name))
100
+ add_offense(current_node, message: format(MSG, arg_name: arg_name))
58
101
  end
102
+ # rubocop:enable Metrics/AbcSize
59
103
  end
60
104
  end
61
105
  end
@@ -31,7 +31,7 @@ module RuboCop
31
31
 
32
32
  # @!method overwritten_constant(node)
33
33
  def_node_matcher :overwritten_constant, <<~PATTERN
34
- (resbody nil? (casgn nil? $_) nil?)
34
+ (resbody nil? $(casgn _ _) nil?)
35
35
  PATTERN
36
36
 
37
37
  def self.autocorrect_incompatible_with
@@ -41,7 +41,8 @@ module RuboCop
41
41
  def on_resbody(node)
42
42
  return unless (constant = overwritten_constant(node))
43
43
 
44
- add_offense(node.loc.assoc, message: format(MSG, constant: constant)) do |corrector|
44
+ message = format(MSG, constant: constant.source)
45
+ add_offense(node.loc.assoc, message: message) do |corrector|
45
46
  corrector.remove(range_between(node.loc.keyword.end_pos, node.loc.assoc.end_pos))
46
47
  end
47
48
  end