aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crates/ra_assists/src/handlers/change_return_type_to_result.rs81
-rw-r--r--crates/ra_assists/src/tests/generated.rs2
-rw-r--r--docs/user/assists.md2
3 files changed, 37 insertions, 48 deletions
diff --git a/crates/ra_assists/src/handlers/change_return_type_to_result.rs b/crates/ra_assists/src/handlers/change_return_type_to_result.rs
index c9f909f9c..c6baa0a57 100644
--- a/crates/ra_assists/src/handlers/change_return_type_to_result.rs
+++ b/crates/ra_assists/src/handlers/change_return_type_to_result.rs
@@ -1,8 +1,6 @@
1use ra_syntax::{ 1use ra_syntax::{
2 ast::{self, BlockExpr, Expr, LoopBodyOwner}, 2 ast::{self, BlockExpr, Expr, LoopBodyOwner},
3 AstNode, 3 AstNode, SyntaxNode,
4 SyntaxKind::{COMMENT, WHITESPACE},
5 SyntaxNode, TextSize,
6}; 4};
7 5
8use crate::{AssistContext, AssistId, Assists}; 6use crate::{AssistContext, AssistId, Assists};
@@ -16,7 +14,7 @@ use crate::{AssistContext, AssistId, Assists};
16// ``` 14// ```
17// -> 15// ->
18// ``` 16// ```
19// fn foo() -> Result<i32, > { Ok(42i32) } 17// fn foo() -> Result<i32, ${0:_}> { Ok(42i32) }
20// ``` 18// ```
21pub(crate) fn change_return_type_to_result(acc: &mut Assists, ctx: &AssistContext) -> Option<()> { 19pub(crate) fn change_return_type_to_result(acc: &mut Assists, ctx: &AssistContext) -> Option<()> {
22 let ret_type = ctx.find_node_at_offset::<ast::RetType>()?; 20 let ret_type = ctx.find_node_at_offset::<ast::RetType>()?;
@@ -42,14 +40,14 @@ pub(crate) fn change_return_type_to_result(acc: &mut Assists, ctx: &AssistContex
42 for ret_expr_arg in tail_return_expr_collector.exprs_to_wrap { 40 for ret_expr_arg in tail_return_expr_collector.exprs_to_wrap {
43 builder.replace_node_and_indent(&ret_expr_arg, format!("Ok({})", ret_expr_arg)); 41 builder.replace_node_and_indent(&ret_expr_arg, format!("Ok({})", ret_expr_arg));
44 } 42 }
45 match ctx.config.snippet_cap {
46 Some(_) => {}
47 None => {}
48 }
49 builder.replace_node_and_indent(type_ref.syntax(), format!("Result<{}, >", type_ref));
50 43
51 if let Some(node_start) = result_insertion_offset(&type_ref) { 44 match ctx.config.snippet_cap {
52 builder.set_cursor(node_start + TextSize::of(&format!("Result<{}, ", type_ref))); 45 Some(cap) => {
46 let snippet = format!("Result<{}, ${{0:_}}>", type_ref);
47 builder.replace_snippet(cap, type_ref.syntax().text_range(), snippet)
48 }
49 None => builder
50 .replace(type_ref.syntax().text_range(), format!("Result<{}, _>", type_ref)),
53 } 51 }
54 }, 52 },
55 ) 53 )
@@ -251,17 +249,8 @@ fn get_tail_expr_from_block(expr: &Expr) -> Option<Vec<NodeType>> {
251 } 249 }
252} 250}
253 251
254fn result_insertion_offset(ret_type: &ast::TypeRef) -> Option<TextSize> {
255 let non_ws_child = ret_type
256 .syntax()
257 .children_with_tokens()
258 .find(|it| it.kind() != COMMENT && it.kind() != WHITESPACE)?;
259 Some(non_ws_child.text_range().start())
260}
261
262#[cfg(test)] 252#[cfg(test)]
263mod tests { 253mod tests {
264
265 use crate::tests::{check_assist, check_assist_not_applicable}; 254 use crate::tests::{check_assist, check_assist_not_applicable};
266 255
267 use super::*; 256 use super::*;
@@ -274,7 +263,7 @@ mod tests {
274 let test = "test"; 263 let test = "test";
275 return 42i32; 264 return 42i32;
276 }"#, 265 }"#,
277 r#"fn foo() -> Result<i32, <|>> { 266 r#"fn foo() -> Result<i32, ${0:_}> {
278 let test = "test"; 267 let test = "test";
279 return Ok(42i32); 268 return Ok(42i32);
280 }"#, 269 }"#,
@@ -289,7 +278,7 @@ mod tests {
289 let test = "test"; 278 let test = "test";
290 return 42i32; 279 return 42i32;
291 }"#, 280 }"#,
292 r#"fn foo() -> Result<i32, <|>> { 281 r#"fn foo() -> Result<i32, ${0:_}> {
293 let test = "test"; 282 let test = "test";
294 return Ok(42i32); 283 return Ok(42i32);
295 }"#, 284 }"#,
@@ -315,7 +304,7 @@ mod tests {
315 let test = "test"; 304 let test = "test";
316 return 42i32; 305 return 42i32;
317 }"#, 306 }"#,
318 r#"fn foo() -> Result<i32, <|>> { 307 r#"fn foo() -> Result<i32, ${0:_}> {
319 let test = "test"; 308 let test = "test";
320 return Ok(42i32); 309 return Ok(42i32);
321 }"#, 310 }"#,
@@ -330,7 +319,7 @@ mod tests {
330 let test = "test"; 319 let test = "test";
331 42i32 320 42i32
332 }"#, 321 }"#,
333 r#"fn foo() -> Result<i32, <|>> { 322 r#"fn foo() -> Result<i32, ${0:_}> {
334 let test = "test"; 323 let test = "test";
335 Ok(42i32) 324 Ok(42i32)
336 }"#, 325 }"#,
@@ -344,7 +333,7 @@ mod tests {
344 r#"fn foo() -> i32<|> { 333 r#"fn foo() -> i32<|> {
345 42i32 334 42i32
346 }"#, 335 }"#,
347 r#"fn foo() -> Result<i32, <|>> { 336 r#"fn foo() -> Result<i32, ${0:_}> {
348 Ok(42i32) 337 Ok(42i32)
349 }"#, 338 }"#,
350 ); 339 );
@@ -360,7 +349,7 @@ mod tests {
360 24i32 349 24i32
361 } 350 }
362 }"#, 351 }"#,
363 r#"fn foo() -> Result<i32, <|>> { 352 r#"fn foo() -> Result<i32, ${0:_}> {
364 if true { 353 if true {
365 Ok(42i32) 354 Ok(42i32)
366 } else { 355 } else {
@@ -385,7 +374,7 @@ mod tests {
385 24i32 374 24i32
386 } 375 }
387 }"#, 376 }"#,
388 r#"fn foo() -> Result<i32, <|>> { 377 r#"fn foo() -> Result<i32, ${0:_}> {
389 if true { 378 if true {
390 if false { 379 if false {
391 Ok(1) 380 Ok(1)
@@ -414,7 +403,7 @@ mod tests {
414 24i32.await 403 24i32.await
415 } 404 }
416 }"#, 405 }"#,
417 r#"async fn foo() -> Result<i32, <|>> { 406 r#"async fn foo() -> Result<i32, ${0:_}> {
418 if true { 407 if true {
419 if false { 408 if false {
420 Ok(1.await) 409 Ok(1.await)
@@ -435,7 +424,7 @@ mod tests {
435 r#"fn foo() -> [i32;<|> 3] { 424 r#"fn foo() -> [i32;<|> 3] {
436 [1, 2, 3] 425 [1, 2, 3]
437 }"#, 426 }"#,
438 r#"fn foo() -> Result<[i32; 3], <|>> { 427 r#"fn foo() -> Result<[i32; 3], ${0:_}> {
439 Ok([1, 2, 3]) 428 Ok([1, 2, 3])
440 }"#, 429 }"#,
441 ); 430 );
@@ -456,7 +445,7 @@ mod tests {
456 24 as i32 445 24 as i32
457 } 446 }
458 }"#, 447 }"#,
459 r#"fn foo() -> Result<i32, <|>> { 448 r#"fn foo() -> Result<i32, ${0:_}> {
460 if true { 449 if true {
461 if false { 450 if false {
462 Ok(1 as i32) 451 Ok(1 as i32)
@@ -481,7 +470,7 @@ mod tests {
481 _ => 24i32, 470 _ => 24i32,
482 } 471 }
483 }"#, 472 }"#,
484 r#"fn foo() -> Result<i32, <|>> { 473 r#"fn foo() -> Result<i32, ${0:_}> {
485 let my_var = 5; 474 let my_var = 5;
486 match my_var { 475 match my_var {
487 5 => Ok(42i32), 476 5 => Ok(42i32),
@@ -504,7 +493,7 @@ mod tests {
504 493
505 my_var 494 my_var
506 }"#, 495 }"#,
507 r#"fn foo() -> Result<i32, <|>> { 496 r#"fn foo() -> Result<i32, ${0:_}> {
508 let my_var = 5; 497 let my_var = 5;
509 loop { 498 loop {
510 println!("test"); 499 println!("test");
@@ -527,7 +516,7 @@ mod tests {
527 516
528 my_var 517 my_var
529 }"#, 518 }"#,
530 r#"fn foo() -> Result<i32, <|>> { 519 r#"fn foo() -> Result<i32, ${0:_}> {
531 let my_var = let x = loop { 520 let my_var = let x = loop {
532 break 1; 521 break 1;
533 }; 522 };
@@ -550,7 +539,7 @@ mod tests {
550 539
551 res 540 res
552 }"#, 541 }"#,
553 r#"fn foo() -> Result<i32, <|>> { 542 r#"fn foo() -> Result<i32, ${0:_}> {
554 let my_var = 5; 543 let my_var = 5;
555 let res = match my_var { 544 let res = match my_var {
556 5 => 42i32, 545 5 => 42i32,
@@ -573,7 +562,7 @@ mod tests {
573 562
574 res 563 res
575 }"#, 564 }"#,
576 r#"fn foo() -> Result<i32, <|>> { 565 r#"fn foo() -> Result<i32, ${0:_}> {
577 let my_var = 5; 566 let my_var = 5;
578 let res = if my_var == 5 { 567 let res = if my_var == 5 {
579 42i32 568 42i32
@@ -609,7 +598,7 @@ mod tests {
609 }, 598 },
610 } 599 }
611 }"#, 600 }"#,
612 r#"fn foo() -> Result<i32, <|>> { 601 r#"fn foo() -> Result<i32, ${0:_}> {
613 let my_var = 5; 602 let my_var = 5;
614 match my_var { 603 match my_var {
615 5 => { 604 5 => {
@@ -642,7 +631,7 @@ mod tests {
642 } 631 }
643 53i32 632 53i32
644 }"#, 633 }"#,
645 r#"fn foo() -> Result<i32, <|>> { 634 r#"fn foo() -> Result<i32, ${0:_}> {
646 let test = "test"; 635 let test = "test";
647 if test == "test" { 636 if test == "test" {
648 return Ok(24i32); 637 return Ok(24i32);
@@ -673,7 +662,7 @@ mod tests {
673 662
674 the_field 663 the_field
675 }"#, 664 }"#,
676 r#"fn foo(the_field: u32) -> Result<u32, <|>> { 665 r#"fn foo(the_field: u32) -> Result<u32, ${0:_}> {
677 let true_closure = || { 666 let true_closure = || {
678 return true; 667 return true;
679 }; 668 };
@@ -712,7 +701,7 @@ mod tests {
712 701
713 t.unwrap_or_else(|| the_field) 702 t.unwrap_or_else(|| the_field)
714 }"#, 703 }"#,
715 r#"fn foo(the_field: u32) -> Result<u32, <|>> { 704 r#"fn foo(the_field: u32) -> Result<u32, ${0:_}> {
716 let true_closure = || { 705 let true_closure = || {
717 return true; 706 return true;
718 }; 707 };
@@ -750,7 +739,7 @@ mod tests {
750 i += 1; 739 i += 1;
751 } 740 }
752 }"#, 741 }"#,
753 r#"fn foo() -> Result<i32, <|>> { 742 r#"fn foo() -> Result<i32, ${0:_}> {
754 let test = "test"; 743 let test = "test";
755 if test == "test" { 744 if test == "test" {
756 return Ok(24i32); 745 return Ok(24i32);
@@ -782,7 +771,7 @@ mod tests {
782 } 771 }
783 } 772 }
784 }"#, 773 }"#,
785 r#"fn foo() -> Result<i32, <|>> { 774 r#"fn foo() -> Result<i32, ${0:_}> {
786 let test = "test"; 775 let test = "test";
787 if test == "test" { 776 if test == "test" {
788 return Ok(24i32); 777 return Ok(24i32);
@@ -820,7 +809,7 @@ mod tests {
820 } 809 }
821 } 810 }
822 }"#, 811 }"#,
823 r#"fn foo() -> Result<i32, <|>> { 812 r#"fn foo() -> Result<i32, ${0:_}> {
824 let test = "test"; 813 let test = "test";
825 let other = 5; 814 let other = 5;
826 if test == "test" { 815 if test == "test" {
@@ -861,7 +850,7 @@ mod tests {
861 850
862 the_field 851 the_field
863 }"#, 852 }"#,
864 r#"fn foo(the_field: u32) -> Result<u32, <|>> { 853 r#"fn foo(the_field: u32) -> Result<u32, ${0:_}> {
865 if the_field < 5 { 854 if the_field < 5 {
866 let mut i = 0; 855 let mut i = 0;
867 loop { 856 loop {
@@ -895,7 +884,7 @@ mod tests {
895 884
896 the_field 885 the_field
897 }"#, 886 }"#,
898 r#"fn foo(the_field: u32) -> Result<u32, <|>> { 887 r#"fn foo(the_field: u32) -> Result<u32, ${0:_}> {
899 if the_field < 5 { 888 if the_field < 5 {
900 let mut i = 0; 889 let mut i = 0;
901 890
@@ -924,7 +913,7 @@ mod tests {
924 913
925 the_field 914 the_field
926 }"#, 915 }"#,
927 r#"fn foo(the_field: u32) -> Result<u32, <|>> { 916 r#"fn foo(the_field: u32) -> Result<u32, ${0:_}> {
928 if the_field < 5 { 917 if the_field < 5 {
929 let mut i = 0; 918 let mut i = 0;
930 919
@@ -954,7 +943,7 @@ mod tests {
954 943
955 the_field 944 the_field
956 }"#, 945 }"#,
957 r#"fn foo(the_field: u32) -> Result<u32, <|>> { 946 r#"fn foo(the_field: u32) -> Result<u32, ${0:_}> {
958 if the_field < 5 { 947 if the_field < 5 {
959 let mut i = 0; 948 let mut i = 0;
960 949
diff --git a/crates/ra_assists/src/tests/generated.rs b/crates/ra_assists/src/tests/generated.rs
index d860cfefc..cd6129dc5 100644
--- a/crates/ra_assists/src/tests/generated.rs
+++ b/crates/ra_assists/src/tests/generated.rs
@@ -276,7 +276,7 @@ fn doctest_change_return_type_to_result() {
276fn foo() -> i32<|> { 42i32 } 276fn foo() -> i32<|> { 42i32 }
277"#####, 277"#####,
278 r#####" 278 r#####"
279fn foo() -> Result<i32, > { Ok(42i32) } 279fn foo() -> Result<i32, ${0:_}> { Ok(42i32) }
280"#####, 280"#####,
281 ) 281 )
282} 282}
diff --git a/docs/user/assists.md b/docs/user/assists.md
index 03c01d6c0..006ec4d54 100644
--- a/docs/user/assists.md
+++ b/docs/user/assists.md
@@ -268,7 +268,7 @@ Change the function's return type to Result.
268fn foo() -> i32┃ { 42i32 } 268fn foo() -> i32┃ { 42i32 }
269 269
270// AFTER 270// AFTER
271fn foo() -> Result<i32, > { Ok(42i32) } 271fn foo() -> Result<i32, ${0:_}> { Ok(42i32) }
272``` 272```
273 273
274## `change_visibility` 274## `change_visibility`