rubocop 0.87.1 → 0.91.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 (515) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/bin/rubocop-profile +32 -0
  4. data/config/default.yml +267 -33
  5. data/lib/rubocop.rb +45 -5
  6. data/lib/rubocop/cached_data.rb +1 -0
  7. data/lib/rubocop/cli.rb +2 -2
  8. data/lib/rubocop/cli/command.rb +1 -0
  9. data/lib/rubocop/cli/command/auto_genenerate_config.rb +4 -3
  10. data/lib/rubocop/cli/command/base.rb +2 -0
  11. data/lib/rubocop/cli/command/execute_runner.rb +10 -1
  12. data/lib/rubocop/cli/command/init_dotfile.rb +1 -0
  13. data/lib/rubocop/cli/command/show_cops.rb +3 -2
  14. data/lib/rubocop/cli/command/version.rb +3 -2
  15. data/lib/rubocop/cli/environment.rb +1 -0
  16. data/lib/rubocop/comment_config.rb +10 -7
  17. data/lib/rubocop/config.rb +20 -3
  18. data/lib/rubocop/config_loader.rb +42 -18
  19. data/lib/rubocop/config_loader_resolver.rb +4 -3
  20. data/lib/rubocop/config_obsoletion.rb +7 -1
  21. data/lib/rubocop/config_store.rb +7 -3
  22. data/lib/rubocop/config_validator.rb +5 -4
  23. data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
  24. data/lib/rubocop/cop/badge.rb +1 -1
  25. data/lib/rubocop/cop/base.rb +37 -6
  26. data/lib/rubocop/cop/bundler/duplicated_gem.rb +5 -1
  27. data/lib/rubocop/cop/bundler/gem_comment.rb +8 -3
  28. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +2 -0
  29. data/lib/rubocop/cop/commissioner.rb +47 -8
  30. data/lib/rubocop/cop/cop.rb +1 -1
  31. data/lib/rubocop/cop/correctors/alignment_corrector.rb +4 -4
  32. data/lib/rubocop/cop/correctors/condition_corrector.rb +3 -5
  33. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +9 -10
  34. data/lib/rubocop/cop/correctors/line_break_corrector.rb +6 -6
  35. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +34 -3
  36. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -8
  37. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +6 -11
  38. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +8 -10
  39. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +15 -18
  40. data/lib/rubocop/cop/documentation.rb +22 -0
  41. data/lib/rubocop/cop/force.rb +1 -0
  42. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +38 -12
  43. data/lib/rubocop/cop/generator.rb +2 -1
  44. data/lib/rubocop/cop/generator/configuration_injector.rb +2 -2
  45. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +5 -12
  46. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -1
  47. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -0
  48. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +9 -8
  49. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +11 -7
  50. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +8 -8
  51. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
  52. data/lib/rubocop/cop/layout/begin_end_alignment.rb +77 -0
  53. data/lib/rubocop/cop/layout/block_alignment.rb +24 -20
  54. data/lib/rubocop/cop/layout/class_structure.rb +13 -16
  55. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +4 -6
  56. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  57. data/lib/rubocop/cop/layout/condition_position.rb +13 -15
  58. data/lib/rubocop/cop/layout/def_end_alignment.rb +8 -5
  59. data/lib/rubocop/cop/layout/dot_position.rb +21 -17
  60. data/lib/rubocop/cop/layout/empty_comment.rb +30 -23
  61. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +19 -16
  62. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +13 -13
  63. data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +145 -0
  64. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +21 -23
  65. data/lib/rubocop/cop/layout/empty_lines.rb +6 -9
  66. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +5 -6
  67. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +7 -8
  68. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +3 -6
  69. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -5
  70. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +2 -5
  71. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -5
  72. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +2 -5
  73. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +2 -5
  74. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +2 -5
  75. data/lib/rubocop/cop/layout/end_alignment.rb +14 -19
  76. data/lib/rubocop/cop/layout/extra_spacing.rb +22 -36
  77. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +2 -5
  78. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +2 -5
  79. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +5 -9
  80. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +2 -5
  81. data/lib/rubocop/cop/layout/hash_alignment.rb +17 -20
  82. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +15 -14
  83. data/lib/rubocop/cop/layout/heredoc_indentation.rb +16 -13
  84. data/lib/rubocop/cop/layout/indentation_style.rb +0 -2
  85. data/lib/rubocop/cop/layout/initial_indentation.rb +6 -7
  86. data/lib/rubocop/cop/layout/leading_comment_space.rb +12 -10
  87. data/lib/rubocop/cop/layout/leading_empty_lines.rb +6 -11
  88. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +2 -5
  89. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +2 -5
  90. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +10 -14
  91. data/lib/rubocop/cop/layout/multiline_block_layout.rb +37 -24
  92. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +2 -5
  93. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +2 -5
  94. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +5 -9
  95. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -5
  96. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +2 -5
  97. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +32 -24
  98. data/lib/rubocop/cop/layout/space_after_colon.rb +11 -7
  99. data/lib/rubocop/cop/layout/space_after_comma.rb +2 -5
  100. data/lib/rubocop/cop/layout/space_after_method_name.rb +5 -6
  101. data/lib/rubocop/cop/layout/space_after_not.rb +9 -11
  102. data/lib/rubocop/cop/layout/space_after_semicolon.rb +2 -5
  103. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +3 -2
  104. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +20 -15
  105. data/lib/rubocop/cop/layout/space_around_keyword.rb +17 -18
  106. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +33 -66
  107. data/lib/rubocop/cop/layout/space_around_operators.rb +17 -16
  108. data/lib/rubocop/cop/layout/space_before_block_braces.rb +23 -22
  109. data/lib/rubocop/cop/layout/space_before_comma.rb +3 -5
  110. data/lib/rubocop/cop/layout/space_before_comment.rb +10 -7
  111. data/lib/rubocop/cop/layout/space_before_first_arg.rb +7 -7
  112. data/lib/rubocop/cop/layout/space_before_semicolon.rb +2 -5
  113. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -17
  114. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +16 -18
  115. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +3 -8
  116. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +17 -16
  117. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +15 -19
  118. data/lib/rubocop/cop/layout/space_inside_parens.rb +9 -14
  119. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +5 -10
  120. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +8 -17
  121. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +14 -22
  122. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +10 -11
  123. data/lib/rubocop/cop/layout/trailing_empty_lines.rb +10 -15
  124. data/lib/rubocop/cop/layout/trailing_whitespace.rb +11 -11
  125. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +7 -4
  126. data/lib/rubocop/cop/lint/ambiguous_operator.rb +17 -10
  127. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +11 -13
  128. data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
  129. data/lib/rubocop/cop/lint/big_decimal_new.rb +9 -10
  130. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +50 -0
  131. data/lib/rubocop/cop/lint/boolean_symbol.rb +16 -11
  132. data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
  133. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +54 -0
  134. data/lib/rubocop/cop/lint/constant_resolution.rb +2 -2
  135. data/lib/rubocop/cop/lint/debugger.rb +6 -1
  136. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +7 -10
  137. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +17 -13
  138. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +8 -2
  139. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
  140. data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +39 -0
  141. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
  142. data/lib/rubocop/cop/lint/duplicate_methods.rb +7 -6
  143. data/lib/rubocop/cop/lint/duplicate_require.rb +46 -0
  144. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +49 -0
  145. data/lib/rubocop/cop/lint/each_with_object_argument.rb +2 -1
  146. data/lib/rubocop/cop/lint/else_layout.rb +1 -1
  147. data/lib/rubocop/cop/lint/empty_conditional_body.rb +67 -0
  148. data/lib/rubocop/cop/lint/empty_ensure.rb +5 -5
  149. data/lib/rubocop/cop/lint/empty_expression.rb +2 -2
  150. data/lib/rubocop/cop/lint/empty_file.rb +50 -0
  151. data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -6
  152. data/lib/rubocop/cop/lint/empty_when.rb +2 -2
  153. data/lib/rubocop/cop/lint/ensure_return.rb +27 -29
  154. data/lib/rubocop/cop/lint/erb_new_arguments.rb +13 -10
  155. data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
  156. data/lib/rubocop/cop/lint/float_comparison.rb +93 -0
  157. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  158. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +4 -3
  159. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +13 -14
  160. data/lib/rubocop/cop/lint/identity_comparison.rb +49 -0
  161. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +5 -4
  162. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +8 -8
  163. data/lib/rubocop/cop/lint/inherit_exception.rb +12 -7
  164. data/lib/rubocop/cop/lint/interpolation_check.rb +18 -15
  165. data/lib/rubocop/cop/lint/literal_as_condition.rb +14 -2
  166. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -7
  167. data/lib/rubocop/cop/lint/loop.rb +23 -2
  168. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +6 -5
  169. data/lib/rubocop/cop/lint/missing_super.rb +99 -0
  170. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +3 -36
  171. data/lib/rubocop/cop/lint/multiple_comparison.rb +9 -10
  172. data/lib/rubocop/cop/lint/nested_method_definition.rb +14 -20
  173. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  174. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  175. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +82 -11
  176. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
  177. data/lib/rubocop/cop/lint/number_conversion.rb +7 -9
  178. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +11 -13
  179. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +79 -0
  180. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +4 -10
  181. data/lib/rubocop/cop/lint/percent_string_array.rb +3 -6
  182. data/lib/rubocop/cop/lint/percent_symbol_array.rb +13 -12
  183. data/lib/rubocop/cop/lint/raise_exception.rb +13 -10
  184. data/lib/rubocop/cop/lint/rand_one.rb +2 -1
  185. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +16 -19
  186. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +7 -11
  187. data/lib/rubocop/cop/lint/redundant_require_statement.rb +5 -7
  188. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +13 -9
  189. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +6 -13
  190. data/lib/rubocop/cop/lint/redundant_with_index.rb +11 -14
  191. data/lib/rubocop/cop/lint/redundant_with_object.rb +11 -14
  192. data/lib/rubocop/cop/lint/regexp_as_condition.rb +4 -6
  193. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -2
  194. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  195. data/lib/rubocop/cop/lint/rescue_type.rb +8 -8
  196. data/lib/rubocop/cop/lint/return_in_void_context.rb +2 -4
  197. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +3 -6
  198. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +14 -10
  199. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +7 -7
  200. data/lib/rubocop/cop/lint/script_permission.rb +10 -7
  201. data/lib/rubocop/cop/lint/self_assignment.rb +78 -0
  202. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +8 -12
  203. data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
  204. data/lib/rubocop/cop/lint/shadowed_exception.rb +2 -2
  205. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +7 -7
  206. data/lib/rubocop/cop/lint/struct_new_override.rb +2 -1
  207. data/lib/rubocop/cop/lint/suppressed_exception.rb +4 -7
  208. data/lib/rubocop/cop/lint/to_json.rb +20 -11
  209. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +34 -0
  210. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +57 -0
  211. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +4 -4
  212. data/lib/rubocop/cop/lint/unified_integer.rb +4 -6
  213. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  214. data/lib/rubocop/cop/lint/unreachable_loop.rb +175 -0
  215. data/lib/rubocop/cop/lint/unused_block_argument.rb +8 -3
  216. data/lib/rubocop/cop/lint/unused_method_argument.rb +8 -3
  217. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +4 -2
  218. data/lib/rubocop/cop/lint/uri_regexp.rb +12 -47
  219. data/lib/rubocop/cop/lint/useless_access_modifier.rb +25 -15
  220. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -4
  221. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -15
  222. data/lib/rubocop/cop/lint/useless_method_definition.rb +70 -0
  223. data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -6
  224. data/lib/rubocop/cop/lint/useless_times.rb +97 -0
  225. data/lib/rubocop/cop/lint/void.rb +3 -7
  226. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  227. data/lib/rubocop/cop/metrics/block_length.rb +2 -2
  228. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
  229. data/lib/rubocop/cop/metrics/class_length.rb +2 -2
  230. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
  231. data/lib/rubocop/cop/metrics/method_length.rb +2 -2
  232. data/lib/rubocop/cop/metrics/module_length.rb +2 -2
  233. data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -6
  234. data/lib/rubocop/cop/metrics/perceived_complexity.rb +7 -8
  235. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +50 -5
  236. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +53 -24
  237. data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +37 -0
  238. data/lib/rubocop/cop/migration/department_name.rb +14 -16
  239. data/lib/rubocop/cop/mixin/alignment.rb +5 -1
  240. data/lib/rubocop/cop/mixin/allowed_methods.rb +2 -0
  241. data/lib/rubocop/cop/mixin/annotation_comment.rb +5 -0
  242. data/lib/rubocop/cop/mixin/array_min_size.rb +1 -1
  243. data/lib/rubocop/cop/mixin/check_line_breakable.rb +17 -8
  244. data/lib/rubocop/cop/mixin/code_length.rb +22 -5
  245. data/lib/rubocop/cop/mixin/comments_help.rb +48 -0
  246. data/lib/rubocop/cop/mixin/configurable_naming.rb +2 -2
  247. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +8 -7
  248. data/lib/rubocop/cop/mixin/empty_parameter.rb +3 -1
  249. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +12 -1
  250. data/lib/rubocop/cop/mixin/first_element_line_break.rb +3 -1
  251. data/lib/rubocop/cop/mixin/hash_transform_method.rb +31 -12
  252. data/lib/rubocop/cop/mixin/line_length_help.rb +1 -3
  253. data/lib/rubocop/cop/mixin/method_complexity.rb +10 -2
  254. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +3 -1
  255. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +13 -12
  256. data/lib/rubocop/cop/mixin/negative_conditional.rb +2 -2
  257. data/lib/rubocop/cop/mixin/percent_array.rb +16 -9
  258. data/lib/rubocop/cop/mixin/range_help.rb +18 -4
  259. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +1 -1
  260. data/lib/rubocop/cop/mixin/rescue_node.rb +10 -1
  261. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +4 -3
  262. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +4 -3
  263. data/lib/rubocop/cop/mixin/statement_modifier.rb +39 -10
  264. data/lib/rubocop/cop/mixin/surrounding_space.rb +8 -29
  265. data/lib/rubocop/cop/mixin/trailing_comma.rb +9 -11
  266. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +6 -13
  267. data/lib/rubocop/cop/mixin/unused_argument.rb +4 -6
  268. data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
  269. data/lib/rubocop/cop/naming/ascii_identifiers.rb +3 -3
  270. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +2 -2
  271. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  272. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +2 -2
  273. data/lib/rubocop/cop/naming/constant_name.rb +2 -2
  274. data/lib/rubocop/cop/naming/file_name.rb +4 -4
  275. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +2 -2
  276. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +2 -2
  277. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -2
  278. data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
  279. data/lib/rubocop/cop/naming/predicate_name.rb +3 -5
  280. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -11
  281. data/lib/rubocop/cop/offense.rb +1 -0
  282. data/lib/rubocop/cop/registry.rb +3 -3
  283. data/lib/rubocop/cop/security/eval.rb +3 -2
  284. data/lib/rubocop/cop/security/json_load.rb +7 -8
  285. data/lib/rubocop/cop/security/marshal_load.rb +3 -4
  286. data/lib/rubocop/cop/security/open.rb +3 -2
  287. data/lib/rubocop/cop/security/yaml_load.rb +7 -6
  288. data/lib/rubocop/cop/severity.rb +0 -8
  289. data/lib/rubocop/cop/style/access_modifier_declarations.rb +7 -8
  290. data/lib/rubocop/cop/style/accessor_grouping.rb +29 -20
  291. data/lib/rubocop/cop/style/alias.rb +43 -36
  292. data/lib/rubocop/cop/style/and_or.rb +9 -11
  293. data/lib/rubocop/cop/style/array_coercion.rb +63 -0
  294. data/lib/rubocop/cop/style/array_join.rb +7 -8
  295. data/lib/rubocop/cop/style/ascii_comments.rb +4 -4
  296. data/lib/rubocop/cop/style/attr.rb +12 -9
  297. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +7 -7
  298. data/lib/rubocop/cop/style/bare_percent_literals.rb +10 -12
  299. data/lib/rubocop/cop/style/begin_block.rb +2 -2
  300. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +14 -18
  301. data/lib/rubocop/cop/style/block_comments.rb +14 -18
  302. data/lib/rubocop/cop/style/block_delimiters.rb +23 -23
  303. data/lib/rubocop/cop/style/case_equality.rb +32 -5
  304. data/lib/rubocop/cop/style/case_like_if.rb +236 -0
  305. data/lib/rubocop/cop/style/class_and_module_children.rb +16 -11
  306. data/lib/rubocop/cop/style/class_check.rb +6 -11
  307. data/lib/rubocop/cop/style/class_methods.rb +7 -11
  308. data/lib/rubocop/cop/style/class_methods_definitions.rb +157 -0
  309. data/lib/rubocop/cop/style/class_vars.rb +7 -12
  310. data/lib/rubocop/cop/style/collection_methods.rb +11 -17
  311. data/lib/rubocop/cop/style/colon_method_call.rb +8 -9
  312. data/lib/rubocop/cop/style/colon_method_definition.rb +6 -6
  313. data/lib/rubocop/cop/style/combinable_loops.rb +89 -0
  314. data/lib/rubocop/cop/style/command_literal.rb +23 -24
  315. data/lib/rubocop/cop/style/comment_annotation.rb +15 -15
  316. data/lib/rubocop/cop/style/commented_keyword.rb +6 -3
  317. data/lib/rubocop/cop/style/conditional_assignment.rb +62 -64
  318. data/lib/rubocop/cop/style/constant_visibility.rb +3 -2
  319. data/lib/rubocop/cop/style/copyright.rb +12 -12
  320. data/lib/rubocop/cop/style/date_time.rb +1 -1
  321. data/lib/rubocop/cop/style/def_with_parentheses.rb +8 -10
  322. data/lib/rubocop/cop/style/dir.rb +8 -10
  323. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +7 -9
  324. data/lib/rubocop/cop/style/documentation.rb +6 -8
  325. data/lib/rubocop/cop/style/documentation_method.rb +1 -1
  326. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +12 -15
  327. data/lib/rubocop/cop/style/double_negation.rb +3 -2
  328. data/lib/rubocop/cop/style/each_for_simple_loop.rb +5 -8
  329. data/lib/rubocop/cop/style/each_with_object.rb +16 -19
  330. data/lib/rubocop/cop/style/empty_block_parameter.rb +9 -10
  331. data/lib/rubocop/cop/style/empty_case_condition.rb +19 -20
  332. data/lib/rubocop/cop/style/empty_else.rb +17 -19
  333. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +9 -10
  334. data/lib/rubocop/cop/style/empty_literal.rb +18 -17
  335. data/lib/rubocop/cop/style/empty_method.rb +10 -13
  336. data/lib/rubocop/cop/style/encoding.rb +5 -9
  337. data/lib/rubocop/cop/style/end_block.rb +4 -6
  338. data/lib/rubocop/cop/style/eval_with_location.rb +7 -7
  339. data/lib/rubocop/cop/style/even_odd.rb +8 -11
  340. data/lib/rubocop/cop/style/expand_path_arguments.rb +22 -21
  341. data/lib/rubocop/cop/style/explicit_block_argument.rb +102 -0
  342. data/lib/rubocop/cop/style/exponential_notation.rb +7 -9
  343. data/lib/rubocop/cop/style/float_division.rb +10 -11
  344. data/lib/rubocop/cop/style/for.rb +11 -15
  345. data/lib/rubocop/cop/style/format_string.rb +18 -19
  346. data/lib/rubocop/cop/style/format_string_token.rb +10 -12
  347. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +19 -41
  348. data/lib/rubocop/cop/style/global_std_stream.rb +65 -0
  349. data/lib/rubocop/cop/style/global_vars.rb +2 -2
  350. data/lib/rubocop/cop/style/guard_clause.rb +6 -6
  351. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +79 -0
  352. data/lib/rubocop/cop/style/hash_each_methods.rb +5 -8
  353. data/lib/rubocop/cop/style/hash_like_case.rb +76 -0
  354. data/lib/rubocop/cop/style/hash_syntax.rb +10 -8
  355. data/lib/rubocop/cop/style/hash_transform_keys.rb +19 -11
  356. data/lib/rubocop/cop/style/hash_transform_values.rb +18 -10
  357. data/lib/rubocop/cop/style/identical_conditional_branches.rb +2 -2
  358. data/lib/rubocop/cop/style/if_inside_else.rb +3 -3
  359. data/lib/rubocop/cop/style/if_unless_modifier.rb +19 -41
  360. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +3 -7
  361. data/lib/rubocop/cop/style/if_with_semicolon.rb +3 -6
  362. data/lib/rubocop/cop/style/implicit_runtime_error.rb +2 -1
  363. data/lib/rubocop/cop/style/infinite_loop.rb +24 -24
  364. data/lib/rubocop/cop/style/inline_comment.rb +3 -3
  365. data/lib/rubocop/cop/style/inverse_methods.rb +22 -32
  366. data/lib/rubocop/cop/style/keyword_parameters_order.rb +58 -0
  367. data/lib/rubocop/cop/style/lambda.rb +7 -12
  368. data/lib/rubocop/cop/style/lambda_call.rb +17 -14
  369. data/lib/rubocop/cop/style/line_end_concatenation.rb +19 -16
  370. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -1
  371. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +16 -11
  372. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +4 -8
  373. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -7
  374. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +12 -3
  375. data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -16
  376. data/lib/rubocop/cop/style/min_max.rb +8 -12
  377. data/lib/rubocop/cop/style/missing_else.rb +11 -21
  378. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +10 -3
  379. data/lib/rubocop/cop/style/mixin_grouping.rb +24 -27
  380. data/lib/rubocop/cop/style/mixin_usage.rb +2 -1
  381. data/lib/rubocop/cop/style/module_function.rb +10 -13
  382. data/lib/rubocop/cop/style/multiline_if_modifier.rb +3 -10
  383. data/lib/rubocop/cop/style/multiline_if_then.rb +4 -10
  384. data/lib/rubocop/cop/style/multiline_memoization.rb +14 -12
  385. data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -2
  386. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +17 -6
  387. data/lib/rubocop/cop/style/multiline_when_then.rb +9 -11
  388. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  389. data/lib/rubocop/cop/style/mutable_constant.rb +23 -20
  390. data/lib/rubocop/cop/style/negated_if.rb +6 -6
  391. data/lib/rubocop/cop/style/negated_unless.rb +6 -6
  392. data/lib/rubocop/cop/style/negated_while.rb +7 -15
  393. data/lib/rubocop/cop/style/nested_modifier.rb +10 -13
  394. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +14 -12
  395. data/lib/rubocop/cop/style/nested_ternary_operator.rb +14 -16
  396. data/lib/rubocop/cop/style/next.rb +10 -14
  397. data/lib/rubocop/cop/style/nil_comparison.rb +13 -11
  398. data/lib/rubocop/cop/style/non_nil_check.rb +34 -26
  399. data/lib/rubocop/cop/style/not.rb +20 -26
  400. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +4 -9
  401. data/lib/rubocop/cop/style/numeric_predicate.rb +9 -15
  402. data/lib/rubocop/cop/style/one_line_conditional.rb +71 -23
  403. data/lib/rubocop/cop/style/option_hash.rb +1 -1
  404. data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
  405. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +42 -0
  406. data/lib/rubocop/cop/style/or_assignment.rb +13 -10
  407. data/lib/rubocop/cop/style/parallel_assignment.rb +18 -18
  408. data/lib/rubocop/cop/style/parentheses_around_condition.rb +6 -6
  409. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +14 -20
  410. data/lib/rubocop/cop/style/percent_q_literals.rb +8 -10
  411. data/lib/rubocop/cop/style/perl_backrefs.rb +8 -10
  412. data/lib/rubocop/cop/style/preferred_hash_methods.rb +11 -14
  413. data/lib/rubocop/cop/style/proc.rb +6 -6
  414. data/lib/rubocop/cop/style/raise_args.rb +15 -24
  415. data/lib/rubocop/cop/style/random_with_offset.rb +17 -16
  416. data/lib/rubocop/cop/style/redundant_assignment.rb +8 -10
  417. data/lib/rubocop/cop/style/redundant_begin.rb +7 -9
  418. data/lib/rubocop/cop/style/redundant_capital_w.rb +6 -9
  419. data/lib/rubocop/cop/style/redundant_condition.rb +20 -9
  420. data/lib/rubocop/cop/style/redundant_exception.rb +2 -0
  421. data/lib/rubocop/cop/style/redundant_fetch_block.rb +3 -12
  422. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +51 -0
  423. data/lib/rubocop/cop/style/redundant_freeze.rb +5 -7
  424. data/lib/rubocop/cop/style/redundant_interpolation.rb +25 -24
  425. data/lib/rubocop/cop/style/redundant_parentheses.rb +19 -12
  426. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +6 -13
  427. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +14 -23
  428. data/lib/rubocop/cop/style/redundant_self.rb +2 -2
  429. data/lib/rubocop/cop/style/redundant_self_assignment.rb +116 -0
  430. data/lib/rubocop/cop/style/redundant_sort.rb +21 -13
  431. data/lib/rubocop/cop/style/regexp_literal.rb +10 -21
  432. data/lib/rubocop/cop/style/rescue_modifier.rb +29 -9
  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 -20
  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 +21 -20
  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 +7 -6
  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 +9 -32
  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/tokens_util.rb +84 -0
  478. data/lib/rubocop/cop/util.rb +3 -13
  479. data/lib/rubocop/cop/utils/format_string.rb +3 -5
  480. data/lib/rubocop/cop/variable_force.rb +2 -2
  481. data/lib/rubocop/cop/variable_force/branch.rb +1 -0
  482. data/lib/rubocop/cop/variable_force/variable.rb +7 -5
  483. data/lib/rubocop/cops_documentation_generator.rb +284 -0
  484. data/lib/rubocop/core_ext/string.rb +2 -2
  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 +13 -12
  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 +17 -17
  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 +37 -15
  502. data/lib/rubocop/rspec/cop_helper.rb +4 -1
  503. data/lib/rubocop/rspec/expect_offense.rb +37 -6
  504. data/lib/rubocop/rspec/shared_contexts.rb +25 -14
  505. data/lib/rubocop/runner.rb +36 -21
  506. data/lib/rubocop/string_interpreter.rb +3 -0
  507. data/lib/rubocop/target_finder.rb +14 -10
  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 +45 -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
@@ -18,7 +18,7 @@ module RuboCop
18
18
  # # good
19
19
  #
20
20
  # float = 42.9
21
- class FloatOutOfRange < Cop
21
+ class FloatOutOfRange < Base
22
22
  MSG = 'Float out of range.'
23
23
 
24
24
  def on_float(node)
@@ -34,7 +34,7 @@ module RuboCop
34
34
  # # good
35
35
  #
36
36
  # format('Numbered format: %1$s and numbered %2$s', a_value, another)
37
- class FormatParameterMismatch < Cop
37
+ class FormatParameterMismatch < Base
38
38
  # http://rubular.com/r/CvpbxkcTzy
39
39
  MSG = "Number of arguments (%<arg_num>i) to `%<method>s` doesn't " \
40
40
  'match the number of fields (%<field_num>i).'
@@ -44,18 +44,19 @@ module RuboCop
44
44
  KERNEL = 'Kernel'
45
45
  SHOVEL = '<<'
46
46
  STRING_TYPES = %i[str dstr].freeze
47
+ RESTRICT_ON_SEND = %i[format sprintf %].freeze
47
48
 
48
49
  def on_send(node)
49
50
  return unless format_string?(node)
50
51
 
51
52
  if invalid_format_string?(node)
52
- add_offense(node, location: :selector, message: MSG_INVALID)
53
+ add_offense(node.loc.selector, message: MSG_INVALID)
53
54
  return
54
55
  end
55
56
 
56
57
  return unless offending_node?(node)
57
58
 
58
- add_offense(node, location: :selector)
59
+ add_offense(node.loc.selector, message: message(node))
59
60
  end
60
61
 
61
62
  private
@@ -30,8 +30,9 @@ module RuboCop
30
30
  # bar
31
31
  # SQL
32
32
  #
33
- class HeredocMethodCallPosition < Cop
33
+ class HeredocMethodCallPosition < Base
34
34
  include RangeHelp
35
+ extend AutoCorrector
35
36
 
36
37
  MSG = 'Put a method call with a HEREDOC receiver on the ' \
37
38
  'same line as the HEREDOC opening.'
@@ -41,25 +42,23 @@ module RuboCop
41
42
  return unless heredoc
42
43
  return if correctly_positioned?(node, heredoc)
43
44
 
44
- add_offense(node, location: call_after_heredoc_range(heredoc))
45
+ add_offense(call_after_heredoc_range(heredoc)) do |corrector|
46
+ autocorrect(corrector, node, heredoc)
47
+ end
45
48
  end
46
49
  alias on_csend on_send
47
50
 
48
- def autocorrect(node)
49
- heredoc = heredoc_node_descendent_receiver(node)
51
+ private
50
52
 
51
- lambda do |corrector|
52
- call_range = call_range_to_safely_reposition(node, heredoc)
53
- return if call_range.nil?
53
+ def autocorrect(corrector, node, heredoc)
54
+ call_range = call_range_to_safely_reposition(node, heredoc)
55
+ return if call_range.nil?
54
56
 
55
- call_source = call_range.source.strip
56
- corrector.remove(call_range)
57
- corrector.insert_after(heredoc_begin_line_range(node), call_source)
58
- end
57
+ call_source = call_range.source.strip
58
+ corrector.remove(call_range)
59
+ corrector.insert_after(heredoc_begin_line_range(node), call_source)
59
60
  end
60
61
 
61
- private
62
-
63
62
  def heredoc_node_descendent_receiver(node)
64
63
  while send_node?(node)
65
64
  return node.receiver if heredoc_node?(node.receiver)
@@ -148,7 +147,7 @@ module RuboCop
148
147
  end
149
148
 
150
149
  def trailing_comma?(call_source, call_line_source)
151
- call_source + ',' == call_line_source
150
+ "#{call_source}," == call_line_source
152
151
  end
153
152
  end
154
153
  end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ #
7
+ # Prefer `equal?` over `==` when comparing `object_id`.
8
+ #
9
+ # `Object#equal?` is provided to compare objects for identity, and in contrast
10
+ # `Object#==` is provided for the purpose of doing value comparison.
11
+ #
12
+ # @example
13
+ # # bad
14
+ # foo.object_id == bar.object_id
15
+ #
16
+ # # good
17
+ # foo.equal?(bar)
18
+ #
19
+ class IdentityComparison < Base
20
+ extend AutoCorrector
21
+
22
+ MSG = 'Use `equal?` instead `==` when comparing `object_id`.'
23
+ RESTRICT_ON_SEND = %i[==].freeze
24
+
25
+ def on_send(node)
26
+ return unless compare_between_object_id_by_double_equal?(node)
27
+
28
+ add_offense(node) do |corrector|
29
+ receiver = node.receiver.receiver.source
30
+ argument = node.first_argument.receiver.source
31
+ replacement = "#{receiver}.equal?(#{argument})"
32
+
33
+ corrector.replace(node, replacement)
34
+ end
35
+ end
36
+
37
+ private
38
+
39
+ def compare_between_object_id_by_double_equal?(node)
40
+ object_id_method?(node.receiver) && object_id_method?(node.first_argument)
41
+ end
42
+
43
+ def object_id_method?(node)
44
+ node.send_type? && node.method?(:object_id)
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -22,7 +22,7 @@ module RuboCop
22
22
  # 'Item 1' \
23
23
  # 'Item 2'
24
24
  # ]
25
- class ImplicitStringConcatenation < Cop
25
+ class ImplicitStringConcatenation < Base
26
26
  MSG = 'Combine %<string1>s and %<string2>s into a single string ' \
27
27
  'literal, rather than using implicit string concatenation.'
28
28
  FOR_ARRAY = ' Or, if they were intended to be separate array ' \
@@ -41,7 +41,7 @@ module RuboCop
41
41
  elsif node.parent&.send_type?
42
42
  message << FOR_METHOD
43
43
  end
44
- add_offense(node, location: range, message: message)
44
+ add_offense(range, message: message)
45
45
  end
46
46
  end
47
47
 
@@ -64,9 +64,10 @@ module RuboCop
64
64
 
65
65
  def ending_delimiter(str)
66
66
  # implicit string concatenation does not work with %{}, etc.
67
- if str.source[0] == "'"
67
+ case str.source[0]
68
+ when "'"
68
69
  "'"
69
- elsif str.source[0] == '"'
70
+ when '"'
70
71
  '"'
71
72
  end
72
73
  end
@@ -45,7 +45,7 @@ module RuboCop
45
45
  # end
46
46
  # end
47
47
  # end
48
- class IneffectiveAccessModifier < Cop
48
+ class IneffectiveAccessModifier < Base
49
49
  MSG = '`%<modifier>s` (on line %<line>d) does not make singleton ' \
50
50
  'methods %<modifier>s. Use %<alternative>s instead.'
51
51
  ALTERNATIVE_PRIVATE = '`private_class_method` or `private` inside a ' \
@@ -70,12 +70,8 @@ module RuboCop
70
70
  def check_node(node)
71
71
  return unless node&.begin_type?
72
72
 
73
- ignored_methods = private_class_method_names(node)
74
-
75
- ineffective_modifier(node, ignored_methods) do |defs_node, modifier|
76
- add_offense(defs_node,
77
- location: :keyword,
78
- message: format_message(modifier))
73
+ ineffective_modifier(node) do |defs_node, modifier|
74
+ add_offense(defs_node.loc.keyword, message: format_message(modifier))
79
75
  end
80
76
  end
81
77
 
@@ -97,20 +93,24 @@ module RuboCop
97
93
  alternative: alternative)
98
94
  end
99
95
 
100
- def ineffective_modifier(node, ignored_methods, modifier = nil, &block)
96
+ # rubocop:disable Metrics/CyclomaticComplexity
97
+ def ineffective_modifier(node, ignored_methods = nil, modifier = nil, &block)
101
98
  node.each_child_node do |child|
102
99
  case child.type
103
100
  when :send
104
101
  modifier = child if access_modifier?(child)
105
102
  when :defs
103
+ ignored_methods ||= private_class_method_names(node)
106
104
  next if correct_visibility?(child, modifier, ignored_methods)
107
105
 
108
106
  yield child, modifier
109
107
  when :kwbegin
108
+ ignored_methods ||= private_class_method_names(node)
110
109
  ineffective_modifier(child, ignored_methods, modifier, &block)
111
110
  end
112
111
  end
113
112
  end
113
+ # rubocop:enable Metrics/CyclomaticComplexity
114
114
 
115
115
  def access_modifier?(node)
116
116
  node.bare_access_modifier? && !node.method?(:module_function)
@@ -33,8 +33,9 @@ module RuboCop
33
33
  # class C < StandardError; end
34
34
  #
35
35
  # C = Class.new(StandardError)
36
- class InheritException < Cop
36
+ class InheritException < Base
37
37
  include ConfigurableEnforcedStyle
38
+ extend AutoCorrector
38
39
 
39
40
  MSG = 'Inherit from `%<prefer>s` instead of `%<current>s`.'
40
41
  PREFERRED_BASE_CLASS = {
@@ -55,6 +56,8 @@ module RuboCop
55
56
  SystemExit
56
57
  ].freeze
57
58
 
59
+ RESTRICT_ON_SEND = %i[new].freeze
60
+
58
61
  def_node_matcher :class_new_call?, <<~PATTERN
59
62
  (send
60
63
  (const {cbase nil?} :Class) :new
@@ -65,19 +68,21 @@ module RuboCop
65
68
  return unless node.parent_class &&
66
69
  illegal_class_name?(node.parent_class)
67
70
 
68
- add_offense(node.parent_class)
71
+ message = message(node.parent_class)
72
+
73
+ add_offense(node.parent_class, message: message) do |corrector|
74
+ corrector.replace(node.parent_class, preferred_base_class)
75
+ end
69
76
  end
70
77
 
71
78
  def on_send(node)
72
79
  constant = class_new_call?(node)
73
80
  return unless constant && illegal_class_name?(constant)
74
81
 
75
- add_offense(constant)
76
- end
82
+ message = message(constant)
77
83
 
78
- def autocorrect(node)
79
- lambda do |corrector|
80
- corrector.replace(node, preferred_base_class)
84
+ add_offense(constant, message: message) do |corrector|
85
+ corrector.replace(constant, preferred_base_class)
81
86
  end
82
87
  end
83
88
 
@@ -16,31 +16,34 @@ module RuboCop
16
16
  # # good
17
17
  #
18
18
  # foo = "something with #{interpolation} inside"
19
- class InterpolationCheck < Cop
19
+ class InterpolationCheck < Base
20
+ extend AutoCorrector
21
+
20
22
  MSG = 'Interpolation in single quoted string detected. '\
21
23
  'Use double quoted strings if you need interpolation.'
22
24
 
23
25
  def on_str(node)
24
- return if heredoc?(node)
25
-
26
26
  parent = node.parent
27
27
  return if parent && (parent.dstr_type? || parent.regexp_type?)
28
- return unless /(?<!\\)#\{.*\}/.match?(node.source.scrub)
28
+ return unless /(?<!\\)#\{.*\}/.match?(node.source)
29
+ return if heredoc?(node)
29
30
 
30
- add_offense(node)
31
+ add_offense(node) do |corrector|
32
+ autocorrect(corrector, node)
33
+ end
31
34
  end
32
35
 
33
- def autocorrect(node)
34
- lambda do |corrector|
35
- starting_token, ending_token = if node.source.include?('"')
36
- ['%{', '}']
37
- else
38
- ['"', '"']
39
- end
36
+ private
40
37
 
41
- corrector.replace(node.loc.begin, starting_token)
42
- corrector.replace(node.loc.end, ending_token)
43
- end
38
+ def autocorrect(corrector, node)
39
+ starting_token, ending_token = if node.source.include?('"')
40
+ ['%{', '}']
41
+ else
42
+ ['"', '"']
43
+ end
44
+
45
+ corrector.replace(node.loc.begin, starting_token)
46
+ corrector.replace(node.loc.end, ending_token)
44
47
  end
45
48
 
46
49
  def heredoc?(node)
@@ -29,7 +29,9 @@ module RuboCop
29
29
  # while true
30
30
  # break if condition
31
31
  # end
32
- class LiteralAsCondition < Cop
32
+ class LiteralAsCondition < Base
33
+ include RangeHelp
34
+
33
35
  MSG = 'Literal `%<literal>s` appeared as a condition.'
34
36
 
35
37
  def on_if(node)
@@ -57,7 +59,10 @@ module RuboCop
57
59
  case_node.each_when do |when_node|
58
60
  next unless when_node.conditions.all?(&:literal?)
59
61
 
60
- add_offense(when_node)
62
+ range = when_conditions_range(when_node)
63
+ message = message(range)
64
+
65
+ add_offense(range, message: message)
61
66
  end
62
67
  end
63
68
  end
@@ -129,6 +134,13 @@ module RuboCop
129
134
  node.condition
130
135
  end
131
136
  end
137
+
138
+ def when_conditions_range(when_node)
139
+ range_between(
140
+ when_node.conditions.first.source_range.begin_pos,
141
+ when_node.conditions.last.source_range.end_pos
142
+ )
143
+ end
132
144
  end
133
145
  end
134
146
  end
@@ -16,10 +16,11 @@ module RuboCop
16
16
  # # good
17
17
  #
18
18
  # "result is 10"
19
- class LiteralInInterpolation < Cop
19
+ class LiteralInInterpolation < Base
20
20
  include Interpolation
21
21
  include RangeHelp
22
22
  include PercentLiteral
23
+ extend AutoCorrector
23
24
 
24
25
  MSG = 'Literal interpolation detected.'
25
26
  COMPOSITE = %i[array hash pair irange erange].freeze
@@ -30,14 +31,13 @@ module RuboCop
30
31
  return if special_keyword?(final_node)
31
32
  return unless prints_as_self?(final_node)
32
33
 
33
- add_offense(final_node)
34
- end
34
+ add_offense(final_node) do |corrector|
35
+ return if final_node.dstr_type? # nested, fixed in next iteration
35
36
 
36
- def autocorrect(node)
37
- return if node.dstr_type? # nested, fixed in next iteration
37
+ value = autocorrected_value(final_node)
38
38
 
39
- value = autocorrected_value(node)
40
- ->(corrector) { corrector.replace(node.parent, value) }
39
+ corrector.replace(final_node.parent, value)
40
+ end
41
41
  end
42
42
 
43
43
  private
@@ -42,7 +42,9 @@ module RuboCop
42
42
  # do_something
43
43
  # break if some_condition
44
44
  # end
45
- class Loop < Cop
45
+ class Loop < Base
46
+ extend AutoCorrector
47
+
46
48
  MSG = 'Use `Kernel#loop` with `break` rather than ' \
47
49
  '`begin/end/until`(or `while`).'
48
50
 
@@ -57,7 +59,26 @@ module RuboCop
57
59
  private
58
60
 
59
61
  def register_offense(node)
60
- add_offense(node, location: :keyword)
62
+ body = node.body
63
+
64
+ add_offense(node.loc.keyword) do |corrector|
65
+ corrector.replace(body.loc.begin, 'loop do')
66
+ corrector.remove(keyword_and_condition_range(node))
67
+ corrector.insert_before(body.loc.end, build_break_line(node))
68
+ end
69
+ end
70
+
71
+ def keyword_and_condition_range(node)
72
+ node.body.loc.end.end.join(node.source_range.end)
73
+ end
74
+
75
+ def build_break_line(node)
76
+ conditional_keyword = node.while_post_type? ? 'unless' : 'if'
77
+ "break #{conditional_keyword} #{node.condition.source}\n#{indent(node)}"
78
+ end
79
+
80
+ def indent(node)
81
+ ' ' * node.loc.column
61
82
  end
62
83
  end
63
84
  end
@@ -42,7 +42,7 @@ module RuboCop
42
42
  # # Including this, that's 3 lines on which the cop is disabled.
43
43
  # # rubocop:enable Layout/SpaceAroundOperators
44
44
  #
45
- class MissingCopEnableDirective < Cop
45
+ class MissingCopEnableDirective < Base
46
46
  include RangeHelp
47
47
 
48
48
  MSG = 'Re-enable %<cop>s cop with `# rubocop:enable` after ' \
@@ -50,7 +50,8 @@ module RuboCop
50
50
  MSG_BOUND = 'Re-enable %<cop>s cop within %<max_range>s lines after ' \
51
51
  'disabling it.'
52
52
 
53
- def investigate(processed_source)
53
+ # rubocop:disable Metrics/AbcSize
54
+ def on_new_investigation
54
55
  max_range = cop_config['MaximumRangeSize']
55
56
  processed_source.disabled_line_ranges.each do |cop, line_ranges|
56
57
  line_ranges.each do |line_range|
@@ -61,12 +62,12 @@ module RuboCop
61
62
  range = source_range(processed_source.buffer,
62
63
  line_range.min,
63
64
  (0..0))
64
- add_offense(range,
65
- location: range,
66
- message: message(max_range: max_range, cop: cop))
65
+
66
+ add_offense(range, message: message(max_range: max_range, cop: cop))
67
67
  end
68
68
  end
69
69
  end
70
+ # rubocop:enable Metrics/AbcSize
70
71
 
71
72
  private
72
73