From b6201051b2975ece55f000e2b428e69dc35b7d63 Mon Sep 17 00:00:00 2001 From: Jeroen Vannevel Date: Fri, 7 Jan 2022 01:02:16 +0000 Subject: [PATCH 1/6] Count the type parameters only --- .../src/handlers/add_turbo_fish.rs | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/crates/ide_assists/src/handlers/add_turbo_fish.rs b/crates/ide_assists/src/handlers/add_turbo_fish.rs index 2872edc9e10..95182d6edef 100644 --- a/crates/ide_assists/src/handlers/add_turbo_fish.rs +++ b/crates/ide_assists/src/handlers/add_turbo_fish.rs @@ -77,7 +77,13 @@ pub(crate) fn add_turbo_fish(acc: &mut Assists, ctx: &AssistContext) -> Option<( } } - let number_of_arguments = generics.len(); + let number_of_arguments = generics + .iter() + .filter(|param| match param { + hir::GenericParam::TypeParam(_) => true, + _ => false, + }) + .count(); let fish_head = std::iter::repeat("_").take(number_of_arguments).collect::>().join(","); acc.add( @@ -339,4 +345,23 @@ fn main() { "Add `: _` before assignment operator", ); } + + #[test] + fn add_turbo_fish_function_lifetime_parameter() { + check_assist( + add_turbo_fish, + r#" +fn make<'a, T, A>(t: T, a: A) {} +fn main() { + make$0(5, 2); +} +"#, + r#" +fn make<'a, T, A>(t: T, a: A) {} +fn main() { + make::<${0:_,_}>(5, 2); +} +"#, + ); + } } From 734193bc23e737191eb6fa66c355af866c0c3fb2 Mon Sep 17 00:00:00 2001 From: Jeroen Vannevel Date: Fri, 7 Jan 2022 01:09:32 +0000 Subject: [PATCH 2/6] support const params --- .../src/handlers/add_turbo_fish.rs | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/crates/ide_assists/src/handlers/add_turbo_fish.rs b/crates/ide_assists/src/handlers/add_turbo_fish.rs index 95182d6edef..12d9a9de6d4 100644 --- a/crates/ide_assists/src/handlers/add_turbo_fish.rs +++ b/crates/ide_assists/src/handlers/add_turbo_fish.rs @@ -80,7 +80,7 @@ pub(crate) fn add_turbo_fish(acc: &mut Assists, ctx: &AssistContext) -> Option<( let number_of_arguments = generics .iter() .filter(|param| match param { - hir::GenericParam::TypeParam(_) => true, + hir::GenericParam::TypeParam(_) | hir::GenericParam::ConstParam(_) => true, _ => false, }) .count(); @@ -361,6 +361,25 @@ fn make<'a, T, A>(t: T, a: A) {} fn main() { make::<${0:_,_}>(5, 2); } +"#, + ); + } + + #[test] + fn add_turbo_fish_function_const_parameter() { + check_assist( + add_turbo_fish, + r#" +fn make(t: T) {} +fn main() { + make$0(3); +} +"#, + r#" +fn make(t: T) {} +fn main() { + make::<${0:_,_}>(3); +} "#, ); } From 76e04290480e872fe59d094118cd341937805d23 Mon Sep 17 00:00:00 2001 From: Jeroen Vannevel Date: Fri, 7 Jan 2022 12:34:03 +0000 Subject: [PATCH 3/6] concise filtering --- crates/ide_assists/src/handlers/add_turbo_fish.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/crates/ide_assists/src/handlers/add_turbo_fish.rs b/crates/ide_assists/src/handlers/add_turbo_fish.rs index 12d9a9de6d4..e493e4e192e 100644 --- a/crates/ide_assists/src/handlers/add_turbo_fish.rs +++ b/crates/ide_assists/src/handlers/add_turbo_fish.rs @@ -79,10 +79,7 @@ pub(crate) fn add_turbo_fish(acc: &mut Assists, ctx: &AssistContext) -> Option<( let number_of_arguments = generics .iter() - .filter(|param| match param { - hir::GenericParam::TypeParam(_) | hir::GenericParam::ConstParam(_) => true, - _ => false, - }) + .filter(|param| matches!(param, hir::GenericParam::TypeParam(_) | hir::GenericParam::ConstParam(_))) .count(); let fish_head = std::iter::repeat("_").take(number_of_arguments).collect::>().join(","); From 778e71b15fac1a5c7dfff031d79d024eaf99665d Mon Sep 17 00:00:00 2001 From: Jeroen Vannevel Date: Fri, 7 Jan 2022 12:40:41 +0000 Subject: [PATCH 4/6] fmt --- crates/ide_assists/src/handlers/add_turbo_fish.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/crates/ide_assists/src/handlers/add_turbo_fish.rs b/crates/ide_assists/src/handlers/add_turbo_fish.rs index e493e4e192e..f67c65d1668 100644 --- a/crates/ide_assists/src/handlers/add_turbo_fish.rs +++ b/crates/ide_assists/src/handlers/add_turbo_fish.rs @@ -79,7 +79,9 @@ pub(crate) fn add_turbo_fish(acc: &mut Assists, ctx: &AssistContext) -> Option<( let number_of_arguments = generics .iter() - .filter(|param| matches!(param, hir::GenericParam::TypeParam(_) | hir::GenericParam::ConstParam(_))) + .filter(|param| { + matches!(param, hir::GenericParam::TypeParam(_) | hir::GenericParam::ConstParam(_)) + }) .count(); let fish_head = std::iter::repeat("_").take(number_of_arguments).collect::>().join(","); From 4bcdb053253e82f88d9db7806571887da45599d7 Mon Sep 17 00:00:00 2001 From: Jeroen Vannevel Date: Fri, 7 Jan 2022 13:17:21 +0000 Subject: [PATCH 5/6] include tabstops --- .../src/handlers/add_turbo_fish.rs | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/crates/ide_assists/src/handlers/add_turbo_fish.rs b/crates/ide_assists/src/handlers/add_turbo_fish.rs index f67c65d1668..522dacc7627 100644 --- a/crates/ide_assists/src/handlers/add_turbo_fish.rs +++ b/crates/ide_assists/src/handlers/add_turbo_fish.rs @@ -83,7 +83,6 @@ pub(crate) fn add_turbo_fish(acc: &mut Assists, ctx: &AssistContext) -> Option<( matches!(param, hir::GenericParam::TypeParam(_) | hir::GenericParam::ConstParam(_)) }) .count(); - let fish_head = std::iter::repeat("_").take(number_of_arguments).collect::>().join(","); acc.add( AssistId("add_turbo_fish", AssistKind::RefactorRewrite), @@ -91,10 +90,12 @@ pub(crate) fn add_turbo_fish(acc: &mut Assists, ctx: &AssistContext) -> Option<( ident.text_range(), |builder| match ctx.config.snippet_cap { Some(cap) => { - let snip = format!("::<${{0:{}}}>", fish_head); + let snip = format!("::<{}>", get_snippet_fish_head(number_of_arguments)); builder.insert_snippet(cap, ident.text_range().end(), snip) } None => { + let fish_head = + std::iter::repeat("_").take(number_of_arguments).collect::>().join(", "); let snip = format!("::<{}>", fish_head); builder.insert(ident.text_range().end(), snip); } @@ -102,6 +103,20 @@ pub(crate) fn add_turbo_fish(acc: &mut Assists, ctx: &AssistContext) -> Option<( ) } +/// This will create a snippet string with tabstops marked +fn get_snippet_fish_head(number_of_arguments: usize) -> String { + let mut fish_head = String::new(); + let mut i = 1; + while i < number_of_arguments { + fish_head.push_str(&format!("${{{}:_}},", i)); + i = i + 1; + } + + // tabstop 0 is a special case and always the last one + fish_head.push_str("${0:_}"); + fish_head +} + #[cfg(test)] mod tests { use crate::tests::{check_assist, check_assist_by_label, check_assist_not_applicable}; @@ -140,7 +155,7 @@ fn main() { r#" fn make() -> T {} fn main() { - make::<${0:_,_}>(); + make::<${1:_},${0:_}>(); } "#, ); @@ -159,7 +174,7 @@ fn main() { r#" fn make() -> T {} fn main() { - make::<${0:_,_,_,_,_,_,_}>(); + make::<${1:_},${2:_},${3:_},${4:_},${5:_},${6:_},${0:_}>(); } "#, ); @@ -358,7 +373,7 @@ fn main() { r#" fn make<'a, T, A>(t: T, a: A) {} fn main() { - make::<${0:_,_}>(5, 2); + make::<${1:_},${0:_}>(5, 2); } "#, ); @@ -377,7 +392,7 @@ fn main() { r#" fn make(t: T) {} fn main() { - make::<${0:_,_}>(3); + make::<${1:_},${0:_}>(3); } "#, ); From 0a240e31c5327cf509d335d0dfb6a5d97100ac0a Mon Sep 17 00:00:00 2001 From: Jeroen Vannevel Date: Fri, 7 Jan 2022 13:53:42 +0000 Subject: [PATCH 6/6] succinct code --- .../src/handlers/add_turbo_fish.rs | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/crates/ide_assists/src/handlers/add_turbo_fish.rs b/crates/ide_assists/src/handlers/add_turbo_fish.rs index 522dacc7627..c3d27f7ea65 100644 --- a/crates/ide_assists/src/handlers/add_turbo_fish.rs +++ b/crates/ide_assists/src/handlers/add_turbo_fish.rs @@ -1,4 +1,5 @@ use ide_db::defs::{Definition, NameRefClass}; +use itertools::Itertools; use syntax::{ast, AstNode, SyntaxKind, T}; use crate::{ @@ -94,8 +95,7 @@ pub(crate) fn add_turbo_fish(acc: &mut Assists, ctx: &AssistContext) -> Option<( builder.insert_snippet(cap, ident.text_range().end(), snip) } None => { - let fish_head = - std::iter::repeat("_").take(number_of_arguments).collect::>().join(", "); + let fish_head = std::iter::repeat("_").take(number_of_arguments).format(", "); let snip = format!("::<{}>", fish_head); builder.insert(ident.text_range().end(), snip); } @@ -105,12 +105,9 @@ pub(crate) fn add_turbo_fish(acc: &mut Assists, ctx: &AssistContext) -> Option<( /// This will create a snippet string with tabstops marked fn get_snippet_fish_head(number_of_arguments: usize) -> String { - let mut fish_head = String::new(); - let mut i = 1; - while i < number_of_arguments { - fish_head.push_str(&format!("${{{}:_}},", i)); - i = i + 1; - } + let mut fish_head = (1..number_of_arguments) + .format_with("", |i, f| f(&format_args!("${{{}:_}}, ", i))) + .to_string(); // tabstop 0 is a special case and always the last one fish_head.push_str("${0:_}"); @@ -155,7 +152,7 @@ fn main() { r#" fn make() -> T {} fn main() { - make::<${1:_},${0:_}>(); + make::<${1:_}, ${0:_}>(); } "#, ); @@ -174,7 +171,7 @@ fn main() { r#" fn make() -> T {} fn main() { - make::<${1:_},${2:_},${3:_},${4:_},${5:_},${6:_},${0:_}>(); + make::<${1:_}, ${2:_}, ${3:_}, ${4:_}, ${5:_}, ${6:_}, ${0:_}>(); } "#, ); @@ -373,7 +370,7 @@ fn main() { r#" fn make<'a, T, A>(t: T, a: A) {} fn main() { - make::<${1:_},${0:_}>(5, 2); + make::<${1:_}, ${0:_}>(5, 2); } "#, ); @@ -392,7 +389,7 @@ fn main() { r#" fn make(t: T) {} fn main() { - make::<${1:_},${0:_}>(3); + make::<${1:_}, ${0:_}>(3); } "#, );