Skip to content

Commit 776b1eb

Browse files
bors[bot]0xPoe
andauthored
Merge #8168
8168: correct `convert to guard return` let_stmt r=Veykril a=hi-rustin close #8074 Co-authored-by: hi-rustin <rustin.liu@gmail.com>
2 parents 2aa6483 + e992acf commit 776b1eb

File tree

1 file changed

+70
-7
lines changed

1 file changed

+70
-7
lines changed

crates/ide_assists/src/handlers/early_return.rs

Lines changed: 70 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)