diff --git a/serde_macros/src/lib.rs b/serde_macros/src/lib.rs index a61f298f..66685a2a 100644 --- a/serde_macros/src/lib.rs +++ b/serde_macros/src/lib.rs @@ -7,8 +7,6 @@ extern crate syntax; extern crate rustc; -use std::gc::Gc; - use syntax::ast::{ Attribute, Ident, @@ -21,7 +19,6 @@ use syntax::ast::{ MutMutable, LitNil, LitStr, - P, StructField, Variant, }; @@ -55,6 +52,7 @@ use syntax::ext::deriving::generic::ty::{ borrowed_explicit_self, }; use syntax::parse::token; +use syntax::ptr::P; use rustc::plugin::Registry; @@ -63,18 +61,18 @@ use rustc::plugin::Registry; pub fn plugin_registrar(reg: &mut Registry) { reg.register_syntax_extension( token::intern("deriving_serializable"), - ItemDecorator(expand_deriving_serializable)); + ItemDecorator(box expand_deriving_serializable)); reg.register_syntax_extension( token::intern("deriving_deserializable"), - ItemDecorator(expand_deriving_deserializable)); + ItemDecorator(box expand_deriving_deserializable)); } fn expand_deriving_serializable(cx: &mut ExtCtxt, sp: Span, - mitem: Gc, - item: Gc, - push: |Gc|) { + mitem: &MetaItem, + item: &Item, + push: |P|) { let inline = cx.meta_word(sp, token::InternedString::new("inline")); let attrs = vec!(cx.attribute(sp, inline)); @@ -123,11 +121,11 @@ fn expand_deriving_serializable(cx: &mut ExtCtxt, fn serializable_substructure(cx: &ExtCtxt, span: Span, substr: &Substructure, - item: Gc - ) -> Gc { - let serializer = substr.nonself_args[0]; + item: &Item + ) -> P { + let serializer = substr.nonself_args[0].clone(); - match (&item.deref().node, substr.fields) { + match (&item.node, substr.fields) { (&ItemStruct(ref definition, _), &Struct(ref fields)) => { if fields.is_empty() { // unit structs have no fields and need to return `Ok()` @@ -139,10 +137,10 @@ fn serializable_substructure(cx: &ExtCtxt, ); let len = fields.len(); - let mut stmts: Vec> = definition.fields.iter() + let mut stmts: Vec> = definition.fields.iter() .zip(fields.iter()) .enumerate() - .map(|(i, (def, &FieldInfo { name, self_, span, .. }))| { + .map(|(i, (def, &FieldInfo { name, ref self_, span, .. }))| { let serial_name = find_serial_name(def.node.attrs.iter()); let name = match (serial_name, name) { (Some(serial), _) => serial.clone(), @@ -178,9 +176,9 @@ fn serializable_substructure(cx: &ExtCtxt, ); let len = fields.len(); - let stmts: Vec> = definition.variants.iter() + let stmts: Vec> = definition.variants.iter() .zip(fields.iter()) - .map(|(def, &FieldInfo { self_, span, .. })| { + .map(|(def, &FieldInfo { ref self_, span, .. })| { let _serial_name = find_serial_name(def.node.attrs.iter()); quote_stmt!( cx, @@ -202,9 +200,9 @@ fn serializable_substructure(cx: &ExtCtxt, pub fn expand_deriving_deserializable(cx: &mut ExtCtxt, span: Span, - mitem: Gc, - item: Gc, - push: |Gc|) { + mitem: &MetaItem, + item: &Item, + push: |P|) { let trait_def = TraitDef { span: span, attributes: Vec::new(), @@ -253,9 +251,9 @@ pub fn expand_deriving_deserializable(cx: &mut ExtCtxt, } fn deserializable_substructure(cx: &mut ExtCtxt, span: Span, - substr: &Substructure) -> Gc { - let deserializer = substr.nonself_args[0]; - let token = substr.nonself_args[1]; + substr: &Substructure) -> P { + let deserializer = substr.nonself_args[0].clone(); + let token = substr.nonself_args[1].clone(); match *substr.fields { StaticStruct(ref definition, ref fields) => { @@ -265,7 +263,7 @@ fn deserializable_substructure(cx: &mut ExtCtxt, span: Span, substr.type_ident, definition.fields.as_slice(), fields, - deserializer, + deserializer.clone(), token) } StaticEnum(ref definition, ref fields) => { @@ -288,9 +286,9 @@ fn deserialize_struct( type_ident: Ident, definitions: &[StructField], fields: &StaticFields, - deserializer: Gc, - token: Gc -) -> Gc { + deserializer: P, + token: P +) -> P { let serial_names: Vec> = definitions.iter().map(|def| find_serial_name(def.node.attrs.iter()) @@ -302,7 +300,7 @@ fn deserialize_struct( type_ident, serial_names.as_slice(), fields, - deserializer + deserializer.clone() ); let map_block = deserialize_struct_from_map( @@ -311,7 +309,7 @@ fn deserialize_struct( type_ident, serial_names.as_slice(), fields, - deserializer + deserializer.clone() ); quote_expr!( @@ -336,8 +334,8 @@ fn deserialize_struct_from_struct( type_ident: Ident, serial_names: &[Option], fields: &StaticFields, - deserializer: Gc -) -> Gc { + deserializer: P +) -> P { let expect_struct_field = cx.ident_of("expect_struct_field"); let call = deserializable_static_fields( @@ -368,15 +366,15 @@ fn deserialize_struct_from_map( type_ident: Ident, serial_names: &[Option], fields: &StaticFields, - deserializer: Gc -) -> Gc { + deserializer: P +) -> P { let fields = match *fields { Unnamed(_) => fail!(), Named(ref fields) => fields.as_slice(), }; // Declare each field. - let let_fields: Vec> = fields.iter() + let let_fields: Vec> = fields.iter() .map(|&(name, span)| { quote_stmt!(cx, let mut $name = None) }) @@ -401,7 +399,7 @@ fn deserialize_struct_from_map( }) .collect(); - let extract_fields: Vec> = serial_names.iter() + let extract_fields: Vec> = serial_names.iter() .zip(fields.iter()) .map(|(serial, &(name, span))| { let serial_name = match serial { @@ -470,9 +468,9 @@ fn deserialize_enum( type_ident: Ident, definitions: &[P], fields: &[(Ident, Span, StaticFields)], - deserializer: Gc, - token: Gc -) -> Gc { + deserializer: P, + token: P +) -> P { let type_name = cx.expr_str(span, token::get_ident(type_ident)); let serial_names = definitions.iter().map(|def| @@ -528,8 +526,8 @@ fn deserializable_static_fields( outer_pat_ident: Ident, serial_names: &[Option], fields: &StaticFields, - getarg: |&ExtCtxt, Span, token::InternedString| -> Gc -) -> Gc { + getarg: |&ExtCtxt, Span, token::InternedString| -> P +) -> P { match *fields { Unnamed(ref fields) => { if fields.is_empty() {