@@ -2,7 +2,7 @@ use crate::ast::{Enum, Field, Input, Struct};
2
2
use crate :: attr:: Trait ;
3
3
use crate :: generics:: InferredBounds ;
4
4
use crate :: unraw:: MemberUnraw ;
5
- use proc_macro2:: { Ident , TokenStream } ;
5
+ use proc_macro2:: { Ident , Span , TokenStream } ;
6
6
use quote:: { format_ident, quote, quote_spanned, ToTokens } ;
7
7
use std:: collections:: BTreeSet as Set ;
8
8
use syn:: { DeriveInput , GenericArgument , PathArguments , Result , Token , Type } ;
@@ -27,7 +27,7 @@ fn try_expand(input: &DeriveInput) -> Result<TokenStream> {
27
27
}
28
28
29
29
fn fallback ( input : & DeriveInput , error : syn:: Error ) -> TokenStream {
30
- let ty = & input. ident ;
30
+ let ty = call_site_ident ( & input. ident ) ;
31
31
let ( impl_generics, ty_generics, where_clause) = input. generics . split_for_impl ( ) ;
32
32
33
33
let error = error. to_compile_error ( ) ;
@@ -55,7 +55,7 @@ fn fallback(input: &DeriveInput, error: syn::Error) -> TokenStream {
55
55
}
56
56
57
57
fn impl_struct ( input : Struct ) -> TokenStream {
58
- let ty = & input. ident ;
58
+ let ty = call_site_ident ( & input. ident ) ;
59
59
let ( impl_generics, ty_generics, where_clause) = input. generics . split_for_impl ( ) ;
60
60
let mut error_inferred_bounds = InferredBounds :: new ( ) ;
61
61
@@ -228,7 +228,7 @@ fn impl_struct(input: Struct) -> TokenStream {
228
228
}
229
229
230
230
fn impl_enum ( input : Enum ) -> TokenStream {
231
- let ty = & input. ident ;
231
+ let ty = call_site_ident ( & input. ident ) ;
232
232
let ( impl_generics, ty_generics, where_clause) = input. generics . split_for_impl ( ) ;
233
233
let mut error_inferred_bounds = InferredBounds :: new ( ) ;
234
234
@@ -492,6 +492,14 @@ fn impl_enum(input: Enum) -> TokenStream {
492
492
}
493
493
}
494
494
495
+ // Create an ident with which we can expand `impl Trait for #ident {}` on a
496
+ // deprecated type without triggering deprecation warning on the generated impl.
497
+ fn call_site_ident ( ident : & Ident ) -> Ident {
498
+ let mut ident = ident. clone ( ) ;
499
+ ident. set_span ( Span :: call_site ( ) ) ;
500
+ ident
501
+ }
502
+
495
503
fn fields_pat ( fields : & [ Field ] ) -> TokenStream {
496
504
let mut members = fields. iter ( ) . map ( |field| & field. member ) . peekable ( ) ;
497
505
match members. peek ( ) {
0 commit comments