10
10
11
11
use std:: panic;
12
12
13
+ use errors:: FatalError ;
13
14
use rustc_macro:: { TokenStream , __internal} ;
14
15
use syntax:: ast:: { self , ItemKind } ;
15
- use syntax:: codemap:: Span ;
16
+ use syntax:: codemap:: { ExpnInfo , MacroAttribute , NameAndSpan , Span } ;
16
17
use syntax:: ext:: base:: * ;
17
18
use syntax:: fold:: { self , Folder } ;
18
- use errors:: FatalError ;
19
+ use syntax:: parse:: token:: intern;
20
+ use syntax:: print:: pprust;
19
21
20
22
pub struct CustomDerive {
21
23
inner : fn ( TokenStream ) -> TokenStream ,
@@ -31,7 +33,7 @@ impl MultiItemModifier for CustomDerive {
31
33
fn expand ( & self ,
32
34
ecx : & mut ExtCtxt ,
33
35
span : Span ,
34
- _meta_item : & ast:: MetaItem ,
36
+ meta_item : & ast:: MetaItem ,
35
37
item : Annotatable )
36
38
-> Vec < Annotatable > {
37
39
let item = match item {
@@ -53,7 +55,17 @@ impl MultiItemModifier for CustomDerive {
53
55
}
54
56
}
55
57
56
- let input_span = item. span ;
58
+ let input_span = Span {
59
+ expn_id : ecx. codemap ( ) . record_expansion ( ExpnInfo {
60
+ call_site : span,
61
+ callee : NameAndSpan {
62
+ format : MacroAttribute ( intern ( & pprust:: meta_item_to_string ( meta_item) ) ) ,
63
+ span : Some ( span) ,
64
+ allow_internal_unstable : true ,
65
+ } ,
66
+ } ) ,
67
+ ..item. span
68
+ } ;
57
69
let input = __internal:: new_token_stream ( item) ;
58
70
let res = __internal:: set_parse_sess ( & ecx. parse_sess , || {
59
71
let inner = self . inner ;
0 commit comments