rubocop 0.85.1 → 0.89.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 (409) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +16 -4
  3. data/bin/rubocop-profile +32 -0
  4. data/config/default.yml +227 -26
  5. data/lib/rubocop/cli/command/auto_genenerate_config.rb +42 -7
  6. data/lib/rubocop/cli/command/base.rb +1 -0
  7. data/lib/rubocop/cli/command/execute_runner.rb +1 -1
  8. data/lib/rubocop/cli/command/init_dotfile.rb +1 -1
  9. data/lib/rubocop/cli/command/show_cops.rb +3 -3
  10. data/lib/rubocop/cli/command/version.rb +2 -2
  11. data/lib/rubocop/cli.rb +2 -4
  12. data/lib/rubocop/comment_config.rb +5 -7
  13. data/lib/rubocop/config.rb +21 -4
  14. data/lib/rubocop/config_loader.rb +41 -69
  15. data/lib/rubocop/config_loader_resolver.rb +4 -4
  16. data/lib/rubocop/config_obsoletion.rb +6 -2
  17. data/lib/rubocop/config_store.rb +4 -0
  18. data/lib/rubocop/config_validator.rb +2 -4
  19. data/lib/rubocop/cop/autocorrect_logic.rb +14 -24
  20. data/lib/rubocop/cop/badge.rb +1 -1
  21. data/lib/rubocop/cop/base.rb +407 -0
  22. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +10 -20
  23. data/lib/rubocop/cop/commissioner.rb +47 -50
  24. data/lib/rubocop/cop/cop.rb +85 -236
  25. data/lib/rubocop/cop/corrector.rb +38 -115
  26. data/lib/rubocop/cop/correctors/line_break_corrector.rb +4 -4
  27. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +26 -0
  28. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
  29. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +1 -1
  30. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +15 -18
  31. data/lib/rubocop/cop/force.rb +1 -0
  32. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +39 -13
  33. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +1 -1
  34. data/lib/rubocop/cop/generator/configuration_injector.rb +3 -3
  35. data/lib/rubocop/cop/generator.rb +1 -1
  36. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +4 -12
  37. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -1
  38. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +11 -14
  39. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +8 -8
  40. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +10 -7
  41. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +7 -8
  42. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
  43. data/lib/rubocop/cop/layout/block_alignment.rb +1 -1
  44. data/lib/rubocop/cop/layout/case_indentation.rb +18 -19
  45. data/lib/rubocop/cop/layout/class_structure.rb +5 -44
  46. data/lib/rubocop/cop/layout/comment_indentation.rb +4 -4
  47. data/lib/rubocop/cop/layout/empty_comment.rb +1 -1
  48. data/lib/rubocop/cop/layout/empty_lines.rb +0 -2
  49. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +1 -0
  50. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +3 -8
  51. data/lib/rubocop/cop/layout/end_alignment.rb +3 -2
  52. data/lib/rubocop/cop/layout/end_of_line.rb +1 -1
  53. data/lib/rubocop/cop/layout/extra_spacing.rb +22 -36
  54. data/lib/rubocop/cop/layout/first_argument_indentation.rb +5 -1
  55. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -1
  56. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -1
  57. data/lib/rubocop/cop/layout/hash_alignment.rb +2 -3
  58. data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
  59. data/lib/rubocop/cop/layout/indentation_style.rb +0 -2
  60. data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
  61. data/lib/rubocop/cop/layout/multiline_block_layout.rb +17 -7
  62. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
  63. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +0 -2
  64. data/lib/rubocop/cop/layout/space_after_colon.rb +1 -1
  65. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +22 -27
  66. data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -2
  67. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +33 -66
  68. data/lib/rubocop/cop/layout/space_around_operators.rb +1 -1
  69. data/lib/rubocop/cop/layout/space_before_block_braces.rb +14 -0
  70. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +4 -3
  71. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -1
  72. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +2 -2
  73. data/lib/rubocop/cop/legacy/corrections_proxy.rb +49 -0
  74. data/lib/rubocop/cop/legacy/corrector.rb +29 -0
  75. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +7 -4
  76. data/lib/rubocop/cop/lint/ambiguous_operator.rb +15 -10
  77. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +11 -13
  78. data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
  79. data/lib/rubocop/cop/lint/big_decimal_new.rb +10 -10
  80. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +50 -0
  81. data/lib/rubocop/cop/lint/boolean_symbol.rb +16 -11
  82. data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
  83. data/lib/rubocop/cop/lint/constant_resolution.rb +89 -0
  84. data/lib/rubocop/cop/lint/debugger.rb +7 -1
  85. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +9 -10
  86. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +21 -17
  87. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +8 -2
  88. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
  89. data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +39 -0
  90. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
  91. data/lib/rubocop/cop/lint/duplicate_methods.rb +9 -6
  92. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +60 -0
  93. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  94. data/lib/rubocop/cop/lint/else_layout.rb +1 -1
  95. data/lib/rubocop/cop/lint/empty_conditional_body.rb +67 -0
  96. data/lib/rubocop/cop/lint/empty_ensure.rb +5 -5
  97. data/lib/rubocop/cop/lint/empty_expression.rb +2 -2
  98. data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -6
  99. data/lib/rubocop/cop/lint/empty_when.rb +2 -2
  100. data/lib/rubocop/cop/lint/ensure_return.rb +27 -29
  101. data/lib/rubocop/cop/lint/erb_new_arguments.rb +11 -10
  102. data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
  103. data/lib/rubocop/cop/lint/float_comparison.rb +93 -0
  104. data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -2
  105. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +11 -5
  106. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +13 -14
  107. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +5 -4
  108. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +8 -8
  109. data/lib/rubocop/cop/lint/inherit_exception.rb +12 -7
  110. data/lib/rubocop/cop/lint/interpolation_check.rb +21 -5
  111. data/lib/rubocop/cop/lint/literal_as_condition.rb +14 -2
  112. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -7
  113. data/lib/rubocop/cop/lint/loop.rb +23 -2
  114. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +6 -5
  115. data/lib/rubocop/cop/lint/missing_super.rb +99 -0
  116. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  117. data/lib/rubocop/cop/lint/multiple_comparison.rb +6 -9
  118. data/lib/rubocop/cop/lint/nested_method_definition.rb +15 -21
  119. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  120. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  121. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +84 -13
  122. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
  123. data/lib/rubocop/cop/lint/number_conversion.rb +6 -9
  124. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +11 -13
  125. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +90 -0
  126. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +12 -13
  127. data/lib/rubocop/cop/lint/percent_string_array.rb +14 -13
  128. data/lib/rubocop/cop/lint/percent_symbol_array.rb +14 -13
  129. data/lib/rubocop/cop/lint/raise_exception.rb +15 -5
  130. data/lib/rubocop/cop/lint/rand_one.rb +3 -3
  131. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +43 -40
  132. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +7 -11
  133. data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -7
  134. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +15 -11
  135. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +6 -13
  136. data/lib/rubocop/cop/lint/redundant_with_index.rb +11 -14
  137. data/lib/rubocop/cop/lint/redundant_with_object.rb +11 -14
  138. data/lib/rubocop/cop/lint/regexp_as_condition.rb +6 -2
  139. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -2
  140. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  141. data/lib/rubocop/cop/lint/rescue_type.rb +8 -8
  142. data/lib/rubocop/cop/lint/return_in_void_context.rb +2 -4
  143. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +3 -6
  144. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +14 -10
  145. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +10 -2
  146. data/lib/rubocop/cop/lint/script_permission.rb +10 -7
  147. data/lib/rubocop/cop/lint/self_assignment.rb +78 -0
  148. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +5 -11
  149. data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
  150. data/lib/rubocop/cop/lint/shadowed_exception.rb +2 -2
  151. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +3 -3
  152. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -1
  153. data/lib/rubocop/cop/lint/suppressed_exception.rb +4 -7
  154. data/lib/rubocop/cop/lint/syntax.rb +11 -26
  155. data/lib/rubocop/cop/lint/to_json.rb +4 -6
  156. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +34 -0
  157. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +4 -4
  158. data/lib/rubocop/cop/lint/unified_integer.rb +4 -6
  159. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  160. data/lib/rubocop/cop/lint/unreachable_loop.rb +174 -0
  161. data/lib/rubocop/cop/lint/unused_block_argument.rb +8 -3
  162. data/lib/rubocop/cop/lint/unused_method_argument.rb +9 -4
  163. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
  164. data/lib/rubocop/cop/lint/uri_regexp.rb +11 -47
  165. data/lib/rubocop/cop/lint/useless_access_modifier.rb +26 -16
  166. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -4
  167. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -15
  168. data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -6
  169. data/lib/rubocop/cop/lint/void.rb +3 -7
  170. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  171. data/lib/rubocop/cop/metrics/block_length.rb +24 -2
  172. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
  173. data/lib/rubocop/cop/metrics/class_length.rb +26 -3
  174. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +37 -4
  175. data/lib/rubocop/cop/metrics/method_length.rb +25 -2
  176. data/lib/rubocop/cop/metrics/module_length.rb +26 -3
  177. data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -6
  178. data/lib/rubocop/cop/metrics/perceived_complexity.rb +7 -8
  179. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +47 -4
  180. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +157 -0
  181. data/lib/rubocop/cop/metrics/utils/iterating_block.rb +61 -0
  182. data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +37 -0
  183. data/lib/rubocop/cop/migration/department_name.rb +14 -16
  184. data/lib/rubocop/cop/mixin/alignment.rb +2 -1
  185. data/lib/rubocop/cop/mixin/allowed_methods.rb +19 -0
  186. data/lib/rubocop/cop/mixin/array_min_size.rb +1 -1
  187. data/lib/rubocop/cop/mixin/auto_corrector.rb +12 -0
  188. data/lib/rubocop/cop/mixin/check_line_breakable.rb +2 -2
  189. data/lib/rubocop/cop/mixin/code_length.rb +26 -5
  190. data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -1
  191. data/lib/rubocop/cop/mixin/configurable_naming.rb +1 -1
  192. data/lib/rubocop/cop/mixin/documentation_comment.rb +2 -2
  193. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -1
  194. data/lib/rubocop/cop/mixin/enforce_superclass.rb +3 -1
  195. data/lib/rubocop/cop/mixin/first_element_line_break.rb +1 -1
  196. data/lib/rubocop/cop/mixin/hash_transform_method.rb +5 -11
  197. data/lib/rubocop/cop/mixin/line_length_help.rb +1 -3
  198. data/lib/rubocop/cop/mixin/method_complexity.rb +10 -2
  199. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1 -1
  200. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -2
  201. data/lib/rubocop/cop/mixin/nil_methods.rb +3 -5
  202. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +6 -1
  203. data/lib/rubocop/cop/mixin/parentheses.rb +1 -2
  204. data/lib/rubocop/cop/mixin/percent_array.rb +2 -6
  205. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +1 -1
  206. data/lib/rubocop/cop/mixin/range_help.rb +19 -5
  207. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +27 -0
  208. data/lib/rubocop/cop/mixin/statement_modifier.rb +39 -10
  209. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  210. data/lib/rubocop/cop/mixin/surrounding_space.rb +7 -27
  211. data/lib/rubocop/cop/mixin/trailing_comma.rb +3 -5
  212. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +12 -17
  213. data/lib/rubocop/cop/mixin/unused_argument.rb +4 -6
  214. data/lib/rubocop/cop/mixin/visibility_help.rb +50 -0
  215. data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
  216. data/lib/rubocop/cop/naming/ascii_identifiers.rb +29 -6
  217. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +4 -4
  218. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  219. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +2 -2
  220. data/lib/rubocop/cop/naming/constant_name.rb +2 -2
  221. data/lib/rubocop/cop/naming/file_name.rb +4 -6
  222. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +2 -2
  223. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +3 -3
  224. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -2
  225. data/lib/rubocop/cop/naming/method_name.rb +1 -1
  226. data/lib/rubocop/cop/naming/method_parameter_name.rb +2 -2
  227. data/lib/rubocop/cop/naming/predicate_name.rb +6 -10
  228. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -11
  229. data/lib/rubocop/cop/naming/variable_name.rb +1 -1
  230. data/lib/rubocop/cop/naming/variable_number.rb +1 -1
  231. data/lib/rubocop/cop/offense.rb +16 -2
  232. data/lib/rubocop/cop/registry.rb +3 -3
  233. data/lib/rubocop/cop/security/eval.rb +2 -2
  234. data/lib/rubocop/cop/security/json_load.rb +6 -8
  235. data/lib/rubocop/cop/security/marshal_load.rb +2 -4
  236. data/lib/rubocop/cop/security/open.rb +2 -2
  237. data/lib/rubocop/cop/security/yaml_load.rb +6 -6
  238. data/lib/rubocop/cop/style/access_modifier_declarations.rb +16 -9
  239. data/lib/rubocop/cop/style/accessor_grouping.rb +149 -0
  240. data/lib/rubocop/cop/style/alias.rb +41 -36
  241. data/lib/rubocop/cop/style/and_or.rb +9 -11
  242. data/lib/rubocop/cop/style/array_coercion.rb +63 -0
  243. data/lib/rubocop/cop/style/array_join.rb +6 -8
  244. data/lib/rubocop/cop/style/ascii_comments.rb +4 -4
  245. data/lib/rubocop/cop/style/attr.rb +11 -9
  246. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +5 -7
  247. data/lib/rubocop/cop/style/bare_percent_literals.rb +11 -13
  248. data/lib/rubocop/cop/style/begin_block.rb +2 -2
  249. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +141 -0
  250. data/lib/rubocop/cop/style/block_comments.rb +14 -18
  251. data/lib/rubocop/cop/style/block_delimiters.rb +25 -27
  252. data/lib/rubocop/cop/style/case_equality.rb +22 -3
  253. data/lib/rubocop/cop/style/case_like_if.rb +220 -0
  254. data/lib/rubocop/cop/style/class_and_module_children.rb +15 -12
  255. data/lib/rubocop/cop/style/class_check.rb +7 -9
  256. data/lib/rubocop/cop/style/class_methods.rb +7 -11
  257. data/lib/rubocop/cop/style/class_vars.rb +24 -7
  258. data/lib/rubocop/cop/style/collection_methods.rb +11 -17
  259. data/lib/rubocop/cop/style/colon_method_call.rb +8 -9
  260. data/lib/rubocop/cop/style/colon_method_definition.rb +6 -6
  261. data/lib/rubocop/cop/style/command_literal.rb +24 -25
  262. data/lib/rubocop/cop/style/comment_annotation.rb +15 -15
  263. data/lib/rubocop/cop/style/commented_keyword.rb +6 -3
  264. data/lib/rubocop/cop/style/conditional_assignment.rb +12 -3
  265. data/lib/rubocop/cop/style/constant_visibility.rb +3 -2
  266. data/lib/rubocop/cop/style/copyright.rb +15 -15
  267. data/lib/rubocop/cop/style/date_time.rb +2 -2
  268. data/lib/rubocop/cop/style/def_with_parentheses.rb +8 -10
  269. data/lib/rubocop/cop/style/dir.rb +9 -12
  270. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +8 -10
  271. data/lib/rubocop/cop/style/documentation.rb +8 -10
  272. data/lib/rubocop/cop/style/documentation_method.rb +1 -1
  273. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +12 -15
  274. data/lib/rubocop/cop/style/double_negation.rb +2 -2
  275. data/lib/rubocop/cop/style/each_for_simple_loop.rb +5 -8
  276. data/lib/rubocop/cop/style/each_with_object.rb +16 -19
  277. data/lib/rubocop/cop/style/empty_case_condition.rb +27 -26
  278. data/lib/rubocop/cop/style/empty_else.rb +17 -19
  279. data/lib/rubocop/cop/style/empty_literal.rb +20 -21
  280. data/lib/rubocop/cop/style/empty_method.rb +10 -13
  281. data/lib/rubocop/cop/style/encoding.rb +6 -10
  282. data/lib/rubocop/cop/style/end_block.rb +4 -6
  283. data/lib/rubocop/cop/style/eval_with_location.rb +9 -7
  284. data/lib/rubocop/cop/style/even_odd.rb +7 -11
  285. data/lib/rubocop/cop/style/expand_path_arguments.rb +23 -22
  286. data/lib/rubocop/cop/style/explicit_block_argument.rb +102 -0
  287. data/lib/rubocop/cop/style/exponential_notation.rb +9 -11
  288. data/lib/rubocop/cop/style/float_division.rb +8 -11
  289. data/lib/rubocop/cop/style/for.rb +11 -15
  290. data/lib/rubocop/cop/style/format_string.rb +21 -19
  291. data/lib/rubocop/cop/style/format_string_token.rb +10 -12
  292. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +20 -42
  293. data/lib/rubocop/cop/style/global_std_stream.rb +65 -0
  294. data/lib/rubocop/cop/style/global_vars.rb +2 -2
  295. data/lib/rubocop/cop/style/guard_clause.rb +5 -6
  296. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +69 -0
  297. data/lib/rubocop/cop/style/hash_each_methods.rb +5 -8
  298. data/lib/rubocop/cop/style/hash_like_case.rb +76 -0
  299. data/lib/rubocop/cop/style/hash_syntax.rb +4 -3
  300. data/lib/rubocop/cop/style/hash_transform_keys.rb +3 -2
  301. data/lib/rubocop/cop/style/hash_transform_values.rb +2 -1
  302. data/lib/rubocop/cop/style/identical_conditional_branches.rb +2 -2
  303. data/lib/rubocop/cop/style/if_inside_else.rb +2 -2
  304. data/lib/rubocop/cop/style/if_unless_modifier.rb +18 -40
  305. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +11 -3
  306. data/lib/rubocop/cop/style/if_with_semicolon.rb +3 -6
  307. data/lib/rubocop/cop/style/implicit_runtime_error.rb +1 -1
  308. data/lib/rubocop/cop/style/infinite_loop.rb +24 -24
  309. data/lib/rubocop/cop/style/inline_comment.rb +3 -3
  310. data/lib/rubocop/cop/style/inverse_methods.rb +23 -33
  311. data/lib/rubocop/cop/style/ip_addresses.rb +1 -1
  312. data/lib/rubocop/cop/style/lambda.rb +7 -12
  313. data/lib/rubocop/cop/style/lambda_call.rb +14 -13
  314. data/lib/rubocop/cop/style/line_end_concatenation.rb +19 -16
  315. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +16 -11
  316. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +4 -8
  317. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -1
  318. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -7
  319. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -2
  320. data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -16
  321. data/lib/rubocop/cop/style/min_max.rb +8 -12
  322. data/lib/rubocop/cop/style/missing_else.rb +11 -21
  323. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +10 -3
  324. data/lib/rubocop/cop/style/mixin_grouping.rb +24 -27
  325. data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
  326. data/lib/rubocop/cop/style/module_function.rb +10 -13
  327. data/lib/rubocop/cop/style/multiline_block_chain.rb +10 -1
  328. data/lib/rubocop/cop/style/multiline_if_modifier.rb +3 -10
  329. data/lib/rubocop/cop/style/multiline_if_then.rb +5 -11
  330. data/lib/rubocop/cop/style/multiline_memoization.rb +14 -12
  331. data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -2
  332. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +17 -8
  333. data/lib/rubocop/cop/style/multiline_when_then.rb +7 -9
  334. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  335. data/lib/rubocop/cop/style/mutable_constant.rb +27 -24
  336. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +5 -6
  337. data/lib/rubocop/cop/style/nested_ternary_operator.rb +27 -0
  338. data/lib/rubocop/cop/style/next.rb +2 -2
  339. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +2 -2
  340. data/lib/rubocop/cop/style/numeric_predicate.rb +7 -4
  341. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +42 -0
  342. data/lib/rubocop/cop/style/parallel_assignment.rb +5 -5
  343. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +2 -2
  344. data/lib/rubocop/cop/style/proc.rb +1 -1
  345. data/lib/rubocop/cop/style/random_with_offset.rb +5 -10
  346. data/lib/rubocop/cop/style/redundant_assignment.rb +117 -0
  347. data/lib/rubocop/cop/style/redundant_condition.rb +15 -3
  348. data/lib/rubocop/cop/style/redundant_exception.rb +18 -10
  349. data/lib/rubocop/cop/style/redundant_fetch_block.rb +122 -0
  350. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +50 -0
  351. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
  352. data/lib/rubocop/cop/style/redundant_parentheses.rb +8 -2
  353. data/lib/rubocop/cop/style/redundant_percent_q.rb +2 -2
  354. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +4 -3
  355. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +23 -32
  356. data/lib/rubocop/cop/style/redundant_self.rb +6 -9
  357. data/lib/rubocop/cop/style/redundant_sort.rb +26 -12
  358. data/lib/rubocop/cop/style/rescue_standard_error.rb +1 -1
  359. data/lib/rubocop/cop/style/safe_navigation.rb +4 -4
  360. data/lib/rubocop/cop/style/sample.rb +1 -1
  361. data/lib/rubocop/cop/style/semicolon.rb +1 -1
  362. data/lib/rubocop/cop/style/signal_exception.rb +3 -1
  363. data/lib/rubocop/cop/style/single_argument_dig.rb +54 -0
  364. data/lib/rubocop/cop/style/single_line_methods.rb +1 -1
  365. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +3 -2
  366. data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
  367. data/lib/rubocop/cop/style/string_concatenation.rb +92 -0
  368. data/lib/rubocop/cop/style/struct_inheritance.rb +23 -2
  369. data/lib/rubocop/cop/style/symbol_array.rb +6 -6
  370. data/lib/rubocop/cop/style/symbol_proc.rb +2 -2
  371. data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
  372. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +9 -32
  373. data/lib/rubocop/cop/style/trivial_accessors.rb +8 -7
  374. data/lib/rubocop/cop/style/word_array.rb +1 -1
  375. data/lib/rubocop/cop/style/yoda_condition.rb +18 -1
  376. data/lib/rubocop/cop/style/zero_length_predicate.rb +12 -8
  377. data/lib/rubocop/cop/team.rb +98 -82
  378. data/lib/rubocop/cop/tokens_util.rb +84 -0
  379. data/lib/rubocop/cop/util.rb +5 -15
  380. data/lib/rubocop/cop/utils/format_string.rb +2 -3
  381. data/lib/rubocop/cop/variable_force/branch.rb +1 -0
  382. data/lib/rubocop/cop/variable_force/variable.rb +7 -5
  383. data/lib/rubocop/cop/variable_force.rb +0 -2
  384. data/lib/rubocop/cops_documentation_generator.rb +282 -0
  385. data/lib/rubocop/error.rb +1 -0
  386. data/lib/rubocop/file_finder.rb +12 -12
  387. data/lib/rubocop/formatter/disabled_config_formatter.rb +3 -3
  388. data/lib/rubocop/formatter/formatter_set.rb +2 -1
  389. data/lib/rubocop/formatter/junit_formatter.rb +1 -1
  390. data/lib/rubocop/name_similarity.rb +7 -3
  391. data/lib/rubocop/options.rb +18 -11
  392. data/lib/rubocop/path_util.rb +19 -19
  393. data/lib/rubocop/platform.rb +1 -1
  394. data/lib/rubocop/rake_task.rb +7 -9
  395. data/lib/rubocop/result_cache.rb +12 -8
  396. data/lib/rubocop/rspec/cop_helper.rb +4 -4
  397. data/lib/rubocop/rspec/expect_offense.rb +63 -22
  398. data/lib/rubocop/rspec/shared_contexts.rb +16 -17
  399. data/lib/rubocop/runner.rb +35 -34
  400. data/lib/rubocop/target_finder.rb +14 -11
  401. data/lib/rubocop/target_ruby.rb +2 -2
  402. data/lib/rubocop/version.rb +2 -2
  403. data/lib/rubocop.rb +33 -5
  404. metadata +49 -11
  405. data/lib/rubocop/cop/lint/useless_comparison.rb +0 -28
  406. data/lib/rubocop/cop/mixin/classish_length.rb +0 -37
  407. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +0 -37
  408. data/lib/rubocop/cop/mixin/too_many_lines.rb +0 -35
  409. data/lib/rubocop/cop/style/method_missing_super.rb +0 -34
@@ -19,6 +19,15 @@ module RuboCop
19
19
  # @@test = 10
20
20
  # end
21
21
  #
22
+ # class A
23
+ # def self.test(name, value)
24
+ # class_variable_set("@@#{name}", value)
25
+ # end
26
+ # end
27
+ #
28
+ # class A; end
29
+ # A.class_variable_set(:@@test, 10)
30
+ #
22
31
  # # good
23
32
  # class A
24
33
  # @test = 10
@@ -30,17 +39,25 @@ module RuboCop
30
39
  # end
31
40
  # end
32
41
  #
33
- class ClassVars < Cop
34
- MSG = 'Replace class var %<class_var>s with a class ' \
35
- 'instance var.'
42
+ # class A
43
+ # def self.test(name)
44
+ # class_variable_get("@@#{name}") # you can access without offense
45
+ # end
46
+ # end
47
+ #
48
+ class ClassVars < Base
49
+ MSG = 'Replace class var %<class_var>s with a class instance var.'
36
50
 
37
51
  def on_cvasgn(node)
38
- add_offense(node, location: :name)
52
+ add_offense(node.loc.name, message: format(MSG, class_var: node.children.first))
39
53
  end
40
54
 
41
- def message(node)
42
- class_var, = *node
43
- format(MSG, class_var: class_var)
55
+ def on_send(node)
56
+ return unless node.method?(:class_variable_set)
57
+
58
+ add_offense(
59
+ node.first_argument, message: format(MSG, class_var: node.first_argument.source)
60
+ )
44
61
  end
45
62
  end
46
63
  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
@@ -75,8 +75,9 @@ module RuboCop
75
75
  # @example AllowInnerBackticks: true
76
76
  # # good
77
77
  # `echo \`ls\``
78
- class CommandLiteral < Cop
78
+ class CommandLiteral < Base
79
79
  include ConfigurableEnforcedStyle
80
+ extend AutoCorrector
80
81
 
81
82
  MSG_USE_BACKTICKS = 'Use backticks around command string.'
82
83
  MSG_USE_PERCENT_X = 'Use `%x` around command string.'
@@ -85,43 +86,41 @@ module RuboCop
85
86
  return if node.heredoc?
86
87
 
87
88
  if backtick_literal?(node)
88
- check_backtick_literal(node)
89
+ check_backtick_literal(node, MSG_USE_PERCENT_X)
89
90
  else
90
- check_percent_x_literal(node)
91
- end
92
- end
93
-
94
- def autocorrect(node)
95
- return if contains_backtick?(node)
96
-
97
- replacement = if backtick_literal?(node)
98
- ['%x', ''].zip(preferred_delimiter).map(&:join)
99
- else
100
- %w[` `]
101
- end
102
-
103
- lambda do |corrector|
104
- corrector.replace(node.loc.begin, replacement.first)
105
- corrector.replace(node.loc.end, replacement.last)
91
+ check_percent_x_literal(node, MSG_USE_BACKTICKS)
106
92
  end
107
93
  end
108
94
 
109
95
  private
110
96
 
111
- def check_backtick_literal(node)
97
+ def check_backtick_literal(node, message)
112
98
  return if allowed_backtick_literal?(node)
113
99
 
114
- add_offense(node)
100
+ add_offense(node, message: message) do |corrector|
101
+ autocorrect(corrector, node)
102
+ end
115
103
  end
116
104
 
117
- def check_percent_x_literal(node)
105
+ def check_percent_x_literal(node, message)
118
106
  return if allowed_percent_x_literal?(node)
119
107
 
120
- add_offense(node)
108
+ add_offense(node, message: message) do |corrector|
109
+ autocorrect(corrector, node)
110
+ end
121
111
  end
122
112
 
123
- def message(node)
124
- backtick_literal?(node) ? MSG_USE_PERCENT_X : MSG_USE_BACKTICKS
113
+ def autocorrect(corrector, node)
114
+ return if contains_backtick?(node)
115
+
116
+ replacement = if backtick_literal?(node)
117
+ ['%x', ''].zip(preferred_delimiter).map(&:join)
118
+ else
119
+ %w[` `]
120
+ end
121
+
122
+ corrector.replace(node.loc.begin, replacement.first)
123
+ corrector.replace(node.loc.end, replacement.last)
125
124
  end
126
125
 
127
126
  def allowed_backtick_literal?(node)
@@ -153,7 +152,7 @@ module RuboCop
153
152
  end
154
153
 
155
154
  def contains_backtick?(node)
156
- node_body(node) =~ /`/
155
+ /`/.match?(node_body(node))
157
156
  end
158
157
 
159
158
  def node_body(node)
@@ -30,9 +30,10 @@ module RuboCop
30
30
  #
31
31
  # # good
32
32
  # # OPTIMIZE: does not work
33
- class CommentAnnotation < Cop
33
+ class CommentAnnotation < Base
34
34
  include AnnotationComment
35
35
  include RangeHelp
36
+ extend AutoCorrector
36
37
 
37
38
  MSG = 'Annotation keywords like `%<keyword>s` should be all ' \
38
39
  'upper case, followed by a colon, and a space, ' \
@@ -40,7 +41,7 @@ module RuboCop
40
41
  MISSING_NOTE = 'Annotation comment, with keyword `%<keyword>s`, ' \
41
42
  'is missing a note.'
42
43
 
43
- def investigate(processed_source)
44
+ def on_new_investigation
44
45
  processed_source.comments.each_with_index do |comment, index|
45
46
  next unless first_comment_line?(processed_source.comments, index) ||
46
47
  inline_comment?(comment)
@@ -49,26 +50,25 @@ module RuboCop
49
50
  next unless annotation?(comment) &&
50
51
  !correct_annotation?(first_word, colon, space, note)
51
52
 
52
- add_offense(
53
- comment,
54
- location: annotation_range(comment, margin,
55
- first_word, colon, space),
56
- message: format(note ? MSG : MISSING_NOTE, keyword: first_word)
57
- )
53
+ range = annotation_range(comment, margin, first_word, colon, space)
54
+
55
+ register_offense(range, note, first_word)
58
56
  end
59
57
  end
60
58
 
61
- def autocorrect(comment)
62
- margin, first_word, colon, space, note = split_comment(comment)
63
- return if note.nil?
59
+ private
64
60
 
65
- range = annotation_range(comment, margin, first_word, colon, space)
61
+ def register_offense(range, note, first_word)
62
+ add_offense(
63
+ range,
64
+ message: format(note ? MSG : MISSING_NOTE, keyword: first_word)
65
+ ) do |corrector|
66
+ next if note.nil?
66
67
 
67
- ->(corrector) { corrector.replace(range, "#{first_word.upcase}: ") }
68
+ corrector.replace(range, "#{first_word.upcase}: ")
69
+ end
68
70
  end
69
71
 
70
- private
71
-
72
72
  def first_comment_line?(comments, index)
73
73
  index.zero? ||
74
74
  comments[index - 1].loc.line < comments[index].loc.line - 1
@@ -38,7 +38,7 @@ module RuboCop
38
38
  '`%<keyword>s` keyword.'
39
39
 
40
40
  def investigate(processed_source)
41
- processed_source.each_comment do |comment|
41
+ processed_source.comments.each do |comment|
42
42
  add_offense(comment) if offensive?(comment)
43
43
  end
44
44
  end
@@ -46,17 +46,20 @@ module RuboCop
46
46
  private
47
47
 
48
48
  KEYWORDS = %w[begin class def end module].freeze
49
+ KEYWORD_REGEXES = KEYWORDS.map { |w| /^\s*#{w}\s/ }.freeze
50
+
49
51
  ALLOWED_COMMENTS = %w[
50
52
  :nodoc:
51
53
  :yields:
52
54
  rubocop:disable
53
55
  rubocop:todo
54
56
  ].freeze
57
+ ALLOWED_COMMENT_REGEXES = ALLOWED_COMMENTS.map { |c| /#\s*#{c}/ }.freeze
55
58
 
56
59
  def offensive?(comment)
57
60
  line = line(comment)
58
- KEYWORDS.any? { |word| line =~ /^\s*#{word}\s/ } &&
59
- ALLOWED_COMMENTS.none? { |c| line =~ /#\s*#{c}/ }
61
+ KEYWORD_REGEXES.any? { |r| r.match?(line) } &&
62
+ ALLOWED_COMMENT_REGEXES.none? { |r| r.match?(line) }
60
63
  end
61
64
 
62
65
  def message(comment)
@@ -30,7 +30,7 @@ module RuboCop
30
30
  end
31
31
 
32
32
  def tail(branch)
33
- branch.begin_type? ? [*branch].last : branch
33
+ branch.begin_type? ? Array(branch).last : branch
34
34
  end
35
35
 
36
36
  # rubocop:disable Metrics/AbcSize
@@ -43,7 +43,7 @@ module RuboCop
43
43
  when :and_asgn, :or_asgn
44
44
  "#{node.children[0].source} #{node.loc.operator.source} "
45
45
  when :casgn
46
- "#{node.children[1]} = "
46
+ lhs_for_casgn(node)
47
47
  when *ConditionalAssignment::VARIABLE_ASSIGNMENT_TYPES
48
48
  "#{node.children[0]} = "
49
49
  else
@@ -93,6 +93,15 @@ module RuboCop
93
93
  end
94
94
  end
95
95
 
96
+ def lhs_for_casgn(node)
97
+ namespace = node.children[0]
98
+ if namespace.nil? || namespace.cbase_type?
99
+ "#{namespace&.source}#{node.children[1]} = "
100
+ else
101
+ "#{namespace.source}::#{node.children[1]} = "
102
+ end
103
+ end
104
+
96
105
  def setter_method?(method_name)
97
106
  method_name.to_s.end_with?(EQUAL) &&
98
107
  !%i[!= == === >= <=].include?(method_name)
@@ -224,7 +233,7 @@ module RuboCop
224
233
  def_node_matcher :assignment_type?, <<~PATTERN
225
234
  {
226
235
  #{ASSIGNMENT_TYPES.join(' ')}
227
- (send _recv {:[]= :<< :=~ :!~ :<=> #end_with_eq?} ...)
236
+ (send _recv {:[]= :<< :=~ :!~ :<=> #end_with_eq? :< :>} ...)
228
237
  }
229
238
  PATTERN
230
239
 
@@ -26,7 +26,7 @@ module RuboCop
26
26
  # public_constant :BAZ
27
27
  # end
28
28
  #
29
- class ConstantVisibility < Cop
29
+ class ConstantVisibility < Base
30
30
  MSG = 'Explicitly make `%<constant_name>s` public or private using ' \
31
31
  'either `#public_constant` or `#private_constant`.'
32
32
 
@@ -34,7 +34,8 @@ module RuboCop
34
34
  return unless class_or_module_scope?(node)
35
35
  return if visibility_declaration?(node)
36
36
 
37
- add_offense(node)
37
+ message = message(node)
38
+ add_offense(node, message: message)
38
39
  end
39
40
 
40
41
  private
@@ -15,28 +15,24 @@ module RuboCop
15
15
  # that RuboCop scans, a comment that matches this regex must be found or
16
16
  # an offense is reported.
17
17
  #
18
- class Copyright < Cop
18
+ class Copyright < Base
19
19
  include RangeHelp
20
+ extend AutoCorrector
20
21
 
21
22
  MSG = 'Include a copyright notice matching /%<notice>s/ before ' \
22
23
  'any code.'
23
24
  AUTOCORRECT_EMPTY_WARNING = 'An AutocorrectNotice must be defined in ' \
24
25
  'your RuboCop config'
25
26
 
26
- def investigate(processed_source)
27
- return if notice.empty?
28
- return if notice_found?(processed_source)
27
+ def on_new_investigation
28
+ return if notice.empty? || notice_found?(processed_source)
29
29
 
30
- range = source_range(processed_source.buffer, 1, 0)
31
- add_offense(insert_notice_before(processed_source),
32
- location: range, message: format(MSG, notice: notice))
33
- end
34
-
35
- def autocorrect(token)
36
- verify_autocorrect_notice!
30
+ add_offense(offense_range, message: format(MSG, notice: notice)) do |corrector|
31
+ verify_autocorrect_notice!
37
32
 
38
- lambda do |corrector|
33
+ token = insert_notice_before(processed_source)
39
34
  range = token.nil? ? range_between(0, 0) : token.pos
35
+
40
36
  corrector.insert_before(range, "#{autocorrect_notice}\n")
41
37
  end
42
38
  end
@@ -51,6 +47,10 @@ module RuboCop
51
47
  cop_config['AutocorrectNotice']
52
48
  end
53
49
 
50
+ def offense_range
51
+ source_range(processed_source.buffer, 1, 0)
52
+ end
53
+
54
54
  def verify_autocorrect_notice!
55
55
  raise Warning, AUTOCORRECT_EMPTY_WARNING if autocorrect_notice.empty?
56
56
 
@@ -72,14 +72,14 @@ module RuboCop
72
72
  return false if token_index >= processed_source.tokens.size
73
73
 
74
74
  token = processed_source.tokens[token_index]
75
- token.comment? && token.text =~ /^#!.*$/
75
+ token.comment? && /^#!.*$/.match?(token.text)
76
76
  end
77
77
 
78
78
  def encoding_token?(processed_source, token_index)
79
79
  return false if token_index >= processed_source.tokens.size
80
80
 
81
81
  token = processed_source.tokens[token_index]
82
- token.comment? && token.text =~ /^#.*coding\s?[:=]\s?(?:UTF|utf)-8/
82
+ token.comment? && /^#.*coding\s?[:=]\s?(?:UTF|utf)-8/.match?(token.text)
83
83
  end
84
84
 
85
85
  def notice_found?(processed_source)
@@ -88,7 +88,7 @@ module RuboCop
88
88
  processed_source.each_token do |token|
89
89
  break unless token.comment?
90
90
 
91
- notice_found = !(token.text =~ notice_regexp).nil?
91
+ notice_found = notice_regexp.match?(token.text)
92
92
  break if notice_found
93
93
  end
94
94
  notice_found
@@ -41,7 +41,7 @@ module RuboCop
41
41
  #
42
42
  # # good
43
43
  # something.to_time
44
- class DateTime < Cop
44
+ class DateTime < Base
45
45
  CLASS_MSG = 'Prefer Time over DateTime.'
46
46
  COERCION_MSG = 'Do not use #to_datetime.'
47
47
 
@@ -50,7 +50,7 @@ module RuboCop
50
50
  PATTERN
51
51
 
52
52
  def_node_matcher :historic_date?, <<~PATTERN
53
- (send _ _ _ (const (const nil? :Date) _))
53
+ (send _ _ _ (const (const {nil? (cbase)} :Date) _))
54
54
  PATTERN
55
55
 
56
56
  def_node_matcher :to_datetime?, <<~PATTERN
@@ -33,24 +33,22 @@ module RuboCop
33
33
  # def Baz.foo
34
34
  # # does a thing
35
35
  # end
36
- class DefWithParentheses < Cop
36
+ class DefWithParentheses < Base
37
+ extend AutoCorrector
38
+
37
39
  MSG = "Omit the parentheses in defs when the method doesn't accept " \
38
40
  'any arguments.'
39
41
 
40
42
  def on_def(node)
41
43
  return if node.single_line?
42
- return unless !node.arguments? && node.arguments.loc.begin
44
+ return unless !node.arguments? && (node_arguments_loc_begin = node.arguments.loc.begin)
43
45
 
44
- add_offense(node.arguments, location: :begin)
45
- end
46
- alias on_defs on_def
47
-
48
- def autocorrect(node)
49
- lambda do |corrector|
50
- corrector.remove(node.loc.begin)
51
- corrector.remove(node.loc.end)
46
+ add_offense(node_arguments_loc_begin) do |corrector|
47
+ corrector.remove(node_arguments_loc_begin)
48
+ corrector.remove(node.arguments.loc.end)
52
49
  end
53
50
  end
51
+ alias on_defs on_def
54
52
  end
55
53
  end
56
54
  end
@@ -16,24 +16,21 @@ module RuboCop
16
16
  #
17
17
  # # good
18
18
  # path = __dir__
19
- class Dir < Cop
20
- MSG = 'Use `__dir__` to get an absolute path to the current ' \
21
- "file's directory."
19
+ class Dir < Base
20
+ extend AutoCorrector
21
+
22
+ MSG = "Use `__dir__` to get an absolute path to the current file's directory."
22
23
 
23
24
  def_node_matcher :dir_replacement?, <<~PATTERN
24
- {(send (const nil? :File) :expand_path (send (const nil? :File) :dirname #file_keyword?))
25
- (send (const nil? :File) :dirname (send (const nil? :File) :realpath #file_keyword?))}
25
+ {(send (const {nil? cbase} :File) :expand_path (send (const {nil? cbase} :File) :dirname #file_keyword?))
26
+ (send (const {nil? cbase} :File) :dirname (send (const {nil? cbase} :File) :realpath #file_keyword?))}
26
27
  PATTERN
27
28
 
28
29
  def on_send(node)
29
30
  dir_replacement?(node) do
30
- add_offense(node)
31
- end
32
- end
33
-
34
- def autocorrect(node)
35
- lambda do |corrector|
36
- corrector.replace(node, '__dir__')
31
+ add_offense(node) do |corrector|
32
+ corrector.replace(node, '__dir__')
33
+ end
37
34
  end
38
35
  end
39
36
 
@@ -20,28 +20,26 @@ module RuboCop
20
20
  # def fixed_method_name_and_no_rubocop_comments
21
21
  # end
22
22
  #
23
- class DisableCopsWithinSourceCodeDirective < Cop
23
+ class DisableCopsWithinSourceCodeDirective < Base
24
+ extend AutoCorrector
25
+
24
26
  # rubocop:enable Lint/RedundantCopDisableDirective
25
27
  MSG = 'Comment to disable/enable RuboCop.'
26
28
 
27
- def investigate(processed_source)
29
+ def on_new_investigation
28
30
  processed_source.comments.each do |comment|
29
31
  next unless rubocop_directive_comment?(comment)
30
32
 
31
- add_offense(comment)
32
- end
33
- end
34
-
35
- def autocorrect(comment)
36
- lambda do |corrector|
37
- corrector.replace(comment, '')
33
+ add_offense(comment) do |corrector|
34
+ corrector.replace(comment, '')
35
+ end
38
36
  end
39
37
  end
40
38
 
41
39
  private
42
40
 
43
41
  def rubocop_directive_comment?(comment)
44
- comment.text =~ CommentConfig::COMMENT_DIRECTIVE_REGEXP
42
+ CommentConfig::COMMENT_DIRECTIVE_REGEXP.match?(comment.text)
45
43
  end
46
44
  end
47
45
  end
@@ -55,7 +55,7 @@ module RuboCop
55
55
  # Public = Class.new
56
56
  # end
57
57
  #
58
- class Documentation < Cop
58
+ class Documentation < Base
59
59
  include DocumentationComment
60
60
 
61
61
  MSG = 'Missing top-level %<type>s documentation comment.'
@@ -84,9 +84,7 @@ module RuboCop
84
84
  return if compact_namespace?(node) &&
85
85
  nodoc_comment?(outer_module(node).first)
86
86
 
87
- add_offense(node,
88
- location: :keyword,
89
- message: format(MSG, type: type))
87
+ add_offense(node.loc.keyword, message: format(MSG, type: type))
90
88
  end
91
89
 
92
90
  def namespace?(node)
@@ -104,7 +102,7 @@ module RuboCop
104
102
  end
105
103
 
106
104
  def compact_namespace?(node)
107
- node.loc.name.source =~ /::/
105
+ /::/.match?(node.loc.name.source)
108
106
  end
109
107
 
110
108
  # First checks if the :nodoc: comment is associated with the
@@ -112,18 +110,18 @@ module RuboCop
112
110
  # proceeds to check its ancestors for :nodoc: all.
113
111
  # Note: How end-of-line comments are associated with code changed in
114
112
  # parser-2.2.0.4.
115
- def nodoc_comment?(node, require_all = false)
113
+ def nodoc_comment?(node, require_all: false)
116
114
  return false unless node&.children&.first
117
115
 
118
116
  nodoc = nodoc(node)
119
117
 
120
- return true if same_line?(nodoc, node) && nodoc?(nodoc, require_all)
118
+ return true if same_line?(nodoc, node) && nodoc?(nodoc, require_all: require_all)
121
119
 
122
- nodoc_comment?(node.parent, true)
120
+ nodoc_comment?(node.parent, require_all: true)
123
121
  end
124
122
 
125
- def nodoc?(comment, require_all = false)
126
- comment.text =~ /^#\s*:nodoc:#{"\s+all\s*$" if require_all}/
123
+ def nodoc?(comment, require_all: false)
124
+ /^#\s*:nodoc:#{"\s+all\s*$" if require_all}/.match?(comment.text)
127
125
  end
128
126
 
129
127
  def nodoc(node)
@@ -91,7 +91,7 @@ module RuboCop
91
91
  # end
92
92
  # end
93
93
  #
94
- class DocumentationMethod < Cop
94
+ class DocumentationMethod < Base
95
95
  include DocumentationComment
96
96
  include DefNode
97
97