rubocop 1.10.0 → 1.14.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 (487) 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 +60 -3
  5. data/exe/rubocop +1 -3
  6. data/lib/rubocop.rb +6 -1
  7. data/lib/rubocop/cached_data.rb +1 -3
  8. data/lib/rubocop/cli.rb +4 -6
  9. data/lib/rubocop/cli/command/auto_genenerate_config.rb +9 -19
  10. data/lib/rubocop/cli/command/execute_runner.rb +1 -1
  11. data/lib/rubocop/cli/command/init_dotfile.rb +1 -3
  12. data/lib/rubocop/cli/command/show_cops.rb +1 -4
  13. data/lib/rubocop/cli/command/suggest_extensions.rb +3 -2
  14. data/lib/rubocop/comment_config.rb +45 -101
  15. data/lib/rubocop/config.rb +11 -26
  16. data/lib/rubocop/config_loader.rb +5 -11
  17. data/lib/rubocop/config_loader_resolver.rb +22 -14
  18. data/lib/rubocop/config_obsoletion/cop_rule.rb +1 -2
  19. data/lib/rubocop/config_store.rb +1 -2
  20. data/lib/rubocop/config_validator.rb +5 -10
  21. data/lib/rubocop/cop/autocorrect_logic.rb +3 -8
  22. data/lib/rubocop/cop/badge.rb +1 -2
  23. data/lib/rubocop/cop/base.rb +8 -6
  24. data/lib/rubocop/cop/bundler/duplicated_gem.rb +3 -3
  25. data/lib/rubocop/cop/bundler/gem_comment.rb +43 -10
  26. data/lib/rubocop/cop/bundler/gem_version.rb +99 -0
  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 +1 -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 +11 -5
  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_block_layout.rb +7 -15
  101. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -2
  102. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -2
  103. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +22 -15
  104. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +10 -5
  105. data/lib/rubocop/cop/layout/parameter_alignment.rb +6 -5
  106. data/lib/rubocop/cop/layout/redundant_line_break.rb +137 -0
  107. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +3 -6
  108. data/lib/rubocop/cop/layout/single_line_block_chain.rb +53 -0
  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 +1 -3
  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 +3 -1
  134. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +79 -41
  135. data/lib/rubocop/cop/lint/deprecated_constants.rb +3 -3
  136. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +3 -5
  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 +1 -0
  141. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -0
  142. data/lib/rubocop/cop/lint/else_layout.rb +1 -3
  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 +1 -0
  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 +13 -5
  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 +5 -7
  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 +15 -7
  205. data/lib/rubocop/cop/lint/unused_block_argument.rb +9 -7
  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/gem_declaration.rb +13 -0
  239. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +3 -6
  240. data/lib/rubocop/cop/mixin/hash_transform_method.rb +8 -22
  241. data/lib/rubocop/cop/mixin/interpolation.rb +1 -3
  242. data/lib/rubocop/cop/mixin/line_length_help.rb +13 -10
  243. data/lib/rubocop/cop/mixin/match_range.rb +2 -5
  244. data/lib/rubocop/cop/mixin/method_complexity.rb +2 -3
  245. data/lib/rubocop/cop/mixin/method_preference.rb +1 -2
  246. data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +4 -3
  247. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +1 -3
  248. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +11 -40
  249. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -2
  250. data/lib/rubocop/cop/mixin/negative_conditional.rb +4 -2
  251. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -4
  252. data/lib/rubocop/cop/mixin/percent_array.rb +1 -3
  253. data/lib/rubocop/cop/mixin/percent_literal.rb +0 -6
  254. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +5 -11
  255. data/lib/rubocop/cop/mixin/preferred_delimiters.rb +4 -7
  256. data/lib/rubocop/cop/mixin/range_help.rb +10 -13
  257. data/lib/rubocop/cop/mixin/rational_literal.rb +1 -0
  258. data/lib/rubocop/cop/mixin/rescue_node.rb +2 -6
  259. data/lib/rubocop/cop/mixin/safe_assignment.rb +6 -2
  260. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +2 -4
  261. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -2
  262. data/lib/rubocop/cop/mixin/statement_modifier.rb +1 -3
  263. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  264. data/lib/rubocop/cop/mixin/trailing_body.rb +1 -2
  265. data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -2
  266. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +7 -13
  267. data/lib/rubocop/cop/mixin/unused_argument.rb +1 -3
  268. data/lib/rubocop/cop/mixin/visibility_help.rb +1 -0
  269. data/lib/rubocop/cop/naming/ascii_identifiers.rb +2 -4
  270. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +2 -2
  271. data/lib/rubocop/cop/naming/constant_name.rb +2 -0
  272. data/lib/rubocop/cop/naming/file_name.rb +7 -16
  273. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +8 -3
  274. data/lib/rubocop/cop/naming/method_name.rb +4 -2
  275. data/lib/rubocop/cop/naming/predicate_name.rb +2 -2
  276. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +10 -0
  277. data/lib/rubocop/cop/offense.rb +3 -8
  278. data/lib/rubocop/cop/registry.rb +12 -11
  279. data/lib/rubocop/cop/security/eval.rb +1 -0
  280. data/lib/rubocop/cop/security/json_load.rb +1 -0
  281. data/lib/rubocop/cop/security/marshal_load.rb +1 -0
  282. data/lib/rubocop/cop/security/open.rb +1 -0
  283. data/lib/rubocop/cop/security/yaml_load.rb +1 -0
  284. data/lib/rubocop/cop/style/access_modifier_declarations.rb +4 -5
  285. data/lib/rubocop/cop/style/accessor_grouping.rb +1 -3
  286. data/lib/rubocop/cop/style/alias.rb +6 -12
  287. data/lib/rubocop/cop/style/and_or.rb +3 -1
  288. data/lib/rubocop/cop/style/arguments_forwarding.rb +4 -3
  289. data/lib/rubocop/cop/style/array_coercion.rb +2 -0
  290. data/lib/rubocop/cop/style/array_join.rb +1 -0
  291. data/lib/rubocop/cop/style/ascii_comments.rb +1 -2
  292. data/lib/rubocop/cop/style/attr.rb +2 -3
  293. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +2 -5
  294. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +59 -71
  295. data/lib/rubocop/cop/style/bisected_attr_accessor/macro.rb +60 -0
  296. data/lib/rubocop/cop/style/case_equality.rb +2 -1
  297. data/lib/rubocop/cop/style/case_like_if.rb +16 -6
  298. data/lib/rubocop/cop/style/character_literal.rb +2 -4
  299. data/lib/rubocop/cop/style/class_and_module_children.rb +6 -9
  300. data/lib/rubocop/cop/style/class_equality_comparison.rb +3 -0
  301. data/lib/rubocop/cop/style/class_methods.rb +1 -3
  302. data/lib/rubocop/cop/style/collection_compact.rb +3 -3
  303. data/lib/rubocop/cop/style/colon_method_call.rb +2 -3
  304. data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
  305. data/lib/rubocop/cop/style/command_literal.rb +4 -9
  306. data/lib/rubocop/cop/style/comment_annotation.rb +3 -6
  307. data/lib/rubocop/cop/style/commented_keyword.rb +7 -13
  308. data/lib/rubocop/cop/style/conditional_assignment.rb +12 -24
  309. data/lib/rubocop/cop/style/constant_visibility.rb +1 -0
  310. data/lib/rubocop/cop/style/copyright.rb +3 -6
  311. data/lib/rubocop/cop/style/date_time.rb +5 -5
  312. data/lib/rubocop/cop/style/def_with_parentheses.rb +1 -2
  313. data/lib/rubocop/cop/style/dir.rb +1 -0
  314. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +2 -2
  315. data/lib/rubocop/cop/style/documentation.rb +30 -3
  316. data/lib/rubocop/cop/style/documentation_method.rb +1 -0
  317. data/lib/rubocop/cop/style/double_negation.rb +1 -0
  318. data/lib/rubocop/cop/style/each_for_simple_loop.rb +2 -2
  319. data/lib/rubocop/cop/style/each_with_object.rb +1 -0
  320. data/lib/rubocop/cop/style/empty_case_condition.rb +2 -7
  321. data/lib/rubocop/cop/style/empty_else.rb +3 -9
  322. data/lib/rubocop/cop/style/empty_literal.rb +13 -8
  323. data/lib/rubocop/cop/style/empty_method.rb +3 -7
  324. data/lib/rubocop/cop/style/end_block.rb +1 -2
  325. data/lib/rubocop/cop/style/endless_method.rb +2 -3
  326. data/lib/rubocop/cop/style/eval_with_location.rb +5 -5
  327. data/lib/rubocop/cop/style/even_odd.rb +1 -0
  328. data/lib/rubocop/cop/style/expand_path_arguments.rb +4 -3
  329. data/lib/rubocop/cop/style/explicit_block_argument.rb +2 -4
  330. data/lib/rubocop/cop/style/float_division.rb +4 -0
  331. data/lib/rubocop/cop/style/format_string.rb +2 -0
  332. data/lib/rubocop/cop/style/format_string_token.rb +2 -4
  333. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -11
  334. data/lib/rubocop/cop/style/global_std_stream.rb +1 -0
  335. data/lib/rubocop/cop/style/guard_clause.rb +3 -7
  336. data/lib/rubocop/cop/style/hash_conversion.rb +57 -5
  337. data/lib/rubocop/cop/style/hash_each_methods.rb +2 -2
  338. data/lib/rubocop/cop/style/hash_except.rb +1 -0
  339. data/lib/rubocop/cop/style/hash_like_case.rb +2 -2
  340. data/lib/rubocop/cop/style/hash_syntax.rb +20 -24
  341. data/lib/rubocop/cop/style/hash_transform_keys.rb +4 -0
  342. data/lib/rubocop/cop/style/hash_transform_values.rb +4 -0
  343. data/lib/rubocop/cop/style/identical_conditional_branches.rb +1 -3
  344. data/lib/rubocop/cop/style/if_unless_modifier.rb +40 -13
  345. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +2 -0
  346. data/lib/rubocop/cop/style/implicit_runtime_error.rb +1 -0
  347. data/lib/rubocop/cop/style/infinite_loop.rb +2 -5
  348. data/lib/rubocop/cop/style/inverse_methods.rb +5 -7
  349. data/lib/rubocop/cop/style/ip_addresses.rb +1 -2
  350. data/lib/rubocop/cop/style/lambda.rb +2 -4
  351. data/lib/rubocop/cop/style/lambda_call.rb +1 -2
  352. data/lib/rubocop/cop/style/line_end_concatenation.rb +5 -12
  353. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +47 -3
  354. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +26 -16
  355. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +1 -2
  356. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -4
  357. data/lib/rubocop/cop/style/method_def_parentheses.rb +4 -8
  358. data/lib/rubocop/cop/style/min_max.rb +2 -2
  359. data/lib/rubocop/cop/style/missing_else.rb +2 -4
  360. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +1 -2
  361. data/lib/rubocop/cop/style/mixin_grouping.rb +4 -10
  362. data/lib/rubocop/cop/style/mixin_usage.rb +3 -2
  363. data/lib/rubocop/cop/style/module_function.rb +8 -6
  364. data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -2
  365. data/lib/rubocop/cop/style/multiline_method_signature.rb +11 -6
  366. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +1 -2
  367. data/lib/rubocop/cop/style/multiple_comparison.rb +22 -5
  368. data/lib/rubocop/cop/style/mutable_constant.rb +7 -10
  369. data/lib/rubocop/cop/style/negated_if.rb +1 -2
  370. data/lib/rubocop/cop/style/negated_if_else_condition.rb +24 -2
  371. data/lib/rubocop/cop/style/negated_unless.rb +1 -2
  372. data/lib/rubocop/cop/style/nested_modifier.rb +3 -7
  373. data/lib/rubocop/cop/style/nested_ternary_operator.rb +2 -3
  374. data/lib/rubocop/cop/style/next.rb +4 -9
  375. data/lib/rubocop/cop/style/nil_comparison.rb +3 -0
  376. data/lib/rubocop/cop/style/nil_lambda.rb +1 -0
  377. data/lib/rubocop/cop/style/non_nil_check.rb +9 -5
  378. data/lib/rubocop/cop/style/numeric_literals.rb +3 -11
  379. data/lib/rubocop/cop/style/numeric_predicate.rb +5 -7
  380. data/lib/rubocop/cop/style/one_line_conditional.rb +1 -2
  381. data/lib/rubocop/cop/style/option_hash.rb +2 -3
  382. data/lib/rubocop/cop/style/optional_arguments.rb +2 -5
  383. data/lib/rubocop/cop/style/or_assignment.rb +4 -6
  384. data/lib/rubocop/cop/style/parallel_assignment.rb +12 -9
  385. data/lib/rubocop/cop/style/parentheses_around_condition.rb +1 -0
  386. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -3
  387. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -2
  388. data/lib/rubocop/cop/style/perl_backrefs.rb +2 -9
  389. data/lib/rubocop/cop/style/preferred_hash_methods.rb +1 -4
  390. data/lib/rubocop/cop/style/proc.rb +2 -2
  391. data/lib/rubocop/cop/style/raise_args.rb +4 -8
  392. data/lib/rubocop/cop/style/random_with_offset.rb +8 -8
  393. data/lib/rubocop/cop/style/redundant_argument.rb +2 -11
  394. data/lib/rubocop/cop/style/redundant_assignment.rb +2 -3
  395. data/lib/rubocop/cop/style/redundant_begin.rb +47 -7
  396. data/lib/rubocop/cop/style/redundant_capital_w.rb +1 -2
  397. data/lib/rubocop/cop/style/redundant_condition.rb +2 -5
  398. data/lib/rubocop/cop/style/redundant_conditional.rb +5 -6
  399. data/lib/rubocop/cop/style/redundant_exception.rb +5 -6
  400. data/lib/rubocop/cop/style/redundant_fetch_block.rb +2 -0
  401. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +2 -1
  402. data/lib/rubocop/cop/style/redundant_freeze.rb +2 -2
  403. data/lib/rubocop/cop/style/redundant_interpolation.rb +1 -2
  404. data/lib/rubocop/cop/style/redundant_parentheses.rb +21 -20
  405. data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -2
  406. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -4
  407. data/lib/rubocop/cop/style/redundant_return.rb +6 -4
  408. data/lib/rubocop/cop/style/redundant_self.rb +9 -9
  409. data/lib/rubocop/cop/style/redundant_self_assignment.rb +4 -2
  410. data/lib/rubocop/cop/style/redundant_sort.rb +3 -5
  411. data/lib/rubocop/cop/style/redundant_sort_by.rb +1 -0
  412. data/lib/rubocop/cop/style/regexp_literal.rb +4 -8
  413. data/lib/rubocop/cop/style/rescue_modifier.rb +21 -14
  414. data/lib/rubocop/cop/style/rescue_standard_error.rb +5 -7
  415. data/lib/rubocop/cop/style/return_nil.rb +7 -2
  416. data/lib/rubocop/cop/style/safe_navigation.rb +12 -21
  417. data/lib/rubocop/cop/style/sample.rb +1 -0
  418. data/lib/rubocop/cop/style/send.rb +1 -2
  419. data/lib/rubocop/cop/style/signal_exception.rb +6 -7
  420. data/lib/rubocop/cop/style/single_argument_dig.rb +2 -2
  421. data/lib/rubocop/cop/style/single_line_block_params.rb +2 -5
  422. data/lib/rubocop/cop/style/single_line_methods.rb +21 -4
  423. data/lib/rubocop/cop/style/slicing_with_range.rb +1 -0
  424. data/lib/rubocop/cop/style/sole_nested_conditional.rb +31 -7
  425. data/lib/rubocop/cop/style/special_global_vars.rb +6 -18
  426. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -2
  427. data/lib/rubocop/cop/style/stderr_puts.rb +3 -6
  428. data/lib/rubocop/cop/style/string_chars.rb +39 -0
  429. data/lib/rubocop/cop/style/string_concatenation.rb +9 -10
  430. data/lib/rubocop/cop/style/string_hash_keys.rb +2 -0
  431. data/lib/rubocop/cop/style/string_literals.rb +2 -5
  432. data/lib/rubocop/cop/style/strip.rb +1 -0
  433. data/lib/rubocop/cop/style/struct_inheritance.rb +11 -0
  434. data/lib/rubocop/cop/style/symbol_literal.rb +1 -3
  435. data/lib/rubocop/cop/style/symbol_proc.rb +29 -10
  436. data/lib/rubocop/cop/style/ternary_parentheses.rb +4 -6
  437. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +6 -2
  438. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +2 -6
  439. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +3 -6
  440. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -10
  441. data/lib/rubocop/cop/style/trivial_accessors.rb +3 -4
  442. data/lib/rubocop/cop/style/unless_else.rb +1 -2
  443. data/lib/rubocop/cop/style/unless_logical_operators.rb +105 -0
  444. data/lib/rubocop/cop/style/unpack_first.rb +1 -0
  445. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -1
  446. data/lib/rubocop/cop/style/when_then.rb +1 -3
  447. data/lib/rubocop/cop/style/while_until_modifier.rb +1 -2
  448. data/lib/rubocop/cop/style/word_array.rb +1 -2
  449. data/lib/rubocop/cop/style/yoda_condition.rb +4 -11
  450. data/lib/rubocop/cop/style/zero_length_predicate.rb +6 -2
  451. data/lib/rubocop/cop/team.rb +2 -5
  452. data/lib/rubocop/cop/util.rb +8 -11
  453. data/lib/rubocop/cop/utils/format_string.rb +1 -3
  454. data/lib/rubocop/cop/variable_force.rb +6 -15
  455. data/lib/rubocop/cop/variable_force/assignment.rb +1 -2
  456. data/lib/rubocop/cop/variable_force/branch.rb +16 -2
  457. data/lib/rubocop/cop/variable_force/reference.rb +1 -3
  458. data/lib/rubocop/cop/variable_force/scope.rb +4 -8
  459. data/lib/rubocop/cop/variable_force/variable.rb +2 -4
  460. data/lib/rubocop/cops_documentation_generator.rb +7 -21
  461. data/lib/rubocop/directive_comment.rb +69 -9
  462. data/lib/rubocop/ext/regexp_parser.rb +3 -6
  463. data/lib/rubocop/file_finder.rb +1 -3
  464. data/lib/rubocop/formatter/clang_style_formatter.rb +4 -2
  465. data/lib/rubocop/formatter/disabled_config_formatter.rb +3 -8
  466. data/lib/rubocop/formatter/git_hub_actions_formatter.rb +1 -5
  467. data/lib/rubocop/formatter/html_formatter.rb +4 -10
  468. data/lib/rubocop/formatter/json_formatter.rb +1 -5
  469. data/lib/rubocop/formatter/junit_formatter.rb +3 -9
  470. data/lib/rubocop/formatter/progress_formatter.rb +1 -3
  471. data/lib/rubocop/formatter/tap_formatter.rb +4 -2
  472. data/lib/rubocop/magic_comment.rb +1 -1
  473. data/lib/rubocop/name_similarity.rb +1 -1
  474. data/lib/rubocop/options.rb +27 -41
  475. data/lib/rubocop/path_util.rb +1 -3
  476. data/lib/rubocop/rake_task.rb +3 -0
  477. data/lib/rubocop/remote_config.rb +4 -7
  478. data/lib/rubocop/result_cache.rb +5 -12
  479. data/lib/rubocop/rspec/cop_helper.rb +1 -1
  480. data/lib/rubocop/rspec/expect_offense.rb +4 -9
  481. data/lib/rubocop/rspec/shared_contexts.rb +8 -15
  482. data/lib/rubocop/runner.rb +7 -14
  483. data/lib/rubocop/target_finder.rb +19 -16
  484. data/lib/rubocop/target_ruby.rb +25 -21
  485. data/lib/rubocop/version.rb +1 -1
  486. metadata +18 -11
  487. data/lib/rubocop/core_ext/hash.rb +0 -20
@@ -23,6 +23,7 @@ module RuboCop
23
23
 
24
24
  MSG = 'Use `%<prefer>s` instead of `%<current>s`.'
25
25
 
26
+ # @!method kv_each(node)
26
27
  def_node_matcher :kv_each, <<~PATTERN
27
28
  (block $(send (send _ ${:keys :values}) :each) ...)
28
29
  PATTERN
@@ -37,8 +38,7 @@ module RuboCop
37
38
  kv_each(node) do |target, method|
38
39
  return unless target.receiver.receiver
39
40
 
40
- msg = format(message, prefer: "each_#{method[0..-2]}",
41
- current: "#{method}.each")
41
+ msg = format(message, prefer: "each_#{method[0..-2]}", current: "#{method}.each")
42
42
 
43
43
  add_offense(kv_range(target), message: msg) do |corrector|
44
44
  correct_key_value_each(target, corrector)
@@ -33,6 +33,7 @@ module RuboCop
33
33
  MSG = 'Use `%<prefer>s` instead.'
34
34
  RESTRICT_ON_SEND = %i[reject select filter].freeze
35
35
 
36
+ # @!method bad_method?(node)
36
37
  def_node_matcher :bad_method?, <<~PATTERN
37
38
  (block
38
39
  (send _ _)
@@ -39,6 +39,7 @@ module RuboCop
39
39
  class HashLikeCase < Base
40
40
  MSG = 'Consider replacing `case-when` with a hash lookup.'
41
41
 
42
+ # @!method hash_like_case?(node)
42
43
  def_node_matcher :hash_like_case?, <<~PATTERN
43
44
  (case
44
45
  _
@@ -51,8 +52,7 @@ module RuboCop
51
52
  return if node.when_branches.size < min_branches_count
52
53
 
53
54
  hash_like_case?(node) do |condition_nodes, body_nodes|
54
- if nodes_of_same_type?(condition_nodes) &&
55
- nodes_of_same_type?(body_nodes)
55
+ if nodes_of_same_type?(condition_nodes) && nodes_of_same_type?(body_nodes)
56
56
  add_offense(node)
57
57
  end
58
58
  end
@@ -54,9 +54,10 @@ module RuboCop
54
54
  # # good
55
55
  # {a: 1, b: 2}
56
56
  # {:c => 3, 'd' => 4}
57
- class HashSyntax < Cop
57
+ class HashSyntax < Base
58
58
  include ConfigurableEnforcedStyle
59
59
  include RangeHelp
60
+ extend AutoCorrector
60
61
 
61
62
  MSG_19 = 'Use the new Ruby 1.9 hash syntax.'
62
63
  MSG_NO_MIXED_KEYS = "Don't mix styles in the same hash."
@@ -104,18 +105,6 @@ module RuboCop
104
105
  end
105
106
  end
106
107
 
107
- def autocorrect(node)
108
- lambda do |corrector|
109
- if style == :hash_rockets || force_hash_rockets?(node.parent.pairs)
110
- autocorrect_hash_rockets(corrector, node)
111
- elsif style == :ruby19_no_mixed_keys || style == :no_mixed_keys
112
- autocorrect_no_mixed_keys(corrector, node)
113
- else
114
- autocorrect_ruby19(corrector, node)
115
- end
116
- end
117
- end
118
-
119
108
  def alternative_style
120
109
  case style
121
110
  when :hash_rockets
@@ -127,6 +116,16 @@ module RuboCop
127
116
 
128
117
  private
129
118
 
119
+ def autocorrect(corrector, node)
120
+ if style == :hash_rockets || force_hash_rockets?(node.parent.pairs)
121
+ autocorrect_hash_rockets(corrector, node)
122
+ elsif style == :ruby19_no_mixed_keys || style == :no_mixed_keys
123
+ autocorrect_no_mixed_keys(corrector, node)
124
+ else
125
+ autocorrect_ruby19(corrector, node)
126
+ end
127
+ end
128
+
130
129
  def sym_indices?(pairs)
131
130
  pairs.all? { |p| word_symbol_pair?(p) }
132
131
  end
@@ -138,7 +137,7 @@ module RuboCop
138
137
  end
139
138
 
140
139
  def acceptable_19_syntax_symbol?(sym_name)
141
- sym_name.sub!(/\A:/, '')
140
+ sym_name.delete_prefix!(':')
142
141
 
143
142
  if cop_config['PreferHashRocketsForNonAlnumEndingSymbols'] &&
144
143
  # Prefer { :production? => false } over { production?: false } and
@@ -152,14 +151,16 @@ module RuboCop
152
151
  return true if /\A[_a-z]\w*[?!]?\z/i.match?(sym_name)
153
152
 
154
153
  # For more complicated hash keys, let the parser validate the syntax.
155
- parse("{ #{sym_name}: :foo }").valid_syntax?
154
+ ProcessedSource.new("{ #{sym_name}: :foo }", target_ruby_version).valid_syntax?
156
155
  end
157
156
 
158
157
  def check(pairs, delim, msg)
159
158
  pairs.each do |pair|
160
159
  if pair.delimiter == delim
161
160
  location = pair.source_range.begin.join(pair.loc.operator)
162
- add_offense(pair, location: location, message: msg) do
161
+ add_offense(location, message: msg) do |corrector|
162
+ autocorrect(corrector, pair)
163
+
163
164
  opposite_style_detected
164
165
  end
165
166
  else
@@ -173,10 +174,7 @@ module RuboCop
173
174
 
174
175
  space = argument_without_space?(pair_node.parent) ? ' ' : ''
175
176
 
176
- corrector.replace(
177
- range,
178
- range.source.sub(/^:(.*\S)\s*=>\s*$/, "#{space}\\1: ")
179
- )
177
+ corrector.replace(range, range.source.sub(/^:(.*\S)\s*=>\s*$/, "#{space}\\1: "))
180
178
 
181
179
  hash_node = pair_node.parent
182
180
  return unless hash_node.parent&.return_type? && !hash_node.braces?
@@ -193,8 +191,7 @@ module RuboCop
193
191
  end
194
192
 
195
193
  def argument_without_space?(node)
196
- node.argument? &&
197
- node.loc.expression.begin_pos == node.parent.loc.selector.end_pos
194
+ node.argument? && node.loc.expression.begin_pos == node.parent.loc.selector.end_pos
198
195
  end
199
196
 
200
197
  def autocorrect_hash_rockets(corrector, pair_node)
@@ -214,8 +211,7 @@ module RuboCop
214
211
  end
215
212
 
216
213
  def force_hash_rockets?(pairs)
217
- cop_config['UseHashRocketsWithSymbolValues'] &&
218
- pairs.map(&:value).any?(&:sym_type?)
214
+ cop_config['UseHashRocketsWithSymbolValues'] && pairs.map(&:value).any?(&:sym_type?)
219
215
  end
220
216
  end
221
217
  end
@@ -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,15 @@ module RuboCop
67
67
 
68
68
  def autocorrect(corrector, node)
69
69
  replacement = if node.modifier_form?
70
- to_normal_form(node)
70
+ last_argument = node.if_branch.last_argument if node.if_branch.send_type?
71
+
72
+ if last_argument.respond_to?(:heredoc?) && last_argument.heredoc?
73
+ heredoc = extract_heredoc_from(last_argument)
74
+ remove_heredoc(corrector, heredoc)
75
+ to_normal_form_with_heredoc(node, indent(node), heredoc)
76
+ else
77
+ to_normal_form(node, indent(node))
78
+ end
71
79
  else
72
80
  to_modifier_form(node)
73
81
  end
@@ -123,8 +131,7 @@ module RuboCop
123
131
  end
124
132
 
125
133
  def line_length_enabled_at_line?(line)
126
- processed_source.comment_config
127
- .cop_enabled_at_line?('Layout/LineLength', line)
134
+ processed_source.comment_config.cop_enabled_at_line?('Layout/LineLength', line)
128
135
  end
129
136
 
130
137
  def named_capture_in_condition?(node)
@@ -132,10 +139,7 @@ module RuboCop
132
139
  end
133
140
 
134
141
  def non_eligible_node?(node)
135
- non_simple_if_unless?(node) ||
136
- node.chained? ||
137
- node.nested_conditional? ||
138
- super
142
+ non_simple_if_unless?(node) || node.chained? || node.nested_conditional? || super
139
143
  end
140
144
 
141
145
  def non_simple_if_unless?(node)
@@ -153,18 +157,41 @@ module RuboCop
153
157
  node = node.parent
154
158
  end
155
159
 
156
- node && (sibling = node.children[index + 1]) &&
157
- sibling.source_range.first_line == line_no
160
+ node && (sibling = node.children[index + 1]) && sibling.source_range.first_line == line_no
158
161
  end
159
162
 
160
- def to_normal_form(node)
161
- indentation = ' ' * node.source_range.column
163
+ def to_normal_form(node, indentation)
162
164
  <<~RUBY.chomp
163
165
  #{node.keyword} #{node.condition.source}
164
166
  #{indentation} #{node.body.source}
165
167
  #{indentation}end
166
168
  RUBY
167
169
  end
170
+
171
+ def to_normal_form_with_heredoc(node, indentation, heredoc)
172
+ heredoc_body, heredoc_end = heredoc
173
+
174
+ <<~RUBY.chomp
175
+ #{node.keyword} #{node.condition.source}
176
+ #{indentation} #{node.body.source}
177
+ #{indentation} #{heredoc_body.source.chomp}
178
+ #{indentation} #{heredoc_end.source.chomp}
179
+ #{indentation}end
180
+ RUBY
181
+ end
182
+
183
+ def extract_heredoc_from(last_argument)
184
+ heredoc_body = last_argument.loc.heredoc_body
185
+ heredoc_end = last_argument.loc.heredoc_end
186
+
187
+ [heredoc_body, heredoc_end]
188
+ end
189
+
190
+ def remove_heredoc(corrector, heredoc)
191
+ heredoc.each do |range|
192
+ corrector.remove(range_by_whole_lines(range, include_final_newline: true))
193
+ end
194
+ end
168
195
  end
169
196
  end
170
197
  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)