Class: RuboCop::Cop::Style::NonNilCheck
Relationships & Source Files | |
Super Chains via Extension / Inclusion / Inheritance | |
Class Chain:
self,
::RuboCop::Cop::AutoCorrector ,
::RuboCop::Cop::Base ,
::RuboCop::ExcludeLimit ,
NodePattern::Macros,
RuboCop::AST::Sexp
|
|
Instance Chain:
self,
::RuboCop::Cop::Base ,
::RuboCop::Cop::AutocorrectLogic ,
::RuboCop::Cop::IgnoredNode ,
::RuboCop::Util ,
RuboCop::AST::Sexp
|
|
Inherits: |
RuboCop::Cop::Base
|
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.
Constant Summary
-
MSG_FOR_REDUNDANCY =
# File 'lib/rubocop/cop/style/non_nil_check.rb', line 48'Explicit non-nil checks are usually redundant.'
-
MSG_FOR_REPLACEMENT =
# File 'lib/rubocop/cop/style/non_nil_check.rb', line 47'Prefer `%<prefer>s` over `%<current>s`.'
-
RESTRICT_ON_SEND =
# File 'lib/rubocop/cop/style/non_nil_check.rb', line 50%i[!= nil? !].freeze
::RuboCop::Cop::Base
- Inherited
Class Attribute Summary
::RuboCop::Cop::AutoCorrector
- Extended
::RuboCop::Cop::Base
- Inherited
.gem_requirements, .lint?, | |
.support_autocorrect? | Returns if class supports autocorrect. |
.support_multiple_source? | Override if your cop should be called repeatedly for multiple investigations Between calls to |
Class Method Summary
::RuboCop::Cop::Base
- Inherited
.autocorrect_incompatible_with | List of cops that should not try to autocorrect at the same time as this cop. |
.badge | Naming. |
.callbacks_needed, .cop_name, .department, | |
.documentation_url | Returns a url to view this cops documentation online. |
.exclude_from_registry | Call for abstract Cop classes. |
.inherited, | |
.joining_forces | Override and return the Force class(es) you need to join. |
.match? | Returns true if the cop name or the cop namespace matches any of the given names. |
.new, | |
.requires_gem | Register a version requirement for the given gem name. |
.restrict_on_send |
::RuboCop::ExcludeLimit
- Extended
exclude_limit | Sets up a configuration option to have an exclude limit tracked. |
transform |
Instance Attribute Summary
- #include_semantic_changes? ⇒ Boolean readonly private
::RuboCop::Cop::Base
- Inherited
::RuboCop::Cop::AutocorrectLogic
- Included
Instance Method Summary
- #nil_check?(node)
- #not_and_nil_check?(node)
- #not_equal_to_nil?(node)
- #on_def(node) (also: #on_defs)
-
#on_defs(node)
Alias for #on_def.
- #on_send(node)
- #unless_check?(node)
- #autocorrect(corrector, node) private
- #autocorrect_comparison(corrector, node) private
- #autocorrect_non_nil(corrector, node, inner_node) private
- #autocorrect_unless_nil(corrector, node, receiver) private
- #message(node) private
- #nil_comparison_style private
- #register_offense?(node) ⇒ Boolean private
- #unless_and_nil_check?(send_node) ⇒ Boolean private
::RuboCop::Cop::Base
- Inherited
#add_global_offense | Adds an offense that has no particular location. |
#add_offense | Adds an offense on the specified range (or node with an expression) Unless that offense is disabled for this range, a corrector will be yielded to provide the cop the opportunity to autocorrect the offense. |
#begin_investigation | Called before any investigation. |
#callbacks_needed, | |
#cop_config | Configuration Helpers. |
#cop_name, #excluded_file?, | |
#external_dependency_checksum | This method should be overridden when a cop’s behavior depends on state that lives outside of these locations: |
#inspect, | |
#message | Gets called if no message is specified when calling |
#name | Alias for Base#cop_name. |
#offenses, | |
#on_investigation_end | Called after all on_… |
#on_new_investigation | Called before all on_… |
#on_other_file | Called instead of all on_… |
#parse | There should be very limited reasons for a Cop to do it’s own parsing. |
#parser_engine, | |
#ready | Called between investigations. |
#relevant_file?, | |
#target_gem_version | Returns a gems locked versions (i.e. |
#target_rails_version, #target_ruby_version, #annotate, #apply_correction, #attempt_correction, | |
#callback_argument | Reserved for Cop::Cop. |
#complete_investigation | Called to complete an investigation. |
#correct, #current_corrector, | |
#current_offense_locations | Reserved for Commissioner: |
#current_offenses, #currently_disabled_lines, #custom_severity, #default_severity, #disable_uncorrectable, #enabled_line?, #file_name_matches_any?, #find_message, #find_severity, #range_for_original, #range_from_node_or_range, | |
#reset_investigation | Actually private methods. |
#use_corrector |
::RuboCop::Cop::AutocorrectLogic
- Included
#disable_offense, #disable_offense_at_end_of_line, #disable_offense_before_and_after, #disable_offense_with_eol_or_surround_comment, #heredoc_range, #max_line_length, #multiline_ranges, #multiline_string?, | |
#range_by_lines | Expand the given range to include all of any lines it covers. |
#range_of_first_line, #range_overlaps_offense?, #string_continuation?, #surrounding_heredoc?, #surrounding_percent_array? |
::RuboCop::Cop::IgnoredNode
- Included
Constructor Details
This class inherits a constructor from RuboCop::Cop::Base
Instance Attribute Details
#include_semantic_changes? ⇒ Boolean
(readonly, private)
[ GitHub ]
# File 'lib/rubocop/cop/style/non_nil_check.rb', line 119
def include_semantic_changes? cop_config['IncludeSemanticChanges'] end
Instance Method Details
#autocorrect(corrector, node) (private)
[ GitHub ]# File 'lib/rubocop/cop/style/non_nil_check.rb', line 93
def autocorrect(corrector, node) case node.method_name when :!= autocorrect_comparison(corrector, node) when :! autocorrect_non_nil(corrector, node, node.receiver) when :nil? autocorrect_unless_nil(corrector, node, node.receiver) end end
#autocorrect_comparison(corrector, node) (private)
[ GitHub ]# File 'lib/rubocop/cop/style/non_nil_check.rb', line 123
def autocorrect_comparison(corrector, node) expr = node.source new_code = if include_semantic_changes? expr.sub(/\s*!=\s*nil/, '') else expr.sub(/^(\S*)\s*!=\s*nil/, '!\1.nil?') end return if expr == new_code corrector.replace(node, new_code) end
#autocorrect_non_nil(corrector, node, inner_node) (private)
[ GitHub ]# File 'lib/rubocop/cop/style/non_nil_check.rb', line 137
def autocorrect_non_nil(corrector, node, inner_node) if inner_node.receiver corrector.replace(node, inner_node.receiver.source) else corrector.replace(node, 'self') end end
#autocorrect_unless_nil(corrector, node, receiver) (private)
[ GitHub ]# File 'lib/rubocop/cop/style/non_nil_check.rb', line 145
def autocorrect_unless_nil(corrector, node, receiver) corrector.replace(node.parent.loc.keyword, 'if') corrector.replace(node, receiver.source) end
#message(node) (private)
[ GitHub ]# File 'lib/rubocop/cop/style/non_nil_check.rb', line 110
def (node) if node.method?(:!=) && !include_semantic_changes? prefer = "!#{node.receiver.source}.nil?" format(MSG_FOR_REPLACEMENT, prefer: prefer, current: node.source) else MSG_FOR_REDUNDANCY end end
#nil_check?(node)
[ GitHub ]# File 'lib/rubocop/cop/style/non_nil_check.rb', line 59
def_node_matcher :nil_check?, '(send _ :nil?)'
#nil_comparison_style (private)
[ GitHub ]# File 'lib/rubocop/cop/style/non_nil_check.rb', line 150
def nil_comparison_style nil_comparison_conf = config.for_cop('Style/NilComparison') nil_comparison_conf['Enabled'] && nil_comparison_conf['EnforcedStyle'] end
#not_and_nil_check?(node)
[ GitHub ]# 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)
[ GitHub ]# File 'lib/rubocop/cop/style/non_nil_check.rb', line 53
def_node_matcher :not_equal_to_nil?, '(send _ :!= nil)'
#on_def(node) Also known as: #on_defs
[ GitHub ]# 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_defs(node)
Alias for #on_def.
# File 'lib/rubocop/cop/style/non_nil_check.rb', line 84
alias on_defs on_def
#on_send(node)
[ GitHub ]# 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) = (node) add_offense(node, message: ) { |corrector| autocorrect(corrector, node) } end
#register_offense?(node) ⇒ Boolean
(private)
# File 'lib/rubocop/cop/style/non_nil_check.rb', line 88
def register_offense?(node) not_equal_to_nil?(node) || (include_semantic_changes? && (not_and_nil_check?(node) || unless_and_nil_check?(node))) end
#unless_and_nil_check?(send_node) ⇒ Boolean
(private)
# File 'lib/rubocop/cop/style/non_nil_check.rb', line 104
def unless_and_nil_check?(send_node) parent = send_node.parent nil_check?(send_node) && unless_check?(parent) && !parent.ternary? && parent.unless? end
#unless_check?(node)
[ GitHub ]# File 'lib/rubocop/cop/style/non_nil_check.rb', line 56
def_node_matcher :unless_check?, '(if (send _ :nil?) ...)'