@@ -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#"
731737fn 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