@@ -9,7 +9,7 @@ use ra_syntax::{
9
9
} ;
10
10
11
11
use crate :: db:: AstDatabase ;
12
- use crate :: { name, quote, LazyMacroId , MacroDefId , MacroDefKind } ;
12
+ use crate :: { name, quote, LazyMacroId , MacroCallId , MacroDefId , MacroDefKind } ;
13
13
14
14
macro_rules! register_builtin {
15
15
( $( $trait: ident => $expand: ident) ,* ) => {
@@ -153,76 +153,113 @@ fn expand_simple_derive(
153
153
Ok ( expanded)
154
154
}
155
155
156
+ fn find_builtin_crate ( db : & dyn AstDatabase , id : LazyMacroId ) -> tt:: TokenTree {
157
+ // FIXME: make hygiene works for builtin derive macro
158
+ // such that $crate can be used here.
159
+
160
+ let m: MacroCallId = id. into ( ) ;
161
+ let file_id = m. as_file ( ) . original_file ( db) ;
162
+ let cg = db. crate_graph ( ) ;
163
+ let krates = db. relevant_crates ( file_id) ;
164
+ let krate = match krates. get ( 0 ) {
165
+ Some ( krate) => krate,
166
+ None => {
167
+ let tt = quote ! { core } ;
168
+ return tt. token_trees [ 0 ] . clone ( ) ;
169
+ }
170
+ } ;
171
+
172
+ // XXX
173
+ // All crates except core itself should have a dependency on core,
174
+ // We detect `core` by seeing whether it doesn't have such a dependency.
175
+ let tt = if cg[ * krate] . dependencies . iter ( ) . any ( |dep| dep. name == "core" ) {
176
+ quote ! { core }
177
+ } else {
178
+ quote ! { crate }
179
+ } ;
180
+
181
+ tt. token_trees [ 0 ] . clone ( )
182
+ }
183
+
156
184
fn copy_expand (
157
- _db : & dyn AstDatabase ,
158
- _id : LazyMacroId ,
185
+ db : & dyn AstDatabase ,
186
+ id : LazyMacroId ,
159
187
tt : & tt:: Subtree ,
160
188
) -> Result < tt:: Subtree , mbe:: ExpandError > {
161
- expand_simple_derive ( tt, quote ! { std:: marker:: Copy } )
189
+ let krate = find_builtin_crate ( db, id) ;
190
+ expand_simple_derive ( tt, quote ! { #krate:: marker:: Copy } )
162
191
}
163
192
164
193
fn clone_expand (
165
- _db : & dyn AstDatabase ,
166
- _id : LazyMacroId ,
194
+ db : & dyn AstDatabase ,
195
+ id : LazyMacroId ,
167
196
tt : & tt:: Subtree ,
168
197
) -> Result < tt:: Subtree , mbe:: ExpandError > {
169
- expand_simple_derive ( tt, quote ! { std:: clone:: Clone } )
198
+ let krate = find_builtin_crate ( db, id) ;
199
+ expand_simple_derive ( tt, quote ! { #krate:: clone:: Clone } )
170
200
}
171
201
172
202
fn default_expand (
173
- _db : & dyn AstDatabase ,
174
- _id : LazyMacroId ,
203
+ db : & dyn AstDatabase ,
204
+ id : LazyMacroId ,
175
205
tt : & tt:: Subtree ,
176
206
) -> Result < tt:: Subtree , mbe:: ExpandError > {
177
- expand_simple_derive ( tt, quote ! { std:: default :: Default } )
207
+ let krate = find_builtin_crate ( db, id) ;
208
+ expand_simple_derive ( tt, quote ! { #krate:: default :: Default } )
178
209
}
179
210
180
211
fn debug_expand (
181
- _db : & dyn AstDatabase ,
182
- _id : LazyMacroId ,
212
+ db : & dyn AstDatabase ,
213
+ id : LazyMacroId ,
183
214
tt : & tt:: Subtree ,
184
215
) -> Result < tt:: Subtree , mbe:: ExpandError > {
185
- expand_simple_derive ( tt, quote ! { std:: fmt:: Debug } )
216
+ let krate = find_builtin_crate ( db, id) ;
217
+ expand_simple_derive ( tt, quote ! { #krate:: fmt:: Debug } )
186
218
}
187
219
188
220
fn hash_expand (
189
- _db : & dyn AstDatabase ,
190
- _id : LazyMacroId ,
221
+ db : & dyn AstDatabase ,
222
+ id : LazyMacroId ,
191
223
tt : & tt:: Subtree ,
192
224
) -> Result < tt:: Subtree , mbe:: ExpandError > {
193
- expand_simple_derive ( tt, quote ! { std:: hash:: Hash } )
225
+ let krate = find_builtin_crate ( db, id) ;
226
+ expand_simple_derive ( tt, quote ! { #krate:: hash:: Hash } )
194
227
}
195
228
196
229
fn eq_expand (
197
- _db : & dyn AstDatabase ,
198
- _id : LazyMacroId ,
230
+ db : & dyn AstDatabase ,
231
+ id : LazyMacroId ,
199
232
tt : & tt:: Subtree ,
200
233
) -> Result < tt:: Subtree , mbe:: ExpandError > {
201
- expand_simple_derive ( tt, quote ! { std:: cmp:: Eq } )
234
+ let krate = find_builtin_crate ( db, id) ;
235
+ expand_simple_derive ( tt, quote ! { #krate:: cmp:: Eq } )
202
236
}
203
237
204
238
fn partial_eq_expand (
205
- _db : & dyn AstDatabase ,
206
- _id : LazyMacroId ,
239
+ db : & dyn AstDatabase ,
240
+ id : LazyMacroId ,
207
241
tt : & tt:: Subtree ,
208
242
) -> Result < tt:: Subtree , mbe:: ExpandError > {
209
- expand_simple_derive ( tt, quote ! { std:: cmp:: PartialEq } )
243
+ let krate = find_builtin_crate ( db, id) ;
244
+ expand_simple_derive ( tt, quote ! { #krate:: cmp:: PartialEq } )
210
245
}
211
246
212
247
fn ord_expand (
213
- _db : & dyn AstDatabase ,
214
- _id : LazyMacroId ,
248
+ db : & dyn AstDatabase ,
249
+ id : LazyMacroId ,
215
250
tt : & tt:: Subtree ,
216
251
) -> Result < tt:: Subtree , mbe:: ExpandError > {
217
- expand_simple_derive ( tt, quote ! { std:: cmp:: Ord } )
252
+ let krate = find_builtin_crate ( db, id) ;
253
+ expand_simple_derive ( tt, quote ! { #krate:: cmp:: Ord } )
218
254
}
219
255
220
256
fn partial_ord_expand (
221
- _db : & dyn AstDatabase ,
222
- _id : LazyMacroId ,
257
+ db : & dyn AstDatabase ,
258
+ id : LazyMacroId ,
223
259
tt : & tt:: Subtree ,
224
260
) -> Result < tt:: Subtree , mbe:: ExpandError > {
225
- expand_simple_derive ( tt, quote ! { std:: cmp:: PartialOrd } )
261
+ let krate = find_builtin_crate ( db, id) ;
262
+ expand_simple_derive ( tt, quote ! { #krate:: cmp:: PartialOrd } )
226
263
}
227
264
228
265
#[ cfg( test) ]
@@ -234,8 +271,18 @@ mod tests {
234
271
235
272
fn expand_builtin_derive ( s : & str , name : Name ) -> String {
236
273
let def = find_builtin_derive ( & name) . unwrap ( ) ;
274
+ let fixture = format ! (
275
+ r#"//- /main.rs crate:main deps:core
276
+ <|>
277
+ {}
278
+ //- /lib.rs crate:core
279
+ // empty
280
+ "# ,
281
+ s
282
+ ) ;
237
283
238
- let ( db, file_id) = TestDB :: with_single_file ( & s) ;
284
+ let ( db, file_pos) = TestDB :: with_position ( & fixture) ;
285
+ let file_id = file_pos. file_id ;
239
286
let parsed = db. parse ( file_id) ;
240
287
let items: Vec < _ > =
241
288
parsed. syntax_node ( ) . descendants ( ) . filter_map ( ast:: ModuleItem :: cast) . collect ( ) ;
@@ -264,7 +311,7 @@ mod tests {
264
311
known:: Copy ,
265
312
) ;
266
313
267
- assert_eq ! ( expanded, "impl< >std ::marker::CopyforFoo< >{}" ) ;
314
+ assert_eq ! ( expanded, "impl< >core ::marker::CopyforFoo< >{}" ) ;
268
315
}
269
316
270
317
#[ test]
@@ -279,7 +326,7 @@ mod tests {
279
326
280
327
assert_eq ! (
281
328
expanded,
282
- "impl<T0:std ::marker::Copy,T1:std ::marker::Copy>std ::marker::CopyforFoo<T0,T1>{}"
329
+ "impl<T0:core ::marker::Copy,T1:core ::marker::Copy>core ::marker::CopyforFoo<T0,T1>{}"
283
330
) ;
284
331
}
285
332
@@ -297,7 +344,7 @@ mod tests {
297
344
298
345
assert_eq ! (
299
346
expanded,
300
- "impl<T0:std ::marker::Copy,T1:std ::marker::Copy>std ::marker::CopyforFoo<T0,T1>{}"
347
+ "impl<T0:core ::marker::Copy,T1:core ::marker::Copy>core ::marker::CopyforFoo<T0,T1>{}"
301
348
) ;
302
349
}
303
350
@@ -313,7 +360,7 @@ mod tests {
313
360
314
361
assert_eq ! (
315
362
expanded,
316
- "impl<T0:std ::clone::Clone,T1:std ::clone::Clone>std ::clone::CloneforFoo<T0,T1>{}"
363
+ "impl<T0:core ::clone::Clone,T1:core ::clone::Clone>core ::clone::CloneforFoo<T0,T1>{}"
317
364
) ;
318
365
}
319
366
}
0 commit comments