diff options
author | Vladyslav Katasonov <[email protected]> | 2021-02-04 22:18:45 +0000 |
---|---|---|
committer | Vladyslav Katasonov <[email protected]> | 2021-02-04 22:41:40 +0000 |
commit | 0ff74467c0d107a0b9472e928f9f0845f68be088 (patch) | |
tree | f44778c3e38e4520b34a4431853d974c909f8704 /crates | |
parent | d9b122858b8a454c23dbeab0971571ce0b38aeec (diff) |
use `&T` for non copy params of extracted function
Use shared ref if param is not `T: Copy` and is used after body
Diffstat (limited to 'crates')
-rw-r--r-- | crates/assists/src/handlers/extract_function.rs | 57 |
1 files changed, 55 insertions, 2 deletions
diff --git a/crates/assists/src/handlers/extract_function.rs b/crates/assists/src/handlers/extract_function.rs index 93ff66b24..ac2a5a674 100644 --- a/crates/assists/src/handlers/extract_function.rs +++ b/crates/assists/src/handlers/extract_function.rs | |||
@@ -124,6 +124,7 @@ struct Function { | |||
124 | #[derive(Debug)] | 124 | #[derive(Debug)] |
125 | struct Param { | 125 | struct Param { |
126 | var: Local, | 126 | var: Local, |
127 | ty: hir::Type, | ||
127 | has_usages_afterwards: bool, | 128 | has_usages_afterwards: bool, |
128 | has_mut_inside_body: bool, | 129 | has_mut_inside_body: bool, |
129 | is_copy: bool, | 130 | is_copy: bool, |
@@ -437,11 +438,14 @@ fn extracted_function_params( | |||
437 | }) | 438 | }) |
438 | .map(|var| { | 439 | .map(|var| { |
439 | let usages = LocalUsages::find(ctx, var); | 440 | let usages = LocalUsages::find(ctx, var); |
441 | let ty = var.ty(ctx.db()); | ||
442 | let is_copy = ty.is_copy(ctx.db()); | ||
440 | Param { | 443 | Param { |
441 | var, | 444 | var, |
445 | ty, | ||
442 | has_usages_afterwards: has_usages_after_body(&usages, body), | 446 | has_usages_afterwards: has_usages_after_body(&usages, body), |
443 | has_mut_inside_body: has_exclusive_usages(ctx, &usages, body), | 447 | has_mut_inside_body: has_exclusive_usages(ctx, &usages, body), |
444 | is_copy: true, | 448 | is_copy, |
445 | } | 449 | } |
446 | }) | 450 | }) |
447 | .collect() | 451 | .collect() |
@@ -719,7 +723,7 @@ fn format_param_to(fn_def: &mut String, ctx: &AssistContext, module: hir::Module | |||
719 | param.mut_pattern(), | 723 | param.mut_pattern(), |
720 | param.var.name(ctx.db()).unwrap(), | 724 | param.var.name(ctx.db()).unwrap(), |
721 | param.type_prefix(), | 725 | param.type_prefix(), |
722 | format_type(¶m.var.ty(ctx.db()), ctx, module) | 726 | format_type(¶m.ty, ctx, module) |
723 | ); | 727 | ); |
724 | } | 728 | } |
725 | 729 | ||
@@ -1726,4 +1730,53 @@ fn $0fun_name(n: i32) { | |||
1726 | }", | 1730 | }", |
1727 | ); | 1731 | ); |
1728 | } | 1732 | } |
1733 | |||
1734 | #[test] | ||
1735 | fn non_copy_without_usages_after() { | ||
1736 | check_assist( | ||
1737 | extract_function, | ||
1738 | r" | ||
1739 | struct Counter(i32); | ||
1740 | fn foo() { | ||
1741 | let c = Counter(0); | ||
1742 | $0let n = c.0;$0 | ||
1743 | }", | ||
1744 | r" | ||
1745 | struct Counter(i32); | ||
1746 | fn foo() { | ||
1747 | let c = Counter(0); | ||
1748 | fun_name(c); | ||
1749 | } | ||
1750 | |||
1751 | fn $0fun_name(c: Counter) { | ||
1752 | let n = c.0; | ||
1753 | }", | ||
1754 | ); | ||
1755 | } | ||
1756 | |||
1757 | |||
1758 | #[test] | ||
1759 | fn non_copy_used_after() { | ||
1760 | check_assist( | ||
1761 | extract_function, | ||
1762 | r" | ||
1763 | struct Counter(i32); | ||
1764 | fn foo() { | ||
1765 | let c = Counter(0); | ||
1766 | $0let n = c.0;$0 | ||
1767 | let m = c.0; | ||
1768 | }", | ||
1769 | r" | ||
1770 | struct Counter(i32); | ||
1771 | fn foo() { | ||
1772 | let c = Counter(0); | ||
1773 | fun_name(&c); | ||
1774 | let m = c.0; | ||
1775 | } | ||
1776 | |||
1777 | fn $0fun_name(c: &Counter) { | ||
1778 | let n = *c.0; | ||
1779 | }", | ||
1780 | ); | ||
1781 | } | ||
1729 | } | 1782 | } |