diff options
| author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2022-01-01 16:42:22 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-01-01 16:42:22 +0000 |
| commit | 3f2edc72cd80d3c2f85705d499d7416690782611 (patch) | |
| tree | d2ed7e7f976a8cd4ec1b9678c2619a988cac9cc2 | |
| parent | 9c210a49b6871f9bd903f1d36a95b6f2de24429d (diff) | |
| parent | b04c4e76df3fe5e8944b007dd6158e5961614263 (diff) | |
| download | rust-3f2edc72cd80d3c2f85705d499d7416690782611.tar.gz rust-3f2edc72cd80d3c2f85705d499d7416690782611.zip | |
Merge #11136
11136: Turbo fish assist supports multiple type arguments r=matklad a=Vannevelj This fixes #11135 (changelog: bug). I've only started using Rust a few days ago but saw this issue on the top of the list when I looked at this repo. I based myself on [this blog post](https://techblog.tonsser.com/posts/what-is-rusts-turbofish) to understand what a "turbo fish" is so let me know if I missed anything. Co-authored-by: Jeroen Vannevel <jer_vannevel@outlook.com>
| -rw-r--r-- | crates/ide_assists/src/handlers/add_turbo_fish.rs | 52 |
1 files changed, 50 insertions, 2 deletions
diff --git a/crates/ide_assists/src/handlers/add_turbo_fish.rs b/crates/ide_assists/src/handlers/add_turbo_fish.rs index 64f9eb9586a..b73942c3c50 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::{ @@ -77,13 +78,22 @@ pub(crate) fn add_turbo_fish(acc: &mut Assists, ctx: &AssistContext) -> Option<( } } + let number_of_arguments = generics.len(); + let fish_head = std::iter::repeat("_").take(number_of_arguments).collect_vec().join(","); + acc.add( AssistId("add_turbo_fish", AssistKind::RefactorRewrite), "Add `::<>`", ident.text_range(), |builder| match ctx.config.snippet_cap { - Some(cap) => builder.insert_snippet(cap, ident.text_range().end(), "::<${0:_}>"), - None => builder.insert(ident.text_range().end(), "::<_>"), + Some(cap) => { + let snip = format!("::<${{0:{}}}>", fish_head); + builder.insert_snippet(cap, ident.text_range().end(), snip) + } + None => { + let snip = format!("::<{}>", fish_head); + builder.insert(ident.text_range().end(), snip); + } }, ) } @@ -114,6 +124,44 @@ fn main() { } #[test] + fn add_turbo_fish_function_multiple_generic_types() { + check_assist( + add_turbo_fish, + r#" +fn make<T, A>() -> T {} +fn main() { + make$0(); +} +"#, + r#" +fn make<T, A>() -> T {} +fn main() { + make::<${0:_,_}>(); +} +"#, + ); + } + + #[test] + fn add_turbo_fish_function_many_generic_types() { + check_assist( + add_turbo_fish, + r#" +fn make<T, A, B, C, D, E, F>() -> T {} +fn main() { + make$0(); +} +"#, + r#" +fn make<T, A, B, C, D, E, F>() -> T {} +fn main() { + make::<${0:_,_,_,_,_,_,_}>(); +} +"#, + ); + } + + #[test] fn add_turbo_fish_after_call() { cov_mark::check!(add_turbo_fish_after_call); check_assist( |
