Skip to content

Commit 512db74

Browse files
Merge pull request #21953 from A4-Tacks/add-some-instead-wrap-some
fix: Improve add some on block like expression
2 parents 129f616 + e7444c0 commit 512db74

File tree

1 file changed

+34
-13
lines changed

1 file changed

+34
-13
lines changed

crates/ide-diagnostics/src/handlers/type_mismatch.rs

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,8 @@ fn add_missing_ok_or_some(
110110
) -> Option<()> {
111111
let root = ctx.sema.db.parse_or_expand(expr_ptr.file_id);
112112
let expr = expr_ptr.value.to_node(&root);
113-
let expr_range = ctx.sema.original_range_opt(expr.syntax())?.range;
113+
let hir::FileRange { file_id, range: expr_range } =
114+
ctx.sema.original_range_opt(expr.syntax())?;
114115
let scope = ctx.sema.scope(expr.syntax())?;
115116

116117
let expected_adt = d.expected.as_adt()?;
@@ -133,6 +134,8 @@ fn add_missing_ok_or_some(
133134
return None;
134135
}
135136

137+
let file_id = file_id.file_id(ctx.sema.db);
138+
136139
if d.actual.is_unit() {
137140
if let Expr::BlockExpr(block) = &expr {
138141
if block.tail_expr().is_none() {
@@ -155,10 +158,7 @@ fn add_missing_ok_or_some(
155158
);
156159
}
157160

158-
let source_change = SourceChange::from_text_edit(
159-
expr_ptr.file_id.original_file(ctx.sema.db).file_id(ctx.sema.db),
160-
builder.finish(),
161-
);
161+
let source_change = SourceChange::from_text_edit(file_id, builder.finish());
162162
let name = format!("Insert {variant_name}(()) as the tail of this block");
163163
acc.push(fix("insert_wrapped_unit", &name, source_change, expr_range));
164164
}
@@ -168,24 +168,30 @@ fn add_missing_ok_or_some(
168168
if ret_expr.expr().is_none() {
169169
let mut builder = TextEdit::builder();
170170
builder.insert(expr_range.end(), format!(" {variant_name}(())"));
171-
let source_change = SourceChange::from_text_edit(
172-
expr_ptr.file_id.original_file(ctx.sema.db).file_id(ctx.sema.db),
173-
builder.finish(),
174-
);
171+
let source_change = SourceChange::from_text_edit(file_id, builder.finish());
175172
let name = format!("Insert {variant_name}(()) as the return value");
176173
acc.push(fix("insert_wrapped_unit", &name, source_change, expr_range));
177174
}
178175
return Some(());
176+
} else if expr.is_block_like()
177+
&& expr.syntax().parent().and_then(ast::StmtList::cast).is_some()
178+
{
179+
// Fix for forms like `fn foo() -> Result<(), String> { for _ in 0..8 {} }`
180+
let mut builder = TextEdit::builder();
181+
let indent = expr.indent_level();
182+
builder.insert(expr_range.end(), format!("\n{indent}{variant_name}(())"));
183+
184+
let source_change = SourceChange::from_text_edit(file_id, builder.finish());
185+
let name = format!("Insert {variant_name}(()) as the tail of this block");
186+
acc.push(fix("insert_wrapped_unit", &name, source_change, expr_range));
187+
return Some(());
179188
}
180189
}
181190

182191
let mut builder = TextEdit::builder();
183192
builder.insert(expr_range.start(), format!("{variant_name}("));
184193
builder.insert(expr_range.end(), ")".to_owned());
185-
let source_change = SourceChange::from_text_edit(
186-
expr_ptr.file_id.original_file(ctx.sema.db).file_id(ctx.sema.db),
187-
builder.finish(),
188-
);
194+
let source_change = SourceChange::from_text_edit(file_id, builder.finish());
189195
let name = format!("Wrap in {variant_name}");
190196
acc.push(fix("wrap_in_constructor", &name, source_change, expr_range));
191197
Some(())
@@ -730,6 +736,21 @@ fn foo() -> Result<(), ()> {}$0
730736
r#"
731737
fn foo() -> Result<(), ()> {
732738
Ok(())
739+
}
740+
"#,
741+
);
742+
743+
check_fix(
744+
r#"
745+
//- minicore: result
746+
fn foo() -> Result<(), ()> {
747+
for _ in 0..5 {}$0
748+
}
749+
"#,
750+
r#"
751+
fn foo() -> Result<(), ()> {
752+
for _ in 0..5 {}
753+
Ok(())
733754
}
734755
"#,
735756
);

0 commit comments

Comments
 (0)