Compare commits

...

14 Commits

Author SHA1 Message Date
David Tolnay 532b950971 Release 0.8.13 2016-10-16 10:34:26 -07:00
Erick Tryzelaar f93b4e91e6 Version bump serde_derive to 0.8.13 2016-10-15 15:24:37 -07:00
Erick Tryzelaar 94e2ccc94e Merge pull request #588 from erickt/master
Drop support for rust 1.8.0 and 1.9.0.
2016-10-15 15:12:56 -07:00
Erick Tryzelaar cbe6b4c97c Drop support for rust 1.8.0 and 1.9.0. 2016-10-15 14:43:30 -07:00
Erick Tryzelaar a46a4e27dd Merge pull request #587 from erickt/master
Update syntex version to 0.45.0
2016-10-15 14:43:13 -07:00
Erick Tryzelaar 4919a3184d Update syntex version to 0.45.0 2016-10-15 14:01:14 -07:00
David Tolnay 0b19608d85 Merge pull request #584 from serde-rs/array-tuple
Array and tuple deserialization cleanup
2016-10-14 08:43:08 -07:00
David Tolnay 99bddddd8e Array and tuple deserialization cleanup 2016-10-14 00:15:24 -07:00
David Tolnay 85c95040b3 Release 0.8.12 2016-10-08 15:38:29 -07:00
David Tolnay 339c0f5493 Remove unneeded test feature 2016-10-08 15:36:46 -07:00
David Tolnay b4d5c26f4e Update to latest syn and quote 2016-10-08 15:36:02 -07:00
David Tolnay f4e1ffa2cb Merge pull request #578 from mjroghelia/rename_rustc_macro
Rename rustc_macro to proc_macro
2016-10-08 15:35:15 -07:00
Mark Roghelia ef5d09e144 Rename rustc_macro to proc_macro
Fixes #575
2016-10-08 18:29:36 -04:00
David Tolnay e547a06639 Simplify deserialize_field_visitor 2016-10-03 13:45:11 -07:00
26 changed files with 138 additions and 172 deletions
+3 -3
View File
@@ -1,11 +1,11 @@
sudo: false sudo: false
language: rust language: rust
rust: rust:
- 1.10.0
- 1.11.0
- stable - stable
- nightly
- 1.8.0
- 1.9.0
- beta - beta
- nightly
addons: addons:
apt: apt:
packages: packages:
+1 -1
View File
@@ -15,7 +15,7 @@ You may be looking for:
## Serde in action ## Serde in action
```rust ```rust
#![feature(rustc_macro)] #![feature(proc_macro)]
#[macro_use] #[macro_use]
extern crate serde_derive; extern crate serde_derive;
+1 -1
View File
@@ -1,4 +1,4 @@
#![cfg_attr(feature = "serde_derive", feature(rustc_macro))] #![cfg_attr(feature = "serde_derive", feature(proc_macro))]
#[cfg(feature = "serde_derive")] #[cfg(feature = "serde_derive")]
#[macro_use] #[macro_use]
+1 -1
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "serde" name = "serde"
version = "0.8.11" version = "0.8.13"
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>"] authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>"]
license = "MIT/Apache-2.0" license = "MIT/Apache-2.0"
description = "A generic serialization/deserialization framework" description = "A generic serialization/deserialization framework"
+69 -98
View File
@@ -512,27 +512,26 @@ seq_impl!(
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
struct ArrayVisitor0<T> { struct ArrayVisitor<A> {
marker: PhantomData<T>, marker: PhantomData<A>,
} }
impl<T> ArrayVisitor0<T> { impl<A> ArrayVisitor<A> {
/// Construct a `ArrayVisitor0<T>`.
pub fn new() -> Self { pub fn new() -> Self {
ArrayVisitor0 { ArrayVisitor {
marker: PhantomData, marker: PhantomData,
} }
} }
} }
impl<T> Visitor for ArrayVisitor0<T> where T: Deserialize + Default { impl<T> Visitor for ArrayVisitor<[T; 0]> where T: Deserialize {
type Value = [T; 0]; type Value = [T; 0];
#[inline] #[inline]
fn visit_unit<E>(&mut self) -> Result<[T; 0], E> fn visit_unit<E>(&mut self) -> Result<[T; 0], E>
where E: Error, where E: Error,
{ {
Ok([T::default(); 0]) Ok([])
} }
#[inline] #[inline]
@@ -540,37 +539,24 @@ impl<T> Visitor for ArrayVisitor0<T> where T: Deserialize + Default {
where V: SeqVisitor, where V: SeqVisitor,
{ {
try!(visitor.end()); try!(visitor.end());
Ok([T::default(); 0]) Ok([])
} }
} }
impl<T> Deserialize for [T; 0] impl<T> Deserialize for [T; 0]
where T: Deserialize + Default where T: Deserialize
{ {
fn deserialize<D>(deserializer: &mut D) -> Result<[T; 0], D::Error> fn deserialize<D>(deserializer: &mut D) -> Result<[T; 0], D::Error>
where D: Deserializer, where D: Deserializer,
{ {
deserializer.deserialize_seq(ArrayVisitor0::new()) deserializer.deserialize_seq_fixed_size(0, ArrayVisitor::<[T; 0]>::new())
} }
} }
macro_rules! array_impls { macro_rules! array_impls {
($($visitor:ident, $len:expr => ($($name:ident),+),)+) => { ($($len:expr => ($($name:ident)+))+) => {
$( $(
struct $visitor<T> { impl<T> Visitor for ArrayVisitor<[T; $len]> where T: Deserialize {
marker: PhantomData<T>,
}
impl<T> $visitor<T> {
/// Construct a `ArrayVisitor*<T>`.
pub fn new() -> Self {
$visitor {
marker: PhantomData
}
}
}
impl<T> Visitor for $visitor<T> where T: Deserialize {
type Value = [T; $len]; type Value = [T; $len];
#[inline] #[inline]
@@ -580,13 +566,13 @@ macro_rules! array_impls {
$( $(
let $name = match try!(visitor.visit()) { let $name = match try!(visitor.visit()) {
Some(val) => val, Some(val) => val,
None => { return Err(Error::end_of_stream()); } None => return Err(Error::end_of_stream()),
}; };
)+; )+
try!(visitor.end()); try!(visitor.end());
Ok([$($name,)+]) Ok([$($name),+])
} }
} }
@@ -596,7 +582,7 @@ macro_rules! array_impls {
fn deserialize<D>(deserializer: &mut D) -> Result<[T; $len], D::Error> fn deserialize<D>(deserializer: &mut D) -> Result<[T; $len], D::Error>
where D: Deserializer, where D: Deserializer,
{ {
deserializer.deserialize_seq_fixed_size($len, $visitor::new()) deserializer.deserialize_seq_fixed_size($len, ArrayVisitor::<[T; $len]>::new())
} }
} }
)+ )+
@@ -604,71 +590,58 @@ macro_rules! array_impls {
} }
array_impls! { array_impls! {
ArrayVisitor1, 1 => (a), 1 => (a)
ArrayVisitor2, 2 => (a, b), 2 => (a b)
ArrayVisitor3, 3 => (a, b, c), 3 => (a b c)
ArrayVisitor4, 4 => (a, b, c, d), 4 => (a b c d)
ArrayVisitor5, 5 => (a, b, c, d, e), 5 => (a b c d e)
ArrayVisitor6, 6 => (a, b, c, d, e, f), 6 => (a b c d e f)
ArrayVisitor7, 7 => (a, b, c, d, e, f, g), 7 => (a b c d e f g)
ArrayVisitor8, 8 => (a, b, c, d, e, f, g, h), 8 => (a b c d e f g h)
ArrayVisitor9, 9 => (a, b, c, d, e, f, g, h, i), 9 => (a b c d e f g h i)
ArrayVisitor10, 10 => (a, b, c, d, e, f, g, h, i, j), 10 => (a b c d e f g h i j)
ArrayVisitor11, 11 => (a, b, c, d, e, f, g, h, i, j, k), 11 => (a b c d e f g h i j k)
ArrayVisitor12, 12 => (a, b, c, d, e, f, g, h, i, j, k, l), 12 => (a b c d e f g h i j k l)
ArrayVisitor13, 13 => (a, b, c, d, e, f, g, h, i, j, k, l, m), 13 => (a b c d e f g h i j k l m)
ArrayVisitor14, 14 => (a, b, c, d, e, f, g, h, i, j, k, l, m, n), 14 => (a b c d e f g h i j k l m n)
ArrayVisitor15, 15 => (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o), 15 => (a b c d e f g h i j k l m n o)
ArrayVisitor16, 16 => (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p), 16 => (a b c d e f g h i j k l m n o p)
ArrayVisitor17, 17 => (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q), 17 => (a b c d e f g h i j k l m n o p q)
ArrayVisitor18, 18 => (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r), 18 => (a b c d e f g h i j k l m n o p q r)
ArrayVisitor19, 19 => (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s), 19 => (a b c d e f g h i j k l m n o p q r s)
ArrayVisitor20, 20 => (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s ,t), 20 => (a b c d e f g h i j k l m n o p q r s t)
ArrayVisitor21, 21 => (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u), 21 => (a b c d e f g h i j k l m n o p q r s t u)
ArrayVisitor22, 22 => (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v), 22 => (a b c d e f g h i j k l m n o p q r s t u v)
ArrayVisitor23, 23 => (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w), 23 => (a b c d e f g h i j k l m n o p q r s t u v w)
ArrayVisitor24, 24 => (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x), 24 => (a b c d e f g h i j k l m n o p q r s t u v w x)
ArrayVisitor25, 25 => (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, 25 => (a b c d e f g h i j k l m n o p q r s t u v w x y)
y), 26 => (a b c d e f g h i j k l m n o p q r s t u v w x y z)
ArrayVisitor26, 26 => (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, 27 => (a b c d e f g h i j k l m n o p q r s t u v w x y z aa)
y, z), 28 => (a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab)
ArrayVisitor27, 27 => (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, 29 => (a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac)
y, z, aa), 30 => (a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad)
ArrayVisitor28, 28 => (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, 31 => (a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae)
y, z, aa, ab), 32 => (a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af)
ArrayVisitor29, 29 => (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x,
y, z, aa, ab, ac),
ArrayVisitor30, 30 => (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x,
y, z, aa, ab, ac, ad),
ArrayVisitor31, 31 => (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x,
y, z, aa, ab, ac, ad, ae),
ArrayVisitor32, 32 => (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x,
y, z, aa, ab, ac, ad, ae, af),
} }
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
macro_rules! tuple_impls { macro_rules! tuple_impls {
($($len:expr => $visitor:ident => ($($name:ident),+),)+) => { ($($len:expr => $visitor:ident => ($($name:ident)+))+) => {
$( $(
/// Construct a tuple visitor. /// Construct a tuple visitor.
pub struct $visitor<$($name,)+> { pub struct $visitor<$($name,)+> {
marker: PhantomData<($($name,)+)>, marker: PhantomData<($($name,)+)>,
} }
impl< impl<$($name: Deserialize,)+> $visitor<$($name,)+> {
$($name: Deserialize,)+
> $visitor<$($name,)+> {
/// Construct a `TupleVisitor*<T>`. /// Construct a `TupleVisitor*<T>`.
pub fn new() -> Self { pub fn new() -> Self {
$visitor { marker: PhantomData } $visitor { marker: PhantomData }
} }
} }
impl<$($name: Deserialize),+> Visitor for $visitor<$($name,)+> {
impl<
$($name: Deserialize,)+
> Visitor for $visitor<$($name,)+> {
type Value = ($($name,)+); type Value = ($($name,)+);
#[inline] #[inline]
@@ -679,9 +652,9 @@ macro_rules! tuple_impls {
$( $(
let $name = match try!(visitor.visit()) { let $name = match try!(visitor.visit()) {
Some(value) => value, Some(value) => value,
None => { return Err(Error::end_of_stream()); } None => return Err(Error::end_of_stream()),
}; };
)+; )+
try!(visitor.end()); try!(visitor.end());
@@ -689,9 +662,7 @@ macro_rules! tuple_impls {
} }
} }
impl< impl<$($name: Deserialize),+> Deserialize for ($($name,)+) {
$($name: Deserialize),+
> Deserialize for ($($name,)+) {
#[inline] #[inline]
fn deserialize<D>(deserializer: &mut D) -> Result<($($name,)+), D::Error> fn deserialize<D>(deserializer: &mut D) -> Result<($($name,)+), D::Error>
where D: Deserializer, where D: Deserializer,
@@ -704,22 +675,22 @@ macro_rules! tuple_impls {
} }
tuple_impls! { tuple_impls! {
1 => TupleVisitor1 => (T0), 1 => TupleVisitor1 => (T0)
2 => TupleVisitor2 => (T0, T1), 2 => TupleVisitor2 => (T0 T1)
3 => TupleVisitor3 => (T0, T1, T2), 3 => TupleVisitor3 => (T0 T1 T2)
4 => TupleVisitor4 => (T0, T1, T2, T3), 4 => TupleVisitor4 => (T0 T1 T2 T3)
5 => TupleVisitor5 => (T0, T1, T2, T3, T4), 5 => TupleVisitor5 => (T0 T1 T2 T3 T4)
6 => TupleVisitor6 => (T0, T1, T2, T3, T4, T5), 6 => TupleVisitor6 => (T0 T1 T2 T3 T4 T5)
7 => TupleVisitor7 => (T0, T1, T2, T3, T4, T5, T6), 7 => TupleVisitor7 => (T0 T1 T2 T3 T4 T5 T6)
8 => TupleVisitor8 => (T0, T1, T2, T3, T4, T5, T6, T7), 8 => TupleVisitor8 => (T0 T1 T2 T3 T4 T5 T6 T7)
9 => TupleVisitor9 => (T0, T1, T2, T3, T4, T5, T6, T7, T8), 9 => TupleVisitor9 => (T0 T1 T2 T3 T4 T5 T6 T7 T8)
10 => TupleVisitor10 => (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9), 10 => TupleVisitor10 => (T0 T1 T2 T3 T4 T5 T6 T7 T8 T9)
11 => TupleVisitor11 => (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10), 11 => TupleVisitor11 => (T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10)
12 => TupleVisitor12 => (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11), 12 => TupleVisitor12 => (T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11)
13 => TupleVisitor13 => (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12), 13 => TupleVisitor13 => (T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11 T12)
14 => TupleVisitor14 => (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13), 14 => TupleVisitor14 => (T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11 T12 T13)
15 => TupleVisitor15 => (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14), 15 => TupleVisitor15 => (T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11 T12 T13 T14)
16 => TupleVisitor16 => (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15), 16 => TupleVisitor16 => (T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11 T12 T13 T14 T15)
} }
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
+6 -6
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "serde_codegen" name = "serde_codegen"
version = "0.8.11" version = "0.8.13"
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>"] authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>"]
license = "MIT/Apache-2.0" license = "MIT/Apache-2.0"
description = "Macros to auto-generate implementations for the serde framework" description = "Macros to auto-generate implementations for the serde framework"
@@ -22,8 +22,8 @@ with-syn = []
[dependencies] [dependencies]
clippy = { version = "^0.*", optional = true } clippy = { version = "^0.*", optional = true }
quote = "0.2" quote = "0.3"
serde_codegen_internals = { version = "=0.9.0", default-features = false, path = "../serde_codegen_internals" } serde_codegen_internals = { version = "=0.10.0", default-features = false, path = "../serde_codegen_internals" }
syn = { version = "0.8", features = ["aster", "visit"] } syn = { version = "0.9", features = ["aster", "visit"] }
syntex = { version = "^0.44.0", optional = true } syntex = { version = "^0.45.0", optional = true }
syntex_syntax = { version = "^0.44.0", optional = true } syntex_syntax = { version = "^0.45.0", optional = true }
+20 -27
View File
@@ -185,17 +185,17 @@ fn deserialize_visitor(generics: &syn::Generics) -> (Tokens, Tokens, Tokens) {
let ty_param_idents = if ty_param_idents.is_empty() { let ty_param_idents = if ty_param_idents.is_empty() {
None None
} else { } else {
Some(quote!(::<#(ty_param_idents),*>)) Some(quote!(::<#(#ty_param_idents),*>))
}; };
let phantom_exprs = iter::repeat(quote!(::std::marker::PhantomData)).take(num_phantoms); let phantom_exprs = iter::repeat(quote!(::std::marker::PhantomData)).take(num_phantoms);
( (
quote! { quote! {
struct __Visitor #generics ( #(phantom_types),* ) #where_clause; struct __Visitor #generics ( #(#phantom_types),* ) #where_clause;
}, },
quote!(__Visitor <#(all_params),*> ), quote!(__Visitor <#(#all_params),*> ),
quote!(__Visitor #ty_param_idents ( #(phantom_exprs),* )), quote!(__Visitor #ty_param_idents ( #(#phantom_exprs),* )),
) )
} }
} }
@@ -358,17 +358,17 @@ fn deserialize_seq(
quote!(#ident: #value) quote!(#ident: #value)
}); });
quote! { quote! {
#type_path { #(args),* } #type_path { #(#args),* }
} }
} else { } else {
let args = (0..fields.len()).map(|i| aster::id(format!("__field{}", i))); let args = (0..fields.len()).map(|i| aster::id(format!("__field{}", i)));
quote! { quote! {
#type_path ( #(args),* ) #type_path ( #(#args),* )
} }
}; };
quote! { quote! {
#(let_values)* #(#let_values)*
try!(visitor.end()); try!(visitor.end());
@@ -505,7 +505,7 @@ fn deserialize_item_enum(
let variant_names = variants.iter().map(|variant| variant.ident.to_string()); let variant_names = variants.iter().map(|variant| variant.ident.to_string());
let variants_stmt = quote! { let variants_stmt = quote! {
const VARIANTS: &'static [&'static str] = &[ #(variant_names),* ]; const VARIANTS: &'static [&'static str] = &[ #(#variant_names),* ];
}; };
let ignored_arm = if item_attrs.deny_unknown_fields() { let ignored_arm = if item_attrs.deny_unknown_fields() {
@@ -551,7 +551,7 @@ fn deserialize_item_enum(
where __V: _serde::de::VariantVisitor, where __V: _serde::de::VariantVisitor,
{ {
match try!(visitor.visit_variant()) { match try!(visitor.visit_variant()) {
#(variant_arms)* #(#variant_arms)*
} }
} }
} }
@@ -678,7 +678,7 @@ fn deserialize_field_visitor(
let index_body = quote! { let index_body = quote! {
match value { match value {
#(index_field_arms)* #(#index_field_arms)*
_ => #fallthrough_index_arm_expr _ => #fallthrough_index_arm_expr
} }
}; };
@@ -704,7 +704,7 @@ fn deserialize_field_visitor(
let str_body = quote! { let str_body = quote! {
match value { match value {
#(str_field_arms)* #(#str_field_arms)*
_ => #fallthrough_str_arm_expr _ => #fallthrough_str_arm_expr
} }
}; };
@@ -732,20 +732,18 @@ fn deserialize_field_visitor(
let bytes_body = quote! { let bytes_body = quote! {
match value { match value {
#(bytes_field_arms)* #(#bytes_field_arms)*
_ => #fallthrough_bytes_arm_expr _ => #fallthrough_bytes_arm_expr
} }
}; };
let field_enum = quote! { quote! {
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]
enum __Field { enum __Field {
#(field_idents,)* #(#field_idents,)*
#ignore_variant #ignore_variant
} }
};
let impl_item = quote! {
impl _serde::de::Deserialize for __Field { impl _serde::de::Deserialize for __Field {
#[inline] #[inline]
fn deserialize<__D>(deserializer: &mut __D) -> ::std::result::Result<__Field, __D::Error> fn deserialize<__D>(deserializer: &mut __D) -> ::std::result::Result<__Field, __D::Error>
@@ -778,11 +776,6 @@ fn deserialize_field_visitor(
deserializer.deserialize_struct_field(__FieldVisitor) deserializer.deserialize_struct_field(__FieldVisitor)
} }
} }
};
quote! {
#field_enum
#impl_item
} }
} }
@@ -816,7 +809,7 @@ fn deserialize_struct_visitor(
}); });
let fields_stmt = quote! { let fields_stmt = quote! {
const FIELDS: &'static [&'static str] = &[ #(field_names),* ]; const FIELDS: &'static [&'static str] = &[ #(#field_names),* ];
}; };
(field_visitor, fields_stmt, visit_map) (field_visitor, fields_stmt, visit_map)
@@ -929,21 +922,21 @@ fn deserialize_map(
}); });
quote! { quote! {
#(let_values)* #(#let_values)*
while let Some(key) = try!(visitor.visit_key::<__Field>()) { while let Some(key) = try!(visitor.visit_key::<__Field>()) {
match key { match key {
#(value_arms)* #(#value_arms)*
#(skipped_arms)* #(#skipped_arms)*
#ignored_arm #ignored_arm
} }
} }
try!(visitor.end()); try!(visitor.end());
#(extract_values)* #(#extract_values)*
Ok(#struct_path { #(result),* }) Ok(#struct_path { #(#result),* })
} }
} }
+3 -1
View File
@@ -201,7 +201,7 @@ pub fn expand_single_item(item: &str) -> Result<String, String> {
let mut de = false; let mut de = false;
let item = syn::MacroInput { let item = syn::MacroInput {
attrs: item.attrs.into_iter().flat_map(|attr| { attrs: item.attrs.into_iter().flat_map(|attr| {
if attr.is_sugared_doc { if attr.is_sugared_doc || attr.style != syn::AttrStyle::Outer {
return Some(attr); return Some(attr);
} }
let (name, nested) = match attr.value { let (name, nested) = match attr.value {
@@ -210,6 +210,7 @@ pub fn expand_single_item(item: &str) -> Result<String, String> {
}; };
if name != "derive" { if name != "derive" {
return Some(syn::Attribute { return Some(syn::Attribute {
style: syn::AttrStyle::Outer,
value: syn::MetaItem::List(name, nested), value: syn::MetaItem::List(name, nested),
is_sugared_doc: false, is_sugared_doc: false,
}); });
@@ -231,6 +232,7 @@ pub fn expand_single_item(item: &str) -> Result<String, String> {
None None
} else { } else {
Some(syn::Attribute { Some(syn::Attribute {
style: syn::AttrStyle::Outer,
value: syn::MetaItem::List(name, rest), value: syn::MetaItem::List(name, rest),
is_sugared_doc: false, is_sugared_doc: false,
}) })
+7 -7
View File
@@ -168,7 +168,7 @@ fn serialize_tuple_struct(
quote! { quote! {
let #let_mut __serde_state = try!(_serializer.serialize_tuple_struct(#type_name, #len)); let #let_mut __serde_state = try!(_serializer.serialize_tuple_struct(#type_name, #len));
#(serialize_stmts)* #(#serialize_stmts)*
_serializer.serialize_tuple_struct_end(__serde_state) _serializer.serialize_tuple_struct_end(__serde_state)
} }
} }
@@ -209,7 +209,7 @@ fn serialize_struct(
quote! { quote! {
let #let_mut __serde_state = try!(_serializer.serialize_struct(#type_name, #len)); let #let_mut __serde_state = try!(_serializer.serialize_struct(#type_name, #len));
#(serialize_fields)* #(#serialize_fields)*
_serializer.serialize_struct_end(__serde_state) _serializer.serialize_struct_end(__serde_state)
} }
} }
@@ -238,7 +238,7 @@ fn serialize_item_enum(
quote! { quote! {
match *self { match *self {
#(arms)* #(#arms)*
} }
} }
} }
@@ -290,7 +290,7 @@ fn serialize_variant(
}) })
.collect(); .collect();
let pat = quote!(#type_ident::#variant_ident(#(field_names),*)); let pat = quote!(#type_ident::#variant_ident(#(#field_names),*));
let block = serialize_tuple_variant( let block = serialize_tuple_variant(
type_name, type_name,
@@ -313,7 +313,7 @@ fn serialize_variant(
}; };
quote!(ref #id) quote!(ref #id)
}); });
let pat = quote!(#type_ident::#variant_ident { #(fields),* }); let pat = quote!(#type_ident::#variant_ident { #(#fields),* });
let block = serialize_struct_variant( let block = serialize_struct_variant(
variant_index, variant_index,
@@ -381,7 +381,7 @@ fn serialize_tuple_variant(
#variant_index, #variant_index,
#variant_name, #variant_name,
#len)); #len));
#(serialize_stmts)* #(#serialize_stmts)*
_serializer.serialize_tuple_variant_end(__serde_state) _serializer.serialize_tuple_variant_end(__serde_state)
} }
} }
@@ -428,7 +428,7 @@ fn serialize_struct_variant(
#variant_name, #variant_name,
#len, #len,
)); ));
#(serialize_fields)* #(#serialize_fields)*
_serializer.serialize_struct_variant_end(__serde_state) _serializer.serialize_struct_variant_end(__serde_state)
} }
} }
+2 -2
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "serde_codegen_internals" name = "serde_codegen_internals"
version = "0.9.0" version = "0.10.0"
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>"] authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>"]
license = "MIT/Apache-2.0" license = "MIT/Apache-2.0"
description = "AST representation used by Serde codegen. Unstable." description = "AST representation used by Serde codegen. Unstable."
@@ -15,4 +15,4 @@ unstable-testing = ["clippy"]
[dependencies] [dependencies]
clippy = { version = "^0.*", optional = true } clippy = { version = "^0.*", optional = true }
syn = "0.8" syn = "0.9"
+5 -5
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "serde_derive" name = "serde_derive"
version = "0.8.11" version = "0.8.13"
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>"] authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>"]
license = "MIT/Apache-2.0" license = "MIT/Apache-2.0"
description = "Macros 1.1 implementation of #[derive(Serialize, Deserialize)]" description = "Macros 1.1 implementation of #[derive(Serialize, Deserialize)]"
@@ -12,10 +12,10 @@ include = ["Cargo.toml", "src/**/*.rs"]
[lib] [lib]
name = "serde_derive" name = "serde_derive"
rustc-macro = true proc-macro = true
[dependencies.serde_codegen] [dependencies.serde_codegen]
version = "=0.8.11" version = "=0.8.13"
path = "../serde_codegen" path = "../serde_codegen"
default-features = false default-features = false
features = ["with-syn"] features = ["with-syn"]
@@ -23,5 +23,5 @@ features = ["with-syn"]
[dev-dependencies] [dev-dependencies]
compiletest_rs = "^0.2.0" compiletest_rs = "^0.2.0"
fnv = "1.0" fnv = "1.0"
serde = { version = "0.8.11", path = "../serde" } serde = { version = "0.8.13", path = "../serde" }
serde_test = { version = "0.8.11", path = "../serde_test" } serde_test = { version = "0.8.13", path = "../serde_test" }
+5 -5
View File
@@ -1,12 +1,12 @@
#![feature(rustc_macro, rustc_macro_lib)] #![feature(proc_macro, proc_macro_lib)]
#![cfg(not(test))] #![cfg(not(test))]
extern crate rustc_macro; extern crate proc_macro;
extern crate serde_codegen; extern crate serde_codegen;
use rustc_macro::TokenStream; use proc_macro::TokenStream;
#[rustc_macro_derive(Serialize)] #[proc_macro_derive(Serialize)]
pub fn derive_serialize(input: TokenStream) -> TokenStream { pub fn derive_serialize(input: TokenStream) -> TokenStream {
let item = format!("#[derive(Serialize)]\n{}", input); let item = format!("#[derive(Serialize)]\n{}", input);
match serde_codegen::expand_single_item(&item) { match serde_codegen::expand_single_item(&item) {
@@ -15,7 +15,7 @@ pub fn derive_serialize(input: TokenStream) -> TokenStream {
} }
} }
#[rustc_macro_derive(Deserialize)] #[proc_macro_derive(Deserialize)]
pub fn derive_deserialize(input: TokenStream) -> TokenStream { pub fn derive_deserialize(input: TokenStream) -> TokenStream {
let item = format!("#[derive(Deserialize)]\n{}", input); let item = format!("#[derive(Deserialize)]\n{}", input);
match serde_codegen::expand_single_item(&item) { match serde_codegen::expand_single_item(&item) {
@@ -1,4 +1,4 @@
#![feature(rustc_macro)] #![feature(proc_macro)]
#[macro_use] #[macro_use]
extern crate serde_derive; extern crate serde_derive;
@@ -1,4 +1,4 @@
#![feature(rustc_macro)] #![feature(proc_macro)]
#[macro_use] #[macro_use]
extern crate serde_derive; extern crate serde_derive;
@@ -1,4 +1,4 @@
#![feature(rustc_macro)] #![feature(proc_macro)]
#[macro_use] #[macro_use]
extern crate serde_derive; extern crate serde_derive;
@@ -1,4 +1,4 @@
#![feature(rustc_macro)] #![feature(proc_macro)]
#[macro_use] #[macro_use]
extern crate serde_derive; extern crate serde_derive;
@@ -1,4 +1,4 @@
#![feature(rustc_macro)] #![feature(proc_macro)]
#[macro_use] #[macro_use]
extern crate serde_derive; extern crate serde_derive;
@@ -1,4 +1,4 @@
#![feature(rustc_macro)] #![feature(proc_macro)]
#[macro_use] #[macro_use]
extern crate serde_derive; extern crate serde_derive;
@@ -1,4 +1,4 @@
#![feature(rustc_macro)] #![feature(proc_macro)]
#[macro_use] #[macro_use]
extern crate serde_derive; extern crate serde_derive;
@@ -1,4 +1,4 @@
#![feature(rustc_macro)] #![feature(proc_macro)]
#[macro_use] #[macro_use]
extern crate serde_derive; extern crate serde_derive;
@@ -1,4 +1,4 @@
#![feature(rustc_macro)] #![feature(proc_macro)]
#[macro_use] #[macro_use]
extern crate serde_derive; extern crate serde_derive;
@@ -1,4 +1,4 @@
#![feature(rustc_macro)] #![feature(proc_macro)]
#[macro_use] #[macro_use]
extern crate serde_derive; extern crate serde_derive;
+1 -1
View File
@@ -1,4 +1,4 @@
#![feature(rustc_macro)] #![feature(proc_macro)]
#![deny(identity_op)] #![deny(identity_op)]
#[macro_use] #[macro_use]
+1 -1
View File
@@ -1,4 +1,4 @@
#![feature(test, rustc_macro, rustc_attrs)] #![feature(test, proc_macro)]
#[macro_use] #[macro_use]
extern crate serde_derive; extern crate serde_derive;
+2 -2
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "serde_test" name = "serde_test"
version = "0.8.11" version = "0.8.13"
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>"] authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>"]
license = "MIT/Apache-2.0" license = "MIT/Apache-2.0"
description = "Token De/Serializer for testing De/Serialize implementations" description = "Token De/Serializer for testing De/Serialize implementations"
@@ -12,4 +12,4 @@ keywords = ["serde", "serialization"]
include = ["Cargo.toml", "src/**/*.rs"] include = ["Cargo.toml", "src/**/*.rs"]
[dependencies] [dependencies]
serde = { version = "0.8.11", path = "../serde" } serde = { version = "0.8.13", path = "../serde" }
+1 -1
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "serde_testing" name = "serde_testing"
version = "0.8.11" version = "0.8.13"
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>"] authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>"]
license = "MIT/Apache-2.0" license = "MIT/Apache-2.0"
description = "A generic serialization/deserialization framework" description = "A generic serialization/deserialization framework"