rubocop 1.12.0 → 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 (401) 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 +22 -8
  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 +16 -10
  85. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +4 -0
  86. data/lib/rubocop/cop/layout/redundant_line_break.rb +125 -0
  87. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +3 -6
  88. data/lib/rubocop/cop/layout/space_after_colon.rb +1 -3
  89. data/lib/rubocop/cop/layout/space_after_method_name.rb +2 -4
  90. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +6 -14
  91. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +1 -2
  92. data/lib/rubocop/cop/layout/space_around_keyword.rb +3 -6
  93. data/lib/rubocop/cop/layout/space_around_operators.rb +4 -9
  94. data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -2
  95. data/lib/rubocop/cop/layout/space_before_brackets.rb +1 -3
  96. data/lib/rubocop/cop/layout/space_before_comment.rb +1 -3
  97. data/lib/rubocop/cop/layout/space_before_first_arg.rb +5 -11
  98. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +2 -4
  99. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +5 -10
  100. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +2 -7
  101. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +5 -10
  102. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +1 -2
  103. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +1 -2
  104. data/lib/rubocop/cop/legacy/corrections_proxy.rb +2 -8
  105. data/lib/rubocop/cop/legacy/corrector.rb +1 -3
  106. data/lib/rubocop/cop/lint/ambiguous_assignment.rb +1 -6
  107. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +14 -7
  108. data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -2
  109. data/lib/rubocop/cop/lint/constant_resolution.rb +1 -2
  110. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +2 -4
  111. data/lib/rubocop/cop/lint/deprecated_constants.rb +3 -3
  112. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +2 -5
  113. data/lib/rubocop/cop/lint/duplicate_branch.rb +1 -2
  114. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -3
  115. data/lib/rubocop/cop/lint/duplicate_methods.rb +3 -7
  116. data/lib/rubocop/cop/lint/else_layout.rb +1 -3
  117. data/lib/rubocop/cop/lint/empty_ensure.rb +1 -3
  118. data/lib/rubocop/cop/lint/empty_file.rb +1 -3
  119. data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -3
  120. data/lib/rubocop/cop/lint/ensure_return.rb +1 -3
  121. data/lib/rubocop/cop/lint/erb_new_arguments.rb +3 -7
  122. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -2
  123. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +3 -6
  124. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +1 -2
  125. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -2
  126. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +3 -7
  127. data/lib/rubocop/cop/lint/inherit_exception.rb +1 -2
  128. data/lib/rubocop/cop/lint/interpolation_check.rb +3 -11
  129. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +3 -6
  130. data/lib/rubocop/cop/lint/loop.rb +1 -2
  131. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +3 -7
  132. data/lib/rubocop/cop/lint/missing_super.rb +1 -2
  133. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -2
  134. data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -2
  135. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -3
  136. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +1 -3
  137. data/lib/rubocop/cop/lint/number_conversion.rb +3 -4
  138. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +1 -2
  139. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +1 -3
  140. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -3
  141. data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -3
  142. data/lib/rubocop/cop/lint/raise_exception.rb +1 -2
  143. data/lib/rubocop/cop/lint/rand_one.rb +1 -2
  144. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +8 -20
  145. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +1 -3
  146. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +3 -7
  147. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +1 -2
  148. data/lib/rubocop/cop/lint/redundant_with_index.rb +1 -4
  149. data/lib/rubocop/cop/lint/redundant_with_object.rb +1 -4
  150. data/lib/rubocop/cop/lint/regexp_as_condition.rb +1 -3
  151. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -4
  152. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -2
  153. data/lib/rubocop/cop/lint/rescue_type.rb +2 -7
  154. data/lib/rubocop/cop/lint/return_in_void_context.rb +1 -2
  155. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +1 -2
  156. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +4 -10
  157. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -2
  158. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +2 -7
  159. data/lib/rubocop/cop/lint/shadowed_argument.rb +4 -11
  160. data/lib/rubocop/cop/lint/shadowed_exception.rb +7 -8
  161. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -2
  162. data/lib/rubocop/cop/lint/symbol_conversion.rb +2 -4
  163. data/lib/rubocop/cop/lint/syntax.rb +1 -3
  164. data/lib/rubocop/cop/lint/to_json.rb +1 -2
  165. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1 -3
  166. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +1 -3
  167. data/lib/rubocop/cop/lint/unreachable_code.rb +2 -5
  168. data/lib/rubocop/cop/lint/unreachable_loop.rb +2 -5
  169. data/lib/rubocop/cop/lint/unused_block_argument.rb +4 -8
  170. data/lib/rubocop/cop/lint/unused_method_argument.rb +1 -2
  171. data/lib/rubocop/cop/lint/useless_access_modifier.rb +2 -4
  172. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -9
  173. data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -3
  174. data/lib/rubocop/cop/lint/void.rb +4 -11
  175. data/lib/rubocop/cop/message_annotator.rb +1 -3
  176. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -7
  177. data/lib/rubocop/cop/metrics/class_length.rb +1 -3
  178. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -2
  179. data/lib/rubocop/cop/metrics/module_length.rb +2 -6
  180. data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -5
  181. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -2
  182. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +4 -7
  183. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +2 -7
  184. data/lib/rubocop/cop/migration/department_name.rb +3 -7
  185. data/lib/rubocop/cop/mixin/alignment.rb +2 -4
  186. data/lib/rubocop/cop/mixin/check_line_breakable.rb +1 -1
  187. data/lib/rubocop/cop/mixin/code_length.rb +1 -3
  188. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +2 -2
  189. data/lib/rubocop/cop/mixin/configurable_formatting.rb +3 -8
  190. data/lib/rubocop/cop/mixin/def_node.rb +2 -5
  191. data/lib/rubocop/cop/mixin/documentation_comment.rb +2 -5
  192. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +3 -7
  193. data/lib/rubocop/cop/mixin/empty_parameter.rb +1 -3
  194. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -3
  195. data/lib/rubocop/cop/mixin/enforce_superclass.rb +2 -6
  196. data/lib/rubocop/cop/mixin/first_element_line_break.rb +1 -3
  197. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +3 -9
  198. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +3 -6
  199. data/lib/rubocop/cop/mixin/hash_transform_method.rb +7 -22
  200. data/lib/rubocop/cop/mixin/interpolation.rb +1 -3
  201. data/lib/rubocop/cop/mixin/line_length_help.rb +2 -4
  202. data/lib/rubocop/cop/mixin/match_range.rb +2 -5
  203. data/lib/rubocop/cop/mixin/method_complexity.rb +1 -3
  204. data/lib/rubocop/cop/mixin/method_preference.rb +1 -2
  205. data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +1 -2
  206. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +1 -3
  207. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +7 -37
  208. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -2
  209. data/lib/rubocop/cop/mixin/negative_conditional.rb +1 -2
  210. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -4
  211. data/lib/rubocop/cop/mixin/percent_array.rb +1 -3
  212. data/lib/rubocop/cop/mixin/percent_literal.rb +0 -6
  213. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +5 -11
  214. data/lib/rubocop/cop/mixin/preferred_delimiters.rb +3 -6
  215. data/lib/rubocop/cop/mixin/range_help.rb +10 -13
  216. data/lib/rubocop/cop/mixin/rescue_node.rb +2 -6
  217. data/lib/rubocop/cop/mixin/safe_assignment.rb +1 -2
  218. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +2 -4
  219. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -2
  220. data/lib/rubocop/cop/mixin/statement_modifier.rb +1 -3
  221. data/lib/rubocop/cop/mixin/trailing_body.rb +1 -2
  222. data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -2
  223. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +3 -7
  224. data/lib/rubocop/cop/mixin/unused_argument.rb +1 -3
  225. data/lib/rubocop/cop/naming/ascii_identifiers.rb +2 -4
  226. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -2
  227. data/lib/rubocop/cop/naming/file_name.rb +7 -16
  228. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -3
  229. data/lib/rubocop/cop/naming/method_name.rb +1 -2
  230. data/lib/rubocop/cop/naming/predicate_name.rb +1 -2
  231. data/lib/rubocop/cop/offense.rb +3 -8
  232. data/lib/rubocop/cop/registry.rb +3 -11
  233. data/lib/rubocop/cop/style/access_modifier_declarations.rb +2 -4
  234. data/lib/rubocop/cop/style/accessor_grouping.rb +1 -3
  235. data/lib/rubocop/cop/style/alias.rb +5 -12
  236. data/lib/rubocop/cop/style/and_or.rb +3 -1
  237. data/lib/rubocop/cop/style/arguments_forwarding.rb +1 -3
  238. data/lib/rubocop/cop/style/ascii_comments.rb +1 -2
  239. data/lib/rubocop/cop/style/attr.rb +1 -3
  240. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +2 -5
  241. data/lib/rubocop/cop/style/bisected_attr_accessor/macro.rb +1 -3
  242. data/lib/rubocop/cop/style/case_like_if.rb +1 -2
  243. data/lib/rubocop/cop/style/character_literal.rb +2 -4
  244. data/lib/rubocop/cop/style/class_and_module_children.rb +3 -6
  245. data/lib/rubocop/cop/style/class_methods.rb +1 -3
  246. data/lib/rubocop/cop/style/collection_compact.rb +1 -3
  247. data/lib/rubocop/cop/style/colon_method_call.rb +1 -3
  248. data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
  249. data/lib/rubocop/cop/style/command_literal.rb +3 -8
  250. data/lib/rubocop/cop/style/comment_annotation.rb +3 -6
  251. data/lib/rubocop/cop/style/commented_keyword.rb +7 -13
  252. data/lib/rubocop/cop/style/conditional_assignment.rb +10 -24
  253. data/lib/rubocop/cop/style/copyright.rb +3 -6
  254. data/lib/rubocop/cop/style/date_time.rb +2 -5
  255. data/lib/rubocop/cop/style/def_with_parentheses.rb +1 -2
  256. data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -2
  257. data/lib/rubocop/cop/style/empty_case_condition.rb +2 -7
  258. data/lib/rubocop/cop/style/empty_else.rb +3 -9
  259. data/lib/rubocop/cop/style/empty_literal.rb +4 -8
  260. data/lib/rubocop/cop/style/empty_method.rb +3 -7
  261. data/lib/rubocop/cop/style/end_block.rb +1 -2
  262. data/lib/rubocop/cop/style/endless_method.rb +1 -3
  263. data/lib/rubocop/cop/style/eval_with_location.rb +2 -4
  264. data/lib/rubocop/cop/style/expand_path_arguments.rb +1 -3
  265. data/lib/rubocop/cop/style/explicit_block_argument.rb +1 -4
  266. data/lib/rubocop/cop/style/format_string_token.rb +1 -4
  267. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -11
  268. data/lib/rubocop/cop/style/guard_clause.rb +3 -7
  269. data/lib/rubocop/cop/style/hash_conversion.rb +31 -3
  270. data/lib/rubocop/cop/style/hash_each_methods.rb +1 -2
  271. data/lib/rubocop/cop/style/hash_like_case.rb +1 -2
  272. data/lib/rubocop/cop/style/hash_syntax.rb +4 -9
  273. data/lib/rubocop/cop/style/identical_conditional_branches.rb +1 -3
  274. data/lib/rubocop/cop/style/if_unless_modifier.rb +41 -13
  275. data/lib/rubocop/cop/style/infinite_loop.rb +2 -5
  276. data/lib/rubocop/cop/style/inverse_methods.rb +3 -7
  277. data/lib/rubocop/cop/style/ip_addresses.rb +1 -2
  278. data/lib/rubocop/cop/style/lambda.rb +2 -4
  279. data/lib/rubocop/cop/style/lambda_call.rb +1 -2
  280. data/lib/rubocop/cop/style/line_end_concatenation.rb +5 -12
  281. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +7 -3
  282. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +10 -18
  283. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +1 -2
  284. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -4
  285. data/lib/rubocop/cop/style/method_def_parentheses.rb +4 -8
  286. data/lib/rubocop/cop/style/min_max.rb +1 -2
  287. data/lib/rubocop/cop/style/missing_else.rb +2 -4
  288. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +1 -2
  289. data/lib/rubocop/cop/style/mixin_grouping.rb +4 -10
  290. data/lib/rubocop/cop/style/mixin_usage.rb +1 -2
  291. data/lib/rubocop/cop/style/module_function.rb +3 -6
  292. data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -2
  293. data/lib/rubocop/cop/style/multiline_method_signature.rb +11 -6
  294. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +1 -2
  295. data/lib/rubocop/cop/style/multiple_comparison.rb +2 -4
  296. data/lib/rubocop/cop/style/mutable_constant.rb +4 -10
  297. data/lib/rubocop/cop/style/negated_if.rb +1 -2
  298. data/lib/rubocop/cop/style/negated_unless.rb +1 -2
  299. data/lib/rubocop/cop/style/nested_modifier.rb +3 -7
  300. data/lib/rubocop/cop/style/nested_ternary_operator.rb +2 -3
  301. data/lib/rubocop/cop/style/next.rb +4 -9
  302. data/lib/rubocop/cop/style/non_nil_check.rb +2 -5
  303. data/lib/rubocop/cop/style/numeric_literals.rb +3 -11
  304. data/lib/rubocop/cop/style/numeric_predicate.rb +2 -7
  305. data/lib/rubocop/cop/style/one_line_conditional.rb +1 -2
  306. data/lib/rubocop/cop/style/option_hash.rb +1 -3
  307. data/lib/rubocop/cop/style/optional_arguments.rb +2 -5
  308. data/lib/rubocop/cop/style/or_assignment.rb +2 -6
  309. data/lib/rubocop/cop/style/parallel_assignment.rb +6 -9
  310. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -3
  311. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -2
  312. data/lib/rubocop/cop/style/perl_backrefs.rb +2 -9
  313. data/lib/rubocop/cop/style/preferred_hash_methods.rb +1 -4
  314. data/lib/rubocop/cop/style/proc.rb +1 -2
  315. data/lib/rubocop/cop/style/raise_args.rb +4 -8
  316. data/lib/rubocop/cop/style/random_with_offset.rb +3 -8
  317. data/lib/rubocop/cop/style/redundant_argument.rb +2 -11
  318. data/lib/rubocop/cop/style/redundant_assignment.rb +1 -3
  319. data/lib/rubocop/cop/style/redundant_begin.rb +15 -4
  320. data/lib/rubocop/cop/style/redundant_capital_w.rb +1 -2
  321. data/lib/rubocop/cop/style/redundant_condition.rb +2 -5
  322. data/lib/rubocop/cop/style/redundant_conditional.rb +3 -6
  323. data/lib/rubocop/cop/style/redundant_exception.rb +3 -6
  324. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -1
  325. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -2
  326. data/lib/rubocop/cop/style/redundant_interpolation.rb +1 -2
  327. data/lib/rubocop/cop/style/redundant_parentheses.rb +8 -20
  328. data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -2
  329. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -4
  330. data/lib/rubocop/cop/style/redundant_return.rb +3 -5
  331. data/lib/rubocop/cop/style/redundant_self.rb +2 -6
  332. data/lib/rubocop/cop/style/redundant_self_assignment.rb +2 -2
  333. data/lib/rubocop/cop/style/redundant_sort.rb +2 -5
  334. data/lib/rubocop/cop/style/regexp_literal.rb +4 -8
  335. data/lib/rubocop/cop/style/rescue_modifier.rb +4 -0
  336. data/lib/rubocop/cop/style/rescue_standard_error.rb +3 -7
  337. data/lib/rubocop/cop/style/return_nil.rb +1 -2
  338. data/lib/rubocop/cop/style/safe_navigation.rb +10 -21
  339. data/lib/rubocop/cop/style/send.rb +1 -2
  340. data/lib/rubocop/cop/style/signal_exception.rb +3 -7
  341. data/lib/rubocop/cop/style/single_argument_dig.rb +1 -2
  342. data/lib/rubocop/cop/style/single_line_block_params.rb +2 -5
  343. data/lib/rubocop/cop/style/single_line_methods.rb +16 -4
  344. data/lib/rubocop/cop/style/sole_nested_conditional.rb +1 -2
  345. data/lib/rubocop/cop/style/special_global_vars.rb +6 -18
  346. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -2
  347. data/lib/rubocop/cop/style/stderr_puts.rb +2 -6
  348. data/lib/rubocop/cop/style/string_chars.rb +2 -1
  349. data/lib/rubocop/cop/style/string_concatenation.rb +8 -10
  350. data/lib/rubocop/cop/style/string_literals.rb +2 -5
  351. data/lib/rubocop/cop/style/struct_inheritance.rb +9 -1
  352. data/lib/rubocop/cop/style/symbol_literal.rb +1 -3
  353. data/lib/rubocop/cop/style/symbol_proc.rb +4 -9
  354. data/lib/rubocop/cop/style/ternary_parentheses.rb +3 -6
  355. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +1 -2
  356. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +2 -6
  357. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +2 -5
  358. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -10
  359. data/lib/rubocop/cop/style/trivial_accessors.rb +2 -4
  360. data/lib/rubocop/cop/style/unless_else.rb +1 -2
  361. data/lib/rubocop/cop/style/unless_logical_operators.rb +2 -2
  362. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -1
  363. data/lib/rubocop/cop/style/when_then.rb +1 -3
  364. data/lib/rubocop/cop/style/while_until_modifier.rb +1 -2
  365. data/lib/rubocop/cop/style/word_array.rb +1 -2
  366. data/lib/rubocop/cop/style/yoda_condition.rb +3 -11
  367. data/lib/rubocop/cop/style/zero_length_predicate.rb +1 -2
  368. data/lib/rubocop/cop/team.rb +2 -5
  369. data/lib/rubocop/cop/util.rb +8 -11
  370. data/lib/rubocop/cop/utils/format_string.rb +1 -3
  371. data/lib/rubocop/cop/variable_force.rb +6 -15
  372. data/lib/rubocop/cop/variable_force/assignment.rb +1 -2
  373. data/lib/rubocop/cop/variable_force/branch.rb +1 -2
  374. data/lib/rubocop/cop/variable_force/reference.rb +1 -3
  375. data/lib/rubocop/cop/variable_force/scope.rb +4 -8
  376. data/lib/rubocop/cop/variable_force/variable.rb +2 -4
  377. data/lib/rubocop/cops_documentation_generator.rb +7 -21
  378. data/lib/rubocop/directive_comment.rb +5 -0
  379. data/lib/rubocop/file_finder.rb +1 -3
  380. data/lib/rubocop/formatter/clang_style_formatter.rb +4 -2
  381. data/lib/rubocop/formatter/disabled_config_formatter.rb +3 -8
  382. data/lib/rubocop/formatter/git_hub_actions_formatter.rb +1 -5
  383. data/lib/rubocop/formatter/html_formatter.rb +4 -10
  384. data/lib/rubocop/formatter/json_formatter.rb +1 -5
  385. data/lib/rubocop/formatter/junit_formatter.rb +3 -9
  386. data/lib/rubocop/formatter/progress_formatter.rb +1 -3
  387. data/lib/rubocop/formatter/tap_formatter.rb +4 -2
  388. data/lib/rubocop/options.rb +27 -41
  389. data/lib/rubocop/path_util.rb +1 -3
  390. data/lib/rubocop/rake_task.rb +3 -0
  391. data/lib/rubocop/remote_config.rb +4 -7
  392. data/lib/rubocop/result_cache.rb +5 -12
  393. data/lib/rubocop/rspec/cop_helper.rb +1 -1
  394. data/lib/rubocop/rspec/expect_offense.rb +4 -9
  395. data/lib/rubocop/rspec/shared_contexts.rb +4 -15
  396. data/lib/rubocop/runner.rb +7 -14
  397. data/lib/rubocop/target_finder.rb +11 -16
  398. data/lib/rubocop/target_ruby.rb +4 -8
  399. data/lib/rubocop/version.rb +1 -1
  400. metadata +5 -5
  401. data/lib/rubocop/core_ext/hash.rb +0 -20
@@ -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
@@ -85,6 +110,9 @@ module RuboCop
85
110
  else
86
111
  add_offense(node, message: MSG_LITERAL_MULTI_ARG) do |corrector|
87
112
  corrector.replace(node, args_to_hash(node.arguments))
113
+
114
+ parent = node.parent
115
+ add_parentheses(parent, corrector) if parent&.send_type? && !parent.parenthesized?
88
116
  end
89
117
  end
90
118
  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
@@ -62,9 +62,7 @@ module RuboCop
62
62
  referenced_after_loop?(var, range)
63
63
  end
64
64
 
65
- add_offense(node.loc.keyword) do |corrector|
66
- autocorrect(corrector, node)
67
- end
65
+ add_offense(node.loc.keyword) { |corrector| autocorrect(corrector, node) }
68
66
  end
69
67
 
70
68
  def autocorrect(corrector, node)
@@ -107,8 +105,7 @@ module RuboCop
107
105
  else
108
106
  indentation = body.source_range.source_line[LEADING_SPACE]
109
107
 
110
- ['loop do', body.source.gsub(/^/, configured_indent),
111
- 'end'].join("\n#{indentation}")
108
+ ['loop do', body.source.gsub(/^/, configured_indent), 'end'].join("\n#{indentation}")
112
109
  end
113
110
  end
114
111
 
@@ -136,8 +136,7 @@ module RuboCop
136
136
  end
137
137
 
138
138
  def inverse_blocks
139
- @inverse_blocks ||= cop_config['InverseBlocks']
140
- .merge(cop_config['InverseBlocks'].invert)
139
+ @inverse_blocks ||= cop_config['InverseBlocks'].merge(cop_config['InverseBlocks'].invert)
141
140
  end
142
141
 
143
142
  def negated?(node)
@@ -160,9 +159,7 @@ module RuboCop
160
159
  # `Integer > Numeric`.
161
160
  def possible_class_hierarchy_check?(lhs, rhs, method)
162
161
  CLASS_COMPARISON_METHODS.include?(method) &&
163
- (camel_case_constant?(lhs) ||
164
- (rhs.size == 1 &&
165
- camel_case_constant?(rhs.first)))
162
+ (camel_case_constant?(lhs) || (rhs.size == 1 && camel_case_constant?(rhs.first)))
166
163
  end
167
164
 
168
165
  def camel_case_constant?(node)
@@ -174,8 +171,7 @@ module RuboCop
174
171
  end
175
172
 
176
173
  def remove_end_parenthesis(corrector, node, method, method_call)
177
- return unless EQUALITY_METHODS.include?(method) ||
178
- method_call.parent.begin_type?
174
+ return unless EQUALITY_METHODS.include?(method) || method_call.parent.begin_type?
179
175
 
180
176
  corrector.remove(end_parentheses(node, method_call))
181
177
  end
@@ -67,8 +67,7 @@ module RuboCop
67
67
 
68
68
  def starts_with_hex_or_colon?(str)
69
69
  first_char = str[0].ord
70
- (48..58).cover?(first_char) || (65..70).cover?(first_char) ||
71
- (97..102).cover?(first_char)
70
+ (48..58).cover?(first_char) || (65..70).cover?(first_char) || (97..102).cover?(first_char)
72
71
  end
73
72
  end
74
73
  end
@@ -50,10 +50,8 @@ module RuboCop
50
50
  include ConfigurableEnforcedStyle
51
51
  extend AutoCorrector
52
52
 
53
- LITERAL_MESSAGE = 'Use the `-> { ... }` lambda literal syntax for ' \
54
- '%<modifier>s lambdas.'
55
- METHOD_MESSAGE = 'Use the `lambda` method for %<modifier>s ' \
56
- 'lambdas.'
53
+ LITERAL_MESSAGE = 'Use the `-> { ... }` lambda literal syntax for %<modifier>s lambdas.'
54
+ METHOD_MESSAGE = 'Use the `lambda` method for %<modifier>s lambdas.'
57
55
 
58
56
  OFFENDING_SELECTORS = {
59
57
  style: {
@@ -52,8 +52,7 @@ module RuboCop
52
52
  private
53
53
 
54
54
  def offense?(node)
55
- explicit_style? && node.implicit_call? ||
56
- implicit_style? && !node.implicit_call?
55
+ explicit_style? && node.implicit_call? || implicit_style? && !node.implicit_call?
57
56
  end
58
57
 
59
58
  def message(_node)
@@ -23,14 +23,12 @@ module RuboCop
23
23
  include RangeHelp
24
24
  extend AutoCorrector
25
25
 
26
- MSG = 'Use `\\` instead of `+` or `<<` to concatenate ' \
27
- 'those strings.'
26
+ MSG = 'Use `\\` instead of `+` or `<<` to concatenate those strings.'
28
27
  CONCAT_TOKEN_TYPES = %i[tPLUS tLSHFT].freeze
29
28
  SIMPLE_STRING_TOKEN_TYPE = :tSTRING
30
29
  COMPLEX_STRING_BEGIN_TOKEN = :tSTRING_BEG
31
30
  COMPLEX_STRING_END_TOKEN = :tSTRING_END
32
- HIGH_PRECEDENCE_OP_TOKEN_TYPES = %i[tSTAR2 tPERCENT tDOT
33
- tLBRACK2].freeze
31
+ HIGH_PRECEDENCE_OP_TOKEN_TYPES = %i[tSTAR2 tPERCENT tDOT tLBRACK2].freeze
34
32
  QUOTE_DELIMITERS = %w[' "].freeze
35
33
 
36
34
  def self.autocorrect_incompatible_with
@@ -38,9 +36,7 @@ module RuboCop
38
36
  end
39
37
 
40
38
  def on_new_investigation
41
- processed_source.tokens.each_index do |index|
42
- check_token_set(index)
43
- end
39
+ processed_source.tokens.each_index { |index| check_token_set(index) }
44
40
  end
45
41
 
46
42
  private
@@ -56,9 +52,7 @@ module RuboCop
56
52
 
57
53
  return unless eligible_next_successor?(next_successor)
58
54
 
59
- add_offense(operator.pos) do |corrector|
60
- autocorrect(corrector, operator.pos)
61
- end
55
+ add_offense(operator.pos) { |corrector| autocorrect(corrector, operator.pos) }
62
56
  end
63
57
 
64
58
  def autocorrect(corrector, operator_range)
@@ -89,8 +83,7 @@ module RuboCop
89
83
  end
90
84
 
91
85
  def eligible_next_successor?(next_successor)
92
- !(next_successor &&
93
- HIGH_PRECEDENCE_OP_TOKEN_TYPES.include?(next_successor.type))
86
+ !(next_successor && HIGH_PRECEDENCE_OP_TOKEN_TYPES.include?(next_successor.type))
94
87
  end
95
88
 
96
89
  def eligible_predecessor?(predecessor)
@@ -40,8 +40,12 @@ module RuboCop
40
40
  # to `true` allows the presence of parentheses in such a method call
41
41
  # even with arguments.
42
42
  #
43
- # NOTE: Parens are required around a method with arguments when inside an
44
- # endless method definition (>= Ruby 3.0).
43
+ # NOTE: Parentheses are still allowed in cases where omitting them
44
+ # results in ambiguous or syntactically incorrect code. For example,
45
+ # parentheses are required around a method with arguments when inside an
46
+ # endless method definition introduced in Ruby 3.0. Parentheses are also
47
+ # allowed when forwarding arguments with the triple-dot syntax introduced
48
+ # in Ruby 2.7 as omitting them starts an endless range.
45
49
  #
46
50
  # @example EnforcedStyle: require_parentheses (default)
47
51
  #
@@ -198,7 +202,7 @@ module RuboCop
198
202
  extend AutoCorrector
199
203
 
200
204
  def self.autocorrect_incompatible_with
201
- [Style::NestedParenthesizedCalls]
205
+ [Style::NestedParenthesizedCalls, Style::RescueModifier]
202
206
  end
203
207
 
204
208
  def on_send(node)
@@ -5,7 +5,7 @@ module RuboCop
5
5
  module Style
6
6
  class MethodCallWithArgsParentheses
7
7
  # Style omit_parentheses
8
- # rubocop:disable Metrics/ModuleLength
8
+ # rubocop:disable Metrics/ModuleLength, Metrics/CyclomaticComplexity
9
9
  module OmitParentheses
10
10
  TRAILING_WHITESPACE_REGEX = /\s+\Z/.freeze
11
11
  OMIT_MSG = 'Omit parentheses for method calls with arguments.'
@@ -13,7 +13,6 @@ module RuboCop
13
13
 
14
14
  private
15
15
 
16
- # rubocop:disable Metrics/CyclomaticComplexity
17
16
  def omit_parentheses(node)
18
17
  return unless node.parenthesized?
19
18
  return if inside_endless_method_def?(node)
@@ -27,7 +26,6 @@ module RuboCop
27
26
  auto_correct(corrector, node)
28
27
  end
29
28
  end
30
- # rubocop:enable Metrics/CyclomaticComplexity
31
29
 
32
30
  def auto_correct(corrector, node)
33
31
  if parentheses_at_the_end_of_multiline_call?(node)
@@ -44,7 +42,7 @@ module RuboCop
44
42
 
45
43
  def inside_endless_method_def?(node)
46
44
  # parens are required around arguments inside an endless method
47
- node.each_ancestor(:def).any?(&:endless?) && node.arguments.any?
45
+ node.each_ancestor(:def, :defs).any?(&:endless?) && node.arguments.any?
48
46
  end
49
47
 
50
48
  def syntax_like_method_call?(node)
@@ -57,8 +55,7 @@ module RuboCop
57
55
 
58
56
  def allowed_camel_case_method_call?(node)
59
57
  node.camel_case_method? &&
60
- (node.arguments.none? ||
61
- cop_config['AllowParenthesesInCamelCaseMethod'])
58
+ (node.arguments.none? || cop_config['AllowParenthesesInCamelCaseMethod'])
62
59
  end
63
60
 
64
61
  def allowed_string_interpolation_method_call?(node)
@@ -101,8 +98,7 @@ module RuboCop
101
98
  end
102
99
 
103
100
  def call_in_optional_arguments?(node)
104
- node.parent &&
105
- (node.parent.optarg_type? || node.parent.kwoptarg_type?)
101
+ node.parent && (node.parent.optarg_type? || node.parent.kwoptarg_type?)
106
102
  end
107
103
 
108
104
  def call_in_single_line_inheritance?(node)
@@ -114,14 +110,13 @@ module RuboCop
114
110
  call_as_argument_or_chain?(node) ||
115
111
  hash_literal_in_arguments?(node) ||
116
112
  node.descendants.any? do |n|
117
- ambigious_literal?(n) || logical_operator?(n) ||
113
+ n.forwarded_args_type? || ambigious_literal?(n) || logical_operator?(n) ||
118
114
  call_with_braced_block?(n)
119
115
  end
120
116
  end
121
117
 
122
118
  def call_with_braced_block?(node)
123
- (node.send_type? || node.super_type?) &&
124
- node.block_node && node.block_node.braces?
119
+ (node.send_type? || node.super_type?) && node.block_node && node.block_node.braces?
125
120
  end
126
121
 
127
122
  def call_as_argument_or_chain?(node)
@@ -147,13 +142,11 @@ module RuboCop
147
142
  previous = node.descendants.first
148
143
  return false unless previous&.send_type?
149
144
 
150
- previous.parenthesized? ||
151
- allowed_chained_call_with_parentheses?(previous)
145
+ previous.parenthesized? || allowed_chained_call_with_parentheses?(previous)
152
146
  end
153
147
 
154
148
  def ambigious_literal?(node)
155
- splat?(node) || ternary_if?(node) || regexp_slash_literal?(node) ||
156
- unary_literal?(node)
149
+ splat?(node) || ternary_if?(node) || regexp_slash_literal?(node) || unary_literal?(node)
157
150
  end
158
151
 
159
152
  def splat?(node)
@@ -182,15 +175,14 @@ module RuboCop
182
175
  end
183
176
 
184
177
  def assigned_before?(node, target)
185
- node.assignment? &&
186
- node.loc.operator.begin < target.loc.begin
178
+ node.assignment? && node.loc.operator.begin < target.loc.begin
187
179
  end
188
180
 
189
181
  def inside_string_interpolation?(node)
190
182
  node.ancestors.drop_while { |a| !a.begin_type? }.any?(&:dstr_type?)
191
183
  end
192
184
  end
193
- # rubocop:enable Metrics/ModuleLength
185
+ # rubocop:enable Metrics/ModuleLength, Metrics/CyclomaticComplexity
194
186
  end
195
187
  end
196
188
  end