rubocop 1.9.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 (488) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +15 -14
  3. data/assets/output.html.erb +1 -1
  4. data/config/default.yml +77 -17
  5. data/config/obsoletion.yml +4 -0
  6. data/exe/rubocop +1 -3
  7. data/lib/rubocop.rb +5 -1
  8. data/lib/rubocop/cached_data.rb +1 -3
  9. data/lib/rubocop/cli.rb +4 -6
  10. data/lib/rubocop/cli/command/auto_genenerate_config.rb +9 -19
  11. data/lib/rubocop/cli/command/execute_runner.rb +1 -1
  12. data/lib/rubocop/cli/command/init_dotfile.rb +1 -3
  13. data/lib/rubocop/cli/command/show_cops.rb +1 -4
  14. data/lib/rubocop/cli/command/suggest_extensions.rb +3 -2
  15. data/lib/rubocop/comment_config.rb +45 -101
  16. data/lib/rubocop/config.rb +11 -26
  17. data/lib/rubocop/config_loader.rb +5 -11
  18. data/lib/rubocop/config_loader_resolver.rb +22 -14
  19. data/lib/rubocop/config_obsoletion/cop_rule.rb +1 -2
  20. data/lib/rubocop/config_store.rb +1 -2
  21. data/lib/rubocop/config_validator.rb +5 -10
  22. data/lib/rubocop/cop/autocorrect_logic.rb +3 -8
  23. data/lib/rubocop/cop/badge.rb +1 -2
  24. data/lib/rubocop/cop/base.rb +8 -6
  25. data/lib/rubocop/cop/bundler/duplicated_gem.rb +3 -3
  26. data/lib/rubocop/cop/bundler/gem_comment.rb +43 -8
  27. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +1 -0
  28. data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -4
  29. data/lib/rubocop/cop/commissioner.rb +2 -8
  30. data/lib/rubocop/cop/cop.rb +4 -18
  31. data/lib/rubocop/cop/corrector.rb +1 -4
  32. data/lib/rubocop/cop/correctors/alignment_corrector.rb +6 -12
  33. data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +2 -4
  34. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +1 -2
  35. data/lib/rubocop/cop/correctors/line_break_corrector.rb +3 -6
  36. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +1 -3
  37. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +1 -3
  38. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -8
  39. data/lib/rubocop/cop/gemspec/date_assignment.rb +57 -0
  40. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +3 -2
  41. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +2 -4
  42. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +2 -0
  43. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +2 -0
  44. data/lib/rubocop/cop/generator.rb +3 -6
  45. data/lib/rubocop/cop/generator/configuration_injector.rb +1 -2
  46. data/lib/rubocop/cop/generator/require_file_injector.rb +2 -5
  47. data/lib/rubocop/cop/internal_affairs.rb +1 -0
  48. data/lib/rubocop/cop/internal_affairs/example_description.rb +7 -4
  49. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +3 -5
  50. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +3 -3
  51. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +151 -0
  52. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +2 -3
  53. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +3 -2
  54. data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +1 -0
  55. data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +1 -0
  56. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -0
  57. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +3 -0
  58. data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +5 -2
  59. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +3 -3
  60. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +12 -10
  61. data/lib/rubocop/cop/layout/argument_alignment.rb +8 -9
  62. data/lib/rubocop/cop/layout/array_alignment.rb +7 -6
  63. data/lib/rubocop/cop/layout/assignment_indentation.rb +8 -7
  64. data/lib/rubocop/cop/layout/begin_end_alignment.rb +1 -4
  65. data/lib/rubocop/cop/layout/block_alignment.rb +8 -19
  66. data/lib/rubocop/cop/layout/block_end_newline.rb +4 -8
  67. data/lib/rubocop/cop/layout/case_indentation.rb +1 -3
  68. data/lib/rubocop/cop/layout/class_structure.rb +5 -10
  69. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +18 -30
  70. data/lib/rubocop/cop/layout/comment_indentation.rb +17 -21
  71. data/lib/rubocop/cop/layout/def_end_alignment.rb +2 -6
  72. data/lib/rubocop/cop/layout/dot_position.rb +1 -3
  73. data/lib/rubocop/cop/layout/else_alignment.rb +10 -9
  74. data/lib/rubocop/cop/layout/empty_comment.rb +5 -12
  75. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +22 -8
  76. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +2 -6
  77. data/lib/rubocop/cop/layout/empty_lines.rb +1 -3
  78. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +8 -18
  79. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +2 -8
  80. data/lib/rubocop/cop/layout/end_alignment.rb +1 -2
  81. data/lib/rubocop/cop/layout/end_of_line.rb +1 -1
  82. data/lib/rubocop/cop/layout/extra_spacing.rb +5 -9
  83. data/lib/rubocop/cop/layout/first_argument_indentation.rb +12 -6
  84. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +10 -8
  85. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -2
  86. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +24 -20
  87. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -2
  88. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -2
  89. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +1 -2
  90. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +6 -5
  91. data/lib/rubocop/cop/layout/hash_alignment.rb +3 -6
  92. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -9
  93. data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -6
  94. data/lib/rubocop/cop/layout/indentation_consistency.rb +9 -6
  95. data/lib/rubocop/cop/layout/indentation_style.rb +25 -30
  96. data/lib/rubocop/cop/layout/indentation_width.rb +21 -11
  97. data/lib/rubocop/cop/layout/initial_indentation.rb +1 -4
  98. data/lib/rubocop/cop/layout/line_length.rb +4 -15
  99. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +1 -2
  100. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +26 -0
  101. data/lib/rubocop/cop/layout/multiline_block_layout.rb +7 -15
  102. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -2
  103. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -2
  104. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +22 -15
  105. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +10 -5
  106. data/lib/rubocop/cop/layout/parameter_alignment.rb +6 -5
  107. data/lib/rubocop/cop/layout/redundant_line_break.rb +125 -0
  108. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +3 -6
  109. data/lib/rubocop/cop/layout/space_after_colon.rb +1 -3
  110. data/lib/rubocop/cop/layout/space_after_method_name.rb +2 -4
  111. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +6 -14
  112. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +1 -2
  113. data/lib/rubocop/cop/layout/space_around_keyword.rb +3 -6
  114. data/lib/rubocop/cop/layout/space_around_operators.rb +4 -9
  115. data/lib/rubocop/cop/layout/space_before_block_braces.rb +2 -3
  116. data/lib/rubocop/cop/layout/space_before_brackets.rb +2 -4
  117. data/lib/rubocop/cop/layout/space_before_comment.rb +1 -3
  118. data/lib/rubocop/cop/layout/space_before_first_arg.rb +5 -11
  119. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +2 -4
  120. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +5 -10
  121. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +2 -7
  122. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +6 -11
  123. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +1 -2
  124. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +1 -2
  125. data/lib/rubocop/cop/legacy/corrections_proxy.rb +2 -8
  126. data/lib/rubocop/cop/legacy/corrector.rb +1 -3
  127. data/lib/rubocop/cop/lint/ambiguous_assignment.rb +1 -6
  128. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +14 -7
  129. data/lib/rubocop/cop/lint/big_decimal_new.rb +1 -0
  130. data/lib/rubocop/cop/lint/boolean_symbol.rb +2 -2
  131. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +2 -0
  132. data/lib/rubocop/cop/lint/constant_resolution.rb +2 -2
  133. data/lib/rubocop/cop/lint/debugger.rb +60 -14
  134. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +2 -4
  135. data/lib/rubocop/cop/lint/deprecated_constants.rb +3 -3
  136. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +16 -9
  137. data/lib/rubocop/cop/lint/duplicate_branch.rb +2 -3
  138. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -3
  139. data/lib/rubocop/cop/lint/duplicate_methods.rb +6 -7
  140. data/lib/rubocop/cop/lint/duplicate_require.rb +3 -2
  141. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -0
  142. data/lib/rubocop/cop/lint/else_layout.rb +2 -4
  143. data/lib/rubocop/cop/lint/empty_ensure.rb +1 -3
  144. data/lib/rubocop/cop/lint/empty_file.rb +1 -3
  145. data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -3
  146. data/lib/rubocop/cop/lint/ensure_return.rb +1 -3
  147. data/lib/rubocop/cop/lint/erb_new_arguments.rb +4 -7
  148. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -2
  149. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +4 -6
  150. data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +1 -0
  151. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +1 -2
  152. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -2
  153. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +4 -7
  154. data/lib/rubocop/cop/lint/inherit_exception.rb +2 -2
  155. data/lib/rubocop/cop/lint/interpolation_check.rb +3 -11
  156. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +3 -6
  157. data/lib/rubocop/cop/lint/loop.rb +1 -2
  158. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +3 -7
  159. data/lib/rubocop/cop/lint/missing_super.rb +1 -2
  160. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -2
  161. data/lib/rubocop/cop/lint/multiple_comparison.rb +5 -4
  162. data/lib/rubocop/cop/lint/nested_method_definition.rb +4 -2
  163. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -3
  164. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -0
  165. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +8 -3
  166. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -0
  167. data/lib/rubocop/cop/lint/number_conversion.rb +12 -4
  168. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +1 -2
  169. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +1 -3
  170. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -3
  171. data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -3
  172. data/lib/rubocop/cop/lint/raise_exception.rb +3 -2
  173. data/lib/rubocop/cop/lint/rand_one.rb +2 -2
  174. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +9 -22
  175. data/lib/rubocop/cop/lint/redundant_require_statement.rb +1 -0
  176. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +2 -3
  177. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +10 -10
  178. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
  179. data/lib/rubocop/cop/lint/redundant_with_index.rb +2 -4
  180. data/lib/rubocop/cop/lint/redundant_with_object.rb +2 -4
  181. data/lib/rubocop/cop/lint/regexp_as_condition.rb +1 -3
  182. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -4
  183. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -2
  184. data/lib/rubocop/cop/lint/rescue_type.rb +2 -7
  185. data/lib/rubocop/cop/lint/return_in_void_context.rb +1 -2
  186. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +2 -2
  187. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +4 -10
  188. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +2 -2
  189. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +3 -7
  190. data/lib/rubocop/cop/lint/shadowed_argument.rb +5 -11
  191. data/lib/rubocop/cop/lint/shadowed_exception.rb +7 -8
  192. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +1 -0
  193. data/lib/rubocop/cop/lint/struct_new_override.rb +2 -2
  194. data/lib/rubocop/cop/lint/suppressed_exception.rb +44 -1
  195. data/lib/rubocop/cop/lint/symbol_conversion.rb +91 -6
  196. data/lib/rubocop/cop/lint/syntax.rb +1 -3
  197. data/lib/rubocop/cop/lint/to_enum_arguments.rb +3 -0
  198. data/lib/rubocop/cop/lint/to_json.rb +1 -2
  199. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1 -3
  200. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +1 -3
  201. data/lib/rubocop/cop/lint/unified_integer.rb +1 -0
  202. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +5 -0
  203. data/lib/rubocop/cop/lint/unreachable_code.rb +3 -5
  204. data/lib/rubocop/cop/lint/unreachable_loop.rb +3 -5
  205. data/lib/rubocop/cop/lint/unused_block_argument.rb +4 -8
  206. data/lib/rubocop/cop/lint/unused_method_argument.rb +2 -2
  207. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -0
  208. data/lib/rubocop/cop/lint/useless_access_modifier.rb +6 -4
  209. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -9
  210. data/lib/rubocop/cop/lint/useless_setter_call.rb +2 -3
  211. data/lib/rubocop/cop/lint/useless_times.rb +3 -0
  212. data/lib/rubocop/cop/lint/void.rb +4 -11
  213. data/lib/rubocop/cop/message_annotator.rb +1 -3
  214. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -7
  215. data/lib/rubocop/cop/metrics/class_length.rb +1 -3
  216. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -2
  217. data/lib/rubocop/cop/metrics/module_length.rb +3 -6
  218. data/lib/rubocop/cop/metrics/parameter_lists.rb +3 -5
  219. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -2
  220. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +4 -7
  221. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +6 -4
  222. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +4 -7
  223. data/lib/rubocop/cop/migration/department_name.rb +3 -7
  224. data/lib/rubocop/cop/mixin/alignment.rb +12 -7
  225. data/lib/rubocop/cop/mixin/check_line_breakable.rb +1 -1
  226. data/lib/rubocop/cop/mixin/code_length.rb +1 -3
  227. data/lib/rubocop/cop/mixin/comments_help.rb +5 -1
  228. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +2 -2
  229. data/lib/rubocop/cop/mixin/configurable_formatting.rb +3 -8
  230. data/lib/rubocop/cop/mixin/def_node.rb +3 -5
  231. data/lib/rubocop/cop/mixin/documentation_comment.rb +3 -6
  232. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +6 -7
  233. data/lib/rubocop/cop/mixin/empty_parameter.rb +2 -3
  234. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -3
  235. data/lib/rubocop/cop/mixin/enforce_superclass.rb +4 -6
  236. data/lib/rubocop/cop/mixin/first_element_line_break.rb +1 -3
  237. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +3 -9
  238. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +3 -6
  239. data/lib/rubocop/cop/mixin/hash_transform_method.rb +8 -22
  240. data/lib/rubocop/cop/mixin/interpolation.rb +1 -3
  241. data/lib/rubocop/cop/mixin/line_length_help.rb +13 -10
  242. data/lib/rubocop/cop/mixin/match_range.rb +2 -5
  243. data/lib/rubocop/cop/mixin/method_complexity.rb +2 -3
  244. data/lib/rubocop/cop/mixin/method_preference.rb +1 -2
  245. data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +4 -3
  246. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +1 -3
  247. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +11 -40
  248. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -2
  249. data/lib/rubocop/cop/mixin/negative_conditional.rb +4 -2
  250. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -4
  251. data/lib/rubocop/cop/mixin/percent_array.rb +1 -3
  252. data/lib/rubocop/cop/mixin/percent_literal.rb +0 -6
  253. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +5 -11
  254. data/lib/rubocop/cop/mixin/preferred_delimiters.rb +6 -9
  255. data/lib/rubocop/cop/mixin/range_help.rb +10 -13
  256. data/lib/rubocop/cop/mixin/rational_literal.rb +1 -0
  257. data/lib/rubocop/cop/mixin/rescue_node.rb +2 -6
  258. data/lib/rubocop/cop/mixin/safe_assignment.rb +6 -2
  259. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +2 -4
  260. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -2
  261. data/lib/rubocop/cop/mixin/statement_modifier.rb +1 -3
  262. data/lib/rubocop/cop/mixin/trailing_body.rb +1 -2
  263. data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -2
  264. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +7 -13
  265. data/lib/rubocop/cop/mixin/unused_argument.rb +1 -3
  266. data/lib/rubocop/cop/mixin/visibility_help.rb +1 -0
  267. data/lib/rubocop/cop/naming/ascii_identifiers.rb +2 -4
  268. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +2 -2
  269. data/lib/rubocop/cop/naming/constant_name.rb +2 -0
  270. data/lib/rubocop/cop/naming/file_name.rb +7 -16
  271. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +8 -3
  272. data/lib/rubocop/cop/naming/method_name.rb +4 -2
  273. data/lib/rubocop/cop/naming/predicate_name.rb +2 -2
  274. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +10 -0
  275. data/lib/rubocop/cop/offense.rb +3 -8
  276. data/lib/rubocop/cop/registry.rb +13 -12
  277. data/lib/rubocop/cop/security/eval.rb +1 -0
  278. data/lib/rubocop/cop/security/json_load.rb +1 -0
  279. data/lib/rubocop/cop/security/marshal_load.rb +1 -0
  280. data/lib/rubocop/cop/security/open.rb +1 -0
  281. data/lib/rubocop/cop/security/yaml_load.rb +1 -0
  282. data/lib/rubocop/cop/style/access_modifier_declarations.rb +4 -5
  283. data/lib/rubocop/cop/style/accessor_grouping.rb +1 -3
  284. data/lib/rubocop/cop/style/alias.rb +6 -12
  285. data/lib/rubocop/cop/style/and_or.rb +3 -1
  286. data/lib/rubocop/cop/style/arguments_forwarding.rb +4 -3
  287. data/lib/rubocop/cop/style/array_coercion.rb +2 -0
  288. data/lib/rubocop/cop/style/array_join.rb +1 -0
  289. data/lib/rubocop/cop/style/ascii_comments.rb +1 -2
  290. data/lib/rubocop/cop/style/attr.rb +2 -3
  291. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +2 -5
  292. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +59 -71
  293. data/lib/rubocop/cop/style/bisected_attr_accessor/macro.rb +60 -0
  294. data/lib/rubocop/cop/style/case_equality.rb +2 -1
  295. data/lib/rubocop/cop/style/case_like_if.rb +16 -6
  296. data/lib/rubocop/cop/style/character_literal.rb +2 -4
  297. data/lib/rubocop/cop/style/class_and_module_children.rb +3 -6
  298. data/lib/rubocop/cop/style/class_equality_comparison.rb +3 -0
  299. data/lib/rubocop/cop/style/class_methods.rb +1 -3
  300. data/lib/rubocop/cop/style/collection_compact.rb +3 -3
  301. data/lib/rubocop/cop/style/colon_method_call.rb +2 -3
  302. data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
  303. data/lib/rubocop/cop/style/command_literal.rb +4 -9
  304. data/lib/rubocop/cop/style/comment_annotation.rb +3 -6
  305. data/lib/rubocop/cop/style/commented_keyword.rb +7 -13
  306. data/lib/rubocop/cop/style/conditional_assignment.rb +12 -24
  307. data/lib/rubocop/cop/style/constant_visibility.rb +28 -0
  308. data/lib/rubocop/cop/style/copyright.rb +3 -6
  309. data/lib/rubocop/cop/style/date_time.rb +5 -5
  310. data/lib/rubocop/cop/style/def_with_parentheses.rb +1 -2
  311. data/lib/rubocop/cop/style/dir.rb +1 -0
  312. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +2 -2
  313. data/lib/rubocop/cop/style/documentation.rb +30 -3
  314. data/lib/rubocop/cop/style/documentation_method.rb +1 -0
  315. data/lib/rubocop/cop/style/double_negation.rb +3 -2
  316. data/lib/rubocop/cop/style/each_for_simple_loop.rb +2 -2
  317. data/lib/rubocop/cop/style/each_with_object.rb +1 -0
  318. data/lib/rubocop/cop/style/empty_case_condition.rb +2 -7
  319. data/lib/rubocop/cop/style/empty_else.rb +3 -9
  320. data/lib/rubocop/cop/style/empty_literal.rb +13 -8
  321. data/lib/rubocop/cop/style/empty_method.rb +3 -7
  322. data/lib/rubocop/cop/style/end_block.rb +1 -2
  323. data/lib/rubocop/cop/style/endless_method.rb +2 -3
  324. data/lib/rubocop/cop/style/eval_with_location.rb +91 -31
  325. data/lib/rubocop/cop/style/even_odd.rb +1 -0
  326. data/lib/rubocop/cop/style/expand_path_arguments.rb +4 -3
  327. data/lib/rubocop/cop/style/explicit_block_argument.rb +3 -5
  328. data/lib/rubocop/cop/style/exponential_notation.rb +6 -7
  329. data/lib/rubocop/cop/style/float_division.rb +4 -0
  330. data/lib/rubocop/cop/style/format_string.rb +2 -0
  331. data/lib/rubocop/cop/style/format_string_token.rb +2 -4
  332. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -11
  333. data/lib/rubocop/cop/style/global_std_stream.rb +1 -0
  334. data/lib/rubocop/cop/style/guard_clause.rb +3 -7
  335. data/lib/rubocop/cop/style/hash_conversion.rb +133 -0
  336. data/lib/rubocop/cop/style/hash_each_methods.rb +2 -2
  337. data/lib/rubocop/cop/style/hash_except.rb +1 -0
  338. data/lib/rubocop/cop/style/hash_like_case.rb +2 -2
  339. data/lib/rubocop/cop/style/hash_syntax.rb +20 -24
  340. data/lib/rubocop/cop/style/hash_transform_keys.rb +4 -0
  341. data/lib/rubocop/cop/style/hash_transform_values.rb +4 -0
  342. data/lib/rubocop/cop/style/identical_conditional_branches.rb +1 -3
  343. data/lib/rubocop/cop/style/if_unless_modifier.rb +41 -13
  344. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +2 -0
  345. data/lib/rubocop/cop/style/implicit_runtime_error.rb +1 -0
  346. data/lib/rubocop/cop/style/infinite_loop.rb +2 -5
  347. data/lib/rubocop/cop/style/inverse_methods.rb +5 -7
  348. data/lib/rubocop/cop/style/ip_addresses.rb +1 -2
  349. data/lib/rubocop/cop/style/lambda.rb +2 -4
  350. data/lib/rubocop/cop/style/lambda_call.rb +1 -2
  351. data/lib/rubocop/cop/style/line_end_concatenation.rb +5 -12
  352. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +47 -3
  353. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +26 -16
  354. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +1 -2
  355. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -4
  356. data/lib/rubocop/cop/style/method_def_parentheses.rb +4 -8
  357. data/lib/rubocop/cop/style/min_max.rb +2 -2
  358. data/lib/rubocop/cop/style/missing_else.rb +2 -4
  359. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +1 -2
  360. data/lib/rubocop/cop/style/mixin_grouping.rb +4 -10
  361. data/lib/rubocop/cop/style/mixin_usage.rb +3 -2
  362. data/lib/rubocop/cop/style/module_function.rb +8 -6
  363. data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -2
  364. data/lib/rubocop/cop/style/multiline_method_signature.rb +11 -6
  365. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +1 -2
  366. data/lib/rubocop/cop/style/multiple_comparison.rb +22 -5
  367. data/lib/rubocop/cop/style/mutable_constant.rb +7 -10
  368. data/lib/rubocop/cop/style/negated_if.rb +1 -2
  369. data/lib/rubocop/cop/style/negated_if_else_condition.rb +16 -2
  370. data/lib/rubocop/cop/style/negated_unless.rb +1 -2
  371. data/lib/rubocop/cop/style/nested_modifier.rb +3 -7
  372. data/lib/rubocop/cop/style/nested_ternary_operator.rb +2 -3
  373. data/lib/rubocop/cop/style/next.rb +4 -9
  374. data/lib/rubocop/cop/style/nil_comparison.rb +3 -0
  375. data/lib/rubocop/cop/style/nil_lambda.rb +1 -0
  376. data/lib/rubocop/cop/style/non_nil_check.rb +9 -5
  377. data/lib/rubocop/cop/style/numeric_literals.rb +3 -11
  378. data/lib/rubocop/cop/style/numeric_predicate.rb +5 -7
  379. data/lib/rubocop/cop/style/one_line_conditional.rb +1 -2
  380. data/lib/rubocop/cop/style/option_hash.rb +2 -3
  381. data/lib/rubocop/cop/style/optional_arguments.rb +2 -5
  382. data/lib/rubocop/cop/style/or_assignment.rb +4 -6
  383. data/lib/rubocop/cop/style/parallel_assignment.rb +12 -9
  384. data/lib/rubocop/cop/style/parentheses_around_condition.rb +1 -0
  385. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -3
  386. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -2
  387. data/lib/rubocop/cop/style/perl_backrefs.rb +2 -9
  388. data/lib/rubocop/cop/style/preferred_hash_methods.rb +1 -4
  389. data/lib/rubocop/cop/style/proc.rb +2 -2
  390. data/lib/rubocop/cop/style/raise_args.rb +4 -8
  391. data/lib/rubocop/cop/style/random_with_offset.rb +8 -8
  392. data/lib/rubocop/cop/style/redundant_argument.rb +2 -11
  393. data/lib/rubocop/cop/style/redundant_assignment.rb +2 -3
  394. data/lib/rubocop/cop/style/redundant_begin.rb +47 -7
  395. data/lib/rubocop/cop/style/redundant_capital_w.rb +1 -2
  396. data/lib/rubocop/cop/style/redundant_condition.rb +2 -5
  397. data/lib/rubocop/cop/style/redundant_conditional.rb +5 -6
  398. data/lib/rubocop/cop/style/redundant_exception.rb +5 -6
  399. data/lib/rubocop/cop/style/redundant_fetch_block.rb +2 -0
  400. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +2 -1
  401. data/lib/rubocop/cop/style/redundant_freeze.rb +2 -2
  402. data/lib/rubocop/cop/style/redundant_interpolation.rb +1 -2
  403. data/lib/rubocop/cop/style/redundant_parentheses.rb +21 -20
  404. data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -2
  405. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -4
  406. data/lib/rubocop/cop/style/redundant_return.rb +6 -4
  407. data/lib/rubocop/cop/style/redundant_self.rb +9 -9
  408. data/lib/rubocop/cop/style/redundant_self_assignment.rb +4 -2
  409. data/lib/rubocop/cop/style/redundant_sort.rb +3 -5
  410. data/lib/rubocop/cop/style/redundant_sort_by.rb +1 -0
  411. data/lib/rubocop/cop/style/regexp_literal.rb +4 -8
  412. data/lib/rubocop/cop/style/rescue_modifier.rb +21 -14
  413. data/lib/rubocop/cop/style/rescue_standard_error.rb +5 -7
  414. data/lib/rubocop/cop/style/return_nil.rb +7 -2
  415. data/lib/rubocop/cop/style/safe_navigation.rb +12 -21
  416. data/lib/rubocop/cop/style/sample.rb +1 -0
  417. data/lib/rubocop/cop/style/send.rb +1 -2
  418. data/lib/rubocop/cop/style/signal_exception.rb +6 -7
  419. data/lib/rubocop/cop/style/single_argument_dig.rb +2 -2
  420. data/lib/rubocop/cop/style/single_line_block_params.rb +2 -5
  421. data/lib/rubocop/cop/style/single_line_methods.rb +16 -4
  422. data/lib/rubocop/cop/style/slicing_with_range.rb +1 -0
  423. data/lib/rubocop/cop/style/sole_nested_conditional.rb +17 -2
  424. data/lib/rubocop/cop/style/special_global_vars.rb +6 -18
  425. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -2
  426. data/lib/rubocop/cop/style/stderr_puts.rb +3 -6
  427. data/lib/rubocop/cop/style/string_chars.rb +39 -0
  428. data/lib/rubocop/cop/style/string_concatenation.rb +9 -10
  429. data/lib/rubocop/cop/style/string_hash_keys.rb +2 -0
  430. data/lib/rubocop/cop/style/string_literals.rb +2 -5
  431. data/lib/rubocop/cop/style/strip.rb +1 -0
  432. data/lib/rubocop/cop/style/struct_inheritance.rb +11 -0
  433. data/lib/rubocop/cop/style/symbol_literal.rb +1 -3
  434. data/lib/rubocop/cop/style/symbol_proc.rb +29 -10
  435. data/lib/rubocop/cop/style/ternary_parentheses.rb +4 -6
  436. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +6 -2
  437. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +2 -6
  438. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +3 -6
  439. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -10
  440. data/lib/rubocop/cop/style/trivial_accessors.rb +3 -4
  441. data/lib/rubocop/cop/style/unless_else.rb +1 -2
  442. data/lib/rubocop/cop/style/unless_logical_operators.rb +105 -0
  443. data/lib/rubocop/cop/style/unpack_first.rb +1 -0
  444. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -1
  445. data/lib/rubocop/cop/style/when_then.rb +1 -3
  446. data/lib/rubocop/cop/style/while_until_modifier.rb +1 -2
  447. data/lib/rubocop/cop/style/word_array.rb +1 -2
  448. data/lib/rubocop/cop/style/yoda_condition.rb +4 -11
  449. data/lib/rubocop/cop/style/zero_length_predicate.rb +6 -2
  450. data/lib/rubocop/cop/team.rb +2 -5
  451. data/lib/rubocop/cop/util.rb +8 -11
  452. data/lib/rubocop/cop/utils/format_string.rb +1 -3
  453. data/lib/rubocop/cop/variable_force.rb +6 -15
  454. data/lib/rubocop/cop/variable_force/assignment.rb +1 -2
  455. data/lib/rubocop/cop/variable_force/branch.rb +1 -2
  456. data/lib/rubocop/cop/variable_force/reference.rb +1 -3
  457. data/lib/rubocop/cop/variable_force/scope.rb +4 -8
  458. data/lib/rubocop/cop/variable_force/variable.rb +2 -4
  459. data/lib/rubocop/cops_documentation_generator.rb +7 -21
  460. data/lib/rubocop/directive_comment.rb +69 -9
  461. data/lib/rubocop/ext/regexp_parser.rb +3 -6
  462. data/lib/rubocop/file_finder.rb +1 -3
  463. data/lib/rubocop/formatter/clang_style_formatter.rb +4 -2
  464. data/lib/rubocop/formatter/disabled_config_formatter.rb +3 -8
  465. data/lib/rubocop/formatter/git_hub_actions_formatter.rb +1 -5
  466. data/lib/rubocop/formatter/html_formatter.rb +4 -10
  467. data/lib/rubocop/formatter/json_formatter.rb +1 -5
  468. data/lib/rubocop/formatter/junit_formatter.rb +3 -9
  469. data/lib/rubocop/formatter/offense_count_formatter.rb +1 -1
  470. data/lib/rubocop/formatter/progress_formatter.rb +1 -3
  471. data/lib/rubocop/formatter/tap_formatter.rb +4 -2
  472. data/lib/rubocop/formatter/worst_offenders_formatter.rb +1 -1
  473. data/lib/rubocop/magic_comment.rb +1 -1
  474. data/lib/rubocop/name_similarity.rb +1 -1
  475. data/lib/rubocop/options.rb +27 -41
  476. data/lib/rubocop/path_util.rb +1 -3
  477. data/lib/rubocop/rake_task.rb +3 -0
  478. data/lib/rubocop/remote_config.rb +4 -7
  479. data/lib/rubocop/result_cache.rb +5 -12
  480. data/lib/rubocop/rspec/cop_helper.rb +1 -1
  481. data/lib/rubocop/rspec/expect_offense.rb +4 -9
  482. data/lib/rubocop/rspec/shared_contexts.rb +4 -15
  483. data/lib/rubocop/runner.rb +7 -14
  484. data/lib/rubocop/target_finder.rb +12 -16
  485. data/lib/rubocop/target_ruby.rb +25 -21
  486. data/lib/rubocop/version.rb +1 -1
  487. metadata +15 -9
  488. data/lib/rubocop/core_ext/hash.rb +0 -20
@@ -32,6 +32,7 @@ module RuboCop
32
32
 
33
33
  minimum_target_ruby_version 2.5
34
34
 
35
+ # @!method on_bad_each_with_object(node)
35
36
  def_node_matcher :on_bad_each_with_object, <<~PATTERN
36
37
  (block
37
38
  ({send csend} !#array_receiver? :each_with_object (hash))
@@ -43,6 +44,7 @@ module RuboCop
43
44
  ({send csend} (lvar _memo) :[]= $!`_memo $(lvar _val)))
44
45
  PATTERN
45
46
 
47
+ # @!method on_bad_hash_brackets_map(node)
46
48
  def_node_matcher :on_bad_hash_brackets_map, <<~PATTERN
47
49
  (send
48
50
  (const _ :Hash)
@@ -55,6 +57,7 @@ module RuboCop
55
57
  (array $_ $(lvar _val))))
56
58
  PATTERN
57
59
 
60
+ # @!method on_bad_map_to_h(node)
58
61
  def_node_matcher :on_bad_map_to_h, <<~PATTERN
59
62
  ({send csend}
60
63
  (block
@@ -66,6 +69,7 @@ module RuboCop
66
69
  :to_h)
67
70
  PATTERN
68
71
 
72
+ # @!method on_bad_to_h(node)
69
73
  def_node_matcher :on_bad_to_h, <<~PATTERN
70
74
  (block
71
75
  ({send csend} !#array_receiver? :to_h)
@@ -29,6 +29,7 @@ module RuboCop
29
29
  include HashTransformMethod
30
30
  extend AutoCorrector
31
31
 
32
+ # @!method on_bad_each_with_object(node)
32
33
  def_node_matcher :on_bad_each_with_object, <<~PATTERN
33
34
  (block
34
35
  ({send csend} !#array_receiver? :each_with_object (hash))
@@ -40,6 +41,7 @@ module RuboCop
40
41
  ({send csend} (lvar _memo) :[]= $(lvar _key) $!`_memo))
41
42
  PATTERN
42
43
 
44
+ # @!method on_bad_hash_brackets_map(node)
43
45
  def_node_matcher :on_bad_hash_brackets_map, <<~PATTERN
44
46
  (send
45
47
  (const _ :Hash)
@@ -52,6 +54,7 @@ module RuboCop
52
54
  (array $(lvar _key) $_)))
53
55
  PATTERN
54
56
 
57
+ # @!method on_bad_map_to_h(node)
55
58
  def_node_matcher :on_bad_map_to_h, <<~PATTERN
56
59
  ({send csend}
57
60
  (block
@@ -63,6 +66,7 @@ module RuboCop
63
66
  :to_h)
64
67
  PATTERN
65
68
 
69
+ # @!method on_bad_to_h(node)
66
70
  def_node_matcher :on_bad_to_h, <<~PATTERN
67
71
  (block
68
72
  ({send csend} !#array_receiver? :to_h)
@@ -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
@@ -34,9 +34,11 @@ module RuboCop
34
34
  MSG = 'Remove redundant %<keyword>s with boolean literal branches.'
35
35
  MSG_FOR_ELSIF = 'Use `else` instead of redundant `elsif` with boolean literal branches.'
36
36
 
37
+ # @!method if_with_boolean_literal_branches?(node)
37
38
  def_node_matcher :if_with_boolean_literal_branches?, <<~PATTERN
38
39
  (if #return_boolean_value? {(true) (false) | (false) (true)})
39
40
  PATTERN
41
+ # @!method double_negative?(node)
40
42
  def_node_matcher :double_negative?, '(send (send _ :!) :!)'
41
43
 
42
44
  def on_if(node)
@@ -19,6 +19,7 @@ module RuboCop
19
19
  ' rather than just a message.'
20
20
  RESTRICT_ON_SEND = %i[raise fail].freeze
21
21
 
22
+ # @!method implicit_runtime_error_raise_or_fail(node)
22
23
  def_node_matcher :implicit_runtime_error_raise_or_fail,
23
24
  '(send nil? ${:raise :fail} {str dstr})'
24
25
 
@@ -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
 
@@ -48,6 +48,7 @@ module RuboCop
48
48
  [Style::Not, Style::SymbolProc]
49
49
  end
50
50
 
51
+ # @!method inverse_candidate?(node)
51
52
  def_node_matcher :inverse_candidate?, <<~PATTERN
52
53
  {
53
54
  (send $(send $(...) $_ $...) :!)
@@ -56,6 +57,7 @@ module RuboCop
56
57
  }
57
58
  PATTERN
58
59
 
60
+ # @!method inverse_block?(node)
59
61
  def_node_matcher :inverse_block?, <<~PATTERN
60
62
  (block $(send (...) $_) ... { $(send ... :!)
61
63
  $(send (...) {:!= :!~} ...)
@@ -134,8 +136,7 @@ module RuboCop
134
136
  end
135
137
 
136
138
  def inverse_blocks
137
- @inverse_blocks ||= cop_config['InverseBlocks']
138
- .merge(cop_config['InverseBlocks'].invert)
139
+ @inverse_blocks ||= cop_config['InverseBlocks'].merge(cop_config['InverseBlocks'].invert)
139
140
  end
140
141
 
141
142
  def negated?(node)
@@ -158,9 +159,7 @@ module RuboCop
158
159
  # `Integer > Numeric`.
159
160
  def possible_class_hierarchy_check?(lhs, rhs, method)
160
161
  CLASS_COMPARISON_METHODS.include?(method) &&
161
- (camel_case_constant?(lhs) ||
162
- (rhs.size == 1 &&
163
- camel_case_constant?(rhs.first)))
162
+ (camel_case_constant?(lhs) || (rhs.size == 1 && camel_case_constant?(rhs.first)))
164
163
  end
165
164
 
166
165
  def camel_case_constant?(node)
@@ -172,8 +171,7 @@ module RuboCop
172
171
  end
173
172
 
174
173
  def remove_end_parenthesis(corrector, node, method, method_call)
175
- return unless EQUALITY_METHODS.include?(method) ||
176
- method_call.parent.begin_type?
174
+ return unless EQUALITY_METHODS.include?(method) || method_call.parent.begin_type?
177
175
 
178
176
  corrector.remove(end_parentheses(node, method_call))
179
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
  #
@@ -79,6 +83,30 @@ module RuboCop
79
83
  # # good
80
84
  # foo.enforce strict: true
81
85
  #
86
+ # # good
87
+ # # Allows parens for calls that won't produce valid Ruby or be ambiguous.
88
+ # model.validate strict(true)
89
+ #
90
+ # # good
91
+ # # Allows parens for calls that won't produce valid Ruby or be ambiguous.
92
+ # yield path, File.basename(path)
93
+ #
94
+ # # good
95
+ # # Operators methods calls with parens
96
+ # array&.[](index)
97
+ #
98
+ # # good
99
+ # # Operators methods without parens, if you prefer
100
+ # array.[] index
101
+ #
102
+ # # good
103
+ # # Operators methods calls with parens
104
+ # array&.[](index)
105
+ #
106
+ # # good
107
+ # # Operators methods without parens, if you prefer
108
+ # array.[] index
109
+ #
82
110
  # @example IgnoreMacros: true (default)
83
111
  #
84
112
  # # good
@@ -146,6 +174,22 @@ module RuboCop
146
174
  #
147
175
  # # good
148
176
  # Array 1
177
+ #
178
+ # @example AllowParenthesesInStringInterpolation: false (default)
179
+ #
180
+ # # bad
181
+ # "#{t('this.is.bad')}"
182
+ #
183
+ # # good
184
+ # "#{t 'this.is.better'}"
185
+ #
186
+ # @example AllowParenthesesInStringInterpolation: true
187
+ #
188
+ # # good
189
+ # "#{t('this.is.good')}"
190
+ #
191
+ # # good
192
+ # "#{t 'this.is.also.good'}"
149
193
  class MethodCallWithArgsParentheses < Base
150
194
  require_relative 'method_call_with_args_parentheses/omit_parentheses'
151
195
  require_relative 'method_call_with_args_parentheses/require_parentheses'
@@ -158,7 +202,7 @@ module RuboCop
158
202
  extend AutoCorrector
159
203
 
160
204
  def self.autocorrect_incompatible_with
161
- [Style::NestedParenthesizedCalls]
205
+ [Style::NestedParenthesizedCalls, Style::RescueModifier]
162
206
  end
163
207
 
164
208
  def on_send(node)
@@ -5,6 +5,7 @@ module RuboCop
5
5
  module Style
6
6
  class MethodCallWithArgsParentheses
7
7
  # Style omit_parentheses
8
+ # rubocop:disable Metrics/ModuleLength, Metrics/CyclomaticComplexity
8
9
  module OmitParentheses
9
10
  TRAILING_WHITESPACE_REGEX = /\s+\Z/.freeze
10
11
  OMIT_MSG = 'Omit parentheses for method calls with arguments.'
@@ -15,10 +16,11 @@ module RuboCop
15
16
  def omit_parentheses(node)
16
17
  return unless node.parenthesized?
17
18
  return if inside_endless_method_def?(node)
18
- return if node.implicit_call?
19
+ return if syntax_like_method_call?(node)
19
20
  return if super_call_without_arguments?(node)
20
21
  return if allowed_camel_case_method_call?(node)
21
22
  return if legitimate_call_with_parentheses?(node)
23
+ return if allowed_string_interpolation_method_call?(node)
22
24
 
23
25
  add_offense(offense_range(node), message: OMIT_MSG) do |corrector|
24
26
  auto_correct(corrector, node)
@@ -40,7 +42,11 @@ module RuboCop
40
42
 
41
43
  def inside_endless_method_def?(node)
42
44
  # parens are required around arguments inside an endless method
43
- node.each_ancestor(:def).any?(&:endless?) && node.arguments.any?
45
+ node.each_ancestor(:def, :defs).any?(&:endless?) && node.arguments.any?
46
+ end
47
+
48
+ def syntax_like_method_call?(node)
49
+ node.implicit_call? || node.operator_method?
44
50
  end
45
51
 
46
52
  def super_call_without_arguments?(node)
@@ -49,8 +55,12 @@ module RuboCop
49
55
 
50
56
  def allowed_camel_case_method_call?(node)
51
57
  node.camel_case_method? &&
52
- (node.arguments.none? ||
53
- cop_config['AllowParenthesesInCamelCaseMethod'])
58
+ (node.arguments.none? || cop_config['AllowParenthesesInCamelCaseMethod'])
59
+ end
60
+
61
+ def allowed_string_interpolation_method_call?(node)
62
+ cop_config['AllowParenthesesInStringInterpolation'] &&
63
+ inside_string_interpolation?(node)
54
64
  end
55
65
 
56
66
  def parentheses_at_the_end_of_multiline_call?(node)
@@ -88,8 +98,7 @@ module RuboCop
88
98
  end
89
99
 
90
100
  def call_in_optional_arguments?(node)
91
- node.parent &&
92
- (node.parent.optarg_type? || node.parent.kwoptarg_type?)
101
+ node.parent && (node.parent.optarg_type? || node.parent.kwoptarg_type?)
93
102
  end
94
103
 
95
104
  def call_in_single_line_inheritance?(node)
@@ -101,20 +110,19 @@ module RuboCop
101
110
  call_as_argument_or_chain?(node) ||
102
111
  hash_literal_in_arguments?(node) ||
103
112
  node.descendants.any? do |n|
104
- ambigious_literal?(n) || logical_operator?(n) ||
113
+ n.forwarded_args_type? || ambigious_literal?(n) || logical_operator?(n) ||
105
114
  call_with_braced_block?(n)
106
115
  end
107
116
  end
108
117
 
109
118
  def call_with_braced_block?(node)
110
- (node.send_type? || node.super_type?) &&
111
- node.block_node && node.block_node.braces?
119
+ (node.send_type? || node.super_type?) && node.block_node && node.block_node.braces?
112
120
  end
113
121
 
114
122
  def call_as_argument_or_chain?(node)
115
123
  node.parent &&
116
124
  (node.parent.send_type? && !assigned_before?(node.parent, node) ||
117
- node.parent.csend_type? || node.parent.super_type?)
125
+ node.parent.csend_type? || node.parent.super_type? || node.parent.yield_type?)
118
126
  end
119
127
 
120
128
  def hash_literal_in_arguments?(node)
@@ -134,13 +142,11 @@ module RuboCop
134
142
  previous = node.descendants.first
135
143
  return false unless previous&.send_type?
136
144
 
137
- previous.parenthesized? ||
138
- allowed_chained_call_with_parentheses?(previous)
145
+ previous.parenthesized? || allowed_chained_call_with_parentheses?(previous)
139
146
  end
140
147
 
141
148
  def ambigious_literal?(node)
142
- splat?(node) || ternary_if?(node) || regexp_slash_literal?(node) ||
143
- unary_literal?(node)
149
+ splat?(node) || ternary_if?(node) || regexp_slash_literal?(node) || unary_literal?(node)
144
150
  end
145
151
 
146
152
  def splat?(node)
@@ -169,10 +175,14 @@ module RuboCop
169
175
  end
170
176
 
171
177
  def assigned_before?(node, target)
172
- node.assignment? &&
173
- node.loc.operator.begin < target.loc.begin
178
+ node.assignment? && node.loc.operator.begin < target.loc.begin
179
+ end
180
+
181
+ def inside_string_interpolation?(node)
182
+ node.ancestors.drop_while { |a| !a.begin_type? }.any?(&:dstr_type?)
174
183
  end
175
184
  end
185
+ # rubocop:enable Metrics/ModuleLength, Metrics/CyclomaticComplexity
176
186
  end
177
187
  end
178
188
  end