Preserve span on Derive trait impls
diff --git a/macro/src/expand.rs b/macro/src/expand.rs
index 92551e6..5bac706 100644
--- a/macro/src/expand.rs
+++ b/macro/src/expand.rs
@@ -3,8 +3,8 @@
use crate::syntax::report::Errors;
use crate::syntax::symbol::Symbol;
use crate::syntax::{
- self, check, mangle, Api, Derive, Enum, ExternFn, ExternType, Impl, Pair, ResolvableName,
- Signature, Struct, Type, TypeAlias, Types,
+ self, check, mangle, Api, Enum, ExternFn, ExternType, Impl, Pair, ResolvableName, Signature,
+ Struct, Trait, Type, TypeAlias, Types,
};
use proc_macro2::{Ident, Span, TokenStream};
use quote::{format_ident, quote, quote_spanned, ToTokens};
@@ -147,15 +147,18 @@
}
};
- let is_copy = strct.derives.contains(&Derive::Copy);
+ let is_copy = strct
+ .derives
+ .iter()
+ .any(|derive| derive.what == Trait::Copy);
for derive in &strct.derives {
- match derive {
- Derive::Copy => {
- expanded.extend(quote! {
+ match derive.what {
+ Trait::Copy => {
+ expanded.extend(quote_spanned! {derive.span=>
impl ::std::marker::Copy for #ident {}
});
}
- Derive::Clone => {
+ Trait::Clone => {
let body = if is_copy {
quote!(*self)
} else {
@@ -164,7 +167,7 @@
#(#fields: ::std::clone::Clone::clone(&self.#fields),)*
})
};
- expanded.extend(quote! {
+ expanded.extend(quote_spanned! {derive.span=>
impl ::std::clone::Clone for #ident {
fn clone(&self) -> Self {
#body