Class: RuboCop::Cop::Style::NonNilCheck

Inherits:
Base
  • Object
show all
Extended by:
AutoCorrector
Defined in:
lib/rubocop/cop/style/non_nil_check.rb

Overview

Checks for non-nil checks, which are usually redundant.

With IncludeSemanticChanges set to false by default, this cop does not report offenses for !x.nil? and does no changes that might change behavior. Also IncludeSemanticChanges set to false with EnforcedStyle: comparison of Style/NilComparison cop, this cop does not report offenses for x != nil and does no changes to !x.nil? style.

With IncludeSemanticChanges set to true, this cop reports offenses for !x.nil? and autocorrects that and x != nil to solely x, which is usually OK, but might change behavior.

Examples:

# bad
if x != nil
end

# good
if x
end

# Non-nil checks are allowed if they are the final nodes of predicate.
# good
def signed_in?
  !current_user.nil?
end

IncludeSemanticChanges: false (default)

# good
if !x.nil?
end

IncludeSemanticChanges: true

# bad
if !x.nil?
end

Constant Summary collapse

MSG_FOR_REPLACEMENT =
'Prefer `%<prefer>s` over `%<current>s`.'
MSG_FOR_REDUNDANCY =
'Explicit non-nil checks are usually redundant.'
RESTRICT_ON_SEND =
%i[!= nil? !].freeze

Instance Attribute Summary

Attributes inherited from Base

#config, #processed_source

Instance Method Summary collapse

Methods included from AutoCorrector

support_autocorrect?

Methods inherited from Base

#active_support_extensions_enabled?, #add_global_offense, #add_offense, autocorrect_incompatible_with, badge, #begin_investigation, callbacks_needed, #callbacks_needed, #config_to_allow_offenses, #config_to_allow_offenses=, #cop_config, cop_name, #cop_name, department, documentation_url, exclude_from_registry, #excluded_file?, #external_dependency_checksum, inherited, #initialize, #inspect, joining_forces, lint?, match?, #offenses, #on_investigation_end, #on_new_investigation, #on_other_file, #parse, #ready, #relevant_file?, support_autocorrect?, support_multiple_source?, #target_rails_version, #target_ruby_version

Methods included from ExcludeLimit

#exclude_limit

Methods included from AutocorrectLogic

#autocorrect?, #autocorrect_enabled?, #autocorrect_requested?, #autocorrect_with_disable_uncorrectable?, #correctable?, #disable_uncorrectable?, #safe_autocorrect?

Methods included from IgnoredNode

#ignore_node, #ignored_node?, #part_of_ignored_node?

Methods included from Util

silence_warnings

Constructor Details

This class inherits a constructor from RuboCop::Cop::Base

Instance Method Details

#nil_check?(node) ⇒ Object



59
# File 'lib/rubocop/cop/style/non_nil_check.rb', line 59

def_node_matcher :nil_check?, '(send _ :nil?)'

#not_and_nil_check?(node) ⇒ Object



62
# File 'lib/rubocop/cop/style/non_nil_check.rb', line 62

def_node_matcher :not_and_nil_check?, '(send (send _ :nil?) :!)'

#not_equal_to_nil?(node) ⇒ Object



53
# File 'lib/rubocop/cop/style/non_nil_check.rb', line 53

def_node_matcher :not_equal_to_nil?, '(send _ :!= nil)'

#on_def(node) ⇒ Object Also known as: on_defs



73
74
75
76
77
78
79
80
81
82
83
# File 'lib/rubocop/cop/style/non_nil_check.rb', line 73

def on_def(node)
  body = node.body

  return unless node.predicate_method? && body

  if body.begin_type?
    ignore_node(body.children.last)
  else
    ignore_node(body)
  end
end

#on_send(node) ⇒ Object



64
65
66
67
68
69
70
71
# File 'lib/rubocop/cop/style/non_nil_check.rb', line 64

def on_send(node)
  return if ignored_node?(node) ||
            (!include_semantic_changes? && nil_comparison_style == 'comparison')
  return unless register_offense?(node)

  message = message(node)
  add_offense(node, message: message) { |corrector| autocorrect(corrector, node) }
end

#unless_check?(node) ⇒ Object



56
# File 'lib/rubocop/cop/style/non_nil_check.rb', line 56

def_node_matcher :unless_check?, '(if (send _ :nil?) ...)'