@@ -44,9 +44,9 @@ def on_if(node)
44
44
message = message ( node )
45
45
46
46
add_offense ( range_of_offense ( node ) , message : message ) do |corrector |
47
- if node . ternary?
47
+ if node . ternary? && ! branches_have_method? ( node )
48
48
correct_ternary ( corrector , node )
49
- elsif node . modifier_form? || ! node . else_branch
49
+ elsif redudant_condition? ( node )
50
50
corrector . replace ( node , node . if_branch . source )
51
51
else
52
52
corrected = make_ternary_form ( node )
@@ -59,7 +59,7 @@ def on_if(node)
59
59
private
60
60
61
61
def message ( node )
62
- if node . modifier_form? || ! node . else_branch
62
+ if redudant_condition? ( node )
63
63
REDUNDANT_CONDITION
64
64
else
65
65
MSG
@@ -68,6 +68,7 @@ def message(node)
68
68
69
69
def range_of_offense ( node )
70
70
return node . loc . expression unless node . ternary?
71
+ return node . loc . expression if node . ternary? && branches_have_method? ( node )
71
72
72
73
range_between ( node . loc . question . begin_pos , node . loc . colon . end_pos )
73
74
end
@@ -81,6 +82,10 @@ def offense?(node)
81
82
( node . ternary? || !else_branch . instance_of? ( AST ::Node ) || else_branch . single_line? )
82
83
end
83
84
85
+ def redudant_condition? ( node )
86
+ node . modifier_form? || !node . else_branch
87
+ end
88
+
84
89
def use_if_branch? ( else_branch )
85
90
else_branch &.if_type?
86
91
end
@@ -89,6 +94,10 @@ def use_hash_key_assignment?(else_branch)
89
94
else_branch &.send_type? && else_branch &.method? ( :[]= )
90
95
end
91
96
97
+ def use_hash_key_access? ( node )
98
+ node . send_type? && node . method? ( :[] )
99
+ end
100
+
92
101
def synonymous_condition_and_branch? ( node )
93
102
condition , if_branch , _else_branch = *node
94
103
# e.g.
@@ -113,7 +122,8 @@ def synonymous_condition_and_branch?(node)
113
122
# else
114
123
# test.value = another_value?
115
124
# end
116
- branches_have_method? ( node ) && condition == if_branch . first_argument
125
+ branches_have_method? ( node ) && condition == if_branch . first_argument &&
126
+ !use_hash_key_access? ( if_branch )
117
127
end
118
128
119
129
def branches_have_assignment? ( node )
@@ -140,6 +150,14 @@ def branches_have_method?(node)
140
150
if_branch . method? ( else_branch . method_name )
141
151
end
142
152
153
+ def if_source ( if_branch )
154
+ if branches_have_method? ( if_branch . parent ) && if_branch . parenthesized?
155
+ if_branch . source . delete_suffix ( ')' )
156
+ else
157
+ if_branch . source
158
+ end
159
+ end
160
+
143
161
def else_source ( else_branch )
144
162
if branches_have_method? ( else_branch . parent )
145
163
else_source_if_has_method ( else_branch )
@@ -176,7 +194,8 @@ def else_source_if_has_assignment(else_branch)
176
194
177
195
def make_ternary_form ( node )
178
196
_condition , if_branch , else_branch = *node
179
- ternary_form = [ if_branch . source , else_source ( else_branch ) ] . join ( ' || ' )
197
+ ternary_form = [ if_source ( if_branch ) , else_source ( else_branch ) ] . join ( ' || ' )
198
+ ternary_form += ')' if branches_have_method? ( node ) && if_branch . parenthesized?
180
199
181
200
if node . parent &.send_type?
182
201
"(#{ ternary_form } )"
0 commit comments