-
-
Notifications
You must be signed in to change notification settings - Fork 3k
/
safe_navigation_with_empty.rb
38 lines (34 loc) · 1.05 KB
/
safe_navigation_with_empty.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# frozen_string_literal: true
module RuboCop
module Cop
module Lint
# This cop checks to make sure safe navigation isn't used with `empty?` in
# a conditional.
#
# While the safe navigation operator is generally a good idea, when
# checking `foo&.empty?` in a conditional, `foo` being `nil` will actually
# do the opposite of what the author intends.
#
# @example
# # bad
# return if foo&.empty?
# return unless foo&.empty?
#
# # good
# return if foo && foo.empty?
# return unless foo && foo.empty?
#
class SafeNavigationWithEmpty < Cop
MSG = 'Avoid calling `empty?` with the safe navigation operator ' \
'in conditionals.'
def_node_matcher :safe_navigation_empty_in_conditional?, <<~PATTERN
(if (csend (send ...) :empty?) ...)
PATTERN
def on_if(node)
return unless safe_navigation_empty_in_conditional?(node)
add_offense(node.condition)
end
end
end
end
end