rubocop-rails 2.8.1 → 2.9.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 (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