lib/rubocop/cop/lint/safe_navigation_chain.rb in rubocop-1.31.2 vs lib/rubocop/cop/lint/safe_navigation_chain.rb in rubocop-1.32.0
- old
+ new
@@ -23,10 +23,11 @@
#
# x&.foo&.bar
# x&.foo || bar
class SafeNavigationChain < Base
include NilMethods
+ extend AutoCorrector
extend TargetRubyVersion
minimum_target_ruby_version 2.3
MSG = 'Do not chain ordinary method call after safe navigation operator.'
@@ -46,14 +47,47 @@
method_chain = method_chain(node)
location =
Parser::Source::Range.new(node.source_range.source_buffer,
safe_nav.source_range.end_pos,
method_chain.source_range.end_pos)
- add_offense(location)
+ add_offense(location) do |corrector|
+ autocorrect(corrector, offense_range: location, send_node: method_chain)
+ end
end
end
private
+
+ # @param [Parser::Source::Range] offense_range
+ # @param [RuboCop::AST::SendNode] send_node
+ # @return [String]
+ def add_safe_navigation_operator(offense_range:, send_node:)
+ source = \
+ if send_node.method?(:[]) || send_node.method?(:[]=)
+ format(
+ '%<method_name>s(%<arguments>s)',
+ arguments: send_node.arguments.map(&:source).join(', '),
+ method_name: send_node.method_name
+ )
+ else
+ offense_range.source.dup
+ end
+ source.prepend('.') unless send_node.dot?
+ source.prepend('&')
+ end
+
+ # @param [RuboCop::Cop::Corrector] corrector
+ # @param [Parser::Source::Range] offense_range
+ # @param [RuboCop::AST::SendNode] send_node
+ def autocorrect(corrector, offense_range:, send_node:)
+ corrector.replace(
+ offense_range,
+ add_safe_navigation_operator(
+ offense_range: offense_range,
+ send_node: send_node
+ )
+ )
+ end
def method_chain(node)
chain = node
chain = chain.parent if chain.send_type? && chain.parent&.call_type?
chain