Class: RuboCop::Cop::Lint::RedundantSafeNavigation
- Extended by:
- AutoCorrector
- Includes:
- AllowedMethods, RangeHelp
- Defined in:
- lib/rubocop/cop/lint/redundant_safe_navigation.rb
Overview
Checks for redundant safe navigation calls.
Use cases where a constant, named in camel case for classes and modules is nil
are rare,
and an offense is not detected when the receiver is a snake case constant.
For all receivers, the instance_of?
, kind_of?
, is_a?
, eql?
, respond_to?
,
and equal?
methods are checked by default.
These are customizable with AllowedMethods
option.
The AllowedMethods
option specifies nil-safe methods,
in other words, it is a method that is allowed to skip safe navigation.
Note that the AllowedMethod
option is not an option that specifies methods
for which to suppress (allow) this cop’s check.
In the example below, the safe navigation operator (&.
) is unnecessary
because NilClass
has methods like respond_to?
and is_a?
.
Constant Summary collapse
- MSG =
'Redundant safe navigation detected.'
- NIL_SPECIFIC_METHODS =
(nil.methods - Object.new.methods).to_set.freeze
- SNAKE_CASE =
/\A[[:digit:][:upper:]_]+\z/.freeze
Constants inherited from Base
Instance Attribute Summary
Attributes inherited from Base
Instance Method Summary collapse
-
#on_csend(node) ⇒ Object
rubocop:disable Metrics/AbcSize.
- #respond_to_nil_specific_method?(node) ⇒ Object
Methods included from AutoCorrector
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?, #message, #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
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
Constructor Details
This class inherits a constructor from RuboCop::Cop::Base
Instance Method Details
#on_csend(node) ⇒ Object
rubocop:disable Metrics/AbcSize
78 79 80 81 82 83 84 85 86 |
# File 'lib/rubocop/cop/lint/redundant_safe_navigation.rb', line 78 def on_csend(node) unless node.receiver.const_type? && !node.receiver.source.match?(SNAKE_CASE) return unless check?(node) && allowed_method?(node.method_name) return if respond_to_nil_specific_method?(node) end range = range_between(node.loc.dot.begin_pos, node.source_range.end_pos) add_offense(range) { |corrector| corrector.replace(node.loc.dot, '.') } end |
#respond_to_nil_specific_method?(node) ⇒ Object
73 74 75 |
# File 'lib/rubocop/cop/lint/redundant_safe_navigation.rb', line 73 def_node_matcher :respond_to_nil_specific_method?, <<~PATTERN (csend _ :respond_to? (sym %NIL_SPECIFIC_METHODS)) PATTERN |