Skip to content

Commit 84e1d27

Browse files
committed
Auto merge of #15743 - Young-Flash:replace_is_some_with_if_let_some, r=HKalbasi
add replace_is_some_with_if_let_some assist This is a basic impl, if it is ok, `if my_result.is_ok()`-> `if let Ok(_x) = my_result ​`will be add next. close #12977
2 parents 7eec17e + 3605bb3 commit 84e1d27

File tree

3 files changed

+111
-0
lines changed

3 files changed

+111
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
use syntax::ast::{self, AstNode};
2+
3+
use crate::{AssistContext, AssistId, AssistKind, Assists};
4+
5+
// Assist: replace_is_some_with_if_let_some
6+
//
7+
// Replace `if x.is_some()` with `if let Some(_tmp) = x`.
8+
//
9+
// ```
10+
// fn main() {
11+
// let x = Some(1);
12+
// if x.is_som$0e() {}
13+
// }
14+
// ```
15+
// ->
16+
// ```
17+
// fn main() {
18+
// let x = Some(1);
19+
// if let Some(_tmp) = x {}
20+
// }
21+
// ```
22+
pub(crate) fn replace_is_some_with_if_let_some(
23+
acc: &mut Assists,
24+
ctx: &AssistContext<'_>,
25+
) -> Option<()> {
26+
let if_expr = ctx.find_node_at_offset::<ast::IfExpr>()?;
27+
28+
let cond = if_expr.condition()?;
29+
let call_expr = match cond {
30+
ast::Expr::MethodCallExpr(call) => call,
31+
_ => return None,
32+
};
33+
34+
let name_ref = call_expr.name_ref()?;
35+
if name_ref.text() != "is_some" {
36+
return None;
37+
}
38+
39+
let receiver = call_expr.receiver()?;
40+
let target = call_expr.syntax().text_range();
41+
42+
acc.add(
43+
AssistId("replace_is_some_with_if_let_some", AssistKind::RefactorRewrite),
44+
"Replace `is_some` with `if let Some`",
45+
target,
46+
|edit| {
47+
let replacement = format!("let Some(_tmp) = {}", receiver);
48+
edit.replace(target, replacement);
49+
},
50+
)
51+
}
52+
53+
#[cfg(test)]
54+
mod tests {
55+
use crate::tests::{check_assist, check_assist_not_applicable};
56+
57+
use super::replace_is_some_with_if_let_some;
58+
59+
#[test]
60+
fn replace_is_some_with_if_let_some_works() {
61+
check_assist(
62+
replace_is_some_with_if_let_some,
63+
r#"
64+
fn main() {
65+
let x = Some(1);
66+
if x.is_som$0e() {}
67+
}
68+
"#,
69+
r#"
70+
fn main() {
71+
let x = Some(1);
72+
if let Some(_tmp) = x {}
73+
}
74+
"#,
75+
);
76+
}
77+
78+
#[test]
79+
fn replace_is_some_with_if_let_some_not_applicable() {
80+
check_assist_not_applicable(
81+
replace_is_some_with_if_let_some,
82+
r#"
83+
fn main() {
84+
let x = Some(1);
85+
if x.is_non$0e() {}
86+
}
87+
"#,
88+
);
89+
}
90+
}

crates/ide-assists/src/lib.rs

+2
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@ mod handlers {
213213
mod unwrap_block;
214214
mod unwrap_result_return_type;
215215
mod unqualify_method_call;
216+
mod replace_is_some_with_if_let_some;
216217
mod wrap_return_type_in_result;
217218
mod into_to_qualified_from;
218219

@@ -332,6 +333,7 @@ mod handlers {
332333
unwrap_result_return_type::unwrap_result_return_type,
333334
unwrap_tuple::unwrap_tuple,
334335
unqualify_method_call::unqualify_method_call,
336+
replace_is_some_with_if_let_some::replace_is_some_with_if_let_some,
335337
wrap_return_type_in_result::wrap_return_type_in_result,
336338
// These are manually sorted for better priorities. By default,
337339
// priority is determined by the size of the target range (smaller

crates/ide-assists/src/tests/generated.rs

+19
Original file line numberDiff line numberDiff line change
@@ -2558,6 +2558,25 @@ fn handle(action: Action) {
25582558
)
25592559
}
25602560

2561+
#[test]
2562+
fn doctest_replace_is_some_with_if_let_some() {
2563+
check_doc_test(
2564+
"replace_is_some_with_if_let_some",
2565+
r#####"
2566+
fn main() {
2567+
let x = Some(1);
2568+
if x.is_som$0e() {}
2569+
}
2570+
"#####,
2571+
r#####"
2572+
fn main() {
2573+
let x = Some(1);
2574+
if let Some(_tmp) = x {}
2575+
}
2576+
"#####,
2577+
)
2578+
}
2579+
25612580
#[test]
25622581
fn doctest_replace_let_with_if_let() {
25632582
check_doc_test(

0 commit comments

Comments
 (0)