rubocop 1.11.0 → 1.15.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 (425) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -3
  3. data/config/default.yml +58 -6
  4. data/exe/rubocop +1 -3
  5. data/lib/rubocop.rb +6 -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/cli/command/suggest_extensions.rb +3 -2
  12. data/lib/rubocop/comment_config.rb +45 -101
  13. data/lib/rubocop/config.rb +11 -26
  14. data/lib/rubocop/config_loader.rb +5 -11
  15. data/lib/rubocop/config_loader_resolver.rb +22 -14
  16. data/lib/rubocop/config_obsoletion/cop_rule.rb +1 -2
  17. data/lib/rubocop/config_store.rb +1 -2
  18. data/lib/rubocop/config_validator.rb +5 -10
  19. data/lib/rubocop/cop/autocorrect_logic.rb +3 -8
  20. data/lib/rubocop/cop/badge.rb +1 -2
  21. data/lib/rubocop/cop/base.rb +8 -6
  22. data/lib/rubocop/cop/bundler/duplicated_gem.rb +1 -2
  23. data/lib/rubocop/cop/bundler/gem_comment.rb +43 -11
  24. data/lib/rubocop/cop/bundler/gem_version.rb +99 -0
  25. data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -4
  26. data/lib/rubocop/cop/commissioner.rb +2 -8
  27. data/lib/rubocop/cop/cop.rb +4 -18
  28. data/lib/rubocop/cop/corrector.rb +1 -4
  29. data/lib/rubocop/cop/correctors/alignment_corrector.rb +6 -12
  30. data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +2 -4
  31. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +1 -2
  32. data/lib/rubocop/cop/correctors/line_break_corrector.rb +3 -6
  33. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +1 -3
  34. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +1 -3
  35. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -8
  36. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +1 -2
  37. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -4
  38. data/lib/rubocop/cop/generator.rb +1 -4
  39. data/lib/rubocop/cop/generator/configuration_injector.rb +1 -2
  40. data/lib/rubocop/cop/generator/require_file_injector.rb +2 -5
  41. data/lib/rubocop/cop/internal_affairs/example_description.rb +7 -5
  42. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +2 -5
  43. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -3
  44. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -3
  45. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +1 -2
  46. data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +1 -2
  47. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +1 -3
  48. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +12 -10
  49. data/lib/rubocop/cop/layout/argument_alignment.rb +34 -18
  50. data/lib/rubocop/cop/layout/array_alignment.rb +7 -6
  51. data/lib/rubocop/cop/layout/assignment_indentation.rb +8 -7
  52. data/lib/rubocop/cop/layout/begin_end_alignment.rb +1 -4
  53. data/lib/rubocop/cop/layout/block_alignment.rb +7 -19
  54. data/lib/rubocop/cop/layout/block_end_newline.rb +4 -8
  55. data/lib/rubocop/cop/layout/case_indentation.rb +1 -3
  56. data/lib/rubocop/cop/layout/class_structure.rb +4 -10
  57. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +18 -30
  58. data/lib/rubocop/cop/layout/comment_indentation.rb +17 -21
  59. data/lib/rubocop/cop/layout/def_end_alignment.rb +2 -6
  60. data/lib/rubocop/cop/layout/dot_position.rb +1 -3
  61. data/lib/rubocop/cop/layout/else_alignment.rb +10 -9
  62. data/lib/rubocop/cop/layout/empty_comment.rb +5 -12
  63. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +22 -8
  64. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +2 -6
  65. data/lib/rubocop/cop/layout/empty_lines.rb +1 -3
  66. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +8 -18
  67. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +2 -8
  68. data/lib/rubocop/cop/layout/end_alignment.rb +1 -2
  69. data/lib/rubocop/cop/layout/end_of_line.rb +1 -1
  70. data/lib/rubocop/cop/layout/extra_spacing.rb +3 -7
  71. data/lib/rubocop/cop/layout/first_argument_indentation.rb +6 -5
  72. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +10 -8
  73. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -2
  74. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +36 -20
  75. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -2
  76. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -2
  77. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +1 -2
  78. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +6 -5
  79. data/lib/rubocop/cop/layout/hash_alignment.rb +18 -13
  80. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -9
  81. data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -6
  82. data/lib/rubocop/cop/layout/indentation_consistency.rb +9 -6
  83. data/lib/rubocop/cop/layout/indentation_style.rb +25 -30
  84. data/lib/rubocop/cop/layout/indentation_width.rb +24 -12
  85. data/lib/rubocop/cop/layout/initial_indentation.rb +1 -4
  86. data/lib/rubocop/cop/layout/line_length.rb +4 -15
  87. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +1 -2
  88. data/lib/rubocop/cop/layout/multiline_block_layout.rb +7 -15
  89. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -2
  90. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -2
  91. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +22 -15
  92. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +10 -5
  93. data/lib/rubocop/cop/layout/parameter_alignment.rb +6 -5
  94. data/lib/rubocop/cop/layout/redundant_line_break.rb +137 -0
  95. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +3 -6
  96. data/lib/rubocop/cop/layout/single_line_block_chain.rb +53 -0
  97. data/lib/rubocop/cop/layout/space_after_colon.rb +1 -3
  98. data/lib/rubocop/cop/layout/space_after_method_name.rb +2 -4
  99. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +6 -14
  100. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +1 -2
  101. data/lib/rubocop/cop/layout/space_around_keyword.rb +3 -6
  102. data/lib/rubocop/cop/layout/space_around_operators.rb +4 -9
  103. data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -2
  104. data/lib/rubocop/cop/layout/space_before_brackets.rb +1 -3
  105. data/lib/rubocop/cop/layout/space_before_comment.rb +1 -3
  106. data/lib/rubocop/cop/layout/space_before_first_arg.rb +5 -11
  107. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +2 -4
  108. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +5 -10
  109. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +2 -7
  110. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +5 -10
  111. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +1 -2
  112. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +1 -2
  113. data/lib/rubocop/cop/legacy/corrections_proxy.rb +2 -8
  114. data/lib/rubocop/cop/legacy/corrector.rb +1 -3
  115. data/lib/rubocop/cop/lint/ambiguous_assignment.rb +1 -6
  116. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +14 -7
  117. data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -2
  118. data/lib/rubocop/cop/lint/constant_resolution.rb +1 -2
  119. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +83 -41
  120. data/lib/rubocop/cop/lint/deprecated_constants.rb +3 -3
  121. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +2 -5
  122. data/lib/rubocop/cop/lint/duplicate_branch.rb +1 -2
  123. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -3
  124. data/lib/rubocop/cop/lint/duplicate_methods.rb +3 -7
  125. data/lib/rubocop/cop/lint/else_layout.rb +1 -3
  126. data/lib/rubocop/cop/lint/empty_block.rb +18 -2
  127. data/lib/rubocop/cop/lint/empty_ensure.rb +1 -3
  128. data/lib/rubocop/cop/lint/empty_file.rb +1 -3
  129. data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -3
  130. data/lib/rubocop/cop/lint/ensure_return.rb +1 -3
  131. data/lib/rubocop/cop/lint/erb_new_arguments.rb +3 -7
  132. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -2
  133. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +3 -6
  134. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +1 -2
  135. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -2
  136. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +3 -7
  137. data/lib/rubocop/cop/lint/inherit_exception.rb +1 -2
  138. data/lib/rubocop/cop/lint/interpolation_check.rb +3 -11
  139. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +3 -6
  140. data/lib/rubocop/cop/lint/loop.rb +1 -2
  141. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +3 -7
  142. data/lib/rubocop/cop/lint/missing_super.rb +1 -2
  143. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -2
  144. data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -2
  145. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -3
  146. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +1 -3
  147. data/lib/rubocop/cop/lint/number_conversion.rb +11 -5
  148. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +1 -2
  149. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +1 -3
  150. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -3
  151. data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -3
  152. data/lib/rubocop/cop/lint/raise_exception.rb +1 -2
  153. data/lib/rubocop/cop/lint/rand_one.rb +1 -2
  154. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +9 -22
  155. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +1 -3
  156. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +3 -7
  157. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +1 -2
  158. data/lib/rubocop/cop/lint/redundant_with_index.rb +1 -4
  159. data/lib/rubocop/cop/lint/redundant_with_object.rb +1 -4
  160. data/lib/rubocop/cop/lint/regexp_as_condition.rb +1 -3
  161. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -4
  162. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -2
  163. data/lib/rubocop/cop/lint/rescue_type.rb +2 -7
  164. data/lib/rubocop/cop/lint/return_in_void_context.rb +1 -2
  165. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +1 -2
  166. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +4 -10
  167. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -2
  168. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +2 -7
  169. data/lib/rubocop/cop/lint/shadowed_argument.rb +4 -11
  170. data/lib/rubocop/cop/lint/shadowed_exception.rb +7 -8
  171. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -2
  172. data/lib/rubocop/cop/lint/suppressed_exception.rb +44 -1
  173. data/lib/rubocop/cop/lint/symbol_conversion.rb +91 -6
  174. data/lib/rubocop/cop/lint/syntax.rb +1 -3
  175. data/lib/rubocop/cop/lint/to_json.rb +1 -2
  176. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1 -3
  177. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +1 -3
  178. data/lib/rubocop/cop/lint/unreachable_code.rb +2 -5
  179. data/lib/rubocop/cop/lint/unreachable_loop.rb +14 -7
  180. data/lib/rubocop/cop/lint/unused_block_argument.rb +9 -7
  181. data/lib/rubocop/cop/lint/unused_method_argument.rb +1 -2
  182. data/lib/rubocop/cop/lint/useless_access_modifier.rb +2 -4
  183. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -9
  184. data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -3
  185. data/lib/rubocop/cop/lint/void.rb +5 -12
  186. data/lib/rubocop/cop/message_annotator.rb +1 -3
  187. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -7
  188. data/lib/rubocop/cop/metrics/class_length.rb +1 -3
  189. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -2
  190. data/lib/rubocop/cop/metrics/module_length.rb +2 -6
  191. data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -5
  192. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -2
  193. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +4 -7
  194. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +2 -7
  195. data/lib/rubocop/cop/migration/department_name.rb +3 -7
  196. data/lib/rubocop/cop/mixin/alignment.rb +12 -7
  197. data/lib/rubocop/cop/mixin/check_line_breakable.rb +20 -4
  198. data/lib/rubocop/cop/mixin/code_length.rb +1 -3
  199. data/lib/rubocop/cop/mixin/comments_help.rb +5 -1
  200. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +2 -2
  201. data/lib/rubocop/cop/mixin/configurable_formatting.rb +3 -8
  202. data/lib/rubocop/cop/mixin/def_node.rb +2 -5
  203. data/lib/rubocop/cop/mixin/documentation_comment.rb +3 -6
  204. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +3 -7
  205. data/lib/rubocop/cop/mixin/empty_parameter.rb +1 -3
  206. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -3
  207. data/lib/rubocop/cop/mixin/enforce_superclass.rb +2 -6
  208. data/lib/rubocop/cop/mixin/first_element_line_break.rb +1 -3
  209. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +7 -7
  210. data/lib/rubocop/cop/mixin/gem_declaration.rb +13 -0
  211. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +3 -6
  212. data/lib/rubocop/cop/mixin/hash_transform_method.rb +7 -22
  213. data/lib/rubocop/cop/mixin/interpolation.rb +1 -3
  214. data/lib/rubocop/cop/mixin/line_length_help.rb +13 -10
  215. data/lib/rubocop/cop/mixin/match_range.rb +2 -5
  216. data/lib/rubocop/cop/mixin/method_complexity.rb +1 -3
  217. data/lib/rubocop/cop/mixin/method_preference.rb +1 -2
  218. data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +4 -3
  219. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +1 -3
  220. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +11 -40
  221. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -2
  222. data/lib/rubocop/cop/mixin/negative_conditional.rb +1 -2
  223. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -4
  224. data/lib/rubocop/cop/mixin/percent_array.rb +1 -3
  225. data/lib/rubocop/cop/mixin/percent_literal.rb +0 -6
  226. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +5 -11
  227. data/lib/rubocop/cop/mixin/preferred_delimiters.rb +4 -7
  228. data/lib/rubocop/cop/mixin/range_help.rb +10 -13
  229. data/lib/rubocop/cop/mixin/rescue_node.rb +2 -6
  230. data/lib/rubocop/cop/mixin/safe_assignment.rb +1 -2
  231. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +2 -4
  232. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -2
  233. data/lib/rubocop/cop/mixin/statement_modifier.rb +1 -3
  234. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  235. data/lib/rubocop/cop/mixin/trailing_body.rb +1 -2
  236. data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -2
  237. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +7 -13
  238. data/lib/rubocop/cop/mixin/unused_argument.rb +1 -3
  239. data/lib/rubocop/cop/naming/ascii_identifiers.rb +2 -4
  240. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -2
  241. data/lib/rubocop/cop/naming/file_name.rb +7 -16
  242. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +6 -3
  243. data/lib/rubocop/cop/naming/method_name.rb +1 -2
  244. data/lib/rubocop/cop/naming/predicate_name.rb +1 -2
  245. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +10 -0
  246. data/lib/rubocop/cop/offense.rb +3 -8
  247. data/lib/rubocop/cop/registry.rb +12 -11
  248. data/lib/rubocop/cop/style/access_modifier_declarations.rb +3 -5
  249. data/lib/rubocop/cop/style/accessor_grouping.rb +1 -3
  250. data/lib/rubocop/cop/style/alias.rb +5 -12
  251. data/lib/rubocop/cop/style/and_or.rb +3 -1
  252. data/lib/rubocop/cop/style/arguments_forwarding.rb +1 -3
  253. data/lib/rubocop/cop/style/ascii_comments.rb +1 -2
  254. data/lib/rubocop/cop/style/attr.rb +1 -3
  255. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +2 -5
  256. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +59 -71
  257. data/lib/rubocop/cop/style/bisected_attr_accessor/macro.rb +60 -0
  258. data/lib/rubocop/cop/style/case_like_if.rb +16 -6
  259. data/lib/rubocop/cop/style/character_literal.rb +2 -4
  260. data/lib/rubocop/cop/style/class_and_module_children.rb +19 -10
  261. data/lib/rubocop/cop/style/class_equality_comparison.rb +2 -0
  262. data/lib/rubocop/cop/style/class_methods.rb +1 -3
  263. data/lib/rubocop/cop/style/collection_compact.rb +1 -3
  264. data/lib/rubocop/cop/style/colon_method_call.rb +1 -3
  265. data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
  266. data/lib/rubocop/cop/style/command_literal.rb +4 -9
  267. data/lib/rubocop/cop/style/comment_annotation.rb +3 -6
  268. data/lib/rubocop/cop/style/commented_keyword.rb +7 -13
  269. data/lib/rubocop/cop/style/conditional_assignment.rb +10 -24
  270. data/lib/rubocop/cop/style/copyright.rb +3 -6
  271. data/lib/rubocop/cop/style/date_time.rb +2 -5
  272. data/lib/rubocop/cop/style/def_with_parentheses.rb +1 -2
  273. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +2 -2
  274. data/lib/rubocop/cop/style/documentation.rb +25 -3
  275. data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -2
  276. data/lib/rubocop/cop/style/empty_case_condition.rb +2 -7
  277. data/lib/rubocop/cop/style/empty_else.rb +3 -9
  278. data/lib/rubocop/cop/style/empty_literal.rb +12 -9
  279. data/lib/rubocop/cop/style/empty_method.rb +3 -7
  280. data/lib/rubocop/cop/style/end_block.rb +1 -2
  281. data/lib/rubocop/cop/style/endless_method.rb +1 -3
  282. data/lib/rubocop/cop/style/eval_with_location.rb +3 -5
  283. data/lib/rubocop/cop/style/expand_path_arguments.rb +1 -3
  284. data/lib/rubocop/cop/style/explicit_block_argument.rb +1 -4
  285. data/lib/rubocop/cop/style/format_string_token.rb +1 -4
  286. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -11
  287. data/lib/rubocop/cop/style/guard_clause.rb +3 -7
  288. data/lib/rubocop/cop/style/hash_conversion.rb +31 -3
  289. data/lib/rubocop/cop/style/hash_each_methods.rb +1 -2
  290. data/lib/rubocop/cop/style/hash_like_case.rb +1 -2
  291. data/lib/rubocop/cop/style/hash_syntax.rb +20 -24
  292. data/lib/rubocop/cop/style/identical_conditional_branches.rb +1 -3
  293. data/lib/rubocop/cop/style/if_unless_modifier.rb +40 -13
  294. data/lib/rubocop/cop/style/infinite_loop.rb +2 -5
  295. data/lib/rubocop/cop/style/inverse_methods.rb +3 -7
  296. data/lib/rubocop/cop/style/ip_addresses.rb +1 -2
  297. data/lib/rubocop/cop/style/lambda.rb +2 -4
  298. data/lib/rubocop/cop/style/lambda_call.rb +1 -2
  299. data/lib/rubocop/cop/style/line_end_concatenation.rb +5 -12
  300. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +47 -3
  301. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +26 -16
  302. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +1 -2
  303. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -4
  304. data/lib/rubocop/cop/style/method_def_parentheses.rb +4 -8
  305. data/lib/rubocop/cop/style/min_max.rb +1 -2
  306. data/lib/rubocop/cop/style/missing_else.rb +2 -4
  307. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +1 -2
  308. data/lib/rubocop/cop/style/mixin_grouping.rb +4 -10
  309. data/lib/rubocop/cop/style/mixin_usage.rb +1 -2
  310. data/lib/rubocop/cop/style/module_function.rb +3 -6
  311. data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -2
  312. data/lib/rubocop/cop/style/multiline_method_signature.rb +11 -6
  313. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +1 -2
  314. data/lib/rubocop/cop/style/multiple_comparison.rb +2 -4
  315. data/lib/rubocop/cop/style/mutable_constant.rb +4 -10
  316. data/lib/rubocop/cop/style/negated_if.rb +1 -2
  317. data/lib/rubocop/cop/style/negated_if_else_condition.rb +23 -2
  318. data/lib/rubocop/cop/style/negated_unless.rb +1 -2
  319. data/lib/rubocop/cop/style/nested_modifier.rb +3 -7
  320. data/lib/rubocop/cop/style/nested_ternary_operator.rb +2 -3
  321. data/lib/rubocop/cop/style/next.rb +4 -9
  322. data/lib/rubocop/cop/style/nil_lambda.rb +29 -12
  323. data/lib/rubocop/cop/style/non_nil_check.rb +2 -5
  324. data/lib/rubocop/cop/style/numeric_literals.rb +3 -11
  325. data/lib/rubocop/cop/style/numeric_predicate.rb +2 -7
  326. data/lib/rubocop/cop/style/one_line_conditional.rb +1 -2
  327. data/lib/rubocop/cop/style/option_hash.rb +1 -3
  328. data/lib/rubocop/cop/style/optional_arguments.rb +2 -5
  329. data/lib/rubocop/cop/style/or_assignment.rb +2 -6
  330. data/lib/rubocop/cop/style/parallel_assignment.rb +6 -9
  331. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -3
  332. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -2
  333. data/lib/rubocop/cop/style/perl_backrefs.rb +2 -9
  334. data/lib/rubocop/cop/style/preferred_hash_methods.rb +1 -4
  335. data/lib/rubocop/cop/style/proc.rb +1 -2
  336. data/lib/rubocop/cop/style/raise_args.rb +4 -8
  337. data/lib/rubocop/cop/style/random_with_offset.rb +3 -8
  338. data/lib/rubocop/cop/style/redundant_argument.rb +2 -11
  339. data/lib/rubocop/cop/style/redundant_assignment.rb +1 -3
  340. data/lib/rubocop/cop/style/redundant_begin.rb +40 -6
  341. data/lib/rubocop/cop/style/redundant_capital_w.rb +1 -2
  342. data/lib/rubocop/cop/style/redundant_condition.rb +2 -5
  343. data/lib/rubocop/cop/style/redundant_conditional.rb +3 -6
  344. data/lib/rubocop/cop/style/redundant_exception.rb +3 -6
  345. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -1
  346. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -2
  347. data/lib/rubocop/cop/style/redundant_interpolation.rb +1 -2
  348. data/lib/rubocop/cop/style/redundant_parentheses.rb +8 -20
  349. data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -2
  350. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -4
  351. data/lib/rubocop/cop/style/redundant_return.rb +6 -4
  352. data/lib/rubocop/cop/style/redundant_self.rb +9 -9
  353. data/lib/rubocop/cop/style/redundant_self_assignment.rb +2 -2
  354. data/lib/rubocop/cop/style/redundant_sort.rb +2 -5
  355. data/lib/rubocop/cop/style/regexp_literal.rb +4 -8
  356. data/lib/rubocop/cop/style/rescue_modifier.rb +21 -14
  357. data/lib/rubocop/cop/style/rescue_standard_error.rb +3 -7
  358. data/lib/rubocop/cop/style/return_nil.rb +1 -2
  359. data/lib/rubocop/cop/style/safe_navigation.rb +10 -21
  360. data/lib/rubocop/cop/style/send.rb +1 -2
  361. data/lib/rubocop/cop/style/signal_exception.rb +3 -7
  362. data/lib/rubocop/cop/style/single_argument_dig.rb +1 -2
  363. data/lib/rubocop/cop/style/single_line_block_params.rb +2 -5
  364. data/lib/rubocop/cop/style/single_line_methods.rb +21 -4
  365. data/lib/rubocop/cop/style/sole_nested_conditional.rb +31 -7
  366. data/lib/rubocop/cop/style/special_global_vars.rb +6 -18
  367. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -2
  368. data/lib/rubocop/cop/style/stderr_puts.rb +2 -6
  369. data/lib/rubocop/cop/style/string_chars.rb +39 -0
  370. data/lib/rubocop/cop/style/string_concatenation.rb +8 -10
  371. data/lib/rubocop/cop/style/string_literals.rb +2 -5
  372. data/lib/rubocop/cop/style/struct_inheritance.rb +10 -0
  373. data/lib/rubocop/cop/style/symbol_literal.rb +1 -3
  374. data/lib/rubocop/cop/style/symbol_proc.rb +4 -9
  375. data/lib/rubocop/cop/style/ternary_parentheses.rb +3 -6
  376. data/lib/rubocop/cop/style/top_level_method_definition.rb +75 -0
  377. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +6 -3
  378. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +2 -6
  379. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +2 -5
  380. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -10
  381. data/lib/rubocop/cop/style/trivial_accessors.rb +67 -4
  382. data/lib/rubocop/cop/style/unless_else.rb +1 -2
  383. data/lib/rubocop/cop/style/unless_logical_operators.rb +8 -2
  384. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -1
  385. data/lib/rubocop/cop/style/when_then.rb +1 -3
  386. data/lib/rubocop/cop/style/while_until_modifier.rb +1 -2
  387. data/lib/rubocop/cop/style/word_array.rb +1 -2
  388. data/lib/rubocop/cop/style/yoda_condition.rb +3 -11
  389. data/lib/rubocop/cop/style/zero_length_predicate.rb +1 -2
  390. data/lib/rubocop/cop/team.rb +2 -5
  391. data/lib/rubocop/cop/util.rb +8 -11
  392. data/lib/rubocop/cop/utils/format_string.rb +1 -3
  393. data/lib/rubocop/cop/variable_force.rb +6 -15
  394. data/lib/rubocop/cop/variable_force/assignment.rb +1 -2
  395. data/lib/rubocop/cop/variable_force/branch.rb +16 -2
  396. data/lib/rubocop/cop/variable_force/reference.rb +1 -3
  397. data/lib/rubocop/cop/variable_force/scope.rb +4 -8
  398. data/lib/rubocop/cop/variable_force/variable.rb +2 -4
  399. data/lib/rubocop/cops_documentation_generator.rb +7 -21
  400. data/lib/rubocop/directive_comment.rb +69 -9
  401. data/lib/rubocop/ext/regexp_parser.rb +3 -6
  402. data/lib/rubocop/file_finder.rb +1 -3
  403. data/lib/rubocop/formatter/clang_style_formatter.rb +4 -2
  404. data/lib/rubocop/formatter/disabled_config_formatter.rb +3 -8
  405. data/lib/rubocop/formatter/git_hub_actions_formatter.rb +1 -5
  406. data/lib/rubocop/formatter/html_formatter.rb +4 -10
  407. data/lib/rubocop/formatter/json_formatter.rb +1 -5
  408. data/lib/rubocop/formatter/junit_formatter.rb +23 -14
  409. data/lib/rubocop/formatter/progress_formatter.rb +1 -3
  410. data/lib/rubocop/formatter/tap_formatter.rb +4 -2
  411. data/lib/rubocop/magic_comment.rb +1 -1
  412. data/lib/rubocop/options.rb +30 -50
  413. data/lib/rubocop/path_util.rb +1 -3
  414. data/lib/rubocop/rake_task.rb +3 -0
  415. data/lib/rubocop/remote_config.rb +4 -7
  416. data/lib/rubocop/result_cache.rb +5 -12
  417. data/lib/rubocop/rspec/cop_helper.rb +1 -1
  418. data/lib/rubocop/rspec/expect_offense.rb +4 -9
  419. data/lib/rubocop/rspec/shared_contexts.rb +8 -15
  420. data/lib/rubocop/runner.rb +7 -14
  421. data/lib/rubocop/target_finder.rb +19 -16
  422. data/lib/rubocop/target_ruby.rb +4 -8
  423. data/lib/rubocop/version.rb +1 -1
  424. metadata +13 -7
  425. data/lib/rubocop/core_ext/hash.rb +0 -20
@@ -107,13 +107,11 @@ module RuboCop
107
107
  private
108
108
 
109
109
  def allowed_slash_literal?(node)
110
- style == :slashes && !contains_disallowed_slash?(node) ||
111
- allowed_mixed_slash?(node)
110
+ style == :slashes && !contains_disallowed_slash?(node) || allowed_mixed_slash?(node)
112
111
  end
113
112
 
114
113
  def allowed_mixed_slash?(node)
115
- style == :mixed && node.single_line? &&
116
- !contains_disallowed_slash?(node)
114
+ style == :mixed && node.single_line? && !contains_disallowed_slash?(node)
117
115
  end
118
116
 
119
117
  def allowed_percent_r_literal?(node)
@@ -123,8 +121,7 @@ module RuboCop
123
121
  end
124
122
 
125
123
  def allowed_mixed_percent_r?(node)
126
- style == :mixed && node.multiline? ||
127
- contains_disallowed_slash?(node)
124
+ style == :mixed && node.multiline? || contains_disallowed_slash?(node)
128
125
  end
129
126
 
130
127
  def contains_disallowed_slash?(node)
@@ -149,8 +146,7 @@ module RuboCop
149
146
  end
150
147
 
151
148
  def preferred_delimiters
152
- config.for_cop('Style/PercentLiteralDelimiters') \
153
- ['PreferredDelimiters']['%r'].split('')
149
+ config.for_cop('Style/PercentLiteralDelimiters') ['PreferredDelimiters']['%r'].chars
154
150
  end
155
151
 
156
152
  def correct_delimiters(node, corrector)
@@ -39,23 +39,27 @@ module RuboCop
39
39
  # rescue SomeException
40
40
  # handle_error
41
41
  # end
42
- class RescueModifier < Cop
42
+ class RescueModifier < Base
43
43
  include Alignment
44
+ include RangeHelp
44
45
  include RescueNode
46
+ extend AutoCorrector
45
47
 
46
48
  MSG = 'Avoid using `rescue` in its modifier form.'
47
49
 
50
+ def self.autocorrect_incompatible_with
51
+ [Style::MethodCallWithArgsParentheses]
52
+ end
53
+
48
54
  def on_resbody(node)
49
55
  return unless rescue_modifier?(node)
50
56
 
51
- add_offense(node.parent)
52
- end
57
+ rescue_node = node.parent
58
+ add_offense(rescue_node) do |corrector|
59
+ parenthesized = parenthesized?(rescue_node)
53
60
 
54
- def autocorrect(node)
55
- parenthesized = parenthesized?(node)
56
- lambda do |corrector|
57
- corrector.replace(node, corrected_block(node, parenthesized))
58
- ParenthesesCorrector.correct(corrector, node.parent) if parenthesized
61
+ correct_rescue_block(corrector, rescue_node, parenthesized)
62
+ ParenthesesCorrector.correct(corrector, rescue_node.parent) if parenthesized
59
63
  end
60
64
  end
61
65
 
@@ -65,17 +69,20 @@ module RuboCop
65
69
  node.parent && parentheses?(node.parent)
66
70
  end
67
71
 
68
- def corrected_block(node, parenthesized)
72
+ def correct_rescue_block(corrector, node, parenthesized)
69
73
  operation, rescue_modifier, = *node
70
74
  *_, rescue_args = *rescue_modifier
71
75
 
72
76
  node_indentation, node_offset = indentation_and_offset(node, parenthesized)
73
77
 
74
- "begin\n" \
75
- "#{operation.source.gsub(/^/, node_indentation)}" \
76
- "\n#{node_offset}rescue\n" \
77
- "#{rescue_args.source.gsub(/^/, node_indentation)}" \
78
- "\n#{node_offset}end"
78
+ corrector.remove(range_between(operation.source_range.end_pos, node.source_range.end_pos))
79
+ corrector.insert_before(operation, "begin\n#{node_indentation}")
80
+ corrector.insert_after(operation, <<~RESCUE_CLAUSE.chop)
81
+
82
+ #{node_offset}rescue
83
+ #{node_indentation}#{rescue_args.source}
84
+ #{node_offset}end
85
+ RESCUE_CLAUSE
79
86
  end
80
87
 
81
88
  def indentation_and_offset(node, parenthesized)
@@ -76,10 +76,8 @@ module RuboCop
76
76
  include RangeHelp
77
77
  extend AutoCorrector
78
78
 
79
- MSG_IMPLICIT = 'Omit the error class when rescuing ' \
80
- '`StandardError` by itself.'
81
- MSG_EXPLICIT = 'Avoid rescuing without specifying ' \
82
- 'an error class.'
79
+ MSG_IMPLICIT = 'Omit the error class when rescuing `StandardError` by itself.'
80
+ MSG_EXPLICIT = 'Avoid rescuing without specifying an error class.'
83
81
 
84
82
  # @!method rescue_without_error_class?(node)
85
83
  def_node_matcher :rescue_without_error_class?, <<~PATTERN
@@ -100,9 +98,7 @@ module RuboCop
100
98
  offense_for_implicit_enforced_style(node, error)
101
99
  end
102
100
  when :explicit
103
- rescue_without_error_class?(node) do
104
- offense_for_exlicit_enforced_style(node)
105
- end
101
+ rescue_without_error_class?(node) { offense_for_exlicit_enforced_style(node) }
106
102
  end
107
103
  end
108
104
 
@@ -74,8 +74,7 @@ module RuboCop
74
74
  end
75
75
 
76
76
  def correct_style?(node)
77
- style == :return && !return_nil_node?(node) ||
78
- style == :return_nil && !return_node?(node)
77
+ style == :return && !return_nil_node?(node) || style == :return_nil && !return_node?(node)
79
78
  end
80
79
 
81
80
  def scoped_node?(node)
@@ -69,8 +69,7 @@ module RuboCop
69
69
 
70
70
  MSG = 'Use safe navigation (`&.`) instead of checking if an object ' \
71
71
  'exists before calling the method.'
72
- LOGIC_JUMP_KEYWORDS = %i[break fail next raise
73
- return throw yield].freeze
72
+ LOGIC_JUMP_KEYWORDS = %i[break fail next raise return throw yield].freeze
74
73
 
75
74
  # if format: (if checked_variable body nil)
76
75
  # unless format: (if checked_variable nil body)
@@ -112,9 +111,7 @@ module RuboCop
112
111
  return if unsafe_method_used?(method_chain, method)
113
112
  return if method_chain.method?(:empty?)
114
113
 
115
- add_offense(node) do |corrector|
116
- autocorrect(corrector, node)
117
- end
114
+ add_offense(node) { |corrector| autocorrect(corrector, node) }
118
115
  end
119
116
 
120
117
  def use_var_only_in_unless_modifier?(node, variable)
@@ -139,8 +136,7 @@ module RuboCop
139
136
  comments = comments(node)
140
137
  return if comments.empty?
141
138
 
142
- corrector.insert_before(method_call,
143
- "#{comments.map(&:text).join("\n")}\n")
139
+ corrector.insert_before(method_call, "#{comments.map(&:text).join("\n")}\n")
144
140
  end
145
141
 
146
142
  def comments(node)
@@ -181,11 +177,9 @@ module RuboCop
181
177
  end
182
178
 
183
179
  def extract_parts_from_if(node)
184
- variable, receiver =
185
- modifier_if_safe_navigation_candidate(node)
180
+ variable, receiver = modifier_if_safe_navigation_candidate(node)
186
181
 
187
- checked_variable, matching_receiver, method =
188
- extract_common_parts(receiver, variable)
182
+ checked_variable, matching_receiver, method = extract_common_parts(receiver, variable)
189
183
 
190
184
  matching_receiver = nil if receiver && LOGIC_JUMP_KEYWORDS.include?(receiver.type)
191
185
 
@@ -195,18 +189,15 @@ module RuboCop
195
189
  def extract_parts_from_and(node)
196
190
  checked_variable, rhs = *node
197
191
  if cop_config['ConvertCodeThatCanStartToReturnNil']
198
- checked_variable =
199
- not_nil_check?(checked_variable) || checked_variable
192
+ checked_variable = not_nil_check?(checked_variable) || checked_variable
200
193
  end
201
194
 
202
- checked_variable, matching_receiver, method =
203
- extract_common_parts(rhs, checked_variable)
195
+ checked_variable, matching_receiver, method = extract_common_parts(rhs, checked_variable)
204
196
  [checked_variable, matching_receiver, rhs, method]
205
197
  end
206
198
 
207
199
  def extract_common_parts(method_chain, checked_variable)
208
- matching_receiver =
209
- find_matching_receiver_invocation(method_chain, checked_variable)
200
+ matching_receiver = find_matching_receiver_invocation(method_chain, checked_variable)
210
201
 
211
202
  method = matching_receiver.parent if matching_receiver
212
203
 
@@ -264,13 +255,11 @@ module RuboCop
264
255
  end
265
256
 
266
257
  def begin_range(node, method_call)
267
- range_between(node.loc.expression.begin_pos,
268
- method_call.loc.expression.begin_pos)
258
+ range_between(node.loc.expression.begin_pos, method_call.loc.expression.begin_pos)
269
259
  end
270
260
 
271
261
  def end_range(node, method_call)
272
- range_between(method_call.loc.expression.end_pos,
273
- node.loc.expression.end_pos)
262
+ range_between(method_call.loc.expression.end_pos, node.loc.expression.end_pos)
274
263
  end
275
264
 
276
265
  def add_safe_nav_to_all_methods_in_chain(corrector,
@@ -14,8 +14,7 @@ module RuboCop
14
14
  # Foo.__send__(:bar)
15
15
  # quuz.public_send(:fred)
16
16
  class Send < Base
17
- MSG = 'Prefer `Object#__send__` or `Object#public_send` to ' \
18
- '`send`.'
17
+ MSG = 'Prefer `Object#__send__` or `Object#public_send` to `send`.'
19
18
  RESTRICT_ON_SEND = %i[send].freeze
20
19
 
21
20
  def on_send(node)
@@ -109,8 +109,7 @@ module RuboCop
109
109
  extend AutoCorrector
110
110
 
111
111
  FAIL_MSG = 'Use `fail` instead of `raise` to signal exceptions.'
112
- RAISE_MSG = 'Use `raise` instead of `fail` to ' \
113
- 'rethrow exceptions.'
112
+ RAISE_MSG = 'Use `raise` instead of `fail` to rethrow exceptions.'
114
113
 
115
114
  RESTRICT_ON_SEND = %i[raise fail].freeze
116
115
 
@@ -118,8 +117,7 @@ module RuboCop
118
117
  def_node_matcher :kernel_call?, '(send (const {nil? cbase} :Kernel) %1 ...)'
119
118
 
120
119
  # @!method custom_fail_methods(node)
121
- def_node_search :custom_fail_methods,
122
- '{(def :fail ...) (defs _ :fail ...)}'
120
+ def_node_search :custom_fail_methods, '{(def :fail ...) (defs _ :fail ...)}'
123
121
 
124
122
  def on_new_investigation
125
123
  ast = processed_source.ast
@@ -204,9 +202,7 @@ module RuboCop
204
202
  end
205
203
 
206
204
  def allow(method_name, node)
207
- each_command_or_kernel_call(method_name, node) do |send_node|
208
- ignore_node(send_node)
209
- end
205
+ each_command_or_kernel_call(method_name, node) { |send_node| ignore_node(send_node) }
210
206
  end
211
207
 
212
208
  def each_command_or_kernel_call(method_name, node)
@@ -43,8 +43,7 @@ module RuboCop
43
43
  receiver = node.receiver.source
44
44
  argument = expression.source
45
45
 
46
- message = format(MSG, receiver: receiver, argument: argument,
47
- original: node.source)
46
+ message = format(MSG, receiver: receiver, argument: argument, original: node.source)
48
47
  add_offense(node, message: message) do |corrector|
49
48
  correct_access = "#{receiver}[#{argument}]"
50
49
  corrector.replace(node, correct_access)
@@ -81,8 +81,7 @@ module RuboCop
81
81
  end
82
82
 
83
83
  def eligible_method?(node)
84
- node.send_node.receiver &&
85
- method_names.include?(node.send_node.method_name)
84
+ node.send_node.receiver && method_names.include?(node.send_node.method_name)
86
85
  end
87
86
 
88
87
  def methods
@@ -108,9 +107,7 @@ module RuboCop
108
107
 
109
108
  # Prepending an underscore to mark an unused parameter is allowed, so
110
109
  # we remove any leading underscores before comparing.
111
- actual_args_no_underscores = actual_args.map do |arg|
112
- arg.to_s.sub(/^_+/, '')
113
- end
110
+ actual_args_no_underscores = actual_args.map { |arg| arg.to_s.sub(/^_+/, '') }
114
111
 
115
112
  actual_args_no_underscores == target_args(method_name)
116
113
  end
@@ -42,9 +42,7 @@ module RuboCop
42
42
  return if node.endless?
43
43
  return if allow_empty? && !node.body
44
44
 
45
- add_offense(node) do |corrector|
46
- autocorrect(corrector, node)
47
- end
45
+ add_offense(node) { |corrector| autocorrect(corrector, node) }
48
46
  end
49
47
  alias on_defs on_def
50
48
 
@@ -70,6 +68,7 @@ module RuboCop
70
68
  return false unless endless_method_config['Enabled']
71
69
  return false if endless_method_config['EnforcedStyle'] == 'disallow'
72
70
  return false unless body_node
71
+ return false if body_node.parent.assignment_method?
73
72
 
74
73
  !(body_node.begin_type? || body_node.kwbegin_type?)
75
74
  end
@@ -91,8 +90,11 @@ module RuboCop
91
90
  end
92
91
 
93
92
  def correct_to_endless(corrector, node)
93
+ self_receiver = node.self_receiver? ? 'self.' : ''
94
94
  arguments = node.arguments.any? ? node.arguments.source : '()'
95
- replacement = "def #{node.method_name}#{arguments} = #{node.body.source}"
95
+ body_source = method_body_source(node.body)
96
+ replacement = "def #{self_receiver}#{node.method_name}#{arguments} = #{body_source}"
97
+
96
98
  corrector.replace(node, replacement)
97
99
  end
98
100
 
@@ -112,6 +114,21 @@ module RuboCop
112
114
  node: node, corrector: corrector
113
115
  )
114
116
  end
117
+
118
+ def method_body_source(method_body)
119
+ if require_parentheses?(method_body)
120
+ arguments_source = method_body.arguments.map(&:source).join(', ')
121
+ body_source = "#{method_body.method_name}(#{arguments_source})"
122
+
123
+ method_body.receiver ? "#{method_body.receiver.source}.#{body_source}" : body_source
124
+ else
125
+ method_body.source
126
+ end
127
+ end
128
+
129
+ def require_parentheses?(method_body)
130
+ method_body.send_type? && !method_body.arguments.empty? && !method_body.comparison_method?
131
+ end
115
132
  end
116
133
  end
117
134
  end
@@ -36,13 +36,13 @@ module RuboCop
36
36
  include RangeHelp
37
37
  extend AutoCorrector
38
38
 
39
- MSG = 'Consider merging nested conditions into '\
40
- 'outer `%<conditional_type>s` conditions.'
39
+ MSG = 'Consider merging nested conditions into outer `%<conditional_type>s` conditions.'
41
40
 
42
41
  def on_if(node)
43
42
  return if node.ternary? || node.else? || node.elsif?
44
43
 
45
44
  if_branch = node.if_branch
45
+ return if use_variable_assignment_in_condition?(node.condition, if_branch)
46
46
  return unless offending_branch?(if_branch)
47
47
 
48
48
  message = format(MSG, conditional_type: node.keyword)
@@ -53,6 +53,21 @@ module RuboCop
53
53
 
54
54
  private
55
55
 
56
+ def use_variable_assignment_in_condition?(condition, if_branch)
57
+ assigned_variables = assigned_variables(condition)
58
+
59
+ assigned_variables && if_branch&.if_type? &&
60
+ assigned_variables.include?(if_branch.condition.source)
61
+ end
62
+
63
+ def assigned_variables(condition)
64
+ assigned_variables = condition.assignment? ? [condition.children.first.to_s] : []
65
+
66
+ assigned_variables + condition.descendants.select(&:assignment?).map do |node|
67
+ node.children.first.to_s
68
+ end
69
+ end
70
+
56
71
  def offending_branch?(branch)
57
72
  return false unless branch
58
73
 
@@ -65,10 +80,7 @@ module RuboCop
65
80
  def autocorrect(corrector, node, if_branch)
66
81
  corrector.wrap(node.condition, '(', ')') if node.condition.or_type?
67
82
 
68
- if node.unless?
69
- corrector.replace(node.loc.keyword, 'if')
70
- corrector.insert_before(node.condition, '!')
71
- end
83
+ correct_from_unless_to_if(corrector, node) if node.unless?
72
84
 
73
85
  and_operator = if_branch.unless? ? ' && !' : ' && '
74
86
  if if_branch.modifier_form?
@@ -79,6 +91,17 @@ module RuboCop
79
91
  end
80
92
  end
81
93
 
94
+ def correct_from_unless_to_if(corrector, node)
95
+ corrector.replace(node.loc.keyword, 'if')
96
+
97
+ condition = node.condition
98
+ if condition.send_type? && condition.comparison_method? && !condition.parenthesized?
99
+ corrector.wrap(node.condition, '!(', ')')
100
+ else
101
+ corrector.insert_before(node.condition, '!')
102
+ end
103
+ end
104
+
82
105
  def correct_for_guard_condition_style(corrector, node, if_branch, and_operator)
83
106
  outer_condition = node.condition
84
107
  correct_outer_condition(corrector, outer_condition)
@@ -121,7 +144,8 @@ module RuboCop
121
144
  end
122
145
 
123
146
  def requrie_parentheses?(condition)
124
- condition.send_type? && !condition.arguments.empty? && !condition.parenthesized?
147
+ condition.send_type? && !condition.arguments.empty? && !condition.parenthesized? &&
148
+ !condition.comparison_method?
125
149
  end
126
150
 
127
151
  def arguments_range(node)
@@ -80,25 +80,15 @@ module RuboCop
80
80
  :$* => %i[$ARGV ARGV]
81
81
  }
82
82
 
83
- PERL_VARS =
84
- ENGLISH_VARS.flat_map { |k, vs| vs.map { |v| [v, [k]] } }.to_h
85
-
86
- ENGLISH_VARS.merge!(
87
- ENGLISH_VARS.flat_map { |_, vs| vs.map { |v| [v, [v]] } }.to_h
88
- )
89
- PERL_VARS.merge!(
90
- PERL_VARS.flat_map { |_, vs| vs.map { |v| [v, [v]] } }.to_h
91
- )
83
+ PERL_VARS = ENGLISH_VARS.flat_map { |k, vs| vs.map { |v| [v, [k]] } }.to_h
84
+
85
+ ENGLISH_VARS.merge!(ENGLISH_VARS.flat_map { |_, vs| vs.map { |v| [v, [v]] } }.to_h)
86
+ PERL_VARS.merge!(PERL_VARS.flat_map { |_, vs| vs.map { |v| [v, [v]] } }.to_h)
92
87
  ENGLISH_VARS.each_value(&:freeze).freeze
93
88
  PERL_VARS.each_value(&:freeze).freeze
94
89
 
95
90
  # Anything *not* in this set is provided by the English library.
96
- NON_ENGLISH_VARS = Set.new(%i[
97
- $LOAD_PATH
98
- $LOADED_FEATURES
99
- $PROGRAM_NAME
100
- ARGV
101
- ]).freeze
91
+ NON_ENGLISH_VARS = Set.new(%i[$LOAD_PATH $LOADED_FEATURES $PROGRAM_NAME ARGV]).freeze
102
92
 
103
93
  def on_gvar(node)
104
94
  global_var, = *node
@@ -120,9 +110,7 @@ module RuboCop
120
110
  if style == :use_english_names
121
111
  format_english_message(global_var)
122
112
  else
123
- format(MSG_REGULAR,
124
- prefer: preferred_names(global_var).first,
125
- global: global_var)
113
+ format(MSG_REGULAR, prefer: preferred_names(global_var).first, global: global_var)
126
114
  end
127
115
  end
128
116