@@ -56,7 +56,11 @@ pub(crate) fn convert_to_guarded_return(acc: &mut Assists, ctx: &AssistContext)
5656 match path. qualifier ( ) {
5757 None => {
5858 let bound_ident = pat. fields ( ) . next ( ) . unwrap ( ) ;
59- Some ( ( path, bound_ident) )
59+ if ast:: IdentPat :: can_cast ( bound_ident. syntax ( ) . kind ( ) ) {
60+ Some ( ( path, bound_ident) )
61+ } else {
62+ return None ;
63+ }
6064 }
6165 Some ( _) => return None ,
6266 }
@@ -143,10 +147,7 @@ pub(crate) fn convert_to_guarded_return(acc: &mut Assists, ctx: &AssistContext)
143147 make:: expr_match ( cond_expr, make:: match_arm_list ( vec ! [ happy_arm, sad_arm] ) )
144148 } ;
145149
146- let let_stmt = make:: let_stmt (
147- make:: ident_pat ( make:: name ( & bound_ident. syntax ( ) . to_string ( ) ) ) . into ( ) ,
148- Some ( match_expr) ,
149- ) ;
150+ let let_stmt = make:: let_stmt ( bound_ident, Some ( match_expr) ) ;
150151 let let_stmt = let_stmt. indent ( if_indent_level) ;
151152 replace ( let_stmt. syntax ( ) , & then_block, & parent_block, & if_expr)
152153 }
@@ -284,7 +285,7 @@ mod tests {
284285 r#"
285286 fn main(n: Option<String>) {
286287 bar();
287- if$0 let Ok (n) = n {
288+ if$0 let Some (n) = n {
288289 foo(n);
289290
290291 //comment
@@ -296,7 +297,69 @@ mod tests {
296297 fn main(n: Option<String>) {
297298 bar();
298299 let n = match n {
299- Ok(it) => it,
300+ Some(it) => it,
301+ _ => return,
302+ };
303+ foo(n);
304+
305+ //comment
306+ bar();
307+ }
308+ "# ,
309+ ) ;
310+ }
311+
312+ #[ test]
313+ fn convert_let_mut_ok_inside_fn ( ) {
314+ check_assist (
315+ convert_to_guarded_return,
316+ r#"
317+ fn main(n: Option<String>) {
318+ bar();
319+ if$0 let Some(mut n) = n {
320+ foo(n);
321+
322+ //comment
323+ bar();
324+ }
325+ }
326+ "# ,
327+ r#"
328+ fn main(n: Option<String>) {
329+ bar();
330+ let mut n = match n {
331+ Some(it) => it,
332+ _ => return,
333+ };
334+ foo(n);
335+
336+ //comment
337+ bar();
338+ }
339+ "# ,
340+ ) ;
341+ }
342+
343+ #[ test]
344+ fn convert_let_ref_ok_inside_fn ( ) {
345+ check_assist (
346+ convert_to_guarded_return,
347+ r#"
348+ fn main(n: Option<&str>) {
349+ bar();
350+ if$0 let Some(ref n) = n {
351+ foo(n);
352+
353+ //comment
354+ bar();
355+ }
356+ }
357+ "# ,
358+ r#"
359+ fn main(n: Option<&str>) {
360+ bar();
361+ let ref n = match n {
362+ Some(it) => it,
300363 _ => return,
301364 };
302365 foo(n);
0 commit comments