rubocop 1.12.1 → 1.13.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 (395) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -2
  3. data/config/default.yml +10 -0
  4. data/exe/rubocop +1 -3
  5. data/lib/rubocop.rb +1 -1
  6. data/lib/rubocop/cached_data.rb +1 -3
  7. data/lib/rubocop/cli.rb +4 -6
  8. data/lib/rubocop/cli/command/auto_genenerate_config.rb +9 -19
  9. data/lib/rubocop/cli/command/init_dotfile.rb +1 -3
  10. data/lib/rubocop/cli/command/show_cops.rb +1 -4
  11. data/lib/rubocop/comment_config.rb +2 -7
  12. data/lib/rubocop/config.rb +11 -26
  13. data/lib/rubocop/config_loader.rb +5 -11
  14. data/lib/rubocop/config_loader_resolver.rb +22 -14
  15. data/lib/rubocop/config_obsoletion/cop_rule.rb +1 -2
  16. data/lib/rubocop/config_store.rb +1 -2
  17. data/lib/rubocop/config_validator.rb +5 -10
  18. data/lib/rubocop/cop/autocorrect_logic.rb +3 -8
  19. data/lib/rubocop/cop/badge.rb +1 -2
  20. data/lib/rubocop/cop/base.rb +8 -6
  21. data/lib/rubocop/cop/bundler/duplicated_gem.rb +1 -2
  22. data/lib/rubocop/cop/bundler/gem_comment.rb +42 -8
  23. data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -4
  24. data/lib/rubocop/cop/commissioner.rb +2 -8
  25. data/lib/rubocop/cop/cop.rb +4 -18
  26. data/lib/rubocop/cop/corrector.rb +1 -4
  27. data/lib/rubocop/cop/correctors/alignment_corrector.rb +3 -6
  28. data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +2 -4
  29. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +1 -2
  30. data/lib/rubocop/cop/correctors/line_break_corrector.rb +3 -6
  31. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +1 -3
  32. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +1 -3
  33. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -8
  34. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +1 -2
  35. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -4
  36. data/lib/rubocop/cop/generator.rb +1 -4
  37. data/lib/rubocop/cop/generator/configuration_injector.rb +1 -2
  38. data/lib/rubocop/cop/generator/require_file_injector.rb +2 -5
  39. data/lib/rubocop/cop/internal_affairs/example_description.rb +6 -4
  40. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +2 -5
  41. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -3
  42. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -3
  43. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +1 -2
  44. data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +1 -2
  45. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +1 -3
  46. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -2
  47. data/lib/rubocop/cop/layout/argument_alignment.rb +2 -4
  48. data/lib/rubocop/cop/layout/assignment_indentation.rb +2 -4
  49. data/lib/rubocop/cop/layout/begin_end_alignment.rb +1 -4
  50. data/lib/rubocop/cop/layout/block_alignment.rb +7 -19
  51. data/lib/rubocop/cop/layout/case_indentation.rb +1 -3
  52. data/lib/rubocop/cop/layout/class_structure.rb +4 -10
  53. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +4 -15
  54. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -5
  55. data/lib/rubocop/cop/layout/def_end_alignment.rb +2 -6
  56. data/lib/rubocop/cop/layout/dot_position.rb +1 -3
  57. data/lib/rubocop/cop/layout/else_alignment.rb +1 -3
  58. data/lib/rubocop/cop/layout/empty_comment.rb +5 -12
  59. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +2 -5
  60. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +2 -6
  61. data/lib/rubocop/cop/layout/empty_lines.rb +1 -3
  62. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +8 -18
  63. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +2 -8
  64. data/lib/rubocop/cop/layout/end_alignment.rb +1 -2
  65. data/lib/rubocop/cop/layout/end_of_line.rb +1 -1
  66. data/lib/rubocop/cop/layout/extra_spacing.rb +3 -7
  67. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +1 -2
  68. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -2
  69. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -5
  70. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -2
  71. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -2
  72. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +1 -2
  73. data/lib/rubocop/cop/layout/hash_alignment.rb +3 -6
  74. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -9
  75. data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -6
  76. data/lib/rubocop/cop/layout/indentation_style.rb +1 -3
  77. data/lib/rubocop/cop/layout/indentation_width.rb +1 -2
  78. data/lib/rubocop/cop/layout/initial_indentation.rb +1 -4
  79. data/lib/rubocop/cop/layout/line_length.rb +4 -15
  80. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +1 -2
  81. data/lib/rubocop/cop/layout/multiline_block_layout.rb +7 -15
  82. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -2
  83. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -2
  84. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -10
  85. data/lib/rubocop/cop/layout/redundant_line_break.rb +125 -0
  86. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +3 -6
  87. data/lib/rubocop/cop/layout/space_after_colon.rb +1 -3
  88. data/lib/rubocop/cop/layout/space_after_method_name.rb +2 -4
  89. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +6 -14
  90. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +1 -2
  91. data/lib/rubocop/cop/layout/space_around_keyword.rb +3 -6
  92. data/lib/rubocop/cop/layout/space_around_operators.rb +4 -9
  93. data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -2
  94. data/lib/rubocop/cop/layout/space_before_brackets.rb +1 -3
  95. data/lib/rubocop/cop/layout/space_before_comment.rb +1 -3
  96. data/lib/rubocop/cop/layout/space_before_first_arg.rb +5 -11
  97. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +2 -4
  98. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +5 -10
  99. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +2 -7
  100. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +5 -10
  101. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +1 -2
  102. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +1 -2
  103. data/lib/rubocop/cop/legacy/corrections_proxy.rb +2 -8
  104. data/lib/rubocop/cop/legacy/corrector.rb +1 -3
  105. data/lib/rubocop/cop/lint/ambiguous_assignment.rb +1 -6
  106. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +14 -7
  107. data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -2
  108. data/lib/rubocop/cop/lint/constant_resolution.rb +1 -2
  109. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +2 -4
  110. data/lib/rubocop/cop/lint/deprecated_constants.rb +3 -3
  111. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +2 -5
  112. data/lib/rubocop/cop/lint/duplicate_branch.rb +1 -2
  113. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -3
  114. data/lib/rubocop/cop/lint/duplicate_methods.rb +3 -7
  115. data/lib/rubocop/cop/lint/else_layout.rb +1 -3
  116. data/lib/rubocop/cop/lint/empty_ensure.rb +1 -3
  117. data/lib/rubocop/cop/lint/empty_file.rb +1 -3
  118. data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -3
  119. data/lib/rubocop/cop/lint/ensure_return.rb +1 -3
  120. data/lib/rubocop/cop/lint/erb_new_arguments.rb +3 -7
  121. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -2
  122. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +3 -6
  123. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +1 -2
  124. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -2
  125. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +3 -7
  126. data/lib/rubocop/cop/lint/inherit_exception.rb +1 -2
  127. data/lib/rubocop/cop/lint/interpolation_check.rb +3 -11
  128. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +3 -6
  129. data/lib/rubocop/cop/lint/loop.rb +1 -2
  130. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +3 -7
  131. data/lib/rubocop/cop/lint/missing_super.rb +1 -2
  132. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -2
  133. data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -2
  134. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -3
  135. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +1 -3
  136. data/lib/rubocop/cop/lint/number_conversion.rb +1 -2
  137. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +1 -2
  138. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +1 -3
  139. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -3
  140. data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -3
  141. data/lib/rubocop/cop/lint/raise_exception.rb +1 -2
  142. data/lib/rubocop/cop/lint/rand_one.rb +1 -2
  143. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +8 -20
  144. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +1 -3
  145. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +3 -7
  146. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +1 -2
  147. data/lib/rubocop/cop/lint/redundant_with_index.rb +1 -4
  148. data/lib/rubocop/cop/lint/redundant_with_object.rb +1 -4
  149. data/lib/rubocop/cop/lint/regexp_as_condition.rb +1 -3
  150. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -4
  151. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -2
  152. data/lib/rubocop/cop/lint/rescue_type.rb +2 -7
  153. data/lib/rubocop/cop/lint/return_in_void_context.rb +1 -2
  154. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +1 -2
  155. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +4 -10
  156. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -2
  157. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +2 -7
  158. data/lib/rubocop/cop/lint/shadowed_argument.rb +4 -11
  159. data/lib/rubocop/cop/lint/shadowed_exception.rb +7 -8
  160. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -2
  161. data/lib/rubocop/cop/lint/symbol_conversion.rb +2 -4
  162. data/lib/rubocop/cop/lint/syntax.rb +1 -3
  163. data/lib/rubocop/cop/lint/to_json.rb +1 -2
  164. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1 -3
  165. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +1 -3
  166. data/lib/rubocop/cop/lint/unreachable_code.rb +2 -5
  167. data/lib/rubocop/cop/lint/unreachable_loop.rb +2 -5
  168. data/lib/rubocop/cop/lint/unused_block_argument.rb +4 -8
  169. data/lib/rubocop/cop/lint/unused_method_argument.rb +1 -2
  170. data/lib/rubocop/cop/lint/useless_access_modifier.rb +2 -4
  171. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -9
  172. data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -3
  173. data/lib/rubocop/cop/lint/void.rb +4 -11
  174. data/lib/rubocop/cop/message_annotator.rb +1 -3
  175. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -7
  176. data/lib/rubocop/cop/metrics/class_length.rb +1 -3
  177. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -2
  178. data/lib/rubocop/cop/metrics/module_length.rb +2 -6
  179. data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -5
  180. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -2
  181. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +4 -7
  182. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +2 -7
  183. data/lib/rubocop/cop/migration/department_name.rb +3 -7
  184. data/lib/rubocop/cop/mixin/alignment.rb +2 -4
  185. data/lib/rubocop/cop/mixin/code_length.rb +1 -3
  186. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +2 -2
  187. data/lib/rubocop/cop/mixin/configurable_formatting.rb +3 -8
  188. data/lib/rubocop/cop/mixin/def_node.rb +2 -5
  189. data/lib/rubocop/cop/mixin/documentation_comment.rb +2 -5
  190. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +3 -7
  191. data/lib/rubocop/cop/mixin/empty_parameter.rb +1 -3
  192. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -3
  193. data/lib/rubocop/cop/mixin/enforce_superclass.rb +2 -6
  194. data/lib/rubocop/cop/mixin/first_element_line_break.rb +1 -3
  195. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +3 -9
  196. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +3 -6
  197. data/lib/rubocop/cop/mixin/hash_transform_method.rb +7 -22
  198. data/lib/rubocop/cop/mixin/interpolation.rb +1 -3
  199. data/lib/rubocop/cop/mixin/line_length_help.rb +2 -4
  200. data/lib/rubocop/cop/mixin/match_range.rb +2 -5
  201. data/lib/rubocop/cop/mixin/method_complexity.rb +1 -3
  202. data/lib/rubocop/cop/mixin/method_preference.rb +1 -2
  203. data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +1 -2
  204. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +1 -3
  205. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +7 -17
  206. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -2
  207. data/lib/rubocop/cop/mixin/negative_conditional.rb +1 -2
  208. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -4
  209. data/lib/rubocop/cop/mixin/percent_array.rb +1 -3
  210. data/lib/rubocop/cop/mixin/percent_literal.rb +0 -6
  211. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +5 -11
  212. data/lib/rubocop/cop/mixin/preferred_delimiters.rb +3 -6
  213. data/lib/rubocop/cop/mixin/range_help.rb +10 -13
  214. data/lib/rubocop/cop/mixin/rescue_node.rb +2 -6
  215. data/lib/rubocop/cop/mixin/safe_assignment.rb +1 -2
  216. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +2 -4
  217. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -2
  218. data/lib/rubocop/cop/mixin/statement_modifier.rb +1 -3
  219. data/lib/rubocop/cop/mixin/trailing_body.rb +1 -2
  220. data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -2
  221. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +3 -7
  222. data/lib/rubocop/cop/mixin/unused_argument.rb +1 -3
  223. data/lib/rubocop/cop/naming/ascii_identifiers.rb +2 -4
  224. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -2
  225. data/lib/rubocop/cop/naming/file_name.rb +7 -16
  226. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -3
  227. data/lib/rubocop/cop/naming/method_name.rb +1 -2
  228. data/lib/rubocop/cop/naming/predicate_name.rb +1 -2
  229. data/lib/rubocop/cop/offense.rb +3 -8
  230. data/lib/rubocop/cop/registry.rb +3 -11
  231. data/lib/rubocop/cop/style/access_modifier_declarations.rb +1 -3
  232. data/lib/rubocop/cop/style/accessor_grouping.rb +1 -3
  233. data/lib/rubocop/cop/style/alias.rb +5 -12
  234. data/lib/rubocop/cop/style/arguments_forwarding.rb +1 -3
  235. data/lib/rubocop/cop/style/ascii_comments.rb +1 -2
  236. data/lib/rubocop/cop/style/attr.rb +1 -3
  237. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +2 -5
  238. data/lib/rubocop/cop/style/bisected_attr_accessor/macro.rb +1 -3
  239. data/lib/rubocop/cop/style/case_like_if.rb +1 -2
  240. data/lib/rubocop/cop/style/character_literal.rb +2 -4
  241. data/lib/rubocop/cop/style/class_and_module_children.rb +3 -6
  242. data/lib/rubocop/cop/style/class_methods.rb +1 -3
  243. data/lib/rubocop/cop/style/collection_compact.rb +1 -3
  244. data/lib/rubocop/cop/style/colon_method_call.rb +1 -3
  245. data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
  246. data/lib/rubocop/cop/style/command_literal.rb +3 -8
  247. data/lib/rubocop/cop/style/comment_annotation.rb +3 -6
  248. data/lib/rubocop/cop/style/commented_keyword.rb +2 -8
  249. data/lib/rubocop/cop/style/conditional_assignment.rb +10 -24
  250. data/lib/rubocop/cop/style/copyright.rb +3 -6
  251. data/lib/rubocop/cop/style/date_time.rb +2 -5
  252. data/lib/rubocop/cop/style/def_with_parentheses.rb +1 -2
  253. data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -2
  254. data/lib/rubocop/cop/style/empty_case_condition.rb +2 -7
  255. data/lib/rubocop/cop/style/empty_else.rb +3 -9
  256. data/lib/rubocop/cop/style/empty_literal.rb +4 -8
  257. data/lib/rubocop/cop/style/empty_method.rb +3 -7
  258. data/lib/rubocop/cop/style/end_block.rb +1 -2
  259. data/lib/rubocop/cop/style/endless_method.rb +1 -3
  260. data/lib/rubocop/cop/style/eval_with_location.rb +2 -4
  261. data/lib/rubocop/cop/style/expand_path_arguments.rb +1 -3
  262. data/lib/rubocop/cop/style/explicit_block_argument.rb +1 -4
  263. data/lib/rubocop/cop/style/format_string_token.rb +1 -4
  264. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -8
  265. data/lib/rubocop/cop/style/guard_clause.rb +3 -7
  266. data/lib/rubocop/cop/style/hash_conversion.rb +28 -3
  267. data/lib/rubocop/cop/style/hash_each_methods.rb +1 -2
  268. data/lib/rubocop/cop/style/hash_like_case.rb +1 -2
  269. data/lib/rubocop/cop/style/hash_syntax.rb +4 -9
  270. data/lib/rubocop/cop/style/identical_conditional_branches.rb +1 -3
  271. data/lib/rubocop/cop/style/if_unless_modifier.rb +41 -13
  272. data/lib/rubocop/cop/style/infinite_loop.rb +2 -5
  273. data/lib/rubocop/cop/style/inverse_methods.rb +3 -7
  274. data/lib/rubocop/cop/style/ip_addresses.rb +1 -2
  275. data/lib/rubocop/cop/style/lambda.rb +2 -4
  276. data/lib/rubocop/cop/style/lambda_call.rb +1 -2
  277. data/lib/rubocop/cop/style/line_end_concatenation.rb +5 -12
  278. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +1 -1
  279. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +7 -13
  280. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +1 -2
  281. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -4
  282. data/lib/rubocop/cop/style/method_def_parentheses.rb +4 -8
  283. data/lib/rubocop/cop/style/min_max.rb +1 -2
  284. data/lib/rubocop/cop/style/missing_else.rb +2 -4
  285. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +1 -2
  286. data/lib/rubocop/cop/style/mixin_grouping.rb +4 -10
  287. data/lib/rubocop/cop/style/mixin_usage.rb +1 -2
  288. data/lib/rubocop/cop/style/module_function.rb +3 -6
  289. data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -2
  290. data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -3
  291. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +1 -2
  292. data/lib/rubocop/cop/style/multiple_comparison.rb +2 -4
  293. data/lib/rubocop/cop/style/mutable_constant.rb +4 -10
  294. data/lib/rubocop/cop/style/negated_if.rb +1 -2
  295. data/lib/rubocop/cop/style/negated_unless.rb +1 -2
  296. data/lib/rubocop/cop/style/nested_modifier.rb +3 -7
  297. data/lib/rubocop/cop/style/nested_ternary_operator.rb +2 -3
  298. data/lib/rubocop/cop/style/next.rb +4 -9
  299. data/lib/rubocop/cop/style/non_nil_check.rb +2 -5
  300. data/lib/rubocop/cop/style/numeric_literals.rb +3 -11
  301. data/lib/rubocop/cop/style/numeric_predicate.rb +2 -7
  302. data/lib/rubocop/cop/style/one_line_conditional.rb +1 -2
  303. data/lib/rubocop/cop/style/option_hash.rb +1 -3
  304. data/lib/rubocop/cop/style/optional_arguments.rb +2 -5
  305. data/lib/rubocop/cop/style/or_assignment.rb +2 -6
  306. data/lib/rubocop/cop/style/parallel_assignment.rb +6 -9
  307. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -3
  308. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -2
  309. data/lib/rubocop/cop/style/perl_backrefs.rb +2 -9
  310. data/lib/rubocop/cop/style/preferred_hash_methods.rb +1 -4
  311. data/lib/rubocop/cop/style/proc.rb +1 -2
  312. data/lib/rubocop/cop/style/raise_args.rb +4 -8
  313. data/lib/rubocop/cop/style/random_with_offset.rb +3 -8
  314. data/lib/rubocop/cop/style/redundant_argument.rb +2 -11
  315. data/lib/rubocop/cop/style/redundant_assignment.rb +1 -3
  316. data/lib/rubocop/cop/style/redundant_begin.rb +4 -4
  317. data/lib/rubocop/cop/style/redundant_capital_w.rb +1 -2
  318. data/lib/rubocop/cop/style/redundant_condition.rb +2 -5
  319. data/lib/rubocop/cop/style/redundant_conditional.rb +3 -6
  320. data/lib/rubocop/cop/style/redundant_exception.rb +3 -6
  321. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -1
  322. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -2
  323. data/lib/rubocop/cop/style/redundant_interpolation.rb +1 -2
  324. data/lib/rubocop/cop/style/redundant_parentheses.rb +8 -20
  325. data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -2
  326. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -4
  327. data/lib/rubocop/cop/style/redundant_return.rb +3 -5
  328. data/lib/rubocop/cop/style/redundant_self.rb +2 -6
  329. data/lib/rubocop/cop/style/redundant_self_assignment.rb +2 -2
  330. data/lib/rubocop/cop/style/redundant_sort.rb +2 -5
  331. data/lib/rubocop/cop/style/regexp_literal.rb +4 -8
  332. data/lib/rubocop/cop/style/rescue_modifier.rb +4 -0
  333. data/lib/rubocop/cop/style/rescue_standard_error.rb +3 -7
  334. data/lib/rubocop/cop/style/return_nil.rb +1 -2
  335. data/lib/rubocop/cop/style/safe_navigation.rb +10 -21
  336. data/lib/rubocop/cop/style/send.rb +1 -2
  337. data/lib/rubocop/cop/style/signal_exception.rb +3 -7
  338. data/lib/rubocop/cop/style/single_argument_dig.rb +1 -2
  339. data/lib/rubocop/cop/style/single_line_block_params.rb +2 -5
  340. data/lib/rubocop/cop/style/single_line_methods.rb +15 -4
  341. data/lib/rubocop/cop/style/sole_nested_conditional.rb +1 -2
  342. data/lib/rubocop/cop/style/special_global_vars.rb +6 -18
  343. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -2
  344. data/lib/rubocop/cop/style/stderr_puts.rb +2 -6
  345. data/lib/rubocop/cop/style/string_chars.rb +2 -1
  346. data/lib/rubocop/cop/style/string_concatenation.rb +8 -10
  347. data/lib/rubocop/cop/style/string_literals.rb +2 -5
  348. data/lib/rubocop/cop/style/struct_inheritance.rb +9 -1
  349. data/lib/rubocop/cop/style/symbol_literal.rb +1 -3
  350. data/lib/rubocop/cop/style/symbol_proc.rb +4 -9
  351. data/lib/rubocop/cop/style/ternary_parentheses.rb +3 -6
  352. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +1 -2
  353. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +2 -6
  354. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +2 -5
  355. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -10
  356. data/lib/rubocop/cop/style/trivial_accessors.rb +2 -4
  357. data/lib/rubocop/cop/style/unless_else.rb +1 -2
  358. data/lib/rubocop/cop/style/unless_logical_operators.rb +2 -2
  359. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -1
  360. data/lib/rubocop/cop/style/when_then.rb +1 -3
  361. data/lib/rubocop/cop/style/while_until_modifier.rb +1 -2
  362. data/lib/rubocop/cop/style/word_array.rb +1 -2
  363. data/lib/rubocop/cop/style/yoda_condition.rb +3 -11
  364. data/lib/rubocop/cop/style/zero_length_predicate.rb +1 -2
  365. data/lib/rubocop/cop/team.rb +2 -5
  366. data/lib/rubocop/cop/util.rb +4 -10
  367. data/lib/rubocop/cop/utils/format_string.rb +1 -3
  368. data/lib/rubocop/cop/variable_force.rb +6 -15
  369. data/lib/rubocop/cop/variable_force/assignment.rb +1 -2
  370. data/lib/rubocop/cop/variable_force/branch.rb +1 -2
  371. data/lib/rubocop/cop/variable_force/reference.rb +1 -3
  372. data/lib/rubocop/cop/variable_force/scope.rb +4 -8
  373. data/lib/rubocop/cop/variable_force/variable.rb +2 -4
  374. data/lib/rubocop/cops_documentation_generator.rb +7 -21
  375. data/lib/rubocop/file_finder.rb +1 -3
  376. data/lib/rubocop/formatter/disabled_config_formatter.rb +3 -8
  377. data/lib/rubocop/formatter/git_hub_actions_formatter.rb +1 -5
  378. data/lib/rubocop/formatter/html_formatter.rb +4 -10
  379. data/lib/rubocop/formatter/json_formatter.rb +1 -5
  380. data/lib/rubocop/formatter/junit_formatter.rb +3 -9
  381. data/lib/rubocop/formatter/progress_formatter.rb +1 -3
  382. data/lib/rubocop/options.rb +27 -41
  383. data/lib/rubocop/path_util.rb +1 -3
  384. data/lib/rubocop/rake_task.rb +3 -0
  385. data/lib/rubocop/remote_config.rb +4 -7
  386. data/lib/rubocop/result_cache.rb +5 -12
  387. data/lib/rubocop/rspec/cop_helper.rb +1 -1
  388. data/lib/rubocop/rspec/expect_offense.rb +4 -9
  389. data/lib/rubocop/rspec/shared_contexts.rb +4 -15
  390. data/lib/rubocop/runner.rb +7 -14
  391. data/lib/rubocop/target_finder.rb +11 -16
  392. data/lib/rubocop/target_ruby.rb +4 -8
  393. data/lib/rubocop/version.rb +1 -1
  394. metadata +5 -5
  395. data/lib/rubocop/core_ext/hash.rb +0 -20
@@ -19,10 +19,8 @@ module RuboCop
19
19
  include RangeHelp
20
20
  extend AutoCorrector
21
21
 
22
- MSG = 'Include a copyright notice matching /%<notice>s/ before ' \
23
- 'any code.'
24
- AUTOCORRECT_EMPTY_WARNING = 'An AutocorrectNotice must be defined in ' \
25
- 'your RuboCop config'
22
+ MSG = 'Include a copyright notice matching /%<notice>s/ before any code.'
23
+ AUTOCORRECT_EMPTY_WARNING = 'An AutocorrectNotice must be defined in your RuboCop config'
26
24
 
27
25
  def on_new_investigation
28
26
  return if notice.empty? || notice_found?(processed_source)
@@ -57,8 +55,7 @@ module RuboCop
57
55
  regex = Regexp.new(notice)
58
56
  return if autocorrect_notice&.match?(regex)
59
57
 
60
- raise Warning, "AutocorrectNotice '#{autocorrect_notice}' must " \
61
- "match Notice /#{notice}/"
58
+ raise Warning, "AutocorrectNotice '#{autocorrect_notice}' must match Notice /#{notice}/"
62
59
  end
63
60
 
64
61
  def insert_notice_before(processed_source)
@@ -63,15 +63,12 @@ module RuboCop
63
63
  PATTERN
64
64
 
65
65
  def on_send(node)
66
- return unless date_time?(node) ||
67
- (to_datetime?(node) && disallow_coercion?)
66
+ return unless date_time?(node) || (to_datetime?(node) && disallow_coercion?)
68
67
  return if historic_date?(node)
69
68
 
70
69
  message = to_datetime?(node) ? COERCION_MSG : CLASS_MSG
71
70
 
72
- add_offense(node, message: message) do |corrector|
73
- autocorrect(corrector, node)
74
- end
71
+ add_offense(node, message: message) { |corrector| autocorrect(corrector, node) }
75
72
  end
76
73
 
77
74
  private
@@ -36,8 +36,7 @@ module RuboCop
36
36
  class DefWithParentheses < Base
37
37
  extend AutoCorrector
38
38
 
39
- MSG = "Omit the parentheses in defs when the method doesn't accept " \
40
- 'any arguments.'
39
+ MSG = "Omit the parentheses in defs when the method doesn't accept any arguments."
41
40
 
42
41
  def on_def(node)
43
42
  return if node.single_line?
@@ -25,8 +25,7 @@ module RuboCop
25
25
  class EachForSimpleLoop < Base
26
26
  extend AutoCorrector
27
27
 
28
- MSG = 'Use `Integer#times` for a simple loop which iterates a fixed ' \
29
- 'number of times.'
28
+ MSG = 'Use `Integer#times` for a simple loop which iterates a fixed number of times.'
30
29
 
31
30
  def on_block(node)
32
31
  return unless offending_each_range(node)
@@ -44,19 +44,14 @@ module RuboCop
44
44
  def on_case(case_node)
45
45
  return if case_node.condition
46
46
 
47
- branch_bodies = [
48
- *case_node.when_branches.map(&:body),
49
- case_node.else_branch
50
- ].compact
47
+ branch_bodies = [*case_node.when_branches.map(&:body), case_node.else_branch].compact
51
48
 
52
49
  return if branch_bodies.any? do |body|
53
50
  body.return_type? ||
54
51
  body.each_descendant.any?(&:return_type?)
55
52
  end
56
53
 
57
- add_offense(case_node.loc.keyword) do |corrector|
58
- autocorrect(corrector, case_node)
59
- end
54
+ add_offense(case_node.loc.keyword) { |corrector| autocorrect(corrector, case_node) }
60
55
  end
61
56
 
62
57
  private
@@ -123,17 +123,13 @@ module RuboCop
123
123
  def empty_check(node)
124
124
  return unless node.else? && !node.else_branch
125
125
 
126
- add_offense(node.loc.else) do |corrector|
127
- autocorrect(corrector, node)
128
- end
126
+ add_offense(node.loc.else) { |corrector| autocorrect(corrector, node) }
129
127
  end
130
128
 
131
129
  def nil_check(node)
132
130
  return unless node.else_branch&.nil_type?
133
131
 
134
- add_offense(node.loc.else) do |corrector|
135
- autocorrect(corrector, node)
136
- end
132
+ add_offense(node.loc.else) { |corrector| autocorrect(corrector, node) }
137
133
  end
138
134
 
139
135
  def autocorrect(corrector, node)
@@ -154,9 +150,7 @@ module RuboCop
154
150
  return node if node.case_type?
155
151
  return node unless node.elsif?
156
152
 
157
- node.each_ancestor(:if, :case, :when).find(-> { node }) do |parent|
158
- parent.loc.end
159
- end
153
+ node.each_ancestor(:if, :case, :when).find(-> { node }) { |parent| parent.loc.end }
160
154
  end
161
155
 
162
156
  def autocorrect_forbidden?(type)
@@ -37,8 +37,7 @@ module RuboCop
37
37
  def_node_matcher :str_node, '(send (const {nil? cbase} :String) :new)'
38
38
 
39
39
  # @!method array_with_block(node)
40
- def_node_matcher :array_with_block,
41
- '(block (send (const {nil? cbase} :Array) :new) args _)'
40
+ def_node_matcher :array_with_block, '(block (send (const {nil? cbase} :Array) :new) args _)'
42
41
 
43
42
  # @!method hash_with_block(node)
44
43
  def_node_matcher :hash_with_block, <<~PATTERN
@@ -84,20 +83,17 @@ module RuboCop
84
83
  parent = node.parent
85
84
  return false unless parent && %i[send super zsuper].include?(parent.type)
86
85
 
87
- node.equal?(parent.arguments.first) &&
88
- !parentheses?(node.parent)
86
+ node.equal?(parent.arguments.first) && !parentheses?(node.parent)
89
87
  end
90
88
 
91
89
  def replacement_range(node)
92
- if hash_node(node) &&
93
- first_argument_unparenthesized?(node)
90
+ if hash_node(node) && first_argument_unparenthesized?(node)
94
91
  # `some_method {}` is not same as `some_method Hash.new`
95
92
  # because the braces are interpreted as a block. We will have
96
93
  # to rewrite the arguments to wrap them in parenthesis.
97
94
  args = node.parent.arguments
98
95
 
99
- range_between(args[0].source_range.begin_pos - 1,
100
- args[-1].source_range.end_pos)
96
+ range_between(args[0].source_range.begin_pos - 1, args[-1].source_range.end_pos)
101
97
  else
102
98
  node.source_range
103
99
  end
@@ -45,16 +45,13 @@ module RuboCop
45
45
  extend AutoCorrector
46
46
 
47
47
  MSG_COMPACT = 'Put empty method definitions on a single line.'
48
- MSG_EXPANDED = 'Put the `end` of empty method definitions on the ' \
49
- 'next line.'
48
+ MSG_EXPANDED = 'Put the `end` of empty method definitions on the next line.'
50
49
 
51
50
  def on_def(node)
52
51
  return if node.body || comment_lines?(node)
53
52
  return if correct_style?(node)
54
53
 
55
- add_offense(node) do |corrector|
56
- corrector.replace(node, corrected(node))
57
- end
54
+ add_offense(node) { |corrector| corrector.replace(node, corrected(node)) }
58
55
  end
59
56
  alias on_defs on_def
60
57
 
@@ -65,8 +62,7 @@ module RuboCop
65
62
  end
66
63
 
67
64
  def correct_style?(node)
68
- compact_style? && compact?(node) ||
69
- expanded_style? && expanded?(node)
65
+ compact_style? && compact?(node) || expanded_style? && expanded?(node)
70
66
  end
71
67
 
72
68
  def corrected(node)
@@ -15,8 +15,7 @@ module RuboCop
15
15
  class EndBlock < Base
16
16
  extend AutoCorrector
17
17
 
18
- MSG = 'Avoid the use of `END` blocks. ' \
19
- 'Use `Kernel#at_exit` instead.'
18
+ MSG = 'Avoid the use of `END` blocks. Use `Kernel#at_exit` instead.'
20
19
 
21
20
  def on_postexe(node)
22
21
  add_offense(node.loc.keyword) do |corrector|
@@ -79,9 +79,7 @@ module RuboCop
79
79
  def handle_disallow_style(node)
80
80
  return unless node.endless?
81
81
 
82
- add_offense(node) do |corrector|
83
- correct_to_multiline(corrector, node)
84
- end
82
+ add_offense(node) { |corrector| correct_to_multiline(corrector, node) }
85
83
  end
86
84
 
87
85
  def correct_to_multiline(corrector, node)
@@ -112,13 +112,11 @@ module RuboCop
112
112
  end
113
113
 
114
114
  def special_file_keyword?(node)
115
- node.str_type? &&
116
- node.source == '__FILE__'
115
+ node.str_type? && node.source == '__FILE__'
117
116
  end
118
117
 
119
118
  def special_line_keyword?(node)
120
- node.int_type? &&
121
- node.source == '__LINE__'
119
+ node.int_type? && node.source == '__LINE__'
122
120
  end
123
121
 
124
122
  def file_and_line(node)
@@ -85,9 +85,7 @@ module RuboCop
85
85
  elsif (default_dir = pathname_parent_expand_path(node))
86
86
  return unless unrecommended_argument?(default_dir)
87
87
 
88
- add_offense(node, message: PATHNAME_MSG) do |corrector|
89
- autocorrect(corrector, node)
90
- end
88
+ add_offense(node, message: PATHNAME_MSG) { |corrector| autocorrect(corrector, node) }
91
89
  elsif (default_dir = pathname_new_parent_expand_path(node))
92
90
  return unless unrecommended_argument?(default_dir)
93
91
 
@@ -106,10 +106,7 @@ module RuboCop
106
106
  end
107
107
 
108
108
  def block_body_range(block_node, send_node)
109
- range_between(
110
- send_node.loc.expression.end_pos,
111
- block_node.loc.end.end_pos
112
- )
109
+ range_between(send_node.loc.expression.end_pos, block_node.loc.end.end_pos)
113
110
  end
114
111
  end
115
112
  end
@@ -146,10 +146,7 @@ module RuboCop
146
146
  next if seq.percent?
147
147
 
148
148
  detected_style = seq.style
149
- token = contents.begin.adjust(
150
- begin_pos: seq.begin_pos,
151
- end_pos: seq.end_pos
152
- )
149
+ token = contents.begin.adjust(begin_pos: seq.begin_pos, end_pos: seq.end_pos)
153
150
 
154
151
  yield(detected_style, token)
155
152
  end
@@ -76,8 +76,7 @@ module RuboCop
76
76
  include RangeHelp
77
77
  extend AutoCorrector
78
78
 
79
- MSG_MISSING_TRUE = 'Missing magic comment `# frozen_string_literal: '\
80
- 'true`.'
79
+ MSG_MISSING_TRUE = 'Missing magic comment `# frozen_string_literal: true`.'
81
80
  MSG_MISSING = 'Missing frozen string literal comment.'
82
81
  MSG_UNNECESSARY = 'Unnecessary frozen string literal comment.'
83
82
  MSG_DISABLED = 'Frozen string literal comment must be set to `true`.'
@@ -143,17 +142,13 @@ module RuboCop
143
142
  def missing_offense(processed_source)
144
143
  range = source_range(processed_source.buffer, 0, 0)
145
144
 
146
- add_offense(range, message: MSG_MISSING) do |corrector|
147
- insert_comment(corrector)
148
- end
145
+ add_offense(range, message: MSG_MISSING) { |corrector| insert_comment(corrector) }
149
146
  end
150
147
 
151
148
  def missing_true_offense(processed_source)
152
149
  range = source_range(processed_source.buffer, 0, 0)
153
150
 
154
- add_offense(range, message: MSG_MISSING_TRUE) do |corrector|
155
- insert_comment(corrector)
156
- end
151
+ add_offense(range, message: MSG_MISSING_TRUE) { |corrector| insert_comment(corrector) }
157
152
  end
158
153
 
159
154
  def unnecessary_comment_offense(processed_source)
@@ -99,12 +99,9 @@ module RuboCop
99
99
 
100
100
  def register_offense(node, scope_exiting_keyword, conditional_keyword)
101
101
  condition, = node.node_parts
102
- example = [scope_exiting_keyword,
103
- conditional_keyword,
104
- condition.source].join(' ')
102
+ example = [scope_exiting_keyword, conditional_keyword, condition.source].join(' ')
105
103
  if too_long_for_single_line?(node, example)
106
- example = "#{conditional_keyword} #{condition.source}; " \
107
- "#{scope_exiting_keyword}; end"
104
+ example = "#{conditional_keyword} #{condition.source}; #{scope_exiting_keyword}; end"
108
105
  end
109
106
 
110
107
  add_offense(node.loc.keyword, message: format(MSG, example: example))
@@ -126,8 +123,7 @@ module RuboCop
126
123
  end
127
124
 
128
125
  def accepted_form?(node, ending: false)
129
- accepted_if?(node, ending) || node.condition.multiline? ||
130
- node.parent&.assignment?
126
+ accepted_if?(node, ending) || node.condition.multiline? || node.parent&.assignment?
131
127
  end
132
128
 
133
129
  def accepted_if?(node, ending)
@@ -61,11 +61,11 @@ module RuboCop
61
61
  def single_argument(node)
62
62
  first_argument = node.first_argument
63
63
  if first_argument.hash_type?
64
- add_offense(node, message: MSG_LITERAL_HASH_ARG) do |corrector|
65
- corrector.replace(node, "{#{first_argument.source}}")
66
- end
64
+ register_offense_for_hash(node, first_argument)
67
65
  elsif first_argument.splat_type?
68
66
  add_offense(node, message: MSG_SPLAT) unless allowed_splat_argument?
67
+ elsif use_zip_method_without_argument?(first_argument)
68
+ register_offense_for_zip_method(node, first_argument)
69
69
  else
70
70
  add_offense(node, message: MSG_TO_H) do |corrector|
71
71
  replacement = first_argument.source
@@ -75,6 +75,31 @@ module RuboCop
75
75
  end
76
76
  end
77
77
 
78
+ def use_zip_method_without_argument?(first_argument)
79
+ return false unless first_argument&.send_type?
80
+
81
+ first_argument.method?(:zip) && first_argument.arguments.empty?
82
+ end
83
+
84
+ def register_offense_for_hash(node, hash_argument)
85
+ add_offense(node, message: MSG_LITERAL_HASH_ARG) do |corrector|
86
+ corrector.replace(node, "{#{hash_argument.source}}")
87
+
88
+ parent = node.parent
89
+ add_parentheses(parent, corrector) if parent&.send_type? && !parent.parenthesized?
90
+ end
91
+ end
92
+
93
+ def register_offense_for_zip_method(node, zip_method)
94
+ add_offense(node, message: MSG_TO_H) do |corrector|
95
+ if zip_method.parenthesized?
96
+ corrector.insert_before(zip_method.loc.end, '[]')
97
+ else
98
+ corrector.insert_after(zip_method, '([])')
99
+ end
100
+ end
101
+ end
102
+
78
103
  def requires_parens?(node)
79
104
  node.call_type? && node.arguments.any? && !node.parenthesized?
80
105
  end
@@ -38,8 +38,7 @@ module RuboCop
38
38
  kv_each(node) do |target, method|
39
39
  return unless target.receiver.receiver
40
40
 
41
- msg = format(message, prefer: "each_#{method[0..-2]}",
42
- current: "#{method}.each")
41
+ msg = format(message, prefer: "each_#{method[0..-2]}", current: "#{method}.each")
43
42
 
44
43
  add_offense(kv_range(target), message: msg) do |corrector|
45
44
  correct_key_value_each(target, corrector)
@@ -52,8 +52,7 @@ module RuboCop
52
52
  return if node.when_branches.size < min_branches_count
53
53
 
54
54
  hash_like_case?(node) do |condition_nodes, body_nodes|
55
- if nodes_of_same_type?(condition_nodes) &&
56
- nodes_of_same_type?(body_nodes)
55
+ if nodes_of_same_type?(condition_nodes) && nodes_of_same_type?(body_nodes)
57
56
  add_offense(node)
58
57
  end
59
58
  end
@@ -137,7 +137,7 @@ module RuboCop
137
137
  end
138
138
 
139
139
  def acceptable_19_syntax_symbol?(sym_name)
140
- sym_name.sub!(/\A:/, '')
140
+ sym_name.delete_prefix!(':')
141
141
 
142
142
  if cop_config['PreferHashRocketsForNonAlnumEndingSymbols'] &&
143
143
  # Prefer { :production? => false } over { production?: false } and
@@ -174,10 +174,7 @@ module RuboCop
174
174
 
175
175
  space = argument_without_space?(pair_node.parent) ? ' ' : ''
176
176
 
177
- corrector.replace(
178
- range,
179
- range.source.sub(/^:(.*\S)\s*=>\s*$/, "#{space}\\1: ")
180
- )
177
+ corrector.replace(range, range.source.sub(/^:(.*\S)\s*=>\s*$/, "#{space}\\1: "))
181
178
 
182
179
  hash_node = pair_node.parent
183
180
  return unless hash_node.parent&.return_type? && !hash_node.braces?
@@ -194,8 +191,7 @@ module RuboCop
194
191
  end
195
192
 
196
193
  def argument_without_space?(node)
197
- node.argument? &&
198
- node.loc.expression.begin_pos == node.parent.loc.selector.end_pos
194
+ node.argument? && node.loc.expression.begin_pos == node.parent.loc.selector.end_pos
199
195
  end
200
196
 
201
197
  def autocorrect_hash_rockets(corrector, pair_node)
@@ -215,8 +211,7 @@ module RuboCop
215
211
  end
216
212
 
217
213
  def force_hash_rockets?(pairs)
218
- cop_config['UseHashRocketsWithSymbolValues'] &&
219
- pairs.map(&:value).any?(&:sym_type?)
214
+ cop_config['UseHashRocketsWithSymbolValues'] && pairs.map(&:value).any?(&:sym_type?)
220
215
  end
221
216
  end
222
217
  end
@@ -100,9 +100,7 @@ module RuboCop
100
100
  def check_expressions(expressions)
101
101
  return unless expressions.size > 1 && expressions.uniq.one?
102
102
 
103
- expressions.each do |expression|
104
- add_offense(expression)
105
- end
103
+ expressions.each { |expression| add_offense(expression) }
106
104
  end
107
105
 
108
106
  def message(node)
@@ -38,13 +38,13 @@ module RuboCop
38
38
  include StatementModifier
39
39
  include LineLengthHelp
40
40
  include IgnoredPattern
41
+ include RangeHelp
41
42
  extend AutoCorrector
42
43
 
43
44
  MSG_USE_MODIFIER = 'Favor modifier `%<keyword>s` usage when having a ' \
44
45
  'single-line body. Another good alternative is ' \
45
46
  'the usage of control flow `&&`/`||`.'
46
- MSG_USE_NORMAL =
47
- 'Modifier form of `%<keyword>s` makes the line too long.'
47
+ MSG_USE_NORMAL = 'Modifier form of `%<keyword>s` makes the line too long.'
48
48
 
49
49
  def self.autocorrect_incompatible_with
50
50
  [Style::SoleNestedConditional]
@@ -67,7 +67,16 @@ module RuboCop
67
67
 
68
68
  def autocorrect(corrector, node)
69
69
  replacement = if node.modifier_form?
70
- to_normal_form(node)
70
+ indentation = ' ' * node.source_range.column
71
+ last_argument = node.if_branch.last_argument
72
+
73
+ if last_argument.respond_to?(:heredoc?) && last_argument.heredoc?
74
+ heredoc = extract_heredoc_from(last_argument)
75
+ remove_heredoc(corrector, heredoc)
76
+ to_normal_form_with_heredoc(node, indentation, heredoc)
77
+ else
78
+ to_normal_form(node, indentation)
79
+ end
71
80
  else
72
81
  to_modifier_form(node)
73
82
  end
@@ -123,8 +132,7 @@ module RuboCop
123
132
  end
124
133
 
125
134
  def line_length_enabled_at_line?(line)
126
- processed_source.comment_config
127
- .cop_enabled_at_line?('Layout/LineLength', line)
135
+ processed_source.comment_config.cop_enabled_at_line?('Layout/LineLength', line)
128
136
  end
129
137
 
130
138
  def named_capture_in_condition?(node)
@@ -132,10 +140,7 @@ module RuboCop
132
140
  end
133
141
 
134
142
  def non_eligible_node?(node)
135
- non_simple_if_unless?(node) ||
136
- node.chained? ||
137
- node.nested_conditional? ||
138
- super
143
+ non_simple_if_unless?(node) || node.chained? || node.nested_conditional? || super
139
144
  end
140
145
 
141
146
  def non_simple_if_unless?(node)
@@ -153,18 +158,41 @@ module RuboCop
153
158
  node = node.parent
154
159
  end
155
160
 
156
- node && (sibling = node.children[index + 1]) &&
157
- sibling.source_range.first_line == line_no
161
+ node && (sibling = node.children[index + 1]) && sibling.source_range.first_line == line_no
158
162
  end
159
163
 
160
- def to_normal_form(node)
161
- indentation = ' ' * node.source_range.column
164
+ def to_normal_form(node, indentation)
162
165
  <<~RUBY.chomp
163
166
  #{node.keyword} #{node.condition.source}
164
167
  #{indentation} #{node.body.source}
165
168
  #{indentation}end
166
169
  RUBY
167
170
  end
171
+
172
+ def to_normal_form_with_heredoc(node, indentation, heredoc)
173
+ heredoc_body, heredoc_end = heredoc
174
+
175
+ <<~RUBY.chomp
176
+ #{node.keyword} #{node.condition.source}
177
+ #{indentation} #{node.body.source}
178
+ #{indentation} #{heredoc_body.source.chomp}
179
+ #{indentation} #{heredoc_end.source.chomp}
180
+ #{indentation}end
181
+ RUBY
182
+ end
183
+
184
+ def extract_heredoc_from(last_argument)
185
+ heredoc_body = last_argument.loc.heredoc_body
186
+ heredoc_end = last_argument.loc.heredoc_end
187
+
188
+ [heredoc_body, heredoc_end]
189
+ end
190
+
191
+ def remove_heredoc(corrector, heredoc)
192
+ heredoc.each do |range|
193
+ corrector.remove(range_by_whole_lines(range, include_final_newline: true))
194
+ end
195
+ end
168
196
  end
169
197
  end
170
198
  end