From cd5ad4e5007c0de29c487bb2763db7e3457b2a2c Mon Sep 17 00:00:00 2001 From: Jeroen Vannevel Date: Wed, 5 Jan 2022 01:18:55 +0000 Subject: [PATCH] Don't include a ref if none was declared --- .../src/handlers/extract_variable.rs | 52 +++++++++++++++++-- 1 file changed, 49 insertions(+), 3 deletions(-) diff --git a/crates/ide_assists/src/handlers/extract_variable.rs b/crates/ide_assists/src/handlers/extract_variable.rs index fb48c0b4f12d..39a4700915f6 100644 --- a/crates/ide_assists/src/handlers/extract_variable.rs +++ b/crates/ide_assists/src/handlers/extract_variable.rs @@ -53,7 +53,13 @@ pub(crate) fn extract_variable(acc: &mut Assists, ctx: &AssistContext) -> Option } let ref_kind: RefKind = if let Some(receiver_type) = get_receiver_type(&ctx, &to_extract) { - if receiver_type.is_mutable_reference() { RefKind::MutRef } else { RefKind::Ref } + if receiver_type.is_mutable_reference() { + RefKind::MutRef + } else if receiver_type.is_reference() { + RefKind::Ref + } else { + RefKind::None + } } else { RefKind::None }; @@ -86,7 +92,7 @@ pub(crate) fn extract_variable(acc: &mut Assists, ctx: &AssistContext) -> Option let reference_modifier = match ref_kind { RefKind::MutRef => "&mut ", RefKind::Ref => "&", - RefKind::None => "" + RefKind::None => "", }; match anchor { @@ -180,7 +186,7 @@ fn get_receiver(expression: ast::Expr) -> Option { enum RefKind { Ref, MutRef, - None + None, } #[derive(Debug)] @@ -1088,6 +1094,46 @@ struct S { fn foo(s: &S) { let $0z = &s.sub.field.field; z.do_thing(); +}"#, + ); + } + + #[test] + fn test_extract_var_regular_parameter() { + check_assist( + extract_variable, + r#" +struct X; + +impl X { + fn do_thing(&self) { + + } +} + +struct S { + sub: X +} + +fn foo(s: S) { + $0s.sub$0.do_thing(); +}"#, + r#" +struct X; + +impl X { + fn do_thing(&self) { + + } +} + +struct S { + sub: X +} + +fn foo(s: S) { + let $0x = s.sub; + x.do_thing(); }"#, ); }