rubocop 0.88.0 → 0.91.1

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 (515) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/bin/rubocop-profile +1 -0
  4. data/config/default.yml +219 -28
  5. data/lib/rubocop.rb +39 -5
  6. data/lib/rubocop/cached_data.rb +1 -0
  7. data/lib/rubocop/cli/command.rb +1 -0
  8. data/lib/rubocop/cli/command/auto_genenerate_config.rb +2 -1
  9. data/lib/rubocop/cli/command/base.rb +2 -0
  10. data/lib/rubocop/cli/command/execute_runner.rb +10 -1
  11. data/lib/rubocop/cli/command/init_dotfile.rb +1 -0
  12. data/lib/rubocop/cli/command/show_cops.rb +3 -2
  13. data/lib/rubocop/cli/command/version.rb +3 -2
  14. data/lib/rubocop/cli/environment.rb +1 -0
  15. data/lib/rubocop/comment_config.rb +19 -12
  16. data/lib/rubocop/config.rb +20 -3
  17. data/lib/rubocop/config_loader.rb +22 -11
  18. data/lib/rubocop/config_loader_resolver.rb +4 -3
  19. data/lib/rubocop/config_obsoletion.rb +7 -1
  20. data/lib/rubocop/config_store.rb +3 -3
  21. data/lib/rubocop/config_validator.rb +5 -4
  22. data/lib/rubocop/cop/base.rb +25 -2
  23. data/lib/rubocop/cop/bundler/duplicated_gem.rb +5 -1
  24. data/lib/rubocop/cop/bundler/gem_comment.rb +8 -3
  25. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +2 -0
  26. data/lib/rubocop/cop/commissioner.rb +47 -8
  27. data/lib/rubocop/cop/correctors/alignment_corrector.rb +4 -4
  28. data/lib/rubocop/cop/correctors/condition_corrector.rb +3 -5
  29. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +9 -10
  30. data/lib/rubocop/cop/correctors/line_break_corrector.rb +7 -7
  31. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +8 -3
  32. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -8
  33. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +6 -11
  34. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +8 -10
  35. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +15 -18
  36. data/lib/rubocop/cop/documentation.rb +22 -0
  37. data/lib/rubocop/cop/force.rb +1 -0
  38. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +32 -11
  39. data/lib/rubocop/cop/generator.rb +2 -1
  40. data/lib/rubocop/cop/generator/configuration_injector.rb +2 -2
  41. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +5 -12
  42. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -1
  43. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -0
  44. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +9 -8
  45. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +11 -7
  46. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +8 -8
  47. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
  48. data/lib/rubocop/cop/layout/begin_end_alignment.rb +77 -0
  49. data/lib/rubocop/cop/layout/block_alignment.rb +24 -20
  50. data/lib/rubocop/cop/layout/case_indentation.rb +4 -7
  51. data/lib/rubocop/cop/layout/class_structure.rb +14 -17
  52. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +4 -6
  53. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  54. data/lib/rubocop/cop/layout/condition_position.rb +13 -15
  55. data/lib/rubocop/cop/layout/def_end_alignment.rb +8 -5
  56. data/lib/rubocop/cop/layout/dot_position.rb +21 -17
  57. data/lib/rubocop/cop/layout/empty_comment.rb +30 -23
  58. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +21 -18
  59. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +13 -13
  60. data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +136 -0
  61. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +21 -23
  62. data/lib/rubocop/cop/layout/empty_lines.rb +6 -9
  63. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +18 -14
  64. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +7 -8
  65. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +4 -7
  66. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -5
  67. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +2 -5
  68. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -5
  69. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +3 -7
  70. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +2 -5
  71. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +2 -5
  72. data/lib/rubocop/cop/layout/end_alignment.rb +11 -17
  73. data/lib/rubocop/cop/layout/extra_spacing.rb +22 -36
  74. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +2 -5
  75. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +2 -5
  76. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +5 -9
  77. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +2 -5
  78. data/lib/rubocop/cop/layout/hash_alignment.rb +17 -20
  79. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +15 -14
  80. data/lib/rubocop/cop/layout/heredoc_indentation.rb +16 -13
  81. data/lib/rubocop/cop/layout/indentation_style.rb +0 -2
  82. data/lib/rubocop/cop/layout/initial_indentation.rb +6 -7
  83. data/lib/rubocop/cop/layout/leading_comment_space.rb +12 -10
  84. data/lib/rubocop/cop/layout/leading_empty_lines.rb +6 -11
  85. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +2 -5
  86. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +2 -5
  87. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +10 -14
  88. data/lib/rubocop/cop/layout/multiline_block_layout.rb +21 -19
  89. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +2 -5
  90. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +2 -5
  91. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +5 -9
  92. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -5
  93. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +2 -5
  94. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +41 -24
  95. data/lib/rubocop/cop/layout/space_after_colon.rb +11 -7
  96. data/lib/rubocop/cop/layout/space_after_comma.rb +2 -5
  97. data/lib/rubocop/cop/layout/space_after_method_name.rb +5 -6
  98. data/lib/rubocop/cop/layout/space_after_not.rb +9 -11
  99. data/lib/rubocop/cop/layout/space_after_semicolon.rb +2 -5
  100. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +22 -17
  101. data/lib/rubocop/cop/layout/space_around_keyword.rb +17 -18
  102. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +9 -1
  103. data/lib/rubocop/cop/layout/space_around_operators.rb +17 -16
  104. data/lib/rubocop/cop/layout/space_before_block_braces.rb +23 -22
  105. data/lib/rubocop/cop/layout/space_before_comma.rb +3 -5
  106. data/lib/rubocop/cop/layout/space_before_comment.rb +10 -7
  107. data/lib/rubocop/cop/layout/space_before_first_arg.rb +7 -7
  108. data/lib/rubocop/cop/layout/space_before_semicolon.rb +2 -5
  109. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -17
  110. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +20 -23
  111. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +3 -8
  112. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +17 -16
  113. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +19 -37
  114. data/lib/rubocop/cop/layout/space_inside_parens.rb +9 -14
  115. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +5 -10
  116. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +8 -17
  117. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +16 -24
  118. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +12 -13
  119. data/lib/rubocop/cop/layout/trailing_empty_lines.rb +10 -15
  120. data/lib/rubocop/cop/layout/trailing_whitespace.rb +11 -11
  121. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +7 -4
  122. data/lib/rubocop/cop/lint/ambiguous_operator.rb +17 -10
  123. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +11 -13
  124. data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
  125. data/lib/rubocop/cop/lint/big_decimal_new.rb +9 -10
  126. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +50 -0
  127. data/lib/rubocop/cop/lint/boolean_symbol.rb +16 -11
  128. data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
  129. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +74 -0
  130. data/lib/rubocop/cop/lint/constant_resolution.rb +2 -2
  131. data/lib/rubocop/cop/lint/debugger.rb +6 -1
  132. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +7 -10
  133. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +17 -13
  134. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
  135. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
  136. data/lib/rubocop/cop/lint/duplicate_methods.rb +5 -4
  137. data/lib/rubocop/cop/lint/duplicate_require.rb +46 -0
  138. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +47 -0
  139. data/lib/rubocop/cop/lint/each_with_object_argument.rb +2 -1
  140. data/lib/rubocop/cop/lint/else_layout.rb +1 -1
  141. data/lib/rubocop/cop/lint/empty_conditional_body.rb +67 -0
  142. data/lib/rubocop/cop/lint/empty_ensure.rb +5 -5
  143. data/lib/rubocop/cop/lint/empty_expression.rb +2 -2
  144. data/lib/rubocop/cop/lint/empty_file.rb +50 -0
  145. data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -6
  146. data/lib/rubocop/cop/lint/empty_when.rb +2 -2
  147. data/lib/rubocop/cop/lint/ensure_return.rb +27 -29
  148. data/lib/rubocop/cop/lint/erb_new_arguments.rb +13 -10
  149. data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
  150. data/lib/rubocop/cop/lint/float_comparison.rb +93 -0
  151. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  152. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +4 -3
  153. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +13 -14
  154. data/lib/rubocop/cop/lint/identity_comparison.rb +51 -0
  155. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +2 -2
  156. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +10 -13
  157. data/lib/rubocop/cop/lint/inherit_exception.rb +12 -7
  158. data/lib/rubocop/cop/lint/interpolation_check.rb +18 -15
  159. data/lib/rubocop/cop/lint/literal_as_condition.rb +4 -2
  160. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -7
  161. data/lib/rubocop/cop/lint/loop.rb +23 -2
  162. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +6 -5
  163. data/lib/rubocop/cop/lint/missing_super.rb +99 -0
  164. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +3 -36
  165. data/lib/rubocop/cop/lint/multiple_comparison.rb +9 -10
  166. data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -1
  167. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  168. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  169. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +27 -23
  170. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
  171. data/lib/rubocop/cop/lint/number_conversion.rb +7 -9
  172. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +11 -13
  173. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +79 -0
  174. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +4 -10
  175. data/lib/rubocop/cop/lint/percent_string_array.rb +3 -6
  176. data/lib/rubocop/cop/lint/percent_symbol_array.rb +13 -12
  177. data/lib/rubocop/cop/lint/raise_exception.rb +13 -10
  178. data/lib/rubocop/cop/lint/rand_one.rb +2 -1
  179. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +38 -31
  180. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +20 -14
  181. data/lib/rubocop/cop/lint/redundant_require_statement.rb +5 -7
  182. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +13 -9
  183. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +6 -13
  184. data/lib/rubocop/cop/lint/redundant_with_index.rb +11 -14
  185. data/lib/rubocop/cop/lint/redundant_with_object.rb +11 -14
  186. data/lib/rubocop/cop/lint/regexp_as_condition.rb +4 -6
  187. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -2
  188. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  189. data/lib/rubocop/cop/lint/rescue_type.rb +8 -9
  190. data/lib/rubocop/cop/lint/return_in_void_context.rb +2 -4
  191. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +3 -6
  192. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +14 -10
  193. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +7 -7
  194. data/lib/rubocop/cop/lint/script_permission.rb +10 -7
  195. data/lib/rubocop/cop/lint/self_assignment.rb +78 -0
  196. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +8 -12
  197. data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
  198. data/lib/rubocop/cop/lint/shadowed_exception.rb +8 -8
  199. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +7 -7
  200. data/lib/rubocop/cop/lint/struct_new_override.rb +2 -1
  201. data/lib/rubocop/cop/lint/suppressed_exception.rb +4 -7
  202. data/lib/rubocop/cop/lint/to_json.rb +20 -11
  203. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +34 -0
  204. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +57 -0
  205. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +4 -4
  206. data/lib/rubocop/cop/lint/unified_integer.rb +4 -6
  207. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  208. data/lib/rubocop/cop/lint/unreachable_loop.rb +171 -0
  209. data/lib/rubocop/cop/lint/unused_block_argument.rb +8 -3
  210. data/lib/rubocop/cop/lint/unused_method_argument.rb +8 -3
  211. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +4 -2
  212. data/lib/rubocop/cop/lint/uri_regexp.rb +12 -47
  213. data/lib/rubocop/cop/lint/useless_access_modifier.rb +27 -23
  214. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -4
  215. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -15
  216. data/lib/rubocop/cop/lint/useless_method_definition.rb +70 -0
  217. data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -6
  218. data/lib/rubocop/cop/lint/useless_times.rb +106 -0
  219. data/lib/rubocop/cop/lint/void.rb +3 -7
  220. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  221. data/lib/rubocop/cop/metrics/block_length.rb +2 -2
  222. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
  223. data/lib/rubocop/cop/metrics/class_length.rb +2 -2
  224. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
  225. data/lib/rubocop/cop/metrics/method_length.rb +2 -2
  226. data/lib/rubocop/cop/metrics/module_length.rb +2 -2
  227. data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -6
  228. data/lib/rubocop/cop/metrics/perceived_complexity.rb +7 -8
  229. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +59 -5
  230. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +53 -24
  231. data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +37 -0
  232. data/lib/rubocop/cop/migration/department_name.rb +14 -16
  233. data/lib/rubocop/cop/mixin/alignment.rb +5 -1
  234. data/lib/rubocop/cop/mixin/allowed_methods.rb +2 -0
  235. data/lib/rubocop/cop/mixin/annotation_comment.rb +5 -0
  236. data/lib/rubocop/cop/mixin/array_min_size.rb +1 -1
  237. data/lib/rubocop/cop/mixin/check_line_breakable.rb +17 -8
  238. data/lib/rubocop/cop/mixin/code_length.rb +22 -5
  239. data/lib/rubocop/cop/mixin/comments_help.rb +48 -0
  240. data/lib/rubocop/cop/mixin/configurable_naming.rb +2 -2
  241. data/lib/rubocop/cop/mixin/configurable_numbering.rb +3 -3
  242. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +8 -7
  243. data/lib/rubocop/cop/mixin/empty_parameter.rb +3 -1
  244. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +12 -1
  245. data/lib/rubocop/cop/mixin/first_element_line_break.rb +3 -1
  246. data/lib/rubocop/cop/mixin/hash_transform_method.rb +31 -12
  247. data/lib/rubocop/cop/mixin/line_length_help.rb +1 -3
  248. data/lib/rubocop/cop/mixin/method_complexity.rb +10 -2
  249. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +3 -1
  250. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +13 -12
  251. data/lib/rubocop/cop/mixin/negative_conditional.rb +2 -2
  252. data/lib/rubocop/cop/mixin/percent_array.rb +16 -9
  253. data/lib/rubocop/cop/mixin/range_help.rb +18 -4
  254. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +1 -1
  255. data/lib/rubocop/cop/mixin/rescue_node.rb +11 -1
  256. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +4 -3
  257. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +4 -3
  258. data/lib/rubocop/cop/mixin/statement_modifier.rb +43 -8
  259. data/lib/rubocop/cop/mixin/surrounding_space.rb +8 -29
  260. data/lib/rubocop/cop/mixin/trailing_comma.rb +9 -11
  261. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +6 -13
  262. data/lib/rubocop/cop/mixin/unused_argument.rb +4 -6
  263. data/lib/rubocop/cop/mixin/visibility_help.rb +4 -16
  264. data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
  265. data/lib/rubocop/cop/naming/ascii_identifiers.rb +3 -3
  266. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +2 -2
  267. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  268. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +2 -2
  269. data/lib/rubocop/cop/naming/constant_name.rb +2 -2
  270. data/lib/rubocop/cop/naming/file_name.rb +4 -4
  271. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +2 -2
  272. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +2 -2
  273. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -2
  274. data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
  275. data/lib/rubocop/cop/naming/predicate_name.rb +3 -5
  276. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -11
  277. data/lib/rubocop/cop/offense.rb +1 -0
  278. data/lib/rubocop/cop/registry.rb +3 -3
  279. data/lib/rubocop/cop/security/eval.rb +3 -2
  280. data/lib/rubocop/cop/security/json_load.rb +7 -8
  281. data/lib/rubocop/cop/security/marshal_load.rb +3 -4
  282. data/lib/rubocop/cop/security/open.rb +3 -2
  283. data/lib/rubocop/cop/security/yaml_load.rb +7 -6
  284. data/lib/rubocop/cop/severity.rb +0 -8
  285. data/lib/rubocop/cop/style/access_modifier_declarations.rb +7 -8
  286. data/lib/rubocop/cop/style/accessor_grouping.rb +23 -21
  287. data/lib/rubocop/cop/style/alias.rb +43 -36
  288. data/lib/rubocop/cop/style/and_or.rb +9 -11
  289. data/lib/rubocop/cop/style/array_join.rb +7 -8
  290. data/lib/rubocop/cop/style/ascii_comments.rb +4 -4
  291. data/lib/rubocop/cop/style/attr.rb +12 -9
  292. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +4 -5
  293. data/lib/rubocop/cop/style/bare_percent_literals.rb +10 -12
  294. data/lib/rubocop/cop/style/begin_block.rb +2 -2
  295. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +9 -14
  296. data/lib/rubocop/cop/style/block_comments.rb +14 -18
  297. data/lib/rubocop/cop/style/block_delimiters.rb +23 -23
  298. data/lib/rubocop/cop/style/case_equality.rb +32 -5
  299. data/lib/rubocop/cop/style/case_like_if.rb +38 -19
  300. data/lib/rubocop/cop/style/class_and_module_children.rb +16 -11
  301. data/lib/rubocop/cop/style/class_check.rb +6 -11
  302. data/lib/rubocop/cop/style/class_methods.rb +7 -11
  303. data/lib/rubocop/cop/style/class_methods_definitions.rb +157 -0
  304. data/lib/rubocop/cop/style/class_vars.rb +7 -12
  305. data/lib/rubocop/cop/style/collection_methods.rb +11 -17
  306. data/lib/rubocop/cop/style/colon_method_call.rb +8 -9
  307. data/lib/rubocop/cop/style/colon_method_definition.rb +6 -6
  308. data/lib/rubocop/cop/style/combinable_loops.rb +84 -0
  309. data/lib/rubocop/cop/style/command_literal.rb +23 -24
  310. data/lib/rubocop/cop/style/comment_annotation.rb +15 -15
  311. data/lib/rubocop/cop/style/commented_keyword.rb +8 -9
  312. data/lib/rubocop/cop/style/conditional_assignment.rb +61 -63
  313. data/lib/rubocop/cop/style/constant_visibility.rb +3 -2
  314. data/lib/rubocop/cop/style/copyright.rb +12 -12
  315. data/lib/rubocop/cop/style/date_time.rb +1 -1
  316. data/lib/rubocop/cop/style/def_with_parentheses.rb +8 -10
  317. data/lib/rubocop/cop/style/dir.rb +8 -10
  318. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +7 -9
  319. data/lib/rubocop/cop/style/documentation.rb +6 -8
  320. data/lib/rubocop/cop/style/documentation_method.rb +1 -1
  321. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +12 -15
  322. data/lib/rubocop/cop/style/double_negation.rb +3 -2
  323. data/lib/rubocop/cop/style/each_for_simple_loop.rb +5 -8
  324. data/lib/rubocop/cop/style/each_with_object.rb +16 -19
  325. data/lib/rubocop/cop/style/empty_block_parameter.rb +9 -10
  326. data/lib/rubocop/cop/style/empty_case_condition.rb +19 -20
  327. data/lib/rubocop/cop/style/empty_else.rb +17 -19
  328. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +9 -10
  329. data/lib/rubocop/cop/style/empty_literal.rb +18 -17
  330. data/lib/rubocop/cop/style/empty_method.rb +10 -13
  331. data/lib/rubocop/cop/style/encoding.rb +5 -9
  332. data/lib/rubocop/cop/style/end_block.rb +4 -6
  333. data/lib/rubocop/cop/style/eval_with_location.rb +7 -7
  334. data/lib/rubocop/cop/style/even_odd.rb +8 -11
  335. data/lib/rubocop/cop/style/expand_path_arguments.rb +22 -21
  336. data/lib/rubocop/cop/style/explicit_block_argument.rb +102 -0
  337. data/lib/rubocop/cop/style/exponential_notation.rb +1 -1
  338. data/lib/rubocop/cop/style/float_division.rb +3 -1
  339. data/lib/rubocop/cop/style/for.rb +11 -15
  340. data/lib/rubocop/cop/style/format_string.rb +18 -19
  341. data/lib/rubocop/cop/style/format_string_token.rb +5 -7
  342. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +19 -41
  343. data/lib/rubocop/cop/style/global_std_stream.rb +65 -0
  344. data/lib/rubocop/cop/style/global_vars.rb +2 -2
  345. data/lib/rubocop/cop/style/guard_clause.rb +6 -6
  346. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +27 -1
  347. data/lib/rubocop/cop/style/hash_each_methods.rb +5 -8
  348. data/lib/rubocop/cop/style/hash_syntax.rb +10 -8
  349. data/lib/rubocop/cop/style/hash_transform_keys.rb +19 -11
  350. data/lib/rubocop/cop/style/hash_transform_values.rb +18 -10
  351. data/lib/rubocop/cop/style/identical_conditional_branches.rb +2 -2
  352. data/lib/rubocop/cop/style/if_inside_else.rb +3 -3
  353. data/lib/rubocop/cop/style/if_unless_modifier.rb +11 -37
  354. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +3 -7
  355. data/lib/rubocop/cop/style/if_with_semicolon.rb +3 -6
  356. data/lib/rubocop/cop/style/implicit_runtime_error.rb +2 -1
  357. data/lib/rubocop/cop/style/infinite_loop.rb +24 -24
  358. data/lib/rubocop/cop/style/inline_comment.rb +3 -3
  359. data/lib/rubocop/cop/style/inverse_methods.rb +22 -32
  360. data/lib/rubocop/cop/style/keyword_parameters_order.rb +53 -0
  361. data/lib/rubocop/cop/style/lambda.rb +7 -12
  362. data/lib/rubocop/cop/style/lambda_call.rb +17 -14
  363. data/lib/rubocop/cop/style/line_end_concatenation.rb +19 -16
  364. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -1
  365. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +16 -11
  366. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +4 -8
  367. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -7
  368. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +12 -3
  369. data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -16
  370. data/lib/rubocop/cop/style/min_max.rb +8 -12
  371. data/lib/rubocop/cop/style/missing_else.rb +13 -13
  372. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +10 -3
  373. data/lib/rubocop/cop/style/mixin_grouping.rb +24 -27
  374. data/lib/rubocop/cop/style/mixin_usage.rb +2 -1
  375. data/lib/rubocop/cop/style/module_function.rb +10 -13
  376. data/lib/rubocop/cop/style/multiline_block_chain.rb +2 -2
  377. data/lib/rubocop/cop/style/multiline_if_modifier.rb +3 -10
  378. data/lib/rubocop/cop/style/multiline_if_then.rb +4 -10
  379. data/lib/rubocop/cop/style/multiline_memoization.rb +14 -12
  380. data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -2
  381. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +17 -6
  382. data/lib/rubocop/cop/style/multiline_when_then.rb +10 -11
  383. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  384. data/lib/rubocop/cop/style/mutable_constant.rb +23 -20
  385. data/lib/rubocop/cop/style/negated_if.rb +6 -6
  386. data/lib/rubocop/cop/style/negated_unless.rb +6 -6
  387. data/lib/rubocop/cop/style/negated_while.rb +7 -15
  388. data/lib/rubocop/cop/style/nested_modifier.rb +10 -13
  389. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +14 -12
  390. data/lib/rubocop/cop/style/nested_ternary_operator.rb +14 -16
  391. data/lib/rubocop/cop/style/next.rb +10 -14
  392. data/lib/rubocop/cop/style/nil_comparison.rb +13 -11
  393. data/lib/rubocop/cop/style/non_nil_check.rb +34 -26
  394. data/lib/rubocop/cop/style/not.rb +20 -26
  395. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +4 -9
  396. data/lib/rubocop/cop/style/numeric_predicate.rb +6 -11
  397. data/lib/rubocop/cop/style/one_line_conditional.rb +73 -23
  398. data/lib/rubocop/cop/style/option_hash.rb +1 -1
  399. data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
  400. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +45 -0
  401. data/lib/rubocop/cop/style/or_assignment.rb +13 -10
  402. data/lib/rubocop/cop/style/parallel_assignment.rb +16 -16
  403. data/lib/rubocop/cop/style/parentheses_around_condition.rb +6 -6
  404. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +15 -21
  405. data/lib/rubocop/cop/style/percent_q_literals.rb +8 -10
  406. data/lib/rubocop/cop/style/perl_backrefs.rb +8 -10
  407. data/lib/rubocop/cop/style/preferred_hash_methods.rb +11 -14
  408. data/lib/rubocop/cop/style/proc.rb +6 -6
  409. data/lib/rubocop/cop/style/raise_args.rb +15 -24
  410. data/lib/rubocop/cop/style/random_with_offset.rb +20 -19
  411. data/lib/rubocop/cop/style/redundant_assignment.rb +8 -18
  412. data/lib/rubocop/cop/style/redundant_begin.rb +7 -9
  413. data/lib/rubocop/cop/style/redundant_capital_w.rb +6 -9
  414. data/lib/rubocop/cop/style/redundant_condition.rb +20 -9
  415. data/lib/rubocop/cop/style/redundant_conditional.rb +4 -5
  416. data/lib/rubocop/cop/style/redundant_exception.rb +2 -0
  417. data/lib/rubocop/cop/style/redundant_fetch_block.rb +3 -12
  418. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +9 -8
  419. data/lib/rubocop/cop/style/redundant_freeze.rb +5 -7
  420. data/lib/rubocop/cop/style/redundant_interpolation.rb +25 -24
  421. data/lib/rubocop/cop/style/redundant_parentheses.rb +21 -15
  422. data/lib/rubocop/cop/style/redundant_percent_q.rb +9 -11
  423. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +6 -13
  424. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +14 -23
  425. data/lib/rubocop/cop/style/redundant_return.rb +17 -17
  426. data/lib/rubocop/cop/style/redundant_self.rb +9 -11
  427. data/lib/rubocop/cop/style/redundant_self_assignment.rb +116 -0
  428. data/lib/rubocop/cop/style/redundant_sort.rb +24 -28
  429. data/lib/rubocop/cop/style/redundant_sort_by.rb +5 -9
  430. data/lib/rubocop/cop/style/regexp_literal.rb +10 -21
  431. data/lib/rubocop/cop/style/rescue_modifier.rb +29 -9
  432. data/lib/rubocop/cop/style/rescue_standard_error.rb +20 -16
  433. data/lib/rubocop/cop/style/return_nil.rb +5 -5
  434. data/lib/rubocop/cop/style/safe_navigation.rb +22 -16
  435. data/lib/rubocop/cop/style/sample.rb +12 -14
  436. data/lib/rubocop/cop/style/self_assignment.rb +26 -22
  437. data/lib/rubocop/cop/style/semicolon.rb +6 -9
  438. data/lib/rubocop/cop/style/send.rb +4 -5
  439. data/lib/rubocop/cop/style/signal_exception.rb +25 -19
  440. data/lib/rubocop/cop/style/single_argument_dig.rb +55 -0
  441. data/lib/rubocop/cop/style/single_line_block_params.rb +4 -2
  442. data/lib/rubocop/cop/style/single_line_methods.rb +18 -17
  443. data/lib/rubocop/cop/style/slicing_with_range.rb +6 -8
  444. data/lib/rubocop/cop/style/sole_nested_conditional.rb +66 -0
  445. data/lib/rubocop/cop/style/special_global_vars.rb +10 -15
  446. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +17 -21
  447. data/lib/rubocop/cop/style/stderr_puts.rb +5 -6
  448. data/lib/rubocop/cop/style/string_concatenation.rb +106 -0
  449. data/lib/rubocop/cop/style/string_hash_keys.rb +6 -7
  450. data/lib/rubocop/cop/style/string_methods.rb +7 -17
  451. data/lib/rubocop/cop/style/strip.rb +9 -14
  452. data/lib/rubocop/cop/style/struct_inheritance.rb +4 -7
  453. data/lib/rubocop/cop/style/symbol_array.rb +6 -17
  454. data/lib/rubocop/cop/style/symbol_literal.rb +4 -6
  455. data/lib/rubocop/cop/style/symbol_proc.rb +15 -19
  456. data/lib/rubocop/cop/style/ternary_parentheses.rb +22 -22
  457. data/lib/rubocop/cop/style/trailing_body_on_class.rb +3 -6
  458. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +4 -7
  459. data/lib/rubocop/cop/style/trailing_body_on_module.rb +3 -6
  460. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +2 -5
  461. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +2 -5
  462. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +11 -9
  463. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +2 -5
  464. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -1
  465. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +8 -17
  466. data/lib/rubocop/cop/style/trivial_accessors.rb +26 -30
  467. data/lib/rubocop/cop/style/unless_else.rb +5 -8
  468. data/lib/rubocop/cop/style/unpack_first.rb +5 -8
  469. data/lib/rubocop/cop/style/variable_interpolation.rb +7 -10
  470. data/lib/rubocop/cop/style/when_then.rb +4 -6
  471. data/lib/rubocop/cop/style/while_until_do.rb +6 -16
  472. data/lib/rubocop/cop/style/while_until_modifier.rb +6 -20
  473. data/lib/rubocop/cop/style/word_array.rb +5 -23
  474. data/lib/rubocop/cop/style/yoda_condition.rb +4 -15
  475. data/lib/rubocop/cop/style/zero_length_predicate.rb +17 -19
  476. data/lib/rubocop/cop/team.rb +2 -1
  477. data/lib/rubocop/cop/util.rb +2 -13
  478. data/lib/rubocop/cop/utils/format_string.rb +3 -5
  479. data/lib/rubocop/cop/variable_force.rb +2 -2
  480. data/lib/rubocop/cop/variable_force/branch.rb +1 -0
  481. data/lib/rubocop/cop/variable_force/variable.rb +2 -2
  482. data/lib/rubocop/cops_documentation_generator.rb +284 -0
  483. data/lib/rubocop/core_ext/string.rb +2 -2
  484. data/lib/rubocop/directive_comment.rb +32 -0
  485. data/lib/rubocop/error.rb +1 -0
  486. data/lib/rubocop/ext/regexp_node.rb +46 -0
  487. data/lib/rubocop/file_finder.rb +1 -0
  488. data/lib/rubocop/formatter/auto_gen_config_formatter.rb +2 -1
  489. data/lib/rubocop/formatter/disabled_config_formatter.rb +1 -1
  490. data/lib/rubocop/formatter/formatter_set.rb +1 -0
  491. data/lib/rubocop/formatter/html_formatter.rb +2 -0
  492. data/lib/rubocop/formatter/junit_formatter.rb +1 -1
  493. data/lib/rubocop/formatter/progress_formatter.rb +2 -1
  494. data/lib/rubocop/formatter/quiet_formatter.rb +1 -1
  495. data/lib/rubocop/formatter/simple_text_formatter.rb +36 -6
  496. data/lib/rubocop/name_similarity.rb +1 -0
  497. data/lib/rubocop/options.rb +25 -4
  498. data/lib/rubocop/path_util.rb +19 -4
  499. data/lib/rubocop/rake_task.rb +1 -0
  500. data/lib/rubocop/remote_config.rb +1 -0
  501. data/lib/rubocop/result_cache.rb +31 -13
  502. data/lib/rubocop/rspec/cop_helper.rb +4 -1
  503. data/lib/rubocop/rspec/expect_offense.rb +11 -6
  504. data/lib/rubocop/rspec/shared_contexts.rb +13 -5
  505. data/lib/rubocop/runner.rb +31 -15
  506. data/lib/rubocop/string_interpreter.rb +3 -0
  507. data/lib/rubocop/target_finder.rb +13 -9
  508. data/lib/rubocop/target_ruby.rb +6 -0
  509. data/lib/rubocop/version.rb +3 -2
  510. data/lib/rubocop/yaml_duplication_checker.rb +1 -0
  511. metadata +38 -8
  512. data/lib/rubocop/cop/lint/useless_comparison.rb +0 -28
  513. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +0 -37
  514. data/lib/rubocop/cop/mixin/too_many_lines.rb +0 -25
  515. data/lib/rubocop/cop/style/method_missing_super.rb +0 -34
@@ -21,9 +21,10 @@ module RuboCop
21
21
  # end
22
22
  #
23
23
  # The compact style is only forced for classes/modules with one child.
24
- class ClassAndModuleChildren < Cop
24
+ class ClassAndModuleChildren < Base
25
25
  include ConfigurableEnforcedStyle
26
26
  include RangeHelp
27
+ extend AutoCorrector
27
28
 
28
29
  NESTED_MSG = 'Use nested module/class definitions instead of ' \
29
30
  'compact style.'
@@ -40,14 +41,6 @@ module RuboCop
40
41
  check_style(node, node.body)
41
42
  end
42
43
 
43
- def autocorrect(node)
44
- lambda do |corrector|
45
- return if node.class_type? && node.parent_class && style != :nested
46
-
47
- nest_or_compact(corrector, node)
48
- end
49
- end
50
-
51
44
  private
52
45
 
53
46
  def nest_or_compact(corrector, node)
@@ -119,6 +112,8 @@ module RuboCop
119
112
  end
120
113
 
121
114
  def check_style(node, body)
115
+ return if node.identifier.children[0]&.cbase_type?
116
+
122
117
  if style == :nested
123
118
  check_nested_style(node)
124
119
  else
@@ -129,13 +124,23 @@ module RuboCop
129
124
  def check_nested_style(node)
130
125
  return unless compact_node_name?(node)
131
126
 
132
- add_offense(node, location: :name, message: NESTED_MSG)
127
+ add_offense(node.loc.name, message: NESTED_MSG) do |corrector|
128
+ autocorrect(corrector, node)
129
+ end
133
130
  end
134
131
 
135
132
  def check_compact_style(node, body)
136
133
  return unless one_child?(body) && !compact_node_name?(node)
137
134
 
138
- add_offense(node, location: :name, message: COMPACT_MSG)
135
+ add_offense(node.loc.name, message: COMPACT_MSG) do |corrector|
136
+ autocorrect(corrector, node)
137
+ end
138
+ end
139
+
140
+ def autocorrect(corrector, node)
141
+ return if node.class_type? && node.parent_class && style != :nested
142
+
143
+ nest_or_compact(corrector, node)
139
144
  end
140
145
 
141
146
  def one_child?(body)
@@ -23,23 +23,18 @@ module RuboCop
23
23
  # var.kind_of?(Time)
24
24
  # var.kind_of?(String)
25
25
  #
26
- class ClassCheck < Cop
26
+ class ClassCheck < Base
27
27
  include ConfigurableEnforcedStyle
28
+ extend AutoCorrector
28
29
 
29
30
  MSG = 'Prefer `Object#%<prefer>s` over `Object#%<current>s`.'
30
-
31
- def_node_matcher :class_check?, '(send _ ${:is_a? :kind_of?} _)'
31
+ RESTRICT_ON_SEND = %i[is_a? kind_of?].freeze
32
32
 
33
33
  def on_send(node)
34
- class_check?(node) do |method_name|
35
- return if style == method_name
36
-
37
- add_offense(node, location: :selector)
38
- end
39
- end
34
+ return if style == node.method_name
40
35
 
41
- def autocorrect(node)
42
- lambda do |corrector|
36
+ message = message(node)
37
+ add_offense(node.loc.selector, message: message) do |corrector|
43
38
  replacement = node.method?(:is_a?) ? 'kind_of?' : 'is_a?'
44
39
 
45
40
  corrector.replace(node.loc.selector, replacement)
@@ -20,7 +20,9 @@ module RuboCop
20
20
  # # ...
21
21
  # end
22
22
  # end
23
- class ClassMethods < Cop
23
+ class ClassMethods < Base
24
+ extend AutoCorrector
25
+
24
26
  MSG = 'Use `self.%<method>s` instead of `%<class>s.%<method>s`.'
25
27
 
26
28
  def on_class(node)
@@ -36,23 +38,17 @@ module RuboCop
36
38
  end
37
39
  alias on_module on_class
38
40
 
39
- def autocorrect(node)
40
- ->(corrector) { corrector.replace(node.loc.name, 'self') }
41
- end
42
-
43
41
  private
44
42
 
45
43
  def check_defs(name, node)
46
44
  # check if the class/module name matches the definee for the defs node
47
45
  return unless name == node.receiver
48
46
 
49
- add_offense(node.receiver, location: :name)
50
- end
51
-
52
- def message(node)
53
- _, class_name = *node
47
+ message = format(MSG, method: node.method_name, class: name.source)
54
48
 
55
- format(MSG, method: node.parent.method_name, class: class_name)
49
+ add_offense(node.receiver.loc.name, message: message) do |corrector|
50
+ corrector.replace(node.receiver, 'self')
51
+ end
56
52
  end
57
53
  end
58
54
  end
@@ -0,0 +1,157 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop enforces using `def self.method_name` or `class << self` to define class methods.
7
+ #
8
+ # @example EnforcedStyle: def_self (default)
9
+ # # bad
10
+ # class SomeClass
11
+ # class << self
12
+ # attr_accessor :class_accessor
13
+ #
14
+ # def class_method
15
+ # # ...
16
+ # end
17
+ # end
18
+ # end
19
+ #
20
+ # # good
21
+ # class SomeClass
22
+ # def self.class_method
23
+ # # ...
24
+ # end
25
+ #
26
+ # class << self
27
+ # attr_accessor :class_accessor
28
+ # end
29
+ # end
30
+ #
31
+ # # good - contains private method
32
+ # class SomeClass
33
+ # class << self
34
+ # attr_accessor :class_accessor
35
+ #
36
+ # private
37
+ #
38
+ # def private_class_method
39
+ # # ...
40
+ # end
41
+ # end
42
+ # end
43
+ #
44
+ # @example EnforcedStyle: self_class
45
+ # # bad
46
+ # class SomeClass
47
+ # def self.class_method
48
+ # # ...
49
+ # end
50
+ # end
51
+ #
52
+ # # good
53
+ # class SomeClass
54
+ # class << self
55
+ # def class_method
56
+ # # ...
57
+ # end
58
+ # end
59
+ # end
60
+ #
61
+ class ClassMethodsDefinitions < Base
62
+ include ConfigurableEnforcedStyle
63
+ include CommentsHelp
64
+ include VisibilityHelp
65
+ include RangeHelp
66
+ extend AutoCorrector
67
+
68
+ MSG = 'Use `%<preferred>s` to define a class method.'
69
+ MSG_SCLASS = 'Do not define public methods within class << self.'
70
+
71
+ def on_sclass(node)
72
+ return unless def_self_style?
73
+ return unless node.identifier.source == 'self'
74
+ return unless all_methods_public?(node)
75
+
76
+ add_offense(node, message: MSG_SCLASS) do |corrector|
77
+ autocorrect_sclass(node, corrector)
78
+ end
79
+ end
80
+
81
+ def on_defs(node)
82
+ return if def_self_style?
83
+
84
+ message = format(MSG, preferred: 'class << self')
85
+ add_offense(node, message: message)
86
+ end
87
+
88
+ private
89
+
90
+ def def_self_style?
91
+ style == :def_self
92
+ end
93
+
94
+ def all_methods_public?(sclass_node)
95
+ def_nodes = def_nodes(sclass_node)
96
+ return false if def_nodes.empty?
97
+
98
+ def_nodes.all? { |def_node| node_visibility(def_node) == :public }
99
+ end
100
+
101
+ def def_nodes(sclass_node)
102
+ sclass_def = sclass_node.body
103
+ return [] unless sclass_def
104
+
105
+ if sclass_def.def_type?
106
+ [sclass_def]
107
+ elsif sclass_def.begin_type?
108
+ sclass_def.each_child_node(:def).to_a
109
+ else
110
+ []
111
+ end
112
+ end
113
+
114
+ def autocorrect_sclass(node, corrector)
115
+ rewritten_defs = []
116
+
117
+ def_nodes(node).each do |def_node|
118
+ next unless node_visibility(def_node) == :public
119
+
120
+ range, source = extract_def_from_sclass(def_node, node)
121
+
122
+ corrector.remove(range)
123
+ rewritten_defs << source
124
+ end
125
+
126
+ if sclass_only_has_methods?(node)
127
+ corrector.remove(node)
128
+ rewritten_defs.first&.strip!
129
+ else
130
+ corrector.insert_after(node, "\n")
131
+ end
132
+
133
+ corrector.insert_after(node, rewritten_defs.join("\n"))
134
+ end
135
+
136
+ def sclass_only_has_methods?(node)
137
+ node.body.def_type? || node.body.each_child_node.all?(&:def_type?)
138
+ end
139
+
140
+ def extract_def_from_sclass(def_node, sclass_node)
141
+ range = source_range_with_comment(def_node)
142
+ source = range.source.sub!(
143
+ "def #{def_node.method_name}",
144
+ "def self.#{def_node.method_name}"
145
+ )
146
+
147
+ source = source.gsub(/^ {#{indentation_diff(def_node, sclass_node)}}/, '')
148
+ [range, source.chomp]
149
+ end
150
+
151
+ def indentation_diff(node1, node2)
152
+ node1.loc.column - node2.loc.column
153
+ end
154
+ end
155
+ end
156
+ end
157
+ end
@@ -45,23 +45,18 @@ module RuboCop
45
45
  # end
46
46
  # end
47
47
  #
48
- class ClassVars < Cop
49
- MSG = 'Replace class var %<class_var>s with a class ' \
50
- 'instance var.'
48
+ class ClassVars < Base
49
+ MSG = 'Replace class var %<class_var>s with a class instance var.'
50
+ RESTRICT_ON_SEND = %i[class_variable_set].freeze
51
51
 
52
52
  def on_cvasgn(node)
53
- add_offense(node, location: :name)
53
+ add_offense(node.loc.name, message: format(MSG, class_var: node.children.first))
54
54
  end
55
55
 
56
56
  def on_send(node)
57
- return unless node.method?(:class_variable_set)
58
-
59
- add_offense(node.first_argument)
60
- end
61
-
62
- def message(node)
63
- class_var, = *node
64
- format(MSG, class_var: class_var)
57
+ add_offense(
58
+ node.first_argument, message: format(MSG, class_var: node.first_argument.source)
59
+ )
65
60
  end
66
61
  end
67
62
  end
@@ -37,8 +37,9 @@ module RuboCop
37
37
  # items.select
38
38
  # items.include?
39
39
  #
40
- class CollectionMethods < Cop
40
+ class CollectionMethods < Base
41
41
  include MethodPreference
42
+ extend AutoCorrector
42
43
 
43
44
  MSG = 'Prefer `%<prefer>s` over `%<current>s`.'
44
45
 
@@ -47,31 +48,24 @@ module RuboCop
47
48
  end
48
49
 
49
50
  def on_send(node)
50
- return unless node.arguments.one? &&
51
- node.first_argument.block_pass_type?
51
+ return unless node.arguments.one? && node.first_argument.block_pass_type?
52
52
 
53
53
  check_method_node(node)
54
54
  end
55
55
 
56
- def autocorrect(node)
57
- lambda do |corrector|
58
- corrector.replace(node.loc.selector,
59
- preferred_method(node.loc.selector.source))
60
- end
61
- end
62
-
63
56
  private
64
57
 
65
- def message(node)
66
- format(MSG,
67
- prefer: preferred_method(node.method_name),
68
- current: node.method_name)
69
- end
70
-
71
58
  def check_method_node(node)
72
59
  return unless preferred_methods[node.method_name]
73
60
 
74
- add_offense(node, location: :selector)
61
+ message = message(node)
62
+ add_offense(node.loc.selector, message: message) do |corrector|
63
+ corrector.replace(node.loc.selector, preferred_method(node.loc.selector.source))
64
+ end
65
+ end
66
+
67
+ def message(node)
68
+ format(MSG, prefer: preferred_method(node.method_name), current: node.method_name)
75
69
  end
76
70
  end
77
71
  end
@@ -17,7 +17,9 @@ module RuboCop
17
17
  # FileUtils.rmdir(dir)
18
18
  # Marshal.dump(obj)
19
19
  #
20
- class ColonMethodCall < Cop
20
+ class ColonMethodCall < Base
21
+ extend AutoCorrector
22
+
21
23
  MSG = 'Do not use `::` for method calls.'
22
24
 
23
25
  def_node_matcher :java_type_node?, <<~PATTERN
@@ -30,17 +32,14 @@ module RuboCop
30
32
  end
31
33
 
32
34
  def on_send(node)
33
- # ignore Java interop code like Java::int
34
- return if java_type_node?(node)
35
-
36
35
  return unless node.receiver && node.double_colon?
37
36
  return if node.camel_case_method?
37
+ # ignore Java interop code like Java::int
38
+ return if java_type_node?(node)
38
39
 
39
- add_offense(node, location: :dot)
40
- end
41
-
42
- def autocorrect(node)
43
- ->(corrector) { corrector.replace(node.loc.dot, '.') }
40
+ add_offense(node.loc.dot) do |corrector|
41
+ corrector.replace(node.loc.dot, '.')
42
+ end
44
43
  end
45
44
  end
46
45
  end
@@ -19,17 +19,17 @@ module RuboCop
19
19
  # end
20
20
  # end
21
21
  #
22
- class ColonMethodDefinition < Cop
22
+ class ColonMethodDefinition < Base
23
+ extend AutoCorrector
24
+
23
25
  MSG = 'Do not use `::` for defining class methods.'
24
26
 
25
27
  def on_defs(node)
26
28
  return unless node.loc.operator.source == '::'
27
29
 
28
- add_offense(node, location: :operator)
29
- end
30
-
31
- def autocorrect(node)
32
- ->(corrector) { corrector.replace(node.loc.operator, '.') }
30
+ add_offense(node.loc.operator) do |corrector|
31
+ corrector.replace(node.loc.operator, '.')
32
+ end
33
33
  end
34
34
  end
35
35
  end
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop checks for places where multiple consecutive loops over the same data
7
+ # can be combined into a single loop. It is very likely that combining them
8
+ # will make the code more efficient and more concise.
9
+ #
10
+ # It is marked as unsafe, because the first loop might modify
11
+ # a state that the second loop depends on; these two aren't combinable.
12
+ #
13
+ # @example
14
+ # # bad
15
+ # def method
16
+ # items.each do |item|
17
+ # do_something(item)
18
+ # end
19
+ #
20
+ # items.each do |item|
21
+ # do_something_else(item)
22
+ # end
23
+ # end
24
+ #
25
+ # # good
26
+ # def method
27
+ # items.each do |item|
28
+ # do_something(item)
29
+ # do_something_else(item)
30
+ # end
31
+ # end
32
+ #
33
+ # # bad
34
+ # def method
35
+ # for item in items do
36
+ # do_something(item)
37
+ # end
38
+ #
39
+ # for item in items do
40
+ # do_something_else(item)
41
+ # end
42
+ # end
43
+ #
44
+ # # good
45
+ # def method
46
+ # for item in items do
47
+ # do_something(item)
48
+ # do_something_else(item)
49
+ # end
50
+ # end
51
+ #
52
+ class CombinableLoops < Base
53
+ MSG = 'Combine this loop with the previous loop.'
54
+
55
+ def on_block(node)
56
+ return unless node.parent&.begin_type?
57
+ return unless collection_looping_method?(node)
58
+
59
+ add_offense(node) if same_collection_looping?(node, node.left_sibling)
60
+ end
61
+
62
+ def on_for(node)
63
+ return unless node.parent&.begin_type?
64
+
65
+ sibling = node.left_sibling
66
+ add_offense(node) if sibling&.for_type? && node.collection == sibling.collection
67
+ end
68
+
69
+ private
70
+
71
+ def collection_looping_method?(node)
72
+ method_name = node.send_node.method_name
73
+ method_name.match?(/^each/) || method_name.match?(/_each$/)
74
+ end
75
+
76
+ def same_collection_looping?(node, sibling)
77
+ sibling&.block_type? &&
78
+ sibling.send_node.method?(node.method_name) &&
79
+ sibling.send_node.receiver == node.send_node.receiver
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end