rubocop-rails 2.8.1 → 2.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (95) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +16 -0
  3. data/config/default.yml +33 -1
  4. data/lib/rubocop/cop/mixin/active_record_helper.rb +4 -3
  5. data/lib/rubocop/cop/mixin/enforce_superclass.rb +40 -0
  6. data/lib/rubocop/cop/mixin/index_method.rb +8 -11
  7. data/lib/rubocop/cop/rails/action_filter.rb +10 -14
  8. data/lib/rubocop/cop/rails/active_record_aliases.rb +13 -17
  9. data/lib/rubocop/cop/rails/active_record_callbacks_order.rb +17 -12
  10. data/lib/rubocop/cop/rails/active_record_override.rb +1 -1
  11. data/lib/rubocop/cop/rails/active_support_aliases.rb +12 -21
  12. data/lib/rubocop/cop/rails/after_commit_override.rb +1 -1
  13. data/lib/rubocop/cop/rails/application_controller.rb +3 -7
  14. data/lib/rubocop/cop/rails/application_job.rb +2 -1
  15. data/lib/rubocop/cop/rails/application_mailer.rb +2 -7
  16. data/lib/rubocop/cop/rails/application_record.rb +2 -7
  17. data/lib/rubocop/cop/rails/arel_star.rb +41 -0
  18. data/lib/rubocop/cop/rails/assert_not.rb +8 -10
  19. data/lib/rubocop/cop/rails/attribute_default_block_value.rb +90 -0
  20. data/lib/rubocop/cop/rails/belongs_to.rb +9 -18
  21. data/lib/rubocop/cop/rails/blank.rb +27 -27
  22. data/lib/rubocop/cop/rails/bulk_change_table.rb +1 -1
  23. data/lib/rubocop/cop/rails/content_tag.rb +16 -16
  24. data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +2 -1
  25. data/lib/rubocop/cop/rails/date.rb +10 -11
  26. data/lib/rubocop/cop/rails/default_scope.rb +11 -4
  27. data/lib/rubocop/cop/rails/delegate.rb +9 -9
  28. data/lib/rubocop/cop/rails/delegate_allow_blank.rb +7 -8
  29. data/lib/rubocop/cop/rails/dynamic_find_by.rb +12 -11
  30. data/lib/rubocop/cop/rails/enum_hash.rb +11 -10
  31. data/lib/rubocop/cop/rails/enum_uniqueness.rb +2 -1
  32. data/lib/rubocop/cop/rails/environment_comparison.rb +18 -14
  33. data/lib/rubocop/cop/rails/exit.rb +4 -10
  34. data/lib/rubocop/cop/rails/file_path.rb +4 -3
  35. data/lib/rubocop/cop/rails/find_by.rb +13 -13
  36. data/lib/rubocop/cop/rails/find_by_id.rb +12 -21
  37. data/lib/rubocop/cop/rails/find_each.rb +16 -14
  38. data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +3 -2
  39. data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +3 -2
  40. data/lib/rubocop/cop/rails/helper_instance_variable.rb +2 -2
  41. data/lib/rubocop/cop/rails/http_positional_arguments.rb +19 -21
  42. data/lib/rubocop/cop/rails/http_status.rb +7 -9
  43. data/lib/rubocop/cop/rails/ignored_skip_action_filter_option.rb +8 -6
  44. data/lib/rubocop/cop/rails/index_by.rb +2 -1
  45. data/lib/rubocop/cop/rails/index_with.rb +2 -1
  46. data/lib/rubocop/cop/rails/inquiry.rb +4 -3
  47. data/lib/rubocop/cop/rails/inverse_of.rb +3 -2
  48. data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +17 -15
  49. data/lib/rubocop/cop/rails/link_to_blank.rb +20 -22
  50. data/lib/rubocop/cop/rails/mailer_name.rb +19 -13
  51. data/lib/rubocop/cop/rails/match_route.rb +14 -13
  52. data/lib/rubocop/cop/rails/negate_include.rb +10 -8
  53. data/lib/rubocop/cop/rails/not_null_column.rb +2 -1
  54. data/lib/rubocop/cop/rails/order_by_id.rb +1 -2
  55. data/lib/rubocop/cop/rails/output.rb +5 -2
  56. data/lib/rubocop/cop/rails/output_safety.rb +3 -2
  57. data/lib/rubocop/cop/rails/pick.rb +14 -12
  58. data/lib/rubocop/cop/rails/pluck.rb +6 -9
  59. data/lib/rubocop/cop/rails/pluck_id.rb +4 -6
  60. data/lib/rubocop/cop/rails/pluck_in_where.rb +7 -7
  61. data/lib/rubocop/cop/rails/pluralization_grammar.rb +10 -14
  62. data/lib/rubocop/cop/rails/presence.rb +12 -13
  63. data/lib/rubocop/cop/rails/present.rb +30 -24
  64. data/lib/rubocop/cop/rails/rake_environment.rb +8 -10
  65. data/lib/rubocop/cop/rails/read_write_attribute.rb +12 -11
  66. data/lib/rubocop/cop/rails/redundant_allow_nil.rb +29 -31
  67. data/lib/rubocop/cop/rails/redundant_foreign_key.rb +9 -12
  68. data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +11 -10
  69. data/lib/rubocop/cop/rails/reflection_class_name.rb +3 -2
  70. data/lib/rubocop/cop/rails/refute_methods.rb +9 -10
  71. data/lib/rubocop/cop/rails/relative_date_constant.rb +16 -8
  72. data/lib/rubocop/cop/rails/render_inline.rb +2 -1
  73. data/lib/rubocop/cop/rails/render_plain_text.rb +9 -14
  74. data/lib/rubocop/cop/rails/request_referer.rb +7 -7
  75. data/lib/rubocop/cop/rails/reversible_migration.rb +2 -6
  76. data/lib/rubocop/cop/rails/safe_navigation.rb +11 -10
  77. data/lib/rubocop/cop/rails/safe_navigation_with_blank.rb +5 -10
  78. data/lib/rubocop/cop/rails/save_bang.rb +17 -20
  79. data/lib/rubocop/cop/rails/scope_args.rb +2 -1
  80. data/lib/rubocop/cop/rails/short_i18n.rb +7 -9
  81. data/lib/rubocop/cop/rails/skips_model_validations.rb +4 -4
  82. data/lib/rubocop/cop/rails/squished_sql_heredocs.rb +5 -6
  83. data/lib/rubocop/cop/rails/time_zone.rb +22 -20
  84. data/lib/rubocop/cop/rails/uniq_before_pluck.rb +4 -6
  85. data/lib/rubocop/cop/rails/unique_validation_without_index.rb +2 -2
  86. data/lib/rubocop/cop/rails/unknown_env.rb +2 -2
  87. data/lib/rubocop/cop/rails/validation.rb +15 -14
  88. data/lib/rubocop/cop/rails/where_equals.rb +94 -0
  89. data/lib/rubocop/cop/rails/where_exists.rb +8 -13
  90. data/lib/rubocop/cop/rails/where_not.rb +5 -16
  91. data/lib/rubocop/cop/rails_cops.rb +4 -0
  92. data/lib/rubocop/rails/schema_loader.rb +4 -4
  93. data/lib/rubocop/rails/schema_loader/schema.rb +1 -1
  94. data/lib/rubocop/rails/version.rb +5 -1
  95. metadata +19 -9
@@ -23,7 +23,9 @@ module RuboCop
23
23
  # class UserMailer < ApplicationMailer
24
24
  # end
25
25
  #
26
- class MailerName < Cop
26
+ class MailerName < Base
27
+ extend AutoCorrector
28
+
27
29
  MSG = 'Mailer should end with `Mailer` suffix.'
28
30
 
29
31
  def_node_matcher :mailer_base_class?, <<~PATTERN
@@ -43,7 +45,9 @@ module RuboCop
43
45
 
44
46
  def on_class(node)
45
47
  class_definition?(node) do |name_node|
46
- add_offense(name_node)
48
+ add_offense(name_node) do |corrector|
49
+ autocorrect(corrector, name_node)
50
+ end
47
51
  end
48
52
  end
49
53
 
@@ -54,23 +58,25 @@ module RuboCop
54
58
  return unless casgn_parent
55
59
 
56
60
  name = casgn_parent.children[1]
57
- add_offense(casgn_parent, location: :name) unless mailer_suffix?(name)
58
- end
61
+ return if mailer_suffix?(name)
59
62
 
60
- def autocorrect(node)
61
- lambda do |corrector|
62
- if node.casgn_type?
63
- name = node.children[1]
64
- corrector.replace(node.loc.name, "#{name}Mailer")
65
- else
66
- name = node.children.last
67
- corrector.replace(node.source_range, "#{name}Mailer")
68
- end
63
+ add_offense(casgn_parent.loc.name) do |corrector|
64
+ autocorrect(corrector, casgn_parent)
69
65
  end
70
66
  end
71
67
 
72
68
  private
73
69
 
70
+ def autocorrect(corrector, node)
71
+ if node.casgn_type?
72
+ name = node.children[1]
73
+ corrector.replace(node.loc.name, "#{name}Mailer")
74
+ else
75
+ name = node.children.last
76
+ corrector.replace(node.source_range, "#{name}Mailer")
77
+ end
78
+ end
79
+
74
80
  def mailer_suffix?(mailer_name)
75
81
  mailer_name.to_s.end_with?('Mailer')
76
82
  end
@@ -20,8 +20,11 @@ module RuboCop
20
20
  # match 'photos/:id', to: 'photos#show', via: [:get, :post]
21
21
  # match 'photos/:id', to: 'photos#show', via: :all
22
22
  #
23
- class MatchRoute < Cop
23
+ class MatchRoute < Base
24
+ extend AutoCorrector
25
+
24
26
  MSG = 'Use `%<http_method>s` instead of `match` to define a route.'
27
+ RESTRICT_ON_SEND = %i[match].freeze
25
28
  HTTP_METHODS = %i[get post put patch delete].freeze
26
29
 
27
30
  def_node_matcher :match_method_call?, <<~PATTERN
@@ -35,30 +38,28 @@ module RuboCop
35
38
  options_node = path_node.hash_type? ? path_node : options_node.first
36
39
 
37
40
  if options_node.nil?
38
- message = format(MSG, http_method: 'get')
39
- add_offense(node, message: message)
41
+ register_offense(node, 'get')
40
42
  else
41
43
  via = extract_via(options_node)
42
- if via.size == 1 && http_method?(via.first)
43
- message = format(MSG, http_method: via.first)
44
- add_offense(node, message: message)
45
- end
44
+ return unless via.size == 1 && http_method?(via.first)
45
+
46
+ register_offense(node, via.first)
46
47
  end
47
48
  end
48
49
  end
49
50
 
50
- def autocorrect(node)
51
- match_method_call?(node) do |path_node, options_node|
52
- options_node = options_node.first
51
+ private
52
+
53
+ def register_offense(node, http_method)
54
+ add_offense(node, message: format(MSG, http_method: http_method)) do |corrector|
55
+ match_method_call?(node) do |path_node, options_node|
56
+ options_node = options_node.first
53
57
 
54
- lambda do |corrector|
55
58
  corrector.replace(node, replacement(path_node, options_node))
56
59
  end
57
60
  end
58
61
  end
59
62
 
60
- private
61
-
62
63
  def_node_matcher :routes_draw?, <<~PATTERN
63
64
  (send (send _ :routes) :draw)
64
65
  PATTERN
@@ -6,6 +6,9 @@ module RuboCop
6
6
  # This cop enforces the use of `collection.exclude?(obj)`
7
7
  # over `!collection.include?(obj)`.
8
8
  #
9
+ # It is marked as unsafe by default because false positive will occur for
10
+ # a receiver object that do not have `exclude?` method. (e.g. `IPAddr`)
11
+ #
9
12
  # @example
10
13
  # # bad
11
14
  # !array.include?(2)
@@ -15,22 +18,21 @@ module RuboCop
15
18
  # array.exclude?(2)
16
19
  # hash.exclude?(:key)
17
20
  #
18
- class NegateInclude < Cop
21
+ class NegateInclude < Base
22
+ extend AutoCorrector
23
+
19
24
  MSG = 'Use `.exclude?` and remove the negation part.'
25
+ RESTRICT_ON_SEND = %i[!].freeze
20
26
 
21
27
  def_node_matcher :negate_include_call?, <<~PATTERN
22
28
  (send (send $_ :include? $_) :!)
23
29
  PATTERN
24
30
 
25
31
  def on_send(node)
26
- add_offense(node) if negate_include_call?(node)
27
- end
32
+ return unless (receiver, obj = negate_include_call?(node))
28
33
 
29
- def autocorrect(node)
30
- negate_include_call?(node) do |receiver, obj|
31
- lambda do |corrector|
32
- corrector.replace(node, "#{receiver.source}.exclude?(#{obj.source})")
33
- end
34
+ add_offense(node) do |corrector|
35
+ corrector.replace(node, "#{receiver.source}.exclude?(#{obj.source})")
34
36
  end
35
37
  end
36
38
  end
@@ -16,8 +16,9 @@ module RuboCop
16
16
  # add_column :users, :name, :string, null: false, default: ''
17
17
  # add_reference :products, :category
18
18
  # add_reference :products, :category, null: false, default: 1
19
- class NotNullColumn < Cop
19
+ class NotNullColumn < Base
20
20
  MSG = 'Do not add a NOT NULL column without a default value.'
21
+ RESTRICT_ON_SEND = %i[add_column add_reference].freeze
21
22
 
22
23
  def_node_matcher :add_not_null_column?, <<~PATTERN
23
24
  (send nil? :add_column _ _ _ (hash $...))
@@ -25,6 +25,7 @@ module RuboCop
25
25
 
26
26
  MSG = 'Do not use the `id` column for ordering. '\
27
27
  'Use a timestamp column to order chronologically.'
28
+ RESTRICT_ON_SEND = %i[order].freeze
28
29
 
29
30
  def_node_matcher :order_by_id?, <<~PATTERN
30
31
  (send _ :order
@@ -37,8 +38,6 @@ module RuboCop
37
38
  PATTERN
38
39
 
39
40
  def on_send(node)
40
- return unless node.method?(:order)
41
-
42
41
  add_offense(offense_range(node)) if order_by_id?(node)
43
42
  end
44
43
 
@@ -13,9 +13,12 @@ module RuboCop
13
13
  #
14
14
  # # good
15
15
  # Rails.logger.debug 'A debug message'
16
- class Output < Cop
16
+ class Output < Base
17
17
  MSG = 'Do not write to stdout. ' \
18
18
  "Use Rails's logger if you want to log."
19
+ RESTRICT_ON_SEND = %i[
20
+ ap p pp pretty_print print puts binwrite syswrite write write_nonblock
21
+ ].freeze
19
22
 
20
23
  def_node_matcher :output?, <<~PATTERN
21
24
  (send nil? {:ap :p :pp :pretty_print :print :puts} ...)
@@ -35,7 +38,7 @@ module RuboCop
35
38
  return unless (output?(node) || io_output?(node)) &&
36
39
  node.arguments?
37
40
 
38
- add_offense(node, location: :selector)
41
+ add_offense(node.loc.selector)
39
42
  end
40
43
 
41
44
  private
@@ -62,8 +62,9 @@ module RuboCop
62
62
  # safe_join([user_content, " ", content_tag(:span, user_content)])
63
63
  # # => ActiveSupport::SafeBuffer
64
64
  # # "&lt;b&gt;hi&lt;/b&gt; <span>&lt;b&gt;hi&lt;/b&gt;</span>"
65
- class OutputSafety < Cop
65
+ class OutputSafety < Base
66
66
  MSG = 'Tagging a string as html safe may be a security risk.'
67
+ RESTRICT_ON_SEND = %i[html_safe raw safe_concat].freeze
67
68
 
68
69
  def on_send(node)
69
70
  return if non_interpolated_string?(node)
@@ -72,7 +73,7 @@ module RuboCop
72
73
  looks_like_rails_raw?(node) ||
73
74
  looks_like_rails_safe_concat?(node)
74
75
 
75
- add_offense(node, location: :selector)
76
+ add_offense(node.loc.selector)
76
77
  end
77
78
  alias on_csend on_send
78
79
 
@@ -17,10 +17,12 @@ module RuboCop
17
17
  # # good
18
18
  # Model.pick(:a)
19
19
  # [{ a: :b, c: :d }].pick(:a, :b)
20
- class Pick < Cop
20
+ class Pick < Base
21
+ extend AutoCorrector
21
22
  extend TargetRailsVersion
22
23
 
23
24
  MSG = 'Prefer `pick(%<args>s)` over `pluck(%<args>s).first`.'
25
+ RESTRICT_ON_SEND = %i[first].freeze
24
26
 
25
27
  minimum_target_rails_version 6.0
26
28
 
@@ -30,24 +32,24 @@ module RuboCop
30
32
 
31
33
  def on_send(node)
32
34
  pick_candidate?(node) do
33
- range = node.receiver.loc.selector.join(node.loc.selector)
34
- add_offense(node, location: range)
35
- end
36
- end
35
+ receiver = node.receiver
36
+ receiver_selector = receiver.loc.selector
37
+ node_selector = node.loc.selector
38
+ range = receiver_selector.join(node_selector)
37
39
 
38
- def autocorrect(node)
39
- first_range = node.receiver.source_range.end.join(node.loc.selector)
40
+ add_offense(range, message: message(receiver)) do |corrector|
41
+ first_range = receiver.source_range.end.join(node_selector)
40
42
 
41
- lambda do |corrector|
42
- corrector.remove(first_range)
43
- corrector.replace(node.receiver.loc.selector, 'pick')
43
+ corrector.remove(first_range)
44
+ corrector.replace(receiver_selector, 'pick')
45
+ end
44
46
  end
45
47
  end
46
48
 
47
49
  private
48
50
 
49
- def message(node)
50
- format(MSG, args: node.receiver.arguments.map(&:source).join(', '))
51
+ def message(receiver)
52
+ format(MSG, args: receiver.arguments.map(&:source).join(', '))
51
53
  end
52
54
  end
53
55
  end
@@ -17,7 +17,8 @@ module RuboCop
17
17
  # # good
18
18
  # Post.published.pluck(:title)
19
19
  # [{ a: :b, c: :d }].pluck(:a)
20
- class Pluck < Cop
20
+ class Pluck < Base
21
+ extend AutoCorrector
21
22
  extend TargetRailsVersion
22
23
 
23
24
  MSG = 'Prefer `pluck(:%<value>s)` over `%<method>s { |%<argument>s| %<element>s[:%<value>s] }`.'
@@ -32,15 +33,11 @@ module RuboCop
32
33
  pluck_candidate?(node) do |method, argument, element, value|
33
34
  next unless argument == element
34
35
 
35
- add_offense(node, location: offense_range(node), message: message(method, argument, element, value))
36
- end
37
- end
38
-
39
- def autocorrect(node)
40
- _method, _argument, _element, value = pluck_candidate?(node)
36
+ message = message(method, argument, element, value)
41
37
 
42
- lambda do |corrector|
43
- corrector.replace(offense_range(node), "pluck(:#{value})")
38
+ add_offense(offense_range(node), message: message) do |corrector|
39
+ corrector.replace(offense_range(node), "pluck(:#{value})")
40
+ end
44
41
  end
45
42
  end
46
43
 
@@ -22,11 +22,13 @@ module RuboCop
22
22
  # ids
23
23
  # end
24
24
  #
25
- class PluckId < Cop
25
+ class PluckId < Base
26
26
  include RangeHelp
27
27
  include ActiveRecordHelper
28
+ extend AutoCorrector
28
29
 
29
30
  MSG = 'Use `ids` instead of `%<bad_method>s`.'
31
+ RESTRICT_ON_SEND = %i[pluck].freeze
30
32
 
31
33
  def_node_matcher :pluck_id_call?, <<~PATTERN
32
34
  (send _ :pluck {(sym :id) (send nil? :primary_key)})
@@ -38,11 +40,7 @@ module RuboCop
38
40
  range = offense_range(node)
39
41
  message = format(MSG, bad_method: range.source)
40
42
 
41
- add_offense(node, location: range, message: message)
42
- end
43
-
44
- def autocorrect(node)
45
- lambda do |corrector|
43
+ add_offense(range, message: message) do |corrector|
46
44
  corrector.replace(offense_range(node), 'ids')
47
45
  end
48
46
  end
@@ -34,22 +34,22 @@ module RuboCop
34
34
  # # bad
35
35
  # Post.where(user_id: active_users.pluck(:id))
36
36
  #
37
- class PluckInWhere < Cop
37
+ class PluckInWhere < Base
38
38
  include ActiveRecordHelper
39
39
  include ConfigurableEnforcedStyle
40
+ extend AutoCorrector
40
41
 
41
42
  MSG = 'Use `select` instead of `pluck` within `where` query method.'
43
+ RESTRICT_ON_SEND = %i[pluck].freeze
42
44
 
43
45
  def on_send(node)
44
- return unless node.method?(:pluck) && in_where?(node)
46
+ return unless in_where?(node)
45
47
  return if style == :conservative && !root_receiver(node)&.const_type?
46
48
 
47
- add_offense(node, location: :selector)
48
- end
49
+ range = node.loc.selector
49
50
 
50
- def autocorrect(node)
51
- lambda do |corrector|
52
- corrector.replace(node.loc.selector, 'select')
51
+ add_offense(range) do |corrector|
52
+ corrector.replace(range, 'select')
53
53
  end
54
54
  end
55
55
 
@@ -14,7 +14,9 @@ module RuboCop
14
14
  # # good
15
15
  # 3.days.ago
16
16
  # 1.month.ago
17
- class PluralizationGrammar < Cop
17
+ class PluralizationGrammar < Base
18
+ extend AutoCorrector
19
+
18
20
  SINGULAR_DURATION_METHODS = { second: :seconds,
19
21
  minute: :minutes,
20
22
  hour: :hours,
@@ -24,21 +26,18 @@ module RuboCop
24
26
  month: :months,
25
27
  year: :years }.freeze
26
28
 
29
+ RESTRICT_ON_SEND = SINGULAR_DURATION_METHODS.keys + SINGULAR_DURATION_METHODS.values
30
+
27
31
  PLURAL_DURATION_METHODS = SINGULAR_DURATION_METHODS.invert.freeze
28
32
 
29
33
  MSG = 'Prefer `%<number>s.%<correct>s`.'
30
34
 
31
35
  def on_send(node)
32
- return unless duration_method?(node.method_name)
33
- return unless literal_number?(node.receiver)
36
+ return unless duration_method?(node.method_name) && literal_number?(node.receiver) && offense?(node)
34
37
 
35
- return unless offense?(node)
36
-
37
- add_offense(node)
38
- end
38
+ number, = *node.receiver
39
39
 
40
- def autocorrect(node)
41
- lambda do |corrector|
40
+ add_offense(node, message: message(number, node.method_name)) do |corrector|
42
41
  method_name = node.loc.selector.source
43
42
 
44
43
  corrector.replace(node.loc.selector, correct_method(method_name))
@@ -47,11 +46,8 @@ module RuboCop
47
46
 
48
47
  private
49
48
 
50
- def message(node)
51
- number, = *node.receiver
52
-
53
- format(MSG, number: number,
54
- correct: correct_method(node.method_name.to_s))
49
+ def message(number, method_name)
50
+ format(MSG, number: number, correct: correct_method(method_name))
55
51
  end
56
52
 
57
53
  def correct_method(method_name)
@@ -37,8 +37,9 @@ module RuboCop
37
37
  #
38
38
  # # good
39
39
  # a.presence || b
40
- class Presence < Cop
40
+ class Presence < Base
41
41
  include RangeHelp
42
+ extend AutoCorrector
42
43
 
43
44
  MSG = 'Use `%<prefer>s` instead of `%<current>s`.'
44
45
 
@@ -76,28 +77,26 @@ module RuboCop
76
77
  return if ignore_if_node?(node)
77
78
 
78
79
  redundant_receiver_and_other(node) do |receiver, other|
79
- add_offense(node, message: message(node, receiver, other)) unless ignore_other_node?(other) || receiver.nil?
80
+ return if ignore_other_node?(other) || receiver.nil?
81
+
82
+ register_offense(node, receiver, other)
80
83
  end
81
84
 
82
85
  redundant_negative_receiver_and_other(node) do |receiver, other|
83
- add_offense(node, message: message(node, receiver, other)) unless ignore_other_node?(other) || receiver.nil?
86
+ return if ignore_other_node?(other) || receiver.nil?
87
+
88
+ register_offense(node, receiver, other)
84
89
  end
85
90
  end
86
91
 
87
- def autocorrect(node)
88
- lambda do |corrector|
89
- redundant_receiver_and_other(node) do |receiver, other|
90
- corrector.replace(node.source_range, replacement(receiver, other))
91
- end
92
+ private
92
93
 
93
- redundant_negative_receiver_and_other(node) do |receiver, other|
94
- corrector.replace(node.source_range, replacement(receiver, other))
95
- end
94
+ def register_offense(node, receiver, other)
95
+ add_offense(node, message: message(node, receiver, other)) do |corrector|
96
+ corrector.replace(node.source_range, replacement(receiver, other))
96
97
  end
97
98
  end
98
99
 
99
- private
100
-
101
100
  def ignore_if_node?(node)
102
101
  node.elsif?
103
102
  end