1
1
use syntax:: {
2
- ast:: { self , edit_in_place:: GenericParamsOwnerEdit , make, AstNode } ,
2
+ ast:: { self , edit_in_place:: GenericParamsOwnerEdit , make, AstNode , HasGenericParams } ,
3
3
ted,
4
4
} ;
5
5
@@ -14,7 +14,7 @@ use crate::{utils::suggest_name, AssistContext, AssistId, AssistKind, Assists};
14
14
// ```
15
15
// ->
16
16
// ```
17
- // fn foo<B : Bar>(bar: B) {}
17
+ // fn foo<$0B : Bar>(bar: B) {}
18
18
// ```
19
19
pub ( crate ) fn introduce_named_generic ( acc : & mut Assists , ctx : & AssistContext < ' _ > ) -> Option < ( ) > {
20
20
let impl_trait_type = ctx. find_node_at_offset :: < ast:: ImplTraitType > ( ) ?;
@@ -39,7 +39,15 @@ pub(crate) fn introduce_named_generic(acc: &mut Assists, ctx: &AssistContext<'_>
39
39
let new_ty = make:: ty ( & type_param_name) . clone_for_update ( ) ;
40
40
41
41
ted:: replace ( impl_trait_type. syntax ( ) , new_ty. syntax ( ) ) ;
42
- fn_. get_or_create_generic_param_list ( ) . add_generic_param ( type_param. into ( ) )
42
+ fn_. get_or_create_generic_param_list ( ) . add_generic_param ( type_param. into ( ) ) ;
43
+
44
+ if let Some ( cap) = ctx. config . snippet_cap {
45
+ if let Some ( generic_param) =
46
+ fn_. generic_param_list ( ) . and_then ( |it| it. generic_params ( ) . last ( ) )
47
+ {
48
+ edit. add_tabstop_before ( cap, generic_param) ;
49
+ }
50
+ }
43
51
} ,
44
52
)
45
53
}
@@ -55,7 +63,7 @@ mod tests {
55
63
check_assist (
56
64
introduce_named_generic,
57
65
r#"fn foo<G>(bar: $0impl Bar) {}"# ,
58
- r#"fn foo<G, B : Bar>(bar: B) {}"# ,
66
+ r#"fn foo<G, $0B : Bar>(bar: B) {}"# ,
59
67
) ;
60
68
}
61
69
@@ -64,7 +72,7 @@ mod tests {
64
72
check_assist (
65
73
introduce_named_generic,
66
74
r#"fn foo(bar: $0impl Bar) {}"# ,
67
- r#"fn foo<B : Bar>(bar: B) {}"# ,
75
+ r#"fn foo<$0B : Bar>(bar: B) {}"# ,
68
76
) ;
69
77
}
70
78
@@ -73,7 +81,7 @@ mod tests {
73
81
check_assist (
74
82
introduce_named_generic,
75
83
r#"fn foo<G>(foo: impl Foo, bar: $0impl Bar) {}"# ,
76
- r#"fn foo<G, B : Bar>(foo: impl Foo, bar: B) {}"# ,
84
+ r#"fn foo<G, $0B : Bar>(foo: impl Foo, bar: B) {}"# ,
77
85
) ;
78
86
}
79
87
@@ -82,7 +90,7 @@ mod tests {
82
90
check_assist (
83
91
introduce_named_generic,
84
92
r#"fn foo<>(bar: $0impl Bar) {}"# ,
85
- r#"fn foo<B : Bar>(bar: B) {}"# ,
93
+ r#"fn foo<$0B : Bar>(bar: B) {}"# ,
86
94
) ;
87
95
}
88
96
@@ -95,7 +103,7 @@ fn foo<
95
103
>(bar: $0impl Bar) {}
96
104
"# ,
97
105
r#"
98
- fn foo<B : Bar
106
+ fn foo<$0B : Bar
99
107
>(bar: B) {}
100
108
"# ,
101
109
) ;
@@ -108,7 +116,7 @@ fn foo<B: Bar
108
116
check_assist (
109
117
introduce_named_generic,
110
118
r#"fn foo<B>(bar: $0impl Bar) {}"# ,
111
- r#"fn foo<B, B : Bar>(bar: B) {}"# ,
119
+ r#"fn foo<B, $0B : Bar>(bar: B) {}"# ,
112
120
) ;
113
121
}
114
122
@@ -127,7 +135,7 @@ fn foo<
127
135
fn foo<
128
136
G: Foo,
129
137
F,
130
- H, B : Bar,
138
+ H, $0B : Bar,
131
139
>(bar: B) {}
132
140
"# ,
133
141
) ;
@@ -138,7 +146,7 @@ fn foo<
138
146
check_assist (
139
147
introduce_named_generic,
140
148
r#"fn foo(bar: $0impl Foo + Bar) {}"# ,
141
- r#"fn foo<F : Foo + Bar>(bar: F) {}"# ,
149
+ r#"fn foo<$0F : Foo + Bar>(bar: F) {}"# ,
142
150
) ;
143
151
}
144
152
}
0 commit comments