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
@@ -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)
@@ -27,11 +27,19 @@ module RuboCop
27
27
 
28
28
  RESTRICT_ON_SEND = %i[new].freeze
29
29
 
30
+ # @!method array_node(node)
30
31
  def_node_matcher :array_node, '(send (const {nil? cbase} :Array) :new)'
32
+
33
+ # @!method hash_node(node)
31
34
  def_node_matcher :hash_node, '(send (const {nil? cbase} :Hash) :new)'
35
+
36
+ # @!method str_node(node)
32
37
  def_node_matcher :str_node, '(send (const {nil? cbase} :String) :new)'
33
- def_node_matcher :array_with_block,
34
- '(block (send (const {nil? cbase} :Array) :new) args _)'
38
+
39
+ # @!method array_with_block(node)
40
+ def_node_matcher :array_with_block, '(block (send (const {nil? cbase} :Array) :new) args _)'
41
+
42
+ # @!method hash_with_block(node)
35
43
  def_node_matcher :hash_with_block, <<~PATTERN
36
44
  {
37
45
  (block (send (const {nil? cbase} :Hash) :new) args _)
@@ -75,20 +83,17 @@ module RuboCop
75
83
  parent = node.parent
76
84
  return false unless parent && %i[send super zsuper].include?(parent.type)
77
85
 
78
- node.equal?(parent.arguments.first) &&
79
- !parentheses?(node.parent)
86
+ node.equal?(parent.arguments.first) && !parentheses?(node.parent)
80
87
  end
81
88
 
82
89
  def replacement_range(node)
83
- if hash_node(node) &&
84
- first_argument_unparenthesized?(node)
90
+ if hash_node(node) && first_argument_unparenthesized?(node)
85
91
  # `some_method {}` is not same as `some_method Hash.new`
86
92
  # because the braces are interpreted as a block. We will have
87
93
  # to rewrite the arguments to wrap them in parenthesis.
88
94
  args = node.parent.arguments
89
95
 
90
- range_between(args[0].source_range.begin_pos - 1,
91
- args[-1].source_range.end_pos)
96
+ range_between(args[0].source_range.begin_pos - 1, args[-1].source_range.end_pos)
92
97
  else
93
98
  node.source_range
94
99
  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|
@@ -11,6 +11,7 @@ module RuboCop
11
11
  # Other method definition types are not considered by this cop.
12
12
  #
13
13
  # The supported styles are:
14
+ #
14
15
  # * allow_single_line (default) - only single line endless method definitions are allowed.
15
16
  # * allow_always - all endless method definitions are allowed.
16
17
  # * disallow - all endless method definitions are disallowed.
@@ -78,9 +79,7 @@ module RuboCop
78
79
  def handle_disallow_style(node)
79
80
  return unless node.endless?
80
81
 
81
- add_offense(node) do |corrector|
82
- correct_to_multiline(corrector, node)
83
- end
82
+ add_offense(node) { |corrector| correct_to_multiline(corrector, node) }
84
83
  end
85
84
 
86
85
  def correct_to_multiline(corrector, node)
@@ -65,10 +65,12 @@ module RuboCop
65
65
 
66
66
  RESTRICT_ON_SEND = %i[eval class_eval module_eval instance_eval].freeze
67
67
 
68
+ # @!method valid_eval_receiver?(node)
68
69
  def_node_matcher :valid_eval_receiver?, <<~PATTERN
69
70
  { nil? (const {nil? cbase} :Kernel) }
70
71
  PATTERN
71
72
 
73
+ # @!method line_with_offset?(node, sign, num)
72
74
  def_node_matcher :line_with_offset?, <<~PATTERN
73
75
  {
74
76
  (send #special_line_keyword? %1 (int %2))
@@ -110,13 +112,11 @@ module RuboCop
110
112
  end
111
113
 
112
114
  def special_file_keyword?(node)
113
- node.str_type? &&
114
- node.source == '__FILE__'
115
+ node.str_type? && node.source == '__FILE__'
115
116
  end
116
117
 
117
118
  def special_line_keyword?(node)
118
- node.int_type? &&
119
- node.source == '__LINE__'
119
+ node.int_type? && node.source == '__LINE__'
120
120
  end
121
121
 
122
122
  def file_and_line(node)
@@ -222,7 +222,7 @@ module RuboCop
222
222
 
223
223
  register_offense(node) do |corrector|
224
224
  line_str = missing_line(node, code)
225
- corrector.insert_after(node.loc.expression.end, ", __FILE__, #{line_str}")
225
+ corrector.insert_after(node.last_argument.source_range.end, ", __FILE__, #{line_str}")
226
226
  end
227
227
  end
228
228
 
@@ -21,6 +21,7 @@ module RuboCop
21
21
  MSG = 'Replace with `Integer#%<method>s?`.'
22
22
  RESTRICT_ON_SEND = %i[== !=].freeze
23
23
 
24
+ # @!method even_odd_candidate?(node)
24
25
  def_node_matcher :even_odd_candidate?, <<~PATTERN
25
26
  (send
26
27
  {(send $_ :% (int 2))
@@ -54,6 +54,7 @@ module RuboCop
54
54
 
55
55
  RESTRICT_ON_SEND = %i[expand_path].freeze
56
56
 
57
+ # @!method file_expand_path(node)
57
58
  def_node_matcher :file_expand_path, <<~PATTERN
58
59
  (send
59
60
  (const {nil? cbase} :File) :expand_path
@@ -61,6 +62,7 @@ module RuboCop
61
62
  $_)
62
63
  PATTERN
63
64
 
65
+ # @!method pathname_parent_expand_path(node)
64
66
  def_node_matcher :pathname_parent_expand_path, <<~PATTERN
65
67
  (send
66
68
  (send
@@ -68,6 +70,7 @@ module RuboCop
68
70
  $_) :parent) :expand_path)
69
71
  PATTERN
70
72
 
73
+ # @!method pathname_new_parent_expand_path(node)
71
74
  def_node_matcher :pathname_new_parent_expand_path, <<~PATTERN
72
75
  (send
73
76
  (send
@@ -82,9 +85,7 @@ module RuboCop
82
85
  elsif (default_dir = pathname_parent_expand_path(node))
83
86
  return unless unrecommended_argument?(default_dir)
84
87
 
85
- add_offense(node, message: PATHNAME_MSG) do |corrector|
86
- autocorrect(corrector, node)
87
- end
88
+ add_offense(node, message: PATHNAME_MSG) { |corrector| autocorrect(corrector, node) }
88
89
  elsif (default_dir = pathname_new_parent_expand_path(node))
89
90
  return unless unrecommended_argument?(default_dir)
90
91
 
@@ -45,6 +45,7 @@ module RuboCop
45
45
  MSG = 'Consider using explicit block argument in the '\
46
46
  "surrounding method's signature over `yield`."
47
47
 
48
+ # @!method yielding_block?(node)
48
49
  def_node_matcher :yielding_block?, <<~PATTERN
49
50
  (block $_ (args $...) (yield $...))
50
51
  PATTERN
@@ -105,10 +106,7 @@ module RuboCop
105
106
  end
106
107
 
107
108
  def block_body_range(block_node, send_node)
108
- range_between(
109
- send_node.loc.expression.end_pos,
110
- block_node.loc.end.end_pos
111
- )
109
+ range_between(send_node.loc.expression.end_pos, block_node.loc.end.end_pos)
112
110
  end
113
111
  end
114
112
  end
@@ -55,15 +55,19 @@ module RuboCop
55
55
 
56
56
  RESTRICT_ON_SEND = %i[/].freeze
57
57
 
58
+ # @!method right_coerce?(node)
58
59
  def_node_matcher :right_coerce?, <<~PATTERN
59
60
  (send _ :/ (send _ :to_f))
60
61
  PATTERN
62
+ # @!method left_coerce?(node)
61
63
  def_node_matcher :left_coerce?, <<~PATTERN
62
64
  (send (send _ :to_f) :/ _)
63
65
  PATTERN
66
+ # @!method both_coerce?(node)
64
67
  def_node_matcher :both_coerce?, <<~PATTERN
65
68
  (send (send _ :to_f) :/ (send _ :to_f))
66
69
  PATTERN
70
+ # @!method any_coerce?(node)
67
71
  def_node_matcher :any_coerce?, <<~PATTERN
68
72
  {(send _ :/ (send _ :to_f)) (send (send _ :to_f) :/ _)}
69
73
  PATTERN
@@ -42,6 +42,7 @@ module RuboCop
42
42
  MSG = 'Favor `%<prefer>s` over `%<current>s`.'
43
43
  RESTRICT_ON_SEND = %i[format sprintf %].freeze
44
44
 
45
+ # @!method formatter(node)
45
46
  def_node_matcher :formatter, <<~PATTERN
46
47
  {
47
48
  (send nil? ${:sprintf :format} _ _ ...)
@@ -50,6 +51,7 @@ module RuboCop
50
51
  }
51
52
  PATTERN
52
53
 
54
+ # @!method variable_argument?(node)
53
55
  def_node_matcher :variable_argument?, <<~PATTERN
54
56
  (send {str dstr} :% {send_type? lvar_type?})
55
57
  PATTERN
@@ -89,6 +89,7 @@ module RuboCop
89
89
 
90
90
  private
91
91
 
92
+ # @!method format_string_in_typical_context?(node)
92
93
  def_node_matcher :format_string_in_typical_context?, <<~PATTERN
93
94
  {
94
95
  ^(send _ {:format :sprintf :printf} %0 ...)
@@ -145,10 +146,7 @@ module RuboCop
145
146
  next if seq.percent?
146
147
 
147
148
  detected_style = seq.style
148
- token = contents.begin.adjust(
149
- begin_pos: seq.begin_pos,
150
- end_pos: seq.end_pos
151
- )
149
+ token = contents.begin.adjust(begin_pos: seq.begin_pos, end_pos: seq.end_pos)
152
150
 
153
151
  yield(detected_style, token)
154
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)
@@ -34,6 +34,7 @@ module RuboCop
34
34
 
35
35
  STD_STREAMS = %i[STDIN STDOUT STDERR].to_set.freeze
36
36
 
37
+ # @!method const_to_gvar_assignment?(node, name)
37
38
  def_node_matcher :const_to_gvar_assignment?, <<~PATTERN
38
39
  (gvasgn %1 (const nil? _))
39
40
  PATTERN
@@ -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)
@@ -6,6 +6,10 @@ module RuboCop
6
6
  # This cop checks the usage of pre-2.1 `Hash[args]` method of converting enumerables and
7
7
  # sequences of values to hashes.
8
8
  #
9
+ # Correction code from splat argument (`Hash[*ary]`) is not simply determined. For example,
10
+ # `Hash[*ary]` can be replaced with `ary.each_slice(2).to_h` but it will be complicated.
11
+ # So, `AllowSplatArgument` option is true by default to allow splat argument for simple code.
12
+ #
9
13
  # @example
10
14
  # # bad
11
15
  # Hash[ary]
@@ -18,6 +22,15 @@ module RuboCop
18
22
  #
19
23
  # # good
20
24
  # {key1 => value1, key2 => value2}
25
+ #
26
+ # @example AllowSplatArgument: true (default)
27
+ # # good
28
+ # Hash[*ary]
29
+ #
30
+ # @example AllowSplatArgument: false
31
+ # # bad
32
+ # Hash[*ary]
33
+ #
21
34
  class HashConversion < Base
22
35
  extend AutoCorrector
23
36
 
@@ -27,6 +40,7 @@ module RuboCop
27
40
  MSG_SPLAT = 'Prefer array_of_pairs.to_h to Hash[*array].'
28
41
  RESTRICT_ON_SEND = %i[[]].freeze
29
42
 
43
+ # @!method hash_from_array?(node)
30
44
  def_node_matcher :hash_from_array?, '(send (const {nil? cbase} :Hash) :[] ...)'
31
45
 
32
46
  def on_send(node)
@@ -47,24 +61,58 @@ module RuboCop
47
61
  def single_argument(node)
48
62
  first_argument = node.first_argument
49
63
  if first_argument.hash_type?
50
- add_offense(node, message: MSG_LITERAL_HASH_ARG) do |corrector|
51
- corrector.replace(node, "{#{first_argument.source}}")
52
- end
64
+ register_offense_for_hash(node, first_argument)
53
65
  elsif first_argument.splat_type?
54
- add_offense(node, message: MSG_SPLAT)
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)
55
69
  else
56
70
  add_offense(node, message: MSG_TO_H) do |corrector|
57
- corrector.replace(node, "#{first_argument.source}.to_h")
71
+ replacement = first_argument.source
72
+ replacement = "(#{replacement})" if requires_parens?(first_argument)
73
+ corrector.replace(node, "#{replacement}.to_h")
58
74
  end
59
75
  end
60
76
  end
61
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
+
103
+ def requires_parens?(node)
104
+ node.call_type? && node.arguments.any? && !node.parenthesized?
105
+ end
106
+
62
107
  def multi_argument(node)
63
108
  if node.arguments.count.odd?
64
109
  add_offense(node, message: MSG_LITERAL_MULTI_ARG)
65
110
  else
66
111
  add_offense(node, message: MSG_LITERAL_MULTI_ARG) do |corrector|
67
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?
68
116
  end
69
117
  end
70
118
  end
@@ -75,6 +123,10 @@ module RuboCop
75
123
  .join(', ')
76
124
  "{#{content}}"
77
125
  end
126
+
127
+ def allowed_splat_argument?
128
+ cop_config.fetch('AllowSplatArgument', true)
129
+ end
78
130
  end
79
131
  end
80
132
  end