rubocop 1.11.0 → 1.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (425) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -3
  3. data/config/default.yml +58 -6
  4. data/exe/rubocop +1 -3
  5. data/lib/rubocop.rb +6 -1
  6. data/lib/rubocop/cached_data.rb +1 -3
  7. data/lib/rubocop/cli.rb +4 -6
  8. data/lib/rubocop/cli/command/auto_genenerate_config.rb +9 -19
  9. data/lib/rubocop/cli/command/init_dotfile.rb +1 -3
  10. data/lib/rubocop/cli/command/show_cops.rb +1 -4
  11. data/lib/rubocop/cli/command/suggest_extensions.rb +3 -2
  12. data/lib/rubocop/comment_config.rb +45 -101
  13. data/lib/rubocop/config.rb +11 -26
  14. data/lib/rubocop/config_loader.rb +5 -11
  15. data/lib/rubocop/config_loader_resolver.rb +22 -14
  16. data/lib/rubocop/config_obsoletion/cop_rule.rb +1 -2
  17. data/lib/rubocop/config_store.rb +1 -2
  18. data/lib/rubocop/config_validator.rb +5 -10
  19. data/lib/rubocop/cop/autocorrect_logic.rb +3 -8
  20. data/lib/rubocop/cop/badge.rb +1 -2
  21. data/lib/rubocop/cop/base.rb +8 -6
  22. data/lib/rubocop/cop/bundler/duplicated_gem.rb +1 -2
  23. data/lib/rubocop/cop/bundler/gem_comment.rb +43 -11
  24. data/lib/rubocop/cop/bundler/gem_version.rb +99 -0
  25. data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -4
  26. data/lib/rubocop/cop/commissioner.rb +2 -8
  27. data/lib/rubocop/cop/cop.rb +4 -18
  28. data/lib/rubocop/cop/corrector.rb +1 -4
  29. data/lib/rubocop/cop/correctors/alignment_corrector.rb +6 -12
  30. data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +2 -4
  31. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +1 -2
  32. data/lib/rubocop/cop/correctors/line_break_corrector.rb +3 -6
  33. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +1 -3
  34. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +1 -3
  35. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -8
  36. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +1 -2
  37. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -4
  38. data/lib/rubocop/cop/generator.rb +1 -4
  39. data/lib/rubocop/cop/generator/configuration_injector.rb +1 -2
  40. data/lib/rubocop/cop/generator/require_file_injector.rb +2 -5
  41. data/lib/rubocop/cop/internal_affairs/example_description.rb +7 -5
  42. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +2 -5
  43. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -3
  44. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -3
  45. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +1 -2
  46. data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +1 -2
  47. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +1 -3
  48. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +12 -10
  49. data/lib/rubocop/cop/layout/argument_alignment.rb +34 -18
  50. data/lib/rubocop/cop/layout/array_alignment.rb +7 -6
  51. data/lib/rubocop/cop/layout/assignment_indentation.rb +8 -7
  52. data/lib/rubocop/cop/layout/begin_end_alignment.rb +1 -4
  53. data/lib/rubocop/cop/layout/block_alignment.rb +7 -19
  54. data/lib/rubocop/cop/layout/block_end_newline.rb +4 -8
  55. data/lib/rubocop/cop/layout/case_indentation.rb +1 -3
  56. data/lib/rubocop/cop/layout/class_structure.rb +4 -10
  57. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +18 -30
  58. data/lib/rubocop/cop/layout/comment_indentation.rb +17 -21
  59. data/lib/rubocop/cop/layout/def_end_alignment.rb +2 -6
  60. data/lib/rubocop/cop/layout/dot_position.rb +1 -3
  61. data/lib/rubocop/cop/layout/else_alignment.rb +10 -9
  62. data/lib/rubocop/cop/layout/empty_comment.rb +5 -12
  63. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +22 -8
  64. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +2 -6
  65. data/lib/rubocop/cop/layout/empty_lines.rb +1 -3
  66. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +8 -18
  67. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +2 -8
  68. data/lib/rubocop/cop/layout/end_alignment.rb +1 -2
  69. data/lib/rubocop/cop/layout/end_of_line.rb +1 -1
  70. data/lib/rubocop/cop/layout/extra_spacing.rb +3 -7
  71. data/lib/rubocop/cop/layout/first_argument_indentation.rb +6 -5
  72. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +10 -8
  73. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -2
  74. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +36 -20
  75. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -2
  76. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -2
  77. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +1 -2
  78. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +6 -5
  79. data/lib/rubocop/cop/layout/hash_alignment.rb +18 -13
  80. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -9
  81. data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -6
  82. data/lib/rubocop/cop/layout/indentation_consistency.rb +9 -6
  83. data/lib/rubocop/cop/layout/indentation_style.rb +25 -30
  84. data/lib/rubocop/cop/layout/indentation_width.rb +24 -12
  85. data/lib/rubocop/cop/layout/initial_indentation.rb +1 -4
  86. data/lib/rubocop/cop/layout/line_length.rb +4 -15
  87. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +1 -2
  88. data/lib/rubocop/cop/layout/multiline_block_layout.rb +7 -15
  89. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -2
  90. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -2
  91. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +22 -15
  92. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +10 -5
  93. data/lib/rubocop/cop/layout/parameter_alignment.rb +6 -5
  94. data/lib/rubocop/cop/layout/redundant_line_break.rb +137 -0
  95. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +3 -6
  96. data/lib/rubocop/cop/layout/single_line_block_chain.rb +53 -0
  97. data/lib/rubocop/cop/layout/space_after_colon.rb +1 -3
  98. data/lib/rubocop/cop/layout/space_after_method_name.rb +2 -4
  99. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +6 -14
  100. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +1 -2
  101. data/lib/rubocop/cop/layout/space_around_keyword.rb +3 -6
  102. data/lib/rubocop/cop/layout/space_around_operators.rb +4 -9
  103. data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -2
  104. data/lib/rubocop/cop/layout/space_before_brackets.rb +1 -3
  105. data/lib/rubocop/cop/layout/space_before_comment.rb +1 -3
  106. data/lib/rubocop/cop/layout/space_before_first_arg.rb +5 -11
  107. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +2 -4
  108. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +5 -10
  109. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +2 -7
  110. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +5 -10
  111. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +1 -2
  112. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +1 -2
  113. data/lib/rubocop/cop/legacy/corrections_proxy.rb +2 -8
  114. data/lib/rubocop/cop/legacy/corrector.rb +1 -3
  115. data/lib/rubocop/cop/lint/ambiguous_assignment.rb +1 -6
  116. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +14 -7
  117. data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -2
  118. data/lib/rubocop/cop/lint/constant_resolution.rb +1 -2
  119. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +83 -41
  120. data/lib/rubocop/cop/lint/deprecated_constants.rb +3 -3
  121. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +2 -5
  122. data/lib/rubocop/cop/lint/duplicate_branch.rb +1 -2
  123. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -3
  124. data/lib/rubocop/cop/lint/duplicate_methods.rb +3 -7
  125. data/lib/rubocop/cop/lint/else_layout.rb +1 -3
  126. data/lib/rubocop/cop/lint/empty_block.rb +18 -2
  127. data/lib/rubocop/cop/lint/empty_ensure.rb +1 -3
  128. data/lib/rubocop/cop/lint/empty_file.rb +1 -3
  129. data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -3
  130. data/lib/rubocop/cop/lint/ensure_return.rb +1 -3
  131. data/lib/rubocop/cop/lint/erb_new_arguments.rb +3 -7
  132. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -2
  133. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +3 -6
  134. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +1 -2
  135. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -2
  136. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +3 -7
  137. data/lib/rubocop/cop/lint/inherit_exception.rb +1 -2
  138. data/lib/rubocop/cop/lint/interpolation_check.rb +3 -11
  139. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +3 -6
  140. data/lib/rubocop/cop/lint/loop.rb +1 -2
  141. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +3 -7
  142. data/lib/rubocop/cop/lint/missing_super.rb +1 -2
  143. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -2
  144. data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -2
  145. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -3
  146. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +1 -3
  147. data/lib/rubocop/cop/lint/number_conversion.rb +11 -5
  148. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +1 -2
  149. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +1 -3
  150. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -3
  151. data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -3
  152. data/lib/rubocop/cop/lint/raise_exception.rb +1 -2
  153. data/lib/rubocop/cop/lint/rand_one.rb +1 -2
  154. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +9 -22
  155. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +1 -3
  156. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +3 -7
  157. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +1 -2
  158. data/lib/rubocop/cop/lint/redundant_with_index.rb +1 -4
  159. data/lib/rubocop/cop/lint/redundant_with_object.rb +1 -4
  160. data/lib/rubocop/cop/lint/regexp_as_condition.rb +1 -3
  161. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -4
  162. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -2
  163. data/lib/rubocop/cop/lint/rescue_type.rb +2 -7
  164. data/lib/rubocop/cop/lint/return_in_void_context.rb +1 -2
  165. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +1 -2
  166. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +4 -10
  167. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -2
  168. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +2 -7
  169. data/lib/rubocop/cop/lint/shadowed_argument.rb +4 -11
  170. data/lib/rubocop/cop/lint/shadowed_exception.rb +7 -8
  171. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -2
  172. data/lib/rubocop/cop/lint/suppressed_exception.rb +44 -1
  173. data/lib/rubocop/cop/lint/symbol_conversion.rb +91 -6
  174. data/lib/rubocop/cop/lint/syntax.rb +1 -3
  175. data/lib/rubocop/cop/lint/to_json.rb +1 -2
  176. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1 -3
  177. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +1 -3
  178. data/lib/rubocop/cop/lint/unreachable_code.rb +2 -5
  179. data/lib/rubocop/cop/lint/unreachable_loop.rb +14 -7
  180. data/lib/rubocop/cop/lint/unused_block_argument.rb +9 -7
  181. data/lib/rubocop/cop/lint/unused_method_argument.rb +1 -2
  182. data/lib/rubocop/cop/lint/useless_access_modifier.rb +2 -4
  183. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -9
  184. data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -3
  185. data/lib/rubocop/cop/lint/void.rb +5 -12
  186. data/lib/rubocop/cop/message_annotator.rb +1 -3
  187. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -7
  188. data/lib/rubocop/cop/metrics/class_length.rb +1 -3
  189. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -2
  190. data/lib/rubocop/cop/metrics/module_length.rb +2 -6
  191. data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -5
  192. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -2
  193. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +4 -7
  194. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +2 -7
  195. data/lib/rubocop/cop/migration/department_name.rb +3 -7
  196. data/lib/rubocop/cop/mixin/alignment.rb +12 -7
  197. data/lib/rubocop/cop/mixin/check_line_breakable.rb +20 -4
  198. data/lib/rubocop/cop/mixin/code_length.rb +1 -3
  199. data/lib/rubocop/cop/mixin/comments_help.rb +5 -1
  200. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +2 -2
  201. data/lib/rubocop/cop/mixin/configurable_formatting.rb +3 -8
  202. data/lib/rubocop/cop/mixin/def_node.rb +2 -5
  203. data/lib/rubocop/cop/mixin/documentation_comment.rb +3 -6
  204. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +3 -7
  205. data/lib/rubocop/cop/mixin/empty_parameter.rb +1 -3
  206. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -3
  207. data/lib/rubocop/cop/mixin/enforce_superclass.rb +2 -6
  208. data/lib/rubocop/cop/mixin/first_element_line_break.rb +1 -3
  209. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +7 -7
  210. data/lib/rubocop/cop/mixin/gem_declaration.rb +13 -0
  211. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +3 -6
  212. data/lib/rubocop/cop/mixin/hash_transform_method.rb +7 -22
  213. data/lib/rubocop/cop/mixin/interpolation.rb +1 -3
  214. data/lib/rubocop/cop/mixin/line_length_help.rb +13 -10
  215. data/lib/rubocop/cop/mixin/match_range.rb +2 -5
  216. data/lib/rubocop/cop/mixin/method_complexity.rb +1 -3
  217. data/lib/rubocop/cop/mixin/method_preference.rb +1 -2
  218. data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +4 -3
  219. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +1 -3
  220. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +11 -40
  221. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -2
  222. data/lib/rubocop/cop/mixin/negative_conditional.rb +1 -2
  223. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -4
  224. data/lib/rubocop/cop/mixin/percent_array.rb +1 -3
  225. data/lib/rubocop/cop/mixin/percent_literal.rb +0 -6
  226. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +5 -11
  227. data/lib/rubocop/cop/mixin/preferred_delimiters.rb +4 -7
  228. data/lib/rubocop/cop/mixin/range_help.rb +10 -13
  229. data/lib/rubocop/cop/mixin/rescue_node.rb +2 -6
  230. data/lib/rubocop/cop/mixin/safe_assignment.rb +1 -2
  231. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +2 -4
  232. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -2
  233. data/lib/rubocop/cop/mixin/statement_modifier.rb +1 -3
  234. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  235. data/lib/rubocop/cop/mixin/trailing_body.rb +1 -2
  236. data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -2
  237. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +7 -13
  238. data/lib/rubocop/cop/mixin/unused_argument.rb +1 -3
  239. data/lib/rubocop/cop/naming/ascii_identifiers.rb +2 -4
  240. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -2
  241. data/lib/rubocop/cop/naming/file_name.rb +7 -16
  242. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +6 -3
  243. data/lib/rubocop/cop/naming/method_name.rb +1 -2
  244. data/lib/rubocop/cop/naming/predicate_name.rb +1 -2
  245. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +10 -0
  246. data/lib/rubocop/cop/offense.rb +3 -8
  247. data/lib/rubocop/cop/registry.rb +12 -11
  248. data/lib/rubocop/cop/style/access_modifier_declarations.rb +3 -5
  249. data/lib/rubocop/cop/style/accessor_grouping.rb +1 -3
  250. data/lib/rubocop/cop/style/alias.rb +5 -12
  251. data/lib/rubocop/cop/style/and_or.rb +3 -1
  252. data/lib/rubocop/cop/style/arguments_forwarding.rb +1 -3
  253. data/lib/rubocop/cop/style/ascii_comments.rb +1 -2
  254. data/lib/rubocop/cop/style/attr.rb +1 -3
  255. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +2 -5
  256. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +59 -71
  257. data/lib/rubocop/cop/style/bisected_attr_accessor/macro.rb +60 -0
  258. data/lib/rubocop/cop/style/case_like_if.rb +16 -6
  259. data/lib/rubocop/cop/style/character_literal.rb +2 -4
  260. data/lib/rubocop/cop/style/class_and_module_children.rb +19 -10
  261. data/lib/rubocop/cop/style/class_equality_comparison.rb +2 -0
  262. data/lib/rubocop/cop/style/class_methods.rb +1 -3
  263. data/lib/rubocop/cop/style/collection_compact.rb +1 -3
  264. data/lib/rubocop/cop/style/colon_method_call.rb +1 -3
  265. data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
  266. data/lib/rubocop/cop/style/command_literal.rb +4 -9
  267. data/lib/rubocop/cop/style/comment_annotation.rb +3 -6
  268. data/lib/rubocop/cop/style/commented_keyword.rb +7 -13
  269. data/lib/rubocop/cop/style/conditional_assignment.rb +10 -24
  270. data/lib/rubocop/cop/style/copyright.rb +3 -6
  271. data/lib/rubocop/cop/style/date_time.rb +2 -5
  272. data/lib/rubocop/cop/style/def_with_parentheses.rb +1 -2
  273. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +2 -2
  274. data/lib/rubocop/cop/style/documentation.rb +25 -3
  275. data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -2
  276. data/lib/rubocop/cop/style/empty_case_condition.rb +2 -7
  277. data/lib/rubocop/cop/style/empty_else.rb +3 -9
  278. data/lib/rubocop/cop/style/empty_literal.rb +12 -9
  279. data/lib/rubocop/cop/style/empty_method.rb +3 -7
  280. data/lib/rubocop/cop/style/end_block.rb +1 -2
  281. data/lib/rubocop/cop/style/endless_method.rb +1 -3
  282. data/lib/rubocop/cop/style/eval_with_location.rb +3 -5
  283. data/lib/rubocop/cop/style/expand_path_arguments.rb +1 -3
  284. data/lib/rubocop/cop/style/explicit_block_argument.rb +1 -4
  285. data/lib/rubocop/cop/style/format_string_token.rb +1 -4
  286. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -11
  287. data/lib/rubocop/cop/style/guard_clause.rb +3 -7
  288. data/lib/rubocop/cop/style/hash_conversion.rb +31 -3
  289. data/lib/rubocop/cop/style/hash_each_methods.rb +1 -2
  290. data/lib/rubocop/cop/style/hash_like_case.rb +1 -2
  291. data/lib/rubocop/cop/style/hash_syntax.rb +20 -24
  292. data/lib/rubocop/cop/style/identical_conditional_branches.rb +1 -3
  293. data/lib/rubocop/cop/style/if_unless_modifier.rb +40 -13
  294. data/lib/rubocop/cop/style/infinite_loop.rb +2 -5
  295. data/lib/rubocop/cop/style/inverse_methods.rb +3 -7
  296. data/lib/rubocop/cop/style/ip_addresses.rb +1 -2
  297. data/lib/rubocop/cop/style/lambda.rb +2 -4
  298. data/lib/rubocop/cop/style/lambda_call.rb +1 -2
  299. data/lib/rubocop/cop/style/line_end_concatenation.rb +5 -12
  300. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +47 -3
  301. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +26 -16
  302. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +1 -2
  303. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -4
  304. data/lib/rubocop/cop/style/method_def_parentheses.rb +4 -8
  305. data/lib/rubocop/cop/style/min_max.rb +1 -2
  306. data/lib/rubocop/cop/style/missing_else.rb +2 -4
  307. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +1 -2
  308. data/lib/rubocop/cop/style/mixin_grouping.rb +4 -10
  309. data/lib/rubocop/cop/style/mixin_usage.rb +1 -2
  310. data/lib/rubocop/cop/style/module_function.rb +3 -6
  311. data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -2
  312. data/lib/rubocop/cop/style/multiline_method_signature.rb +11 -6
  313. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +1 -2
  314. data/lib/rubocop/cop/style/multiple_comparison.rb +2 -4
  315. data/lib/rubocop/cop/style/mutable_constant.rb +4 -10
  316. data/lib/rubocop/cop/style/negated_if.rb +1 -2
  317. data/lib/rubocop/cop/style/negated_if_else_condition.rb +23 -2
  318. data/lib/rubocop/cop/style/negated_unless.rb +1 -2
  319. data/lib/rubocop/cop/style/nested_modifier.rb +3 -7
  320. data/lib/rubocop/cop/style/nested_ternary_operator.rb +2 -3
  321. data/lib/rubocop/cop/style/next.rb +4 -9
  322. data/lib/rubocop/cop/style/nil_lambda.rb +29 -12
  323. data/lib/rubocop/cop/style/non_nil_check.rb +2 -5
  324. data/lib/rubocop/cop/style/numeric_literals.rb +3 -11
  325. data/lib/rubocop/cop/style/numeric_predicate.rb +2 -7
  326. data/lib/rubocop/cop/style/one_line_conditional.rb +1 -2
  327. data/lib/rubocop/cop/style/option_hash.rb +1 -3
  328. data/lib/rubocop/cop/style/optional_arguments.rb +2 -5
  329. data/lib/rubocop/cop/style/or_assignment.rb +2 -6
  330. data/lib/rubocop/cop/style/parallel_assignment.rb +6 -9
  331. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -3
  332. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -2
  333. data/lib/rubocop/cop/style/perl_backrefs.rb +2 -9
  334. data/lib/rubocop/cop/style/preferred_hash_methods.rb +1 -4
  335. data/lib/rubocop/cop/style/proc.rb +1 -2
  336. data/lib/rubocop/cop/style/raise_args.rb +4 -8
  337. data/lib/rubocop/cop/style/random_with_offset.rb +3 -8
  338. data/lib/rubocop/cop/style/redundant_argument.rb +2 -11
  339. data/lib/rubocop/cop/style/redundant_assignment.rb +1 -3
  340. data/lib/rubocop/cop/style/redundant_begin.rb +40 -6
  341. data/lib/rubocop/cop/style/redundant_capital_w.rb +1 -2
  342. data/lib/rubocop/cop/style/redundant_condition.rb +2 -5
  343. data/lib/rubocop/cop/style/redundant_conditional.rb +3 -6
  344. data/lib/rubocop/cop/style/redundant_exception.rb +3 -6
  345. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -1
  346. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -2
  347. data/lib/rubocop/cop/style/redundant_interpolation.rb +1 -2
  348. data/lib/rubocop/cop/style/redundant_parentheses.rb +8 -20
  349. data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -2
  350. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -4
  351. data/lib/rubocop/cop/style/redundant_return.rb +6 -4
  352. data/lib/rubocop/cop/style/redundant_self.rb +9 -9
  353. data/lib/rubocop/cop/style/redundant_self_assignment.rb +2 -2
  354. data/lib/rubocop/cop/style/redundant_sort.rb +2 -5
  355. data/lib/rubocop/cop/style/regexp_literal.rb +4 -8
  356. data/lib/rubocop/cop/style/rescue_modifier.rb +21 -14
  357. data/lib/rubocop/cop/style/rescue_standard_error.rb +3 -7
  358. data/lib/rubocop/cop/style/return_nil.rb +1 -2
  359. data/lib/rubocop/cop/style/safe_navigation.rb +10 -21
  360. data/lib/rubocop/cop/style/send.rb +1 -2
  361. data/lib/rubocop/cop/style/signal_exception.rb +3 -7
  362. data/lib/rubocop/cop/style/single_argument_dig.rb +1 -2
  363. data/lib/rubocop/cop/style/single_line_block_params.rb +2 -5
  364. data/lib/rubocop/cop/style/single_line_methods.rb +21 -4
  365. data/lib/rubocop/cop/style/sole_nested_conditional.rb +31 -7
  366. data/lib/rubocop/cop/style/special_global_vars.rb +6 -18
  367. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -2
  368. data/lib/rubocop/cop/style/stderr_puts.rb +2 -6
  369. data/lib/rubocop/cop/style/string_chars.rb +39 -0
  370. data/lib/rubocop/cop/style/string_concatenation.rb +8 -10
  371. data/lib/rubocop/cop/style/string_literals.rb +2 -5
  372. data/lib/rubocop/cop/style/struct_inheritance.rb +10 -0
  373. data/lib/rubocop/cop/style/symbol_literal.rb +1 -3
  374. data/lib/rubocop/cop/style/symbol_proc.rb +4 -9
  375. data/lib/rubocop/cop/style/ternary_parentheses.rb +3 -6
  376. data/lib/rubocop/cop/style/top_level_method_definition.rb +75 -0
  377. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +6 -3
  378. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +2 -6
  379. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +2 -5
  380. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -10
  381. data/lib/rubocop/cop/style/trivial_accessors.rb +67 -4
  382. data/lib/rubocop/cop/style/unless_else.rb +1 -2
  383. data/lib/rubocop/cop/style/unless_logical_operators.rb +8 -2
  384. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -1
  385. data/lib/rubocop/cop/style/when_then.rb +1 -3
  386. data/lib/rubocop/cop/style/while_until_modifier.rb +1 -2
  387. data/lib/rubocop/cop/style/word_array.rb +1 -2
  388. data/lib/rubocop/cop/style/yoda_condition.rb +3 -11
  389. data/lib/rubocop/cop/style/zero_length_predicate.rb +1 -2
  390. data/lib/rubocop/cop/team.rb +2 -5
  391. data/lib/rubocop/cop/util.rb +8 -11
  392. data/lib/rubocop/cop/utils/format_string.rb +1 -3
  393. data/lib/rubocop/cop/variable_force.rb +6 -15
  394. data/lib/rubocop/cop/variable_force/assignment.rb +1 -2
  395. data/lib/rubocop/cop/variable_force/branch.rb +16 -2
  396. data/lib/rubocop/cop/variable_force/reference.rb +1 -3
  397. data/lib/rubocop/cop/variable_force/scope.rb +4 -8
  398. data/lib/rubocop/cop/variable_force/variable.rb +2 -4
  399. data/lib/rubocop/cops_documentation_generator.rb +7 -21
  400. data/lib/rubocop/directive_comment.rb +69 -9
  401. data/lib/rubocop/ext/regexp_parser.rb +3 -6
  402. data/lib/rubocop/file_finder.rb +1 -3
  403. data/lib/rubocop/formatter/clang_style_formatter.rb +4 -2
  404. data/lib/rubocop/formatter/disabled_config_formatter.rb +3 -8
  405. data/lib/rubocop/formatter/git_hub_actions_formatter.rb +1 -5
  406. data/lib/rubocop/formatter/html_formatter.rb +4 -10
  407. data/lib/rubocop/formatter/json_formatter.rb +1 -5
  408. data/lib/rubocop/formatter/junit_formatter.rb +23 -14
  409. data/lib/rubocop/formatter/progress_formatter.rb +1 -3
  410. data/lib/rubocop/formatter/tap_formatter.rb +4 -2
  411. data/lib/rubocop/magic_comment.rb +1 -1
  412. data/lib/rubocop/options.rb +30 -50
  413. data/lib/rubocop/path_util.rb +1 -3
  414. data/lib/rubocop/rake_task.rb +3 -0
  415. data/lib/rubocop/remote_config.rb +4 -7
  416. data/lib/rubocop/result_cache.rb +5 -12
  417. data/lib/rubocop/rspec/cop_helper.rb +1 -1
  418. data/lib/rubocop/rspec/expect_offense.rb +4 -9
  419. data/lib/rubocop/rspec/shared_contexts.rb +8 -15
  420. data/lib/rubocop/runner.rb +7 -14
  421. data/lib/rubocop/target_finder.rb +19 -16
  422. data/lib/rubocop/target_ruby.rb +4 -8
  423. data/lib/rubocop/version.rb +1 -1
  424. metadata +13 -7
  425. data/lib/rubocop/core_ext/hash.rb +0 -20
@@ -63,15 +63,12 @@ module RuboCop
63
63
  PATTERN
64
64
 
65
65
  def on_send(node)
66
- return unless date_time?(node) ||
67
- (to_datetime?(node) && disallow_coercion?)
66
+ return unless date_time?(node) || (to_datetime?(node) && disallow_coercion?)
68
67
  return if historic_date?(node)
69
68
 
70
69
  message = to_datetime?(node) ? COERCION_MSG : CLASS_MSG
71
70
 
72
- add_offense(node, message: message) do |corrector|
73
- autocorrect(corrector, node)
74
- end
71
+ add_offense(node, message: message) { |corrector| autocorrect(corrector, node) }
75
72
  end
76
73
 
77
74
  private
@@ -36,8 +36,7 @@ module RuboCop
36
36
  class DefWithParentheses < Base
37
37
  extend AutoCorrector
38
38
 
39
- MSG = "Omit the parentheses in defs when the method doesn't accept " \
40
- 'any arguments.'
39
+ MSG = "Omit the parentheses in defs when the method doesn't accept any arguments."
41
40
 
42
41
  def on_def(node)
43
42
  return if node.single_line?
@@ -70,8 +70,8 @@ module RuboCop
70
70
  end
71
71
 
72
72
  def directive_cops(comment)
73
- match = CommentConfig::COMMENT_DIRECTIVE_REGEXP.match(comment.text)
74
- match && match[2] ? match[2].split(',').map(&:strip) : []
73
+ match_captures = DirectiveComment.new(comment).match_captures
74
+ match_captures && match_captures[1] ? match_captures[1].split(',').map(&:strip) : []
75
75
  end
76
76
 
77
77
  def allowed_cops
@@ -60,6 +60,15 @@ module RuboCop
60
60
  # extend Foo
61
61
  # end
62
62
  #
63
+ # @example AllowedConstants: ['ClassMethods']
64
+ #
65
+ # # good
66
+ # module A
67
+ # module ClassMethods
68
+ # # ...
69
+ # end
70
+ # end
71
+ #
63
72
  class Documentation < Base
64
73
  include DocumentationComment
65
74
 
@@ -90,14 +99,19 @@ module RuboCop
90
99
 
91
100
  def check(node, body, type)
92
101
  return if namespace?(body)
93
- return if documentation_comment?(node) || nodoc_comment?(node)
94
- return if compact_namespace?(node) &&
95
- nodoc_comment?(outer_module(node).first)
102
+ return if documentation_comment?(node)
103
+ return if constant_allowed?(node)
104
+ return if nodoc_self_or_outer_module?(node)
96
105
  return if macro_only?(body)
97
106
 
98
107
  add_offense(node.loc.keyword, message: format(MSG, type: type))
99
108
  end
100
109
 
110
+ def nodoc_self_or_outer_module?(node)
111
+ nodoc_comment?(node) ||
112
+ compact_namespace?(node) && nodoc_comment?(outer_module(node).first)
113
+ end
114
+
101
115
  def macro_only?(body)
102
116
  body.respond_to?(:macro?) && body.macro? ||
103
117
  body.respond_to?(:children) && body.children&.all? { |child| macro_only?(child) }
@@ -117,6 +131,10 @@ module RuboCop
117
131
  constant_definition?(node) || constant_visibility_declaration?(node)
118
132
  end
119
133
 
134
+ def constant_allowed?(node)
135
+ allowed_constants.include?(node.identifier.short_name)
136
+ end
137
+
120
138
  def compact_namespace?(node)
121
139
  /::/.match?(node.loc.name.source)
122
140
  end
@@ -143,6 +161,10 @@ module RuboCop
143
161
  def nodoc(node)
144
162
  processed_source.ast_with_comments[node.children.first].first
145
163
  end
164
+
165
+ def allowed_constants
166
+ @allowed_constants ||= cop_config.fetch('AllowedConstants', []).map(&:intern)
167
+ end
146
168
  end
147
169
  end
148
170
  end
@@ -25,8 +25,7 @@ module RuboCop
25
25
  class EachForSimpleLoop < Base
26
26
  extend AutoCorrector
27
27
 
28
- MSG = 'Use `Integer#times` for a simple loop which iterates a fixed ' \
29
- 'number of times.'
28
+ MSG = 'Use `Integer#times` for a simple loop which iterates a fixed number of times.'
30
29
 
31
30
  def on_block(node)
32
31
  return unless offending_each_range(node)
@@ -44,19 +44,14 @@ module RuboCop
44
44
  def on_case(case_node)
45
45
  return if case_node.condition
46
46
 
47
- branch_bodies = [
48
- *case_node.when_branches.map(&:body),
49
- case_node.else_branch
50
- ].compact
47
+ branch_bodies = [*case_node.when_branches.map(&:body), case_node.else_branch].compact
51
48
 
52
49
  return if branch_bodies.any? do |body|
53
50
  body.return_type? ||
54
51
  body.each_descendant.any?(&:return_type?)
55
52
  end
56
53
 
57
- add_offense(case_node.loc.keyword) do |corrector|
58
- autocorrect(corrector, case_node)
59
- end
54
+ add_offense(case_node.loc.keyword) { |corrector| autocorrect(corrector, case_node) }
60
55
  end
61
56
 
62
57
  private
@@ -123,17 +123,13 @@ module RuboCop
123
123
  def empty_check(node)
124
124
  return unless node.else? && !node.else_branch
125
125
 
126
- add_offense(node.loc.else) do |corrector|
127
- autocorrect(corrector, node)
128
- end
126
+ add_offense(node.loc.else) { |corrector| autocorrect(corrector, node) }
129
127
  end
130
128
 
131
129
  def nil_check(node)
132
130
  return unless node.else_branch&.nil_type?
133
131
 
134
- add_offense(node.loc.else) do |corrector|
135
- autocorrect(corrector, node)
136
- end
132
+ add_offense(node.loc.else) { |corrector| autocorrect(corrector, node) }
137
133
  end
138
134
 
139
135
  def autocorrect(corrector, node)
@@ -154,9 +150,7 @@ module RuboCop
154
150
  return node if node.case_type?
155
151
  return node unless node.elsif?
156
152
 
157
- node.each_ancestor(:if, :case, :when).find(-> { node }) do |parent|
158
- parent.loc.end
159
- end
153
+ node.each_ancestor(:if, :case, :when).find(-> { node }) { |parent| parent.loc.end }
160
154
  end
161
155
 
162
156
  def autocorrect_forbidden?(type)
@@ -37,8 +37,7 @@ module RuboCop
37
37
  def_node_matcher :str_node, '(send (const {nil? cbase} :String) :new)'
38
38
 
39
39
  # @!method array_with_block(node)
40
- def_node_matcher :array_with_block,
41
- '(block (send (const {nil? cbase} :Array) :new) args _)'
40
+ def_node_matcher :array_with_block, '(block (send (const {nil? cbase} :Array) :new) args _)'
42
41
 
43
42
  # @!method hash_with_block(node)
44
43
  def_node_matcher :hash_with_block, <<~PATTERN
@@ -63,7 +62,7 @@ module RuboCop
63
62
  ARR_MSG
64
63
  elsif offense_hash_node?(node)
65
64
  HASH_MSG
66
- elsif str_node(node) && !frozen_string_literals_enabled?
65
+ elsif str_node(node) && !frozen_strings?
67
66
  format(STR_MSG, prefer: preferred_string_literal)
68
67
  end
69
68
  end
@@ -84,20 +83,17 @@ module RuboCop
84
83
  parent = node.parent
85
84
  return false unless parent && %i[send super zsuper].include?(parent.type)
86
85
 
87
- node.equal?(parent.arguments.first) &&
88
- !parentheses?(node.parent)
86
+ node.equal?(parent.arguments.first) && !parentheses?(node.parent)
89
87
  end
90
88
 
91
89
  def replacement_range(node)
92
- if hash_node(node) &&
93
- first_argument_unparenthesized?(node)
90
+ if hash_node(node) && first_argument_unparenthesized?(node)
94
91
  # `some_method {}` is not same as `some_method Hash.new`
95
92
  # because the braces are interpreted as a block. We will have
96
93
  # to rewrite the arguments to wrap them in parenthesis.
97
94
  args = node.parent.arguments
98
95
 
99
- range_between(args[0].source_range.begin_pos - 1,
100
- args[-1].source_range.end_pos)
96
+ range_between(args[0].source_range.begin_pos - 1, args[-1].source_range.end_pos)
101
97
  else
102
98
  node.source_range
103
99
  end
@@ -129,6 +125,13 @@ module RuboCop
129
125
  end
130
126
  end
131
127
  end
128
+
129
+ def frozen_strings?
130
+ return true if frozen_string_literals_enabled?
131
+
132
+ frozen_string_cop_enabled = config.for_cop('Style/FrozenStringLiteral')['Enabled']
133
+ frozen_string_cop_enabled && !frozen_string_literals_disabled?
134
+ end
132
135
  end
133
136
  end
134
137
  end
@@ -45,16 +45,13 @@ module RuboCop
45
45
  extend AutoCorrector
46
46
 
47
47
  MSG_COMPACT = 'Put empty method definitions on a single line.'
48
- MSG_EXPANDED = 'Put the `end` of empty method definitions on the ' \
49
- 'next line.'
48
+ MSG_EXPANDED = 'Put the `end` of empty method definitions on the next line.'
50
49
 
51
50
  def on_def(node)
52
51
  return if node.body || comment_lines?(node)
53
52
  return if correct_style?(node)
54
53
 
55
- add_offense(node) do |corrector|
56
- corrector.replace(node, corrected(node))
57
- end
54
+ add_offense(node) { |corrector| corrector.replace(node, corrected(node)) }
58
55
  end
59
56
  alias on_defs on_def
60
57
 
@@ -65,8 +62,7 @@ module RuboCop
65
62
  end
66
63
 
67
64
  def correct_style?(node)
68
- compact_style? && compact?(node) ||
69
- expanded_style? && expanded?(node)
65
+ compact_style? && compact?(node) || expanded_style? && expanded?(node)
70
66
  end
71
67
 
72
68
  def corrected(node)
@@ -15,8 +15,7 @@ module RuboCop
15
15
  class EndBlock < Base
16
16
  extend AutoCorrector
17
17
 
18
- MSG = 'Avoid the use of `END` blocks. ' \
19
- 'Use `Kernel#at_exit` instead.'
18
+ MSG = 'Avoid the use of `END` blocks. Use `Kernel#at_exit` instead.'
20
19
 
21
20
  def on_postexe(node)
22
21
  add_offense(node.loc.keyword) do |corrector|
@@ -79,9 +79,7 @@ module RuboCop
79
79
  def handle_disallow_style(node)
80
80
  return unless node.endless?
81
81
 
82
- add_offense(node) do |corrector|
83
- correct_to_multiline(corrector, node)
84
- end
82
+ add_offense(node) { |corrector| correct_to_multiline(corrector, node) }
85
83
  end
86
84
 
87
85
  def correct_to_multiline(corrector, node)
@@ -112,13 +112,11 @@ module RuboCop
112
112
  end
113
113
 
114
114
  def special_file_keyword?(node)
115
- node.str_type? &&
116
- node.source == '__FILE__'
115
+ node.str_type? && node.source == '__FILE__'
117
116
  end
118
117
 
119
118
  def special_line_keyword?(node)
120
- node.int_type? &&
121
- node.source == '__LINE__'
119
+ node.int_type? && node.source == '__LINE__'
122
120
  end
123
121
 
124
122
  def file_and_line(node)
@@ -224,7 +222,7 @@ module RuboCop
224
222
 
225
223
  register_offense(node) do |corrector|
226
224
  line_str = missing_line(node, code)
227
- corrector.insert_after(node.loc.expression.end, ", __FILE__, #{line_str}")
225
+ corrector.insert_after(node.last_argument.source_range.end, ", __FILE__, #{line_str}")
228
226
  end
229
227
  end
230
228
 
@@ -85,9 +85,7 @@ module RuboCop
85
85
  elsif (default_dir = pathname_parent_expand_path(node))
86
86
  return unless unrecommended_argument?(default_dir)
87
87
 
88
- add_offense(node, message: PATHNAME_MSG) do |corrector|
89
- autocorrect(corrector, node)
90
- end
88
+ add_offense(node, message: PATHNAME_MSG) { |corrector| autocorrect(corrector, node) }
91
89
  elsif (default_dir = pathname_new_parent_expand_path(node))
92
90
  return unless unrecommended_argument?(default_dir)
93
91
 
@@ -106,10 +106,7 @@ module RuboCop
106
106
  end
107
107
 
108
108
  def block_body_range(block_node, send_node)
109
- range_between(
110
- send_node.loc.expression.end_pos,
111
- block_node.loc.end.end_pos
112
- )
109
+ range_between(send_node.loc.expression.end_pos, block_node.loc.end.end_pos)
113
110
  end
114
111
  end
115
112
  end
@@ -146,10 +146,7 @@ module RuboCop
146
146
  next if seq.percent?
147
147
 
148
148
  detected_style = seq.style
149
- token = contents.begin.adjust(
150
- begin_pos: seq.begin_pos,
151
- end_pos: seq.end_pos
152
- )
149
+ token = contents.begin.adjust(begin_pos: seq.begin_pos, end_pos: seq.end_pos)
153
150
 
154
151
  yield(detected_style, token)
155
152
  end
@@ -10,9 +10,6 @@ module RuboCop
10
10
  # default in future Ruby. The comment will be added below a shebang and
11
11
  # encoding comment.
12
12
  #
13
- # Note that the cop will ignore files where the comment exists but is set
14
- # to `false` instead of `true`.
15
- #
16
13
  # @example EnforcedStyle: always (default)
17
14
  # # The `always` style will always add the frozen string literal comment
18
15
  # # to a file, regardless of the Ruby version or if `freeze` or `<<` are
@@ -79,8 +76,7 @@ module RuboCop
79
76
  include RangeHelp
80
77
  extend AutoCorrector
81
78
 
82
- MSG_MISSING_TRUE = 'Missing magic comment `# frozen_string_literal: '\
83
- 'true`.'
79
+ MSG_MISSING_TRUE = 'Missing magic comment `# frozen_string_literal: true`.'
84
80
  MSG_MISSING = 'Missing frozen string literal comment.'
85
81
  MSG_UNNECESSARY = 'Unnecessary frozen string literal comment.'
86
82
  MSG_DISABLED = 'Frozen string literal comment must be set to `true`.'
@@ -146,17 +142,13 @@ module RuboCop
146
142
  def missing_offense(processed_source)
147
143
  range = source_range(processed_source.buffer, 0, 0)
148
144
 
149
- add_offense(range, message: MSG_MISSING) do |corrector|
150
- insert_comment(corrector)
151
- end
145
+ add_offense(range, message: MSG_MISSING) { |corrector| insert_comment(corrector) }
152
146
  end
153
147
 
154
148
  def missing_true_offense(processed_source)
155
149
  range = source_range(processed_source.buffer, 0, 0)
156
150
 
157
- add_offense(range, message: MSG_MISSING_TRUE) do |corrector|
158
- insert_comment(corrector)
159
- end
151
+ add_offense(range, message: MSG_MISSING_TRUE) { |corrector| insert_comment(corrector) }
160
152
  end
161
153
 
162
154
  def unnecessary_comment_offense(processed_source)
@@ -99,12 +99,9 @@ module RuboCop
99
99
 
100
100
  def register_offense(node, scope_exiting_keyword, conditional_keyword)
101
101
  condition, = node.node_parts
102
- example = [scope_exiting_keyword,
103
- conditional_keyword,
104
- condition.source].join(' ')
102
+ example = [scope_exiting_keyword, conditional_keyword, condition.source].join(' ')
105
103
  if too_long_for_single_line?(node, example)
106
- example = "#{conditional_keyword} #{condition.source}; " \
107
- "#{scope_exiting_keyword}; end"
104
+ example = "#{conditional_keyword} #{condition.source}; #{scope_exiting_keyword}; end"
108
105
  end
109
106
 
110
107
  add_offense(node.loc.keyword, message: format(MSG, example: example))
@@ -126,8 +123,7 @@ module RuboCop
126
123
  end
127
124
 
128
125
  def accepted_form?(node, ending: false)
129
- accepted_if?(node, ending) || node.condition.multiline? ||
130
- node.parent&.assignment?
126
+ accepted_if?(node, ending) || node.condition.multiline? || node.parent&.assignment?
131
127
  end
132
128
 
133
129
  def accepted_if?(node, ending)
@@ -61,11 +61,11 @@ module RuboCop
61
61
  def single_argument(node)
62
62
  first_argument = node.first_argument
63
63
  if first_argument.hash_type?
64
- add_offense(node, message: MSG_LITERAL_HASH_ARG) do |corrector|
65
- corrector.replace(node, "{#{first_argument.source}}")
66
- end
64
+ register_offense_for_hash(node, first_argument)
67
65
  elsif first_argument.splat_type?
68
66
  add_offense(node, message: MSG_SPLAT) unless allowed_splat_argument?
67
+ elsif use_zip_method_without_argument?(first_argument)
68
+ register_offense_for_zip_method(node, first_argument)
69
69
  else
70
70
  add_offense(node, message: MSG_TO_H) do |corrector|
71
71
  replacement = first_argument.source
@@ -75,6 +75,31 @@ module RuboCop
75
75
  end
76
76
  end
77
77
 
78
+ def use_zip_method_without_argument?(first_argument)
79
+ return false unless first_argument&.send_type?
80
+
81
+ first_argument.method?(:zip) && first_argument.arguments.empty?
82
+ end
83
+
84
+ def register_offense_for_hash(node, hash_argument)
85
+ add_offense(node, message: MSG_LITERAL_HASH_ARG) do |corrector|
86
+ corrector.replace(node, "{#{hash_argument.source}}")
87
+
88
+ parent = node.parent
89
+ add_parentheses(parent, corrector) if parent&.send_type? && !parent.parenthesized?
90
+ end
91
+ end
92
+
93
+ def register_offense_for_zip_method(node, zip_method)
94
+ add_offense(node, message: MSG_TO_H) do |corrector|
95
+ if zip_method.parenthesized?
96
+ corrector.insert_before(zip_method.loc.end, '[]')
97
+ else
98
+ corrector.insert_after(zip_method, '([])')
99
+ end
100
+ end
101
+ end
102
+
78
103
  def requires_parens?(node)
79
104
  node.call_type? && node.arguments.any? && !node.parenthesized?
80
105
  end
@@ -85,6 +110,9 @@ module RuboCop
85
110
  else
86
111
  add_offense(node, message: MSG_LITERAL_MULTI_ARG) do |corrector|
87
112
  corrector.replace(node, args_to_hash(node.arguments))
113
+
114
+ parent = node.parent
115
+ add_parentheses(parent, corrector) if parent&.send_type? && !parent.parenthesized?
88
116
  end
89
117
  end
90
118
  end