lib/rubocop/cop/style/non_nil_check.rb in rubocop-0.45.0 vs lib/rubocop/cop/style/non_nil_check.rb in rubocop-0.46.0
- old
+ new
@@ -25,40 +25,31 @@
# end
class NonNilCheck < Cop
include OnMethodDef
include IfNode
- NIL_NODE = s(:nil)
+ def_node_matcher :not_equal_to_nil?, '(send _ :!= (:nil))'
+ def_node_matcher :unless_check?, '(if (send _ :nil?) ...)'
+ def_node_matcher :nil_check?, '(send _ :nil?)'
+ def_node_matcher :not_and_nil_check?, '(send (send _ :nil?) :!)'
def on_send(node)
return if ignored_node?(node)
- receiver, method, args = *node
- if not_equal_to_nil?(method, args)
+ if not_equal_to_nil?(node)
add_offense(node, :selector)
elsif include_semantic_changes? &&
- (not_and_nil_check?(method, receiver) ||
- unless_and_nil_check?(node, method))
+ (not_and_nil_check?(node) || unless_and_nil_check?(node))
add_offense(node, :expression)
end
end
private
- def not_equal_to_nil?(method, args)
- method == :!= && args == NIL_NODE
- end
-
- def not_and_nil_check?(method, receiver)
- method == :! && nil_check?(receiver)
- end
-
- def unless_and_nil_check?(send_node, method)
- return unless method == :nil?
-
+ def unless_and_nil_check?(send_node)
parent = send_node.parent
- parent && parent.if_type? && !ternary?(parent) &&
+ nil_check?(send_node) && unless_check?(parent) && !ternary?(parent) &&
parent.loc.keyword.is?('unless')
end
def message(node)
_receiver, method, _args = *node
@@ -82,43 +73,34 @@
else
ignore_node(body)
end
end
- def nil_check?(node)
- return false unless node && node.send_type?
-
- _receiver, method, *_args = *node
- method == :nil?
- end
-
def autocorrect(node)
receiver, method, _args = *node
- if method == :!=
+ case method
+ when :!=
autocorrect_comparison(node)
- elsif method == :!
+ when :!
autocorrect_non_nil(node, receiver)
- elsif method == :nil?
+ when :nil?
autocorrect_unless_nil(node, receiver)
end
end
def autocorrect_comparison(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
+ 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
- lambda do |corrector|
- corrector.replace(node.source_range, new_code)
- end
+ ->(corrector) { corrector.replace(node.source_range, new_code) }
end
def autocorrect_non_nil(node, inner_node)
lambda do |corrector|
receiver, _method, _args = *inner_node