1
+ use ide_db:: { famous_defs:: FamousDefs , traits:: resolve_target_trait} ;
1
2
use syntax:: {
2
3
ast:: { self , AstNode , HasName , edit_in_place:: Indent , make} ,
3
4
syntax_editor:: Position ,
@@ -10,6 +11,8 @@ use crate::{AssistContext, AssistId, Assists};
10
11
// Generate `AsRef` implement from `Borrow`.
11
12
//
12
13
// ```
14
+ // //- minicore: borrow, as_ref
15
+ // use core::borrow::Borrow;
13
16
// struct Foo<T>(T);
14
17
//
15
18
// impl<T> $0Borrow<T> for Foo<T> {
@@ -20,6 +23,7 @@ use crate::{AssistContext, AssistId, Assists};
20
23
// ```
21
24
// ->
22
25
// ```
26
+ // use core::borrow::Borrow;
23
27
// struct Foo<T>(T);
24
28
//
25
29
// $0impl<T> AsRef<T> for Foo<T> {
@@ -39,6 +43,8 @@ use crate::{AssistContext, AssistId, Assists};
39
43
// Generate `AsMut` implement from `BorrowMut`.
40
44
//
41
45
// ```
46
+ // //- minicore: borrow_mut, as_mut
47
+ // use core::borrow::BorrowMut;
42
48
// struct Foo<T>(T);
43
49
//
44
50
// impl<T> $0BorrowMut<T> for Foo<T> {
@@ -49,6 +55,7 @@ use crate::{AssistContext, AssistId, Assists};
49
55
// ```
50
56
// ->
51
57
// ```
58
+ // use core::borrow::BorrowMut;
52
59
// struct Foo<T>(T);
53
60
//
54
61
// $0impl<T> AsMut<T> for Foo<T> {
@@ -73,12 +80,11 @@ pub(crate) fn generate_asref_impl_from_borrow(
73
80
let indent = impl_. indent_level ( ) ;
74
81
75
82
let name = path. path ( ) ?. segment ( ) ?. name_ref ( ) ?;
83
+ let scope = ctx. sema . scope ( path. syntax ( ) ) ?;
84
+ let famous = FamousDefs ( & ctx. sema , scope. krate ( ) ) ;
85
+ let trait_ = resolve_target_trait ( & ctx. sema , & impl_) ?;
76
86
77
- let ( target_name, target_method_name) = match & * name. text ( ) {
78
- "Borrow" => ( "AsRef" , "as_ref" ) ,
79
- "BorrowMut" => ( "AsMut" , "as_mut" ) ,
80
- _ => return None ,
81
- } ;
87
+ let ( target_name, target_method_name) = out_trait ( famous, trait_) ?;
82
88
83
89
let method = impl_. assoc_item_list ( ) ?. assoc_items ( ) . find_map ( |it| match it {
84
90
ast:: AssocItem :: Fn ( f) => Some ( f) ,
@@ -118,6 +124,19 @@ pub(crate) fn generate_asref_impl_from_borrow(
118
124
)
119
125
}
120
126
127
+ fn out_trait (
128
+ famous : FamousDefs < ' _ , ' _ > ,
129
+ trait_ : hir:: Trait ,
130
+ ) -> Option < ( & ' static str , & ' static str ) > {
131
+ if trait_ == famous. core_borrow_Borrow ( ) ? {
132
+ Some ( ( "AsRef" , "as_ref" ) )
133
+ } else if trait_ == famous. core_borrow_BorrowMut ( ) ? {
134
+ Some ( ( "AsMut" , "as_mut" ) )
135
+ } else {
136
+ None
137
+ }
138
+ }
139
+
121
140
#[ cfg( test) ]
122
141
mod tests {
123
142
use crate :: tests:: check_assist;
@@ -129,6 +148,8 @@ mod tests {
129
148
check_assist (
130
149
generate_asref_impl_from_borrow,
131
150
r#"
151
+ //- minicore: borrow, as_ref
152
+ use core::borrow::Borrow;
132
153
struct Foo<T>(T);
133
154
134
155
impl<T> $0Borrow<T> for Foo<T> {
@@ -138,6 +159,7 @@ impl<T> $0Borrow<T> for Foo<T> {
138
159
}
139
160
"# ,
140
161
r#"
162
+ use core::borrow::Borrow;
141
163
struct Foo<T>(T);
142
164
143
165
$0impl<T> AsRef<T> for Foo<T> {
@@ -160,6 +182,8 @@ impl<T> Borrow<T> for Foo<T> {
160
182
check_assist (
161
183
generate_asref_impl_from_borrow,
162
184
r#"
185
+ //- minicore: borrow_mut, as_mut
186
+ use core::borrow::BorrowMut;
163
187
struct Foo<T>(T);
164
188
165
189
impl<T> $0BorrowMut<T> for Foo<T> {
@@ -169,6 +193,7 @@ impl<T> $0BorrowMut<T> for Foo<T> {
169
193
}
170
194
"# ,
171
195
r#"
196
+ use core::borrow::BorrowMut;
172
197
struct Foo<T>(T);
173
198
174
199
$0impl<T> AsMut<T> for Foo<T> {
@@ -191,6 +216,8 @@ impl<T> BorrowMut<T> for Foo<T> {
191
216
check_assist (
192
217
generate_asref_impl_from_borrow,
193
218
r#"
219
+ //- minicore: borrow, as_ref
220
+ use core::borrow::Borrow;
194
221
struct Foo<T>(T);
195
222
196
223
#[cfg(feature = "foo")]
@@ -202,6 +229,7 @@ impl<T> $0Borrow<T> for Foo<T> {
202
229
}
203
230
"# ,
204
231
r#"
232
+ use core::borrow::Borrow;
205
233
struct Foo<T>(T);
206
234
207
235
$0#[cfg(feature = "foo")]
@@ -228,8 +256,10 @@ impl<T> Borrow<T> for Foo<T> {
228
256
check_assist (
229
257
generate_asref_impl_from_borrow,
230
258
r#"
259
+ //- minicore: borrow, as_ref
231
260
mod foo {
232
261
mod bar {
262
+ use core::borrow::Borrow;
233
263
struct Foo<T>(T);
234
264
235
265
impl<T> $0Borrow<T> for Foo<T> {
@@ -243,6 +273,7 @@ mod foo {
243
273
r#"
244
274
mod foo {
245
275
mod bar {
276
+ use core::borrow::Borrow;
246
277
struct Foo<T>(T);
247
278
248
279
$0impl<T> AsRef<T> for Foo<T> {
0 commit comments