diff options
Diffstat (limited to 'src/libsyntax/ext/auto_serialize.rs')
| -rw-r--r-- | src/libsyntax/ext/auto_serialize.rs | 181 |
1 files changed, 93 insertions, 88 deletions
diff --git a/src/libsyntax/ext/auto_serialize.rs b/src/libsyntax/ext/auto_serialize.rs index fe9f59d5538..f3c356923f2 100644 --- a/src/libsyntax/ext/auto_serialize.rs +++ b/src/libsyntax/ext/auto_serialize.rs @@ -84,13 +84,13 @@ mod syntax { export parse; } -type ser_tps_map = map::hashmap<str, fn@(@ast::expr) -> [@ast::stmt]>; +type ser_tps_map = map::hashmap<str, fn@(@ast::expr) -> [@ast::stmt]/~>; type deser_tps_map = map::hashmap<str, fn@() -> @ast::expr>; fn expand(cx: ext_ctxt, span: span, _mitem: ast::meta_item, - in_items: [@ast::item]) -> [@ast::item] { + in_items: [@ast::item]/~) -> [@ast::item]/~ { fn not_auto_serialize(a: ast::attribute) -> bool { attr::get_attr_name(a) != @"auto_serialize" } @@ -103,11 +103,11 @@ fn expand(cx: ext_ctxt, vec::flat_map(in_items) {|in_item| alt in_item.node { ast::item_ty(ty, tps, _) { - [filter_attrs(in_item)] + ty_fns(cx, in_item.ident, ty, tps) + [filter_attrs(in_item)]/~ + ty_fns(cx, in_item.ident, ty, tps) } ast::item_enum(variants, tps, _) { - [filter_attrs(in_item)] + enum_fns(cx, in_item.ident, + [filter_attrs(in_item)]/~ + enum_fns(cx, in_item.ident, in_item.span, variants, tps) } @@ -115,7 +115,7 @@ fn expand(cx: ext_ctxt, cx.span_err(span, "#[auto_serialize] can only be \ applied to type and enum \ definitions"); - [in_item] + [in_item]/~ } } } @@ -126,26 +126,27 @@ impl helpers for ext_ctxt { helper_name: str) -> @ast::path { let head = vec::init(base_path.idents); let tail = vec::last(base_path.idents); - self.path(base_path.span, head + [@(helper_name + "_" + *tail)]) + self.path(base_path.span, head + [@(helper_name + "_" + *tail)]/~) } - fn path(span: span, strs: [ast::ident]) -> @ast::path { - @{span: span, global: false, idents: strs, rp: none, types: []} + fn path(span: span, strs: [ast::ident]/~) -> @ast::path { + @{span: span, global: false, idents: strs, rp: none, types: []/~} } - fn path_tps(span: span, strs: [ast::ident], - tps: [@ast::ty]) -> @ast::path { + fn path_tps(span: span, strs: [ast::ident]/~, + tps: [@ast::ty]/~) -> @ast::path { @{span: span, global: false, idents: strs, rp: none, types: tps} } - fn ty_path(span: span, strs: [ast::ident], tps: [@ast::ty]) -> @ast::ty { + fn ty_path(span: span, strs: [ast::ident]/~, + tps: [@ast::ty]/~) -> @ast::ty { @{id: self.next_id(), node: ast::ty_path(self.path_tps(span, strs, tps), self.next_id()), span: span} } fn ty_fn(span: span, - -input_tys: [@ast::ty], + -input_tys: [@ast::ty]/~, -output: @ast::ty) -> @ast::ty { let args = vec::map(input_tys) {|ty| {mode: ast::expl(ast::by_ref), @@ -159,7 +160,7 @@ impl helpers for ext_ctxt { output: output, purity: ast::impure_fn, cf: ast::return_val, - constraints: []}), + constraints: []/~}), span: span} } @@ -172,11 +173,11 @@ impl helpers for ext_ctxt { } fn var_ref(span: span, name: ast::ident) -> @ast::expr { - self.expr(span, ast::expr_path(self.path(span, [name]))) + self.expr(span, ast::expr_path(self.path(span, [name]/~))) } - fn blk(span: span, stmts: [@ast::stmt]) -> ast::blk { - {node: {view_items: [], + fn blk(span: span, stmts: [@ast::stmt]/~) -> ast::blk { + {node: {view_items: []/~, stmts: stmts, expr: none, id: self.next_id(), @@ -185,8 +186,8 @@ impl helpers for ext_ctxt { } fn expr_blk(expr: @ast::expr) -> ast::blk { - {node: {view_items: [], - stmts: [], + {node: {view_items: []/~, + stmts: []/~, expr: some(expr), id: self.next_id(), rules: ast::default_blk}, @@ -194,8 +195,8 @@ impl helpers for ext_ctxt { } fn binder_pat(span: span, nm: ast::ident) -> @ast::pat { - let path = @{span: span, global: false, idents: [nm], - rp: none, types: []}; + let path = @{span: span, global: false, idents: [nm]/~, + rp: none, types: []/~}; @{id: self.next_id(), node: ast::pat_ident(path, none), span: span} @@ -206,7 +207,8 @@ impl helpers for ext_ctxt { span: expr.span} } - fn alt_stmt(arms: [ast::arm], span: span, -v: @ast::expr) -> @ast::stmt { + fn alt_stmt(arms: [ast::arm]/~, + span: span, -v: @ast::expr) -> @ast::stmt { self.stmt( self.expr( span, @@ -277,7 +279,7 @@ impl helpers for ext_ctxt { fn ser_path(cx: ext_ctxt, tps: ser_tps_map, path: @ast::path, -s: @ast::expr, -v: @ast::expr) - -> [@ast::stmt] { + -> [@ast::stmt]/~ { let ext_cx = cx; // required for #ast{} // We want to take a path like a::b::c<...> and generate a call @@ -299,15 +301,15 @@ fn ser_path(cx: ext_ctxt, tps: ser_tps_map, path: @ast::path, [cx.stmt( cx.expr( path.span, - ast::expr_call(callee, [s, v] + ty_args, false)))] + ast::expr_call(callee, [s, v]/~ + ty_args, false)))]/~ } fn ser_variant(cx: ext_ctxt, tps: ser_tps_map, - tys: [@ast::ty], + tys: [@ast::ty]/~, span: span, -s: @ast::expr, - pfn: fn([@ast::pat]) -> ast::pat_, + pfn: fn([@ast::pat]/~) -> ast::pat_, bodyfn: fn(-@ast::expr, ast::blk) -> @ast::expr, argfn: fn(-@ast::expr, uint, ast::blk) -> @ast::expr) -> ast::arm { @@ -326,9 +328,9 @@ fn ser_variant(cx: ext_ctxt, }; let body_blk = cx.blk(span, stmts); - let body = cx.blk(span, [cx.stmt(bodyfn(s, body_blk))]); + let body = cx.blk(span, [cx.stmt(bodyfn(s, body_blk))]/~); - {pats: [pat], guard: none, body: body} + {pats: [pat]/~, guard: none, body: body} } fn ser_lambda(cx: ext_ctxt, tps: ser_tps_map, ty: @ast::ty, @@ -338,34 +340,34 @@ fn ser_lambda(cx: ext_ctxt, tps: ser_tps_map, ty: @ast::ty, fn ser_ty(cx: ext_ctxt, tps: ser_tps_map, ty: @ast::ty, -s: @ast::expr, -v: @ast::expr) - -> [@ast::stmt] { + -> [@ast::stmt]/~ { let ext_cx = cx; // required for #ast{} alt ty.node { ast::ty_nil { - [#ast[stmt]{$(s).emit_nil()}] + [#ast[stmt]{$(s).emit_nil()}]/~ } ast::ty_bot { cx.span_err( ty.span, #fmt["Cannot serialize bottom type"]); - [] + []/~ } ast::ty_box(mt) { let l = ser_lambda(cx, tps, mt.ty, cx.clone(s), #ast{ *$(v) }); - [#ast(stmt){$(s).emit_box($(l));}] + [#ast(stmt){$(s).emit_box($(l));}]/~ } ast::ty_uniq(mt) { let l = ser_lambda(cx, tps, mt.ty, cx.clone(s), #ast{ *$(v) }); - [#ast(stmt){$(s).emit_uniq($(l));}] + [#ast(stmt){$(s).emit_uniq($(l));}]/~ } ast::ty_ptr(_) | ast::ty_rptr(_, _) { cx.span_err(ty.span, "cannot serialize pointer types"); - [] + []/~ } ast::ty_rec(flds) { @@ -374,7 +376,7 @@ fn ser_ty(cx: ext_ctxt, tps: ser_tps_map, let vf = cx.expr(fld.span, ast::expr_field(cx.clone(v), fld.node.ident, - [])); + []/~)); let s = cx.clone(s); let f = cx.lit_str(fld.span, fld.node.ident); let i = cx.lit_uint(fld.span, fidx); @@ -382,12 +384,12 @@ fn ser_ty(cx: ext_ctxt, tps: ser_tps_map, #ast(stmt){$(s).emit_rec_field($(f), $(i), $(l));} }; let fld_lambda = cx.lambda(cx.blk(ty.span, fld_stmts)); - [#ast(stmt){$(s).emit_rec($(fld_lambda));}] + [#ast(stmt){$(s).emit_rec($(fld_lambda));}]/~ } ast::ty_fn(_, _) { cx.span_err(ty.span, "cannot serialize function types"); - [] + []/~ } ast::ty_tup(tys) { @@ -420,8 +422,8 @@ fn ser_ty(cx: ext_ctxt, tps: ser_tps_map, let body = cx.lambda(blk); #ast{ $(s).emit_tup_elt($(idx), $(body)) } }) - ]; - [cx.alt_stmt(arms, ty.span, v)] + ]/~; + [cx.alt_stmt(arms, ty.span, v)]/~ } ast::ty_path(path, _) { @@ -444,12 +446,12 @@ fn ser_ty(cx: ext_ctxt, tps: ser_tps_map, ast::ty_mac(_) { cx.span_err(ty.span, "cannot serialize macro types"); - [] + []/~ } ast::ty_infer { cx.span_err(ty.span, "cannot serialize inferred types"); - [] + []/~ } ast::ty_vstore(@{node: ast::ty_vec(mt),_}, ast::vstore_uniq) | @@ -467,7 +469,7 @@ fn ser_ty(cx: ext_ctxt, tps: ser_tps_map, [#ast(stmt){ std::serialization::emit_from_vec($(s), $(v), {|__e| $(ser_e) }) - }] + }]/~ } ast::ty_vstore(_, _) { @@ -477,20 +479,21 @@ fn ser_ty(cx: ext_ctxt, tps: ser_tps_map, } } -fn mk_ser_fn(cx: ext_ctxt, span: span, name: ast::ident, tps: [ast::ty_param], +fn mk_ser_fn(cx: ext_ctxt, span: span, name: ast::ident, + tps: [ast::ty_param]/~, f: fn(ext_ctxt, ser_tps_map, - -@ast::expr, -@ast::expr) -> [@ast::stmt]) + -@ast::expr, -@ast::expr) -> [@ast::stmt]/~) -> @ast::item { let ext_cx = cx; // required for #ast - let tp_types = vec::map(tps, {|tp| cx.ty_path(span, [tp.ident], [])}); - let v_ty = cx.ty_path(span, [name], tp_types); + let tp_types = vec::map(tps, {|tp| cx.ty_path(span, [tp.ident]/~, []/~)}); + let v_ty = cx.ty_path(span, [name]/~, tp_types); let tp_inputs = vec::map(tps, {|tp| {mode: ast::expl(ast::by_ref), ty: cx.ty_fn(span, - [cx.ty_path(span, [tp.ident], [])], + [cx.ty_path(span, [tp.ident]/~, []/~)]/~, cx.ty_nil(span)), ident: @("__s" + *tp.ident), id: cx.next_id()}}); @@ -498,15 +501,15 @@ fn mk_ser_fn(cx: ext_ctxt, span: span, name: ast::ident, tps: [ast::ty_param], #debug["tp_inputs = %?", tp_inputs]; - let ser_inputs: [ast::arg] = + let ser_inputs: [ast::arg]/~ = [{mode: ast::expl(ast::by_ref), - ty: cx.ty_path(span, [@"__S"], []), + ty: cx.ty_path(span, [@"__S"]/~, []/~), ident: @"__s", id: cx.next_id()}, {mode: ast::expl(ast::by_ref), ty: v_ty, ident: @"__v", - id: cx.next_id()}] + id: cx.next_id()}]/~ + tp_inputs; let tps_map = map::str_hash(); @@ -514,22 +517,23 @@ fn mk_ser_fn(cx: ext_ctxt, span: span, name: ast::ident, tps: [ast::ty_param], let arg_ident = arg.ident; tps_map.insert( *tp.ident, - fn@(v: @ast::expr) -> [@ast::stmt] { + fn@(v: @ast::expr) -> [@ast::stmt]/~ { let f = cx.var_ref(span, arg_ident); #debug["serializing type arg %s", *arg_ident]; - [#ast(stmt){$(f)($(v));}] + [#ast(stmt){$(f)($(v));}]/~ }); } let ser_bnds = @[ ast::bound_iface(cx.ty_path(span, - [@"std", @"serialization", @"serializer"], - []))]; + [@"std", @"serialization", + @"serializer"]/~, + []/~))]/~; - let ser_tps: [ast::ty_param] = + let ser_tps: [ast::ty_param]/~ = [{ident: @"__S", id: cx.next_id(), - bounds: ser_bnds}] + + bounds: ser_bnds}]/~ + vec::map(tps) {|tp| cx.clone_ty_param(tp) }; let ser_output: @ast::ty = @{id: cx.next_id(), @@ -540,13 +544,13 @@ fn mk_ser_fn(cx: ext_ctxt, span: span, name: ast::ident, tps: [ast::ty_param], f(cx, tps_map, #ast{ __s }, #ast{ __v })); @{ident: @("serialize_" + *name), - attrs: [], + attrs: []/~, id: cx.next_id(), node: ast::item_fn({inputs: ser_inputs, output: ser_output, purity: ast::impure_fn, cf: ast::return_val, - constraints: []}, + constraints: []/~}, ser_tps, ser_blk), vis: ast::public, @@ -571,7 +575,7 @@ fn deser_path(cx: ext_ctxt, tps: deser_tps_map, path: @ast::path, cx.lambda(cx.expr_blk(dv_expr)) }; - cx.expr(path.span, ast::expr_call(callee, [d] + ty_args, false)) + cx.expr(path.span, ast::expr_call(callee, [d]/~ + ty_args, false)) } fn deser_lambda(cx: ext_ctxt, tps: deser_tps_map, ty: @ast::ty, @@ -688,30 +692,30 @@ fn deser_ty(cx: ext_ctxt, tps: deser_tps_map, } fn mk_deser_fn(cx: ext_ctxt, span: span, - name: ast::ident, tps: [ast::ty_param], + name: ast::ident, tps: [ast::ty_param]/~, f: fn(ext_ctxt, deser_tps_map, -@ast::expr) -> @ast::expr) -> @ast::item { let ext_cx = cx; // required for #ast - let tp_types = vec::map(tps, {|tp| cx.ty_path(span, [tp.ident], [])}); - let v_ty = cx.ty_path(span, [name], tp_types); + let tp_types = vec::map(tps, {|tp| cx.ty_path(span, [tp.ident]/~, []/~)}); + let v_ty = cx.ty_path(span, [name]/~, tp_types); let tp_inputs = vec::map(tps, {|tp| {mode: ast::expl(ast::by_ref), ty: cx.ty_fn(span, - [], - cx.ty_path(span, [tp.ident], [])), + []/~, + cx.ty_path(span, [tp.ident]/~, []/~)), ident: @("__d" + *tp.ident), id: cx.next_id()}}); #debug["tp_inputs = %?", tp_inputs]; - let deser_inputs: [ast::arg] = + let deser_inputs: [ast::arg]/~ = [{mode: ast::expl(ast::by_ref), - ty: cx.ty_path(span, [@"__D"], []), + ty: cx.ty_path(span, [@"__D"]/~, []/~), ident: @"__d", - id: cx.next_id()}] + id: cx.next_id()}]/~ + tp_inputs; let tps_map = map::str_hash(); @@ -728,46 +732,47 @@ fn mk_deser_fn(cx: ext_ctxt, span: span, let deser_bnds = @[ ast::bound_iface(cx.ty_path( span, - [@"std", @"serialization", @"deserializer"], - []))]; + [@"std", @"serialization", @"deserializer"]/~, + []/~))]/~; - let deser_tps: [ast::ty_param] = + let deser_tps: [ast::ty_param]/~ = [{ident: @"__D", id: cx.next_id(), - bounds: deser_bnds}] + vec::map(tps) {|tp| + bounds: deser_bnds}]/~ + vec::map(tps) {|tp| let cloned = cx.clone_ty_param(tp); - {bounds: @(*cloned.bounds + [ast::bound_copy]) with cloned} + {bounds: @(*cloned.bounds + [ast::bound_copy]/~) with cloned} }; let deser_blk = cx.expr_blk(f(cx, tps_map, #ast(expr){__d})); @{ident: @("deserialize_" + *name), - attrs: [], + attrs: []/~, id: cx.next_id(), node: ast::item_fn({inputs: deser_inputs, output: v_ty, purity: ast::impure_fn, cf: ast::return_val, - constraints: []}, + constraints: []/~}, deser_tps, deser_blk), vis: ast::public, span: span} } -fn ty_fns(cx: ext_ctxt, name: ast::ident, ty: @ast::ty, tps: [ast::ty_param]) - -> [@ast::item] { +fn ty_fns(cx: ext_ctxt, name: ast::ident, + ty: @ast::ty, tps: [ast::ty_param]/~) + -> [@ast::item]/~ { let span = ty.span; [ mk_ser_fn(cx, span, name, tps, {|a,b,c,d|ser_ty(a, b, ty, c, d)}), mk_deser_fn(cx, span, name, tps, {|a,b,c|deser_ty(a, b, ty, c)}) - ] + ]/~ } fn ser_enum(cx: ext_ctxt, tps: ser_tps_map, e_name: ast::ident, - e_span: span, variants: [ast::variant], - -s: @ast::expr, -v: @ast::expr) -> [@ast::stmt] { + e_span: span, variants: [ast::variant]/~, + -s: @ast::expr, -v: @ast::expr) -> [@ast::stmt]/~ { let ext_cx = cx; let arms = vec::from_fn(vec::len(variants)) {|vidx| let variant = variants[vidx]; @@ -781,9 +786,9 @@ fn ser_enum(cx: ext_ctxt, tps: ser_tps_map, e_name: ast::ident, // Generate pattern var(v1, v2, v3) {|pats| if vec::is_empty(pats) { - ast::pat_ident(cx.path(v_span, [v_name]), none) + ast::pat_ident(cx.path(v_span, [v_name]/~), none) } else { - ast::pat_enum(cx.path(v_span, [v_name]), some(pats)) + ast::pat_enum(cx.path(v_span, [v_name]/~), some(pats)) } }, @@ -809,16 +814,16 @@ fn ser_enum(cx: ext_ctxt, tps: ser_tps_map, e_name: ast::ident, } }) }; - let lam = cx.lambda(cx.blk(e_span, [cx.alt_stmt(arms, e_span, v)])); + let lam = cx.lambda(cx.blk(e_span, [cx.alt_stmt(arms, e_span, v)]/~)); let e_name = cx.lit_str(e_span, e_name); - [#ast(stmt){ $(s).emit_enum($(e_name), $(lam)) }] + [#ast(stmt){ $(s).emit_enum($(e_name), $(lam)) }]/~ } fn deser_enum(cx: ext_ctxt, tps: deser_tps_map, e_name: ast::ident, - e_span: span, variants: [ast::variant], + e_span: span, variants: [ast::variant]/~, -d: @ast::expr) -> @ast::expr { let ext_cx = cx; - let arms: [ast::arm] = vec::from_fn(vec::len(variants)) {|vidx| + let arms: [ast::arm]/~ = vec::from_fn(vec::len(variants)) {|vidx| let variant = variants[vidx]; let v_span = variant.span; let v_name = variant.node.name; @@ -843,7 +848,7 @@ fn deser_enum(cx: ext_ctxt, tps: deser_tps_map, e_name: ast::ident, {pats: [@{id: cx.next_id(), node: ast::pat_lit(cx.lit_uint(v_span, vidx)), - span: v_span}], + span: v_span}]/~, guard: none, body: cx.expr_blk(body)} }; @@ -859,12 +864,12 @@ fn deser_enum(cx: ext_ctxt, tps: deser_tps_map, e_name: ast::ident, } fn enum_fns(cx: ext_ctxt, e_name: ast::ident, e_span: span, - variants: [ast::variant], tps: [ast::ty_param]) - -> [@ast::item] { + variants: [ast::variant]/~, tps: [ast::ty_param]/~) + -> [@ast::item]/~ { [ mk_ser_fn(cx, e_span, e_name, tps, {|a,b,c,d|ser_enum(a, b, e_name, e_span, variants, c, d)}), mk_deser_fn(cx, e_span, e_name, tps, {|a,b,c|deser_enum(a, b, e_name, e_span, variants, c)}) - ] + ]/~ } |
