|
1 | 1 | use ide_db::defs::{Definition, NameRefClass};
|
| 2 | +use itertools::Itertools; |
2 | 3 | use syntax::{ast, AstNode, SyntaxKind, T};
|
3 | 4 |
|
4 | 5 | use crate::{
|
@@ -77,13 +78,22 @@ pub(crate) fn add_turbo_fish(acc: &mut Assists, ctx: &AssistContext) -> Option<(
|
77 | 78 | }
|
78 | 79 | }
|
79 | 80 |
|
| 81 | + let number_of_arguments = generics.len(); |
| 82 | + let fish_head = std::iter::repeat("_").take(number_of_arguments).collect_vec().join(","); |
| 83 | + |
80 | 84 | acc.add(
|
81 | 85 | AssistId("add_turbo_fish", AssistKind::RefactorRewrite),
|
82 | 86 | "Add `::<>`",
|
83 | 87 | ident.text_range(),
|
84 | 88 | |builder| match ctx.config.snippet_cap {
|
85 |
| - Some(cap) => builder.insert_snippet(cap, ident.text_range().end(), "::<${0:_}>"), |
86 |
| - None => builder.insert(ident.text_range().end(), "::<_>"), |
| 89 | + Some(cap) => { |
| 90 | + let snip = format!("::<${{0:{}}}>", fish_head); |
| 91 | + builder.insert_snippet(cap, ident.text_range().end(), snip) |
| 92 | + }, |
| 93 | + None => { |
| 94 | + let snip = format!("::<{}>", fish_head); |
| 95 | + builder.insert(ident.text_range().end(), snip); |
| 96 | + }, |
87 | 97 | },
|
88 | 98 | )
|
89 | 99 | }
|
@@ -113,6 +123,44 @@ fn main() {
|
113 | 123 | );
|
114 | 124 | }
|
115 | 125 |
|
| 126 | + #[test] |
| 127 | + fn add_turbo_fish_function_multiple_generic_types() { |
| 128 | + check_assist( |
| 129 | + add_turbo_fish, |
| 130 | + r#" |
| 131 | +fn make<T, A>() -> T {} |
| 132 | +fn main() { |
| 133 | + make$0(); |
| 134 | +} |
| 135 | +"#, |
| 136 | + r#" |
| 137 | +fn make<T, A>() -> T {} |
| 138 | +fn main() { |
| 139 | + make::<${0:_,_}>(); |
| 140 | +} |
| 141 | +"#, |
| 142 | + ); |
| 143 | + } |
| 144 | + |
| 145 | + #[test] |
| 146 | + fn add_turbo_fish_function_many_generic_types() { |
| 147 | + check_assist( |
| 148 | + add_turbo_fish, |
| 149 | + r#" |
| 150 | +fn make<T, A, B, C, D, E, F>() -> T {} |
| 151 | +fn main() { |
| 152 | + make$0(); |
| 153 | +} |
| 154 | +"#, |
| 155 | + r#" |
| 156 | +fn make<T, A, B, C, D, E, F>() -> T {} |
| 157 | +fn main() { |
| 158 | + make::<${0:_,_,_,_,_,_,_}>(); |
| 159 | +} |
| 160 | +"#, |
| 161 | + ); |
| 162 | + } |
| 163 | + |
116 | 164 | #[test]
|
117 | 165 | fn add_turbo_fish_after_call() {
|
118 | 166 | cov_mark::check!(add_turbo_fish_after_call);
|
|
0 commit comments