class RuboCop::Cop::Style::SafeNavigationChainLength


user.address.zip if user
user&.address&.zip
# good
user&.address&.zip&.upcase
# bad
@example Max: 2 (default)
will suggest ‘foo&.bar&.baz`, which is an offense for the latter.
and this cop is configured with `Max: 1`, then for `foo.bar.baz if foo` the former
E.g. if `Style/SafeNavigation` is configured with `MaxChainLength: 2` (default)
the other proposes.
and their settings are “incompatible”, one of the cops will complain about what
There is a potential interplay with `Style/SafeNavigation` - if both are enabled
returning `nil`.
The longer the chain is, the harder it becomes to track what on it could be
Enforces safe navigation chains length to not exceed the configured maximum.

def max

def max
  cop_config['Max'] || 2
end

def on_csend(node)

def on_csend(node)
  safe_navigation_chains = safe_navigation_chains(node)
  return if safe_navigation_chains.size < max
  add_offense(safe_navigation_chains.last, message: format(MSG, max: max))
end

def safe_navigation_chains(node)

def safe_navigation_chains(node)
  node.each_ancestor.with_object([]) do |parent, chains|
    break chains unless parent.csend_type?
    chains << parent
  end
end