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

Inherits:
Cop
  • Object
show all
Defined in:
lib/rubocop/cop/style/non_nil_check.rb

Overview

This cop 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.

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

Constants included from Util

Util::LITERAL_REGEX

Instance Attribute Summary

Attributes inherited from Cop

#config, #corrections, #offenses, #processed_source

Instance Method Summary collapse

Methods inherited from Cop

#add_offense, all, autocorrect_incompatible_with, badge, #config_to_allow_offenses, #config_to_allow_offenses=, #cop_config, cop_name, #cop_name, #correct, department, #disable_uncorrectable, #duplicate_location?, #excluded_file?, #external_dependency_checksum, #find_location, #highlights, inherited, #initialize, #join_force?, lint?, match?, #messages, #parse, qualified_cop_name, #reason_to_not_correct, #relevant_file?, #target_rails_version, #target_ruby_version

Methods included from AST::Sexp

#s

Methods included from NodePattern::Macros

#def_node_matcher, #def_node_search, #node_search, #node_search_all, #node_search_body, #node_search_first

Methods included from AutocorrectLogic

#autocorrect?, #autocorrect_enabled?, #autocorrect_requested?, #correctable?, #disable_offense, #disable_uncorrectable?, #safe_autocorrect?, #support_autocorrect?

Methods included from IgnoredNode

#ignore_node, #ignored_node?, #part_of_ignored_node?

Methods included from Util

begins_its_line?, comment_line?, double_quotes_required?, escape_string, first_part_of_call_chain, interpret_string_escapes, line_range, needs_escaping?, on_node, parentheses?, same_line?, to_string_literal, to_supported_styles, tokens, trim_string_interporation_escape_character

Methods included from PathUtil

absolute?, chdir, hidden_dir?, hidden_file_in_not_hidden_dir?, match_path?, pwd, relative_path, reset_pwd, smart_path

Constructor Details

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

Instance Method Details

#autocorrect(node) ⇒ Object



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

def autocorrect(node)
  case node.method_name
  when :!=
    autocorrect_comparison(node)
  when :!
    autocorrect_non_nil(node, node.receiver)
  when :nil?
    autocorrect_unless_nil(node, node.receiver)
  end
end

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



58
59
60
61
62
63
64
65
66
67
68
# File 'lib/rubocop/cop/style/non_nil_check.rb', line 58

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



47
48
49
50
51
52
53
54
55
56
# File 'lib/rubocop/cop/style/non_nil_check.rb', line 47

def on_send(node)
  return if ignored_node?(node)

  if not_equal_to_nil?(node)
    add_offense(node, location: :selector)
  elsif include_semantic_changes? &&
        (not_and_nil_check?(node) || unless_and_nil_check?(node))
    add_offense(node)
  end
end