@@ -163,17 +163,18 @@ mod tests {
163163 }
164164
165165 #[ test]
166- fn remove_parens_prefix_with_return_no_value ( ) {
167- // removing `()` from !(return) would make `!return` which is invalid syntax
168- check_assist_not_applicable (
166+ fn remove_parens_prefix_with_ret_like_prefix ( ) {
167+ check_assist ( remove_parentheses, r#"fn f() { !$0(return) }"# , r#"fn f() { !return }"# ) ;
168+ // `break`, `continue` behave the same under prefix operators
169+ check_assist ( remove_parentheses, r#"fn f() { !$0(break) }"# , r#"fn f() { !break }"# ) ;
170+ check_assist ( remove_parentheses, r#"fn f() { !$0(continue) }"# , r#"fn f() { !continue }"# ) ;
171+ check_assist (
169172 remove_parentheses,
170- r#"fn main() { let _x = true && !$0(return) || true; }"# ,
173+ r#"fn f() { !$0(return false) }"# ,
174+ r#"fn f() { !return false }"# ,
171175 ) ;
172- check_assist_not_applicable ( remove_parentheses, r#"fn f() { !$0(return) }"# ) ;
173- check_assist_not_applicable ( remove_parentheses, r#"fn f() { !$0(break) }"# ) ;
174- check_assist_not_applicable ( remove_parentheses, r#"fn f() { !$0(continue) }"# ) ;
175176
176- // Binary operators should still allow removal
177+ // Binary operators should still allow removal unless a ret-like expression is immediately followed by `||` or `&&`.
177178 check_assist (
178179 remove_parentheses,
179180 r#"fn f() { true || $0(return) }"# ,
@@ -247,6 +248,79 @@ mod tests {
247248 ) ;
248249 }
249250
251+ #[ test]
252+ fn remove_parens_return_in_unary_not ( ) {
253+ check_assist (
254+ remove_parentheses,
255+ r#"fn f() { cond && !$0(return) }"# ,
256+ r#"fn f() { cond && !return }"# ,
257+ ) ;
258+ check_assist (
259+ remove_parentheses,
260+ r#"fn f() { cond && !$0(return false) }"# ,
261+ r#"fn f() { cond && !return false }"# ,
262+ ) ;
263+ }
264+
265+ #[ test]
266+ fn remove_parens_return_in_disjunction_with_closure_risk ( ) {
267+ // `return` may only be blocked when it would form `return ||` or `return &&`
268+ check_assist_not_applicable (
269+ remove_parentheses,
270+ r#"fn f() { let _x = true && $0(return) || true; }"# ,
271+ ) ;
272+ check_assist_not_applicable (
273+ remove_parentheses,
274+ r#"fn f() { let _x = true && !$0(return) || true; }"# ,
275+ ) ;
276+ check_assist_not_applicable (
277+ remove_parentheses,
278+ r#"fn f() { let _x = true && $0(return false) || true; }"# ,
279+ ) ;
280+ check_assist_not_applicable (
281+ remove_parentheses,
282+ r#"fn f() { let _x = true && !$0(return false) || true; }"# ,
283+ ) ;
284+ check_assist_not_applicable (
285+ remove_parentheses,
286+ r#"fn f() { let _x = true && $0(return) && true; }"# ,
287+ ) ;
288+ check_assist_not_applicable (
289+ remove_parentheses,
290+ r#"fn f() { let _x = true && !$0(return) && true; }"# ,
291+ ) ;
292+ check_assist_not_applicable (
293+ remove_parentheses,
294+ r#"fn f() { let _x = true && $0(return false) && true; }"# ,
295+ ) ;
296+ check_assist_not_applicable (
297+ remove_parentheses,
298+ r#"fn f() { let _x = true && !$0(return false) && true; }"# ,
299+ ) ;
300+ check_assist_not_applicable (
301+ remove_parentheses,
302+ r#"fn f() { let _x = $0(return) || true; }"# ,
303+ ) ;
304+ check_assist_not_applicable (
305+ remove_parentheses,
306+ r#"fn f() { let _x = $0(return) && true; }"# ,
307+ ) ;
308+ }
309+
310+ #[ test]
311+ fn remove_parens_return_in_disjunction_is_ok ( ) {
312+ check_assist (
313+ remove_parentheses,
314+ r#"fn f() { let _x = true || $0(return); }"# ,
315+ r#"fn f() { let _x = true || return; }"# ,
316+ ) ;
317+ check_assist (
318+ remove_parentheses,
319+ r#"fn f() { let _x = true && $0(return); }"# ,
320+ r#"fn f() { let _x = true && return; }"# ,
321+ ) ;
322+ }
323+
250324 #[ test]
251325 fn remove_parens_double_paren_stmt ( ) {
252326 check_assist (
0 commit comments