about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorErick Tryzelaar <erick.tryzelaar@gmail.com>2012-12-27 14:36:00 -0500
committerErick Tryzelaar <erick.tryzelaar@gmail.com>2013-01-09 08:55:36 -0800
commit93c2ebf9944274ca9d1e97589a992ff52c04f07d (patch)
tree8ceaf6ee4de8aa8f65c70e5fa3deb5a7964b1018 /src
parentb75550af5ce401a27ab777b8bb6a7d4dfd5c4f17 (diff)
downloadrust-93c2ebf9944274ca9d1e97589a992ff52c04f07d.tar.gz
rust-93c2ebf9944274ca9d1e97589a992ff52c04f07d.zip
syntax: convert ast::spanned into a struct
Diffstat (limited to 'src')
-rw-r--r--src/libcargo/cargo.rc6
-rw-r--r--src/libfuzzer/fuzzer.rc2
-rw-r--r--src/librustc/front/core_inject.rs2
-rw-r--r--src/librustc/front/intrinsic_inject.rs7
-rw-r--r--src/librustc/front/test.rs4
-rw-r--r--src/librustc/metadata/decoder.rs7
-rw-r--r--src/librustc/middle/astencode.rs21
-rw-r--r--src/librustc/middle/check_const.rs9
-rw-r--r--src/librustc/middle/check_match.rs5
-rw-r--r--src/librustc/middle/kind.rs2
-rw-r--r--src/librustc/middle/lint.rs3
-rw-r--r--src/librustc/middle/trans/base.rs3
-rw-r--r--src/librustc/middle/trans/expr.rs2
-rw-r--r--src/librustc/middle/trans/tvec.rs8
-rw-r--r--src/librustc/middle/ty.rs2
-rw-r--r--src/librustc/middle/typeck/check/mod.rs16
-rw-r--r--src/librustc/middle/typeck/check/regionmanip.rs3
-rw-r--r--src/libsyntax/ast.rs3
-rw-r--r--src/libsyntax/ast_map.rs15
-rw-r--r--src/libsyntax/ast_util.rs4
-rw-r--r--src/libsyntax/ext/auto_encode.rs44
-rw-r--r--src/libsyntax/ext/build.rs49
-rw-r--r--src/libsyntax/ext/deriving.rs12
-rw-r--r--src/libsyntax/ext/expand.rs7
-rw-r--r--src/libsyntax/ext/pipes/ast_builder.rs31
-rw-r--r--src/libsyntax/ext/tt/macro_parser.rs6
-rw-r--r--src/libsyntax/ext/tt/macro_rules.rs2
-rw-r--r--src/libsyntax/fold.rs102
-rw-r--r--src/libsyntax/parse/classify.rs3
-rw-r--r--src/libsyntax/parse/parser.rs72
-rw-r--r--src/libsyntax/print/pprust.rs3
31 files changed, 245 insertions, 210 deletions
diff --git a/src/libcargo/cargo.rc b/src/libcargo/cargo.rc
index 8d81f75e0da..f588f3643ce 100644
--- a/src/libcargo/cargo.rc
+++ b/src/libcargo/cargo.rc
@@ -294,7 +294,8 @@ fn load_link(mis: ~[@ast::meta_item]) -> (Option<~str>,
     let mut uuid = None;
     for mis.each |a| {
         match a.node {
-            ast::meta_name_value(v, {node: ast::lit_str(s), span: _}) => {
+            ast::meta_name_value(v, ast::spanned { node: ast::lit_str(s),
+                                                   _ }) => {
                 match v {
                     ~"name" => name = Some(*s),
                     ~"vers" => vers = Some(*s),
@@ -321,7 +322,8 @@ fn load_crate(filename: &Path) -> Option<Crate> {
 
     for c.node.attrs.each |a| {
         match a.node.value.node {
-            ast::meta_name_value(v, {node: ast::lit_str(_), span: _}) => {
+            ast::meta_name_value(v, ast::spanned { node: ast::lit_str(_),
+                                                   _ }) => {
                 match v {
                     ~"desc" => desc = Some(v),
                     ~"sigs" => sigs = Some(v),
diff --git a/src/libfuzzer/fuzzer.rc b/src/libfuzzer/fuzzer.rc
index cf242ddd8e2..de8ce8fc370 100644
--- a/src/libfuzzer/fuzzer.rc
+++ b/src/libfuzzer/fuzzer.rc
@@ -81,7 +81,7 @@ fn common_exprs() -> ~[ast::expr] {
     }
 
     fn dsl(l: ast::lit_) -> ast::lit {
-        { node: l, span: ast_util::dummy_sp() }
+        ast::spanned { node: l, span: ast_util::dummy_sp() }
     }
 
     ~[dse(ast::expr_break(option::None)),
diff --git a/src/librustc/front/core_inject.rs b/src/librustc/front/core_inject.rs
index 9bd7566e2e7..772bd39e07b 100644
--- a/src/librustc/front/core_inject.rs
+++ b/src/librustc/front/core_inject.rs
@@ -39,7 +39,7 @@ fn use_core(crate: @ast::crate) -> bool {
 fn inject_libcore_ref(sess: Session,
                       crate: @ast::crate) -> @ast::crate {
     fn spanned<T: Copy>(x: T) -> ast::spanned<T> {
-        return {node: x, span: dummy_sp()};
+        ast::spanned { node: x, span: dummy_sp() }
     }
 
     let precursor = @{
diff --git a/src/librustc/front/intrinsic_inject.rs b/src/librustc/front/intrinsic_inject.rs
index bad8ca88ad8..14d31e2f841 100644
--- a/src/librustc/front/intrinsic_inject.rs
+++ b/src/librustc/front/intrinsic_inject.rs
@@ -36,6 +36,9 @@ fn inject_intrinsic(sess: Session, crate: @ast::crate) -> @ast::crate {
 
     let items = vec::append(~[item], crate.node.module.items);
 
-    return @{node: {module: { items: items ,.. /*bad*/copy crate.node.module }
-                 ,.. /*bad*/copy crate.node} ,.. /*bad*/copy *crate }
+    @ast::spanned {
+        node: { module: { items: items ,.. /*bad*/copy crate.node.module },
+                .. /*bad*/copy crate.node},
+        .. /*bad*/copy *crate
+    }
 }
diff --git a/src/librustc/front/test.rs b/src/librustc/front/test.rs
index 1e2063649b0..497a6878bc1 100644
--- a/src/librustc/front/test.rs
+++ b/src/librustc/front/test.rs
@@ -242,7 +242,7 @@ fn mk_test_module(cx: test_ctxt) -> @ast::item {
 }
 
 fn nospan<T: Copy>(t: T) -> ast::spanned<T> {
-    return {node: t, span: dummy_sp()};
+    ast::spanned { node: t, span: dummy_sp() }
 }
 
 fn path_node(+ids: ~[ast::ident]) -> @ast::path {
@@ -489,7 +489,7 @@ fn mk_main(cx: test_ctxt) -> @ast::item {
     let body_: ast::blk_ =
         default_block(~[], option::Some(test_main_call_expr),
                       cx.sess.next_node_id());
-    let body = {node: body_, span: dummy_sp()};
+    let body = ast::spanned { node: body_, span: dummy_sp() };
 
     let item_ = ast::item_fn(decl, ast::impure_fn, ~[], body);
     let item: ast::item =
diff --git a/src/librustc/metadata/decoder.rs b/src/librustc/metadata/decoder.rs
index dbc70f1318c..081a92f686b 100644
--- a/src/librustc/metadata/decoder.rs
+++ b/src/librustc/metadata/decoder.rs
@@ -1031,9 +1031,10 @@ fn get_attributes(md: ebml::Doc) -> ~[ast::attribute] {
             assert (vec::len(meta_items) == 1u);
             let meta_item = meta_items[0];
             attrs.push(
-                {node: {style: ast::attr_outer, value: /*bad*/copy *meta_item,
-                        is_sugared_doc: false},
-                 span: ast_util::dummy_sp()});
+                ast::spanned { node: { style: ast::attr_outer,
+                                       value: /*bad*/copy *meta_item,
+                                       is_sugared_doc: false },
+                               span: ast_util::dummy_sp()});
         };
       }
       option::None => ()
diff --git a/src/librustc/middle/astencode.rs b/src/librustc/middle/astencode.rs
index c2f2d7711af..45e4b9f328f 100644
--- a/src/librustc/middle/astencode.rs
+++ b/src/librustc/middle/astencode.rs
@@ -259,8 +259,10 @@ fn simplify_ast(ii: ast::inlined_item) -> ast::inlined_item {
         let stmts_sans_items = do vec::filter(blk.stmts) |stmt| {
             match stmt.node {
               ast::stmt_expr(_, _) | ast::stmt_semi(_, _) |
-              ast::stmt_decl(@{node: ast::decl_local(_), span: _}, _) => true,
-              ast::stmt_decl(@{node: ast::decl_item(_), span: _}, _) => false,
+              ast::stmt_decl(@ast::spanned { node: ast::decl_local(_),
+                                             span: _}, _) => true,
+              ast::stmt_decl(@ast::spanned { node: ast::decl_item(_),
+                                             span: _}, _) => false,
               ast::stmt_mac(*) => fail ~"unexpanded macro in astencode"
             }
         };
@@ -286,9 +288,10 @@ fn simplify_ast(ii: ast::inlined_item) -> ast::inlined_item {
       }
       ast::ii_dtor(ref dtor, nm, ref tps, parent_id) => {
         let dtor_body = fld.fold_block((*dtor).node.body);
-        ast::ii_dtor({node: {body: dtor_body,
-                              .. /*bad*/copy (*dtor).node},
-            .. (/*bad*/copy *dtor)}, nm, /*bad*/copy *tps, parent_id)
+        ast::ii_dtor(ast::spanned { node: { body: dtor_body,
+                                            .. /*bad*/copy (*dtor).node },
+                                    .. (/*bad*/copy *dtor) },
+                     nm, /*bad*/copy *tps, parent_id)
       }
     }
 }
@@ -324,9 +327,11 @@ fn renumber_ast(xcx: extended_decode_ctxt, ii: ast::inlined_item)
         let dtor_id = fld.new_id((*dtor).node.id);
         let new_parent = xcx.tr_def_id(parent_id);
         let new_self = fld.new_id((*dtor).node.self_id);
-        ast::ii_dtor({node: {id: dtor_id, attrs: dtor_attrs,
-                self_id: new_self, body: dtor_body},
-                        .. (/*bad*/copy *dtor)},
+        ast::ii_dtor(ast::spanned { node: { id: dtor_id,
+                                            attrs: dtor_attrs,
+                                            self_id: new_self,
+                                            body: dtor_body },
+                                    .. (/*bad*/copy *dtor)},
           nm, new_params, new_parent)
       }
      }
diff --git a/src/librustc/middle/check_const.rs b/src/librustc/middle/check_const.rs
index b8d222aecd7..0166c8da410 100644
--- a/src/librustc/middle/check_const.rs
+++ b/src/librustc/middle/check_const.rs
@@ -57,7 +57,8 @@ fn check_item(sess: Session, ast_map: ast_map::map,
 fn check_pat(p: @pat, &&_is_const: bool, v: visit::vt<bool>) {
     fn is_str(e: @expr) -> bool {
         match e.node {
-          expr_vstore(@{node: expr_lit(@{node: lit_str(_), _}), _},
+          expr_vstore(@{node: expr_lit(@spanned { node: lit_str(_),
+                                                  _}), _},
                       expr_vstore_uniq) => true,
           _ => false
         }
@@ -84,7 +85,7 @@ fn check_expr(sess: Session, def_map: resolve::DefMap,
                           ~"disallowed operator in constant expression");
             return;
           }
-          expr_lit(@{node: lit_str(_), _}) => { }
+          expr_lit(@spanned {node: lit_str(_), _}) => { }
           expr_binary(_, _, _) | expr_unary(_, _) => {
             if method_map.contains_key(e.id) {
                 sess.span_err(e.span, ~"user-defined operators are not \
@@ -170,7 +171,7 @@ fn check_expr(sess: Session, def_map: resolve::DefMap,
         }
     }
     match e.node {
-      expr_lit(@{node: lit_int(v, t), _}) => {
+      expr_lit(@spanned {node: lit_int(v, t), _}) => {
         if t != ty_char {
             if (v as u64) > ast_util::int_ty_max(
                 if t == ty_i { sess.targ_cfg.int_type } else { t }) {
@@ -178,7 +179,7 @@ fn check_expr(sess: Session, def_map: resolve::DefMap,
             }
         }
       }
-      expr_lit(@{node: lit_uint(v, t), _}) => {
+      expr_lit(@spanned {node: lit_uint(v, t), _}) => {
         if v > ast_util::uint_ty_max(
             if t == ty_u { sess.targ_cfg.uint_type } else { t }) {
             sess.span_err(e.span, ~"literal out of range for its type");
diff --git a/src/librustc/middle/check_match.rs b/src/librustc/middle/check_match.rs
index c70d17423cf..441e800f36f 100644
--- a/src/librustc/middle/check_match.rs
+++ b/src/librustc/middle/check_match.rs
@@ -692,7 +692,10 @@ fn is_refutable(cx: @MatchCheckCtxt, pat: &pat) -> bool {
         is_refutable(cx, sub)
       }
       pat_wild | pat_ident(_, _, None) => { false }
-      pat_lit(@{node: expr_lit(@{node: lit_nil, _}), _}) => { false } // "()"
+      pat_lit(@{node: expr_lit(@spanned { node: lit_nil, _}), _}) => {
+        // "()"
+        false
+      }
       pat_lit(_) | pat_range(_, _) => { true }
       pat_rec(fields, _) => {
         fields.any(|f| is_refutable(cx, f.pat))
diff --git a/src/librustc/middle/kind.rs b/src/librustc/middle/kind.rs
index f2a7dd0648c..5e7002af2a5 100644
--- a/src/librustc/middle/kind.rs
+++ b/src/librustc/middle/kind.rs
@@ -409,7 +409,7 @@ fn check_expr(e: @expr, cx: ctx, v: visit::vt<ctx>) {
 
 fn check_stmt(stmt: @stmt, cx: ctx, v: visit::vt<ctx>) {
     match stmt.node {
-      stmt_decl(@{node: decl_local(ref locals), _}, _) => {
+      stmt_decl(@spanned {node: decl_local(ref locals), _}, _) => {
         for locals.each |local| {
             match local.node.init {
               Some(expr) =>
diff --git a/src/librustc/middle/lint.rs b/src/librustc/middle/lint.rs
index d5992d201bb..1db7e666ffb 100644
--- a/src/librustc/middle/lint.rs
+++ b/src/librustc/middle/lint.rs
@@ -467,7 +467,8 @@ fn check_item_while_true(cx: ty::ctxt, it: @ast::item) {
            match e.node {
              ast::expr_while(cond, _) => {
                 match cond.node {
-                    ast::expr_lit(@{node: ast::lit_bool(true),_}) => {
+                    ast::expr_lit(@ast::spanned { node: ast::lit_bool(true),
+                                                  _}) => {
                             cx.sess.span_lint(
                                 while_true, e.id, it.id,
                                 e.span,
diff --git a/src/librustc/middle/trans/base.rs b/src/librustc/middle/trans/base.rs
index 78c70dd3cf1..668457a6a46 100644
--- a/src/librustc/middle/trans/base.rs
+++ b/src/librustc/middle/trans/base.rs
@@ -1938,7 +1938,8 @@ fn trans_item(ccx: @crate_ctxt, item: ast::item) {
         } else {
             for vec::each((*body).node.stmts) |stmt| {
                 match stmt.node {
-                  ast::stmt_decl(@{node: ast::decl_item(i), _}, _) => {
+                  ast::stmt_decl(@ast::spanned { node: ast::decl_item(i),
+                                                 _ }, _) => {
                     trans_item(ccx, *i);
                   }
                   _ => ()
diff --git a/src/librustc/middle/trans/expr.rs b/src/librustc/middle/trans/expr.rs
index 40face3655d..50267a5965e 100644
--- a/src/librustc/middle/trans/expr.rs
+++ b/src/librustc/middle/trans/expr.rs
@@ -545,7 +545,7 @@ fn trans_rvalue_dps_unadjusted(bcx: block, expr: @ast::expr,
         ast::expr_tup(args) => {
             return trans_tup(bcx, args, dest);
         }
-        ast::expr_lit(@{node: ast::lit_str(s), _}) => {
+        ast::expr_lit(@ast::spanned {node: ast::lit_str(s), _}) => {
             return tvec::trans_lit_str(bcx, expr, s, dest);
         }
         ast::expr_vstore(contents, ast::expr_vstore_slice) |
diff --git a/src/librustc/middle/trans/tvec.rs b/src/librustc/middle/trans/tvec.rs
index ee44c80943b..11990b5a8b6 100644
--- a/src/librustc/middle/trans/tvec.rs
+++ b/src/librustc/middle/trans/tvec.rs
@@ -197,7 +197,7 @@ fn trans_slice_vstore(bcx: block,
 
     // Handle the &"..." case:
     match content_expr.node {
-        ast::expr_lit(@{node: ast::lit_str(s), span: _}) => {
+        ast::expr_lit(@ast::spanned {node: ast::lit_str(s), span: _}) => {
             return trans_lit_str(bcx, content_expr, s, dest);
         }
         _ => {}
@@ -316,7 +316,7 @@ fn write_content(bcx: block,
     let _indenter = indenter();
 
     match /*bad*/copy content_expr.node {
-        ast::expr_lit(@{node: ast::lit_str(s), span: _}) => {
+        ast::expr_lit(@ast::spanned { node: ast::lit_str(s), _ }) => {
             match dest {
                 Ignore => {
                     return bcx;
@@ -422,7 +422,9 @@ fn elements_required(bcx: block, content_expr: @ast::expr) -> uint {
     //! Figure out the number of elements we need to store this content
 
     match /*bad*/copy content_expr.node {
-        ast::expr_lit(@{node: ast::lit_str(s), span: _}) => s.len() + 1,
+        ast::expr_lit(@ast::spanned { node: ast::lit_str(s), _ }) => {
+            s.len() + 1
+        },
         ast::expr_vec(es, _) => es.len(),
         ast::expr_repeat(_, count_expr, _) => {
             ty::eval_repeat_count(bcx.tcx(), count_expr, content_expr.span)
diff --git a/src/librustc/middle/ty.rs b/src/librustc/middle/ty.rs
index b894b9f50eb..65533571f9a 100644
--- a/src/librustc/middle/ty.rs
+++ b/src/librustc/middle/ty.rs
@@ -3157,7 +3157,7 @@ fn expr_kind(tcx: ctxt,
         ast::expr_copy(*) |
         ast::expr_unary_move(*) |
         ast::expr_repeat(*) |
-        ast::expr_lit(@{node: lit_str(_), _}) |
+        ast::expr_lit(@ast::spanned {node: lit_str(_), _}) |
         ast::expr_vstore(_, ast::expr_vstore_slice) |
         ast::expr_vstore(_, ast::expr_vstore_mut_slice) |
         ast::expr_vstore(_, ast::expr_vstore_fixed(_)) |
diff --git a/src/librustc/middle/typeck/check/mod.rs b/src/librustc/middle/typeck/check/mod.rs
index d0abd61697d..69b2724c054 100644
--- a/src/librustc/middle/typeck/check/mod.rs
+++ b/src/librustc/middle/typeck/check/mod.rs
@@ -552,11 +552,12 @@ fn check_struct(ccx: @crate_ctxt, struct_def: @ast::struct_def,
     let self_ty = ty::node_id_to_type(tcx, id);
 
     do struct_def.dtor.iter() |dtor| {
-        let class_t = {self_ty: self_ty,
-                       self_id: dtor.node.self_id,
-                       def_id: local_def(id),
-                       explicit_self: {node: ast::sty_by_ref,
-                                       span: ast_util::dummy_sp()}};
+        let class_t = { self_ty: self_ty,
+                        self_id: dtor.node.self_id,
+                        def_id: local_def(id),
+                        explicit_self:
+                            spanned { node: ast::sty_by_ref,
+                                      span: ast_util::dummy_sp() } };
         // typecheck the dtor
         check_bare_fn(ccx, ast_util::dtor_dec(),
                       dtor.node.body, dtor.node.id,
@@ -1911,7 +1912,7 @@ fn check_expr_with_unifier(fcx: @fn_ctxt,
     match /*bad*/copy expr.node {
       ast::expr_vstore(ev, vst) => {
         let typ = match /*bad*/copy ev.node {
-          ast::expr_lit(@{node: ast::lit_str(s), span:_}) => {
+          ast::expr_lit(@ast::spanned { node: ast::lit_str(s), _ }) => {
             let tt = ast_expr_vstore_to_vstore(fcx, ev, str::len(*s), vst);
             ty::mk_estr(tcx, tt)
           }
@@ -2600,7 +2601,8 @@ fn check_block(fcx0: @fn_ctxt, blk: ast::blk) -> bool {
         for blk.node.stmts.each |s| {
             if bot && !warned &&
                 match s.node {
-                  ast::stmt_decl(@{node: ast::decl_local(_), _}, _) |
+                  ast::stmt_decl(@ast::spanned { node: ast::decl_local(_),
+                                                 _}, _) |
                   ast::stmt_expr(_, _) | ast::stmt_semi(_, _) => {
                     true
                   }
diff --git a/src/librustc/middle/typeck/check/regionmanip.rs b/src/librustc/middle/typeck/check/regionmanip.rs
index 1de37f79f08..1e4082fc961 100644
--- a/src/librustc/middle/typeck/check/regionmanip.rs
+++ b/src/librustc/middle/typeck/check/regionmanip.rs
@@ -43,7 +43,8 @@ fn replace_bound_regions_in_fn_ty(
     let mut all_tys = ty::tys_in_fn_ty(fn_ty);
 
     match self_info {
-      Some({explicit_self: {node: ast::sty_region(m), _}, _}) => {
+      Some({explicit_self: ast::spanned { node: ast::sty_region(m),
+                                          _}, _}) => {
         let region = ty::re_bound(ty::br_self);
         let ty = ty::mk_rptr(tcx, region,
                              { ty: ty::mk_self(tcx), mutbl: m });
diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs
index 42e722f8d53..b71f62c6db2 100644
--- a/src/libsyntax/ast.rs
+++ b/src/libsyntax/ast.rs
@@ -23,8 +23,7 @@ use std::serialize::{Encodable, Decodable, Encoder, Decoder};
 
 #[auto_encode]
 #[auto_decode]
-type spanned<T> = {node: T, span: span};
-
+struct spanned<T> { node: T, span: span }
 
 /* can't import macros yet, so this is copied from token.rs. See its comment
  * there. */
diff --git a/src/libsyntax/ast_map.rs b/src/libsyntax/ast_map.rs
index f56f0c545bf..81c7bb2abc9 100644
--- a/src/libsyntax/ast_map.rs
+++ b/src/libsyntax/ast_map.rs
@@ -176,12 +176,15 @@ fn map_fn(fk: visit::fn_kind, decl: fn_decl, body: blk,
         cx.local_id += 1u;
     }
     match fk {
-      visit::fk_dtor(tps, ref attrs, self_id, parent_id) => {
-          let dt = @{node: {id: id, attrs: (*attrs), self_id: self_id,
-                     body: /* FIXME (#2543) */ copy body}, span: sp};
-          cx.map.insert(id, node_dtor(/* FIXME (#2543) */ copy tps, dt,
-                                      parent_id,
-                                      @/* FIXME (#2543) */ copy cx.path));
+        visit::fk_dtor(tps, ref attrs, self_id, parent_id) => {
+            let dt = @spanned {
+                node: {id: id, attrs: (*attrs), self_id: self_id,
+                     body: /* FIXME (#2543) */ copy body},
+                span: sp,
+            };
+            cx.map.insert(id, node_dtor(/* FIXME (#2543) */ copy tps, dt,
+                                        parent_id,
+                                        @/* FIXME (#2543) */ copy cx.path));
       }
       _ => ()
     }
diff --git a/src/libsyntax/ast_util.rs b/src/libsyntax/ast_util.rs
index 3cab2151fde..91baaaaa1da 100644
--- a/src/libsyntax/ast_util.rs
+++ b/src/libsyntax/ast_util.rs
@@ -29,7 +29,7 @@ pure fn spanned<T>(+lo: BytePos, +hi: BytePos, +t: T) -> spanned<T> {
 }
 
 pure fn respan<T>(sp: span, +t: T) -> spanned<T> {
-    {node: move t, span: sp}
+    spanned {node: t, span: sp}
 }
 
 pure fn dummy_spanned<T>(+t: T) -> spanned<T> {
@@ -284,7 +284,7 @@ impl def_id : to_bytes::IterBytes {
 
 fn block_from_expr(e: @expr) -> blk {
     let blk_ = default_block(~[], option::Some::<@expr>(e), e.id);
-    return {node: blk_, span: e.span};
+    return spanned {node: blk_, span: e.span};
 }
 
 fn default_block(+stmts1: ~[@stmt], expr1: Option<@expr>, id1: node_id) ->
diff --git a/src/libsyntax/ext/auto_encode.rs b/src/libsyntax/ext/auto_encode.rs
index 152c49461b8..a3f208a3f07 100644
--- a/src/libsyntax/ext/auto_encode.rs
+++ b/src/libsyntax/ext/auto_encode.rs
@@ -299,8 +299,8 @@ priv impl ext_ctxt {
     }
 
     fn stmt(expr: @ast::expr) -> @ast::stmt {
-        @{node: ast::stmt_semi(expr, self.next_id()),
-          span: expr.span}
+        @ast::spanned { node: ast::stmt_semi(expr, self.next_id()),
+                       span: expr.span }
     }
 
     fn lit_str(span: span, s: @~str) -> @ast::expr {
@@ -310,8 +310,8 @@ priv impl ext_ctxt {
                 self.expr(
                     span,
                     ast::expr_lit(
-                        @{node: ast::lit_str(s),
-                          span: span})),
+                        @ast::spanned { node: ast::lit_str(s),
+                                        span: span})),
                 ast::expr_vstore_uniq))
     }
 
@@ -319,8 +319,8 @@ priv impl ext_ctxt {
         self.expr(
             span,
             ast::expr_lit(
-                @{node: ast::lit_uint(i as u64, ast::ty_u),
-                  span: span}))
+                @ast::spanned { node: ast::lit_uint(i as u64, ast::ty_u),
+                                span: span}))
     }
 
     fn lambda(blk: ast::blk) -> @ast::expr {
@@ -330,21 +330,21 @@ priv impl ext_ctxt {
     }
 
     fn blk(span: span, stmts: ~[@ast::stmt]) -> ast::blk {
-        {node: {view_items: ~[],
-                stmts: stmts,
-                expr: None,
-                id: self.next_id(),
-                rules: ast::default_blk},
-         span: span}
+        ast::spanned { node: { view_items: ~[],
+                               stmts: stmts,
+                               expr: None,
+                               id: self.next_id(),
+                               rules: ast::default_blk},
+                       span: span }
     }
 
     fn expr_blk(expr: @ast::expr) -> ast::blk {
-        {node: {view_items: ~[],
-                stmts: ~[],
-                expr: Some(expr),
-                id: self.next_id(),
-                rules: ast::default_blk},
-         span: expr.span}
+        ast::spanned { node: { view_items: ~[],
+                               stmts: ~[],
+                               expr: Some(expr),
+                               id: self.next_id(),
+                               rules: ast::default_blk},
+                       span: expr.span }
     }
 
     fn expr_path(span: span, strs: ~[ast::ident]) -> @ast::expr {
@@ -570,7 +570,8 @@ fn mk_ser_method(
         ident: cx.ident_of(~"encode"),
         attrs: ~[],
         tps: ~[],
-        self_ty: { node: ast::sty_region(ast::m_imm), span: span },
+        self_ty: ast::spanned { node: ast::sty_region(ast::m_imm),
+                                span: span },
         purity: ast::impure_fn,
         decl: ser_decl,
         body: ser_body,
@@ -624,7 +625,8 @@ fn mk_deser_method(
         ident: cx.ident_of(~"decode"),
         attrs: ~[],
         tps: ~[],
-        self_ty: { node: ast::sty_static, span: span },
+        self_ty: ast::spanned { node: ast::sty_static,
+                                span: span },
         purity: ast::impure_fn,
         decl: deser_decl,
         body: deser_body,
@@ -862,7 +864,7 @@ fn mk_deser_fields(
             ]
         );
 
-        {
+        ast::spanned {
             node: { mutbl: field.mutbl, ident: field.ident, expr: expr },
             span: span,
         }
diff --git a/src/libsyntax/ext/build.rs b/src/libsyntax/ext/build.rs
index 4a3c8ee2259..288ef1b273e 100644
--- a/src/libsyntax/ext/build.rs
+++ b/src/libsyntax/ext/build.rs
@@ -26,7 +26,7 @@ fn mk_expr(cx: ext_ctxt, sp: codemap::span, expr: ast::expr_) ->
 }
 
 fn mk_lit(cx: ext_ctxt, sp: span, lit: ast::lit_) -> @ast::expr {
-    let sp_lit = @{node: lit, span: sp};
+    let sp_lit = @ast::spanned { node: lit, span: sp };
     mk_expr(cx, sp, ast::expr_lit(sp_lit))
 }
 fn mk_int(cx: ext_ctxt, sp: span, i: int) -> @ast::expr {
@@ -136,7 +136,8 @@ fn mk_uniq_str(cx: ext_ctxt, sp: span, s: ~str) -> @ast::expr {
 }
 fn mk_field(sp: span, f: &{ident: ast::ident, ex: @ast::expr})
     -> ast::field {
-    {node: {mutbl: ast::m_imm, ident: f.ident, expr: f.ex}, span: sp}
+    ast::spanned { node: {mutbl: ast::m_imm, ident: f.ident, expr: f.ex},
+                   span: sp }
 }
 fn mk_fields(sp: span, fields: ~[{ident: ast::ident, ex: @ast::expr}]) ->
     ~[ast::field] {
@@ -159,9 +160,10 @@ fn mk_struct_e(cx: ext_ctxt, sp: span,
 }
 fn mk_glob_use(cx: ext_ctxt, sp: span,
                path: ~[ast::ident]) -> @ast::view_item {
-    let glob = @{node: ast::view_path_glob(mk_raw_path(sp, path),
-                                          cx.next_id()),
-                span: sp};
+    let glob = @ast::spanned {
+        node: ast::view_path_glob(mk_raw_path(sp, path), cx.next_id()),
+        span: sp,
+    };
     @{node: ast::view_item_import(~[glob]),
       attrs: ~[],
       vis: ast::private,
@@ -176,29 +178,29 @@ fn mk_local(cx: ext_ctxt, sp: span, mutbl: bool,
                                                  None),
                            span: sp};
     let ty : @ast::Ty = @{ id: cx.next_id(), node: ast::ty_infer, span: sp };
-    let local : @ast::local = @{node: {is_mutbl: mutbl,
-                                       ty: ty,
-                                       pat: pat,
-                                       init: Some(ex),
-                                       id: cx.next_id()},
-                                span: sp};
-    let decl = {node: ast::decl_local(~[local]), span: sp};
-    @{ node: ast::stmt_decl(@decl, cx.next_id()), span: sp }
+    let local : @ast::local = @ast::spanned { node: { is_mutbl: mutbl,
+                                                      ty: ty,
+                                                      pat: pat,
+                                                      init: Some(ex),
+                                                      id: cx.next_id()},
+                                              span: sp};
+    let decl = ast::spanned {node: ast::decl_local(~[local]), span: sp};
+    @ast::spanned { node: ast::stmt_decl(@decl, cx.next_id()), span: sp }
 }
 fn mk_block(cx: ext_ctxt, sp: span,
             view_items: ~[@ast::view_item],
             stmts: ~[@ast::stmt],
             expr: Option<@ast::expr>) -> @ast::expr {
-    let blk = {node: {view_items: view_items,
-                      stmts: stmts,
-                      expr: expr,
-                      id: cx.next_id(),
-                      rules: ast::default_blk },
-               span: sp };
+    let blk = ast::spanned { node: { view_items: view_items,
+                                     stmts: stmts,
+                                     expr: expr,
+                                     id: cx.next_id(),
+                                     rules: ast::default_blk },
+                             span: sp };
     mk_expr(cx, sp, ast::expr_block(blk))
 }
 fn mk_block_(cx: ext_ctxt, sp: span, +stmts: ~[@ast::stmt]) -> ast::blk {
-    {
+    ast::spanned {
         node: {
             view_items: ~[],
             stmts: move stmts,
@@ -217,7 +219,7 @@ fn mk_simple_block(cx: ext_ctxt, span: span, expr: @ast::expr) -> ast::blk {
         id: cx.next_id(),
         rules: ast::default_blk
     };
-    { node: move block, span: span }
+    ast::spanned { node: block, span: span }
 }
 fn mk_copy(cx: ext_ctxt, sp: span, e: @ast::expr) -> @ast::expr {
     mk_expr(cx, sp, ast::expr_copy(e))
@@ -250,12 +252,13 @@ fn mk_pat_struct(cx: ext_ctxt,
     mk_pat(cx, span, move pat)
 }
 fn mk_bool(cx: ext_ctxt, span: span, value: bool) -> @ast::expr {
-    let lit_expr = ast::expr_lit(@{ node: ast::lit_bool(value), span: span });
+    let lit_expr = ast::expr_lit(@ast::spanned { node: ast::lit_bool(value),
+                                                 span: span });
     build::mk_expr(cx, span, move lit_expr)
 }
 fn mk_stmt(cx: ext_ctxt, span: span, expr: @ast::expr) -> @ast::stmt {
     let stmt_ = ast::stmt_semi(expr, cx.next_id());
-    @{ node: move stmt_, span: span }
+    @ast::spanned { node: move stmt_, span: span }
 }
 fn mk_ty_path(cx: ext_ctxt,
               span: span,
diff --git a/src/libsyntax/ext/deriving.rs b/src/libsyntax/ext/deriving.rs
index 41804b1022a..8e36dc01e2a 100644
--- a/src/libsyntax/ext/deriving.rs
+++ b/src/libsyntax/ext/deriving.rs
@@ -16,10 +16,10 @@ use core::prelude::*;
 use ast::{Ty, and, bind_by_ref, binop, deref, enum_def, enum_variant_kind};
 use ast::{expr, expr_match, ident, item, item_, item_struct, item_enum};
 use ast::{item_impl, m_imm, meta_item, method, named_field, or, pat};
-use ast::{pat_ident, pat_wild, public, pure_fn, re_anon, stmt, struct_def};
-use ast::{struct_variant_kind, sty_by_ref, sty_region, tuple_variant_kind};
-use ast::{ty_nil, ty_param, ty_param_bound, ty_path, ty_rptr, unnamed_field};
-use ast::{variant};
+use ast::{pat_ident, pat_wild, public, pure_fn, re_anon, spanned, stmt};
+use ast::{struct_def, struct_variant_kind, sty_by_ref, sty_region};
+use ast::{tuple_variant_kind, ty_nil, ty_param, ty_param_bound, ty_path};
+use ast::{ty_rptr, unnamed_field, variant};
 use ext::base::ext_ctxt;
 use ext::build;
 use codemap::span;
@@ -159,7 +159,7 @@ fn create_eq_method(cx: ext_ctxt,
     let body_block = build::mk_simple_block(cx, span, body);
 
     // Create the method.
-    let self_ty = { node: sty_region(m_imm), span: span };
+    let self_ty = spanned { node: sty_region(m_imm), span: span };
     return @{
         ident: method_ident,
         attrs: ~[],
@@ -309,7 +309,7 @@ fn create_iter_bytes_method(cx: ext_ctxt,
     let body_block = build::mk_block_(cx, span, move statements);
 
     // Create the method.
-    let self_ty = { node: sty_region(m_imm), span: span };
+    let self_ty = spanned { node: sty_region(m_imm), span: span };
     let method_ident = cx.ident_of(~"iter_bytes");
     return @{
         ident: method_ident,
diff --git a/src/libsyntax/ext/expand.rs b/src/libsyntax/ext/expand.rs
index 8faeb167191..82dae3e26b3 100644
--- a/src/libsyntax/ext/expand.rs
+++ b/src/libsyntax/ext/expand.rs
@@ -156,7 +156,9 @@ fn expand_item_mac(exts: HashMap<~str, syntax_extension>,
                    fld: ast_fold) -> Option<@ast::item> {
 
     let (pth, tts) = match it.node {
-        item_mac({node: mac_invoc_tt(pth, ref tts), _}) => (pth, (*tts)),
+        item_mac(ast::spanned { node: mac_invoc_tt(pth, ref tts), _}) => {
+            (pth, (*tts))
+        }
         _ => cx.span_bug(it.span, ~"invalid item macro invocation")
     };
 
@@ -234,7 +236,8 @@ fn expand_stmt(exts: HashMap<~str, syntax_extension>, cx: ext_ctxt,
                 {call_site: sp, callie: {name: *extname, span: exp_sp}}));
             let expanded = match exp(cx, mac.span, tts) {
                 mr_expr(e) =>
-                    @{node: stmt_expr(e, cx.next_id()), span: e.span},
+                    @ast::spanned { node: stmt_expr(e, cx.next_id()),
+                                    span: e.span},
                 mr_any(_,_,stmt_mkr) => stmt_mkr(),
                 _ => cx.span_fatal(
                     pth.span,
diff --git a/src/libsyntax/ext/pipes/ast_builder.rs b/src/libsyntax/ext/pipes/ast_builder.rs
index 56ace4aac1b..3e265de04a3 100644
--- a/src/libsyntax/ext/pipes/ast_builder.rs
+++ b/src/libsyntax/ext/pipes/ast_builder.rs
@@ -136,8 +136,8 @@ impl ext_ctxt: ext_ctxt_ast_builder {
     }
 
     fn stmt_expr(e: @ast::expr) -> @ast::stmt {
-        @{node: ast::stmt_expr(e, self.next_id()),
-          span: dummy_sp()}
+        @spanned { node: ast::stmt_expr(e, self.next_id()),
+                   span: dummy_sp()}
     }
 
     fn stmt_let(ident: ident, e: @ast::expr) -> @ast::stmt {
@@ -146,8 +146,8 @@ impl ext_ctxt: ext_ctxt_ast_builder {
     }
 
     fn field_imm(name: ident, e: @ast::expr) -> ast::field {
-        {node: {mutbl: ast::m_imm, ident: name, expr: e},
-         span: dummy_sp()}
+        spanned { node: { mutbl: ast::m_imm, ident: name, expr: e },
+                  span: dummy_sp()}
     }
 
     fn rec(+fields: ~[ast::field]) -> @ast::expr {
@@ -158,8 +158,8 @@ impl ext_ctxt: ext_ctxt_ast_builder {
     }
 
     fn ty_field_imm(name: ident, ty: @ast::Ty) -> ast::ty_field {
-        {node: {ident: name, mt: { ty: ty, mutbl: ast::m_imm } },
-          span: dummy_sp()}
+        spanned { node: { ident: name, mt: { ty: ty, mutbl: ast::m_imm } },
+                  span: dummy_sp() }
     }
 
     fn ty_rec(+fields: ~[ast::ty_field]) -> @ast::Ty {
@@ -199,8 +199,7 @@ impl ext_ctxt: ext_ctxt_ast_builder {
                    id: self.next_id(),
                    rules: ast::default_blk};
 
-        {node: blk,
-         span: dummy_sp()}
+        spanned { node: blk, span: dummy_sp() }
     }
 
     fn expr_block(e: @ast::expr) -> ast::blk {
@@ -275,13 +274,13 @@ impl ext_ctxt: ext_ctxt_ast_builder {
                +tys: ~[@ast::Ty]) -> ast::variant {
         let args = tys.map(|ty| {ty: *ty, id: self.next_id()});
 
-        {node: {name: name,
-                attrs: ~[],
-                kind: ast::tuple_variant_kind(args),
-                id: self.next_id(),
-                disr_expr: None,
-                vis: ast::public},
-         span: span}
+        spanned { node: { name: name,
+                          attrs: ~[],
+                          kind: ast::tuple_variant_kind(args),
+                          id: self.next_id(),
+                          disr_expr: None,
+                          vis: ast::public},
+                  span: span}
     }
 
     fn item_mod(name: ident,
@@ -290,7 +289,7 @@ impl ext_ctxt: ext_ctxt_ast_builder {
         // XXX: Total hack: import `core::kinds::Owned` to work around a
         // parser bug whereby `fn f<T: ::kinds::Owned>` doesn't parse.
         let vi = ast::view_item_import(~[
-            @{
+            @ast::spanned {
                 node: ast::view_path_simple(
                     self.ident_of(~"Owned"),
                     path(
diff --git a/src/libsyntax/ext/tt/macro_parser.rs b/src/libsyntax/ext/tt/macro_parser.rs
index 724e2fc9dba..2449db17c0f 100644
--- a/src/libsyntax/ext/tt/macro_parser.rs
+++ b/src/libsyntax/ext/tt/macro_parser.rs
@@ -189,13 +189,13 @@ fn nameize(p_s: parse_sess, ms: ~[matcher], res: ~[@named_match])
     fn n_rec(p_s: parse_sess, m: matcher, res: ~[@named_match],
              ret_val: HashMap<ident, @named_match>) {
         match m {
-          {node: match_tok(_), span: _} => (),
-          {node: match_seq(ref more_ms, _, _, _, _), span: _} => {
+          spanned {node: match_tok(_), _} => (),
+          spanned {node: match_seq(ref more_ms, _, _, _, _), _} => {
             for (*more_ms).each() |next_m| {
                 n_rec(p_s, *next_m, res, ret_val)
             };
           }
-          {node: match_nonterminal(bind_name, _, idx), span: sp} => {
+          spanned {node: match_nonterminal(bind_name, _, idx), span: sp} => {
             if ret_val.contains_key(bind_name) {
                 p_s.span_diagnostic.span_fatal(sp, ~"Duplicated bind name: "+
                                                *p_s.interner.get(bind_name))
diff --git a/src/libsyntax/ext/tt/macro_rules.rs b/src/libsyntax/ext/tt/macro_rules.rs
index 1f1efdfe165..069eb1e0d82 100644
--- a/src/libsyntax/ext/tt/macro_rules.rs
+++ b/src/libsyntax/ext/tt/macro_rules.rs
@@ -33,7 +33,7 @@ fn add_new_extension(cx: ext_ctxt, sp: span, name: ident,
                      arg: ~[ast::token_tree]) -> base::mac_result {
     // these spans won't matter, anyways
     fn ms(m: matcher_) -> matcher {
-        {node: m, span: dummy_sp()}
+        ast::spanned { node: m, span: dummy_sp() }
     }
 
     let lhs_nm =  cx.parse_sess().interner.gensym(@~"lhs");
diff --git a/src/libsyntax/fold.rs b/src/libsyntax/fold.rs
index 7de4e3f1d5f..2c4efa82499 100644
--- a/src/libsyntax/fold.rs
+++ b/src/libsyntax/fold.rs
@@ -93,27 +93,27 @@ type ast_fold_precursor = @{
 
 //used in noop_fold_item and noop_fold_crate and noop_fold_crate_directive
 fn fold_meta_item_(&&mi: @meta_item, fld: ast_fold) -> @meta_item {
-    return @{node:
-              match mi.node {
+    @spanned {
+        node:
+            match mi.node {
                 meta_word(ref id) => meta_word((*id)),
                 meta_list(ref id, mis) => {
-                  let fold_meta_item = |x|fold_meta_item_(x, fld);
-                  meta_list(/* FIXME: (#2543) */ copy (*id),
-                            vec::map(mis, |e| fold_meta_item(*e)))
+                    let fold_meta_item = |x|fold_meta_item_(x, fld);
+                    meta_list(/* FIXME: (#2543) */ copy (*id),
+                        vec::map(mis, |e| fold_meta_item(*e)))
                 }
                 meta_name_value(ref id, s) => {
-                  meta_name_value((*id), /* FIXME (#2543) */ copy s)
+                    meta_name_value((*id), /* FIXME (#2543) */ copy s)
                 }
-              },
-          span: fld.new_span(mi.span)};
+            },
+        span: fld.new_span(mi.span) }
 }
 //used in noop_fold_item and noop_fold_crate
-fn fold_attribute_(at: attribute, fld: ast_fold) ->
-   attribute {
-    return {node: {style: at.node.style,
-                value: *fold_meta_item_(@at.node.value, fld),
-                is_sugared_doc: at.node.is_sugared_doc },
-         span: fld.new_span(at.span)};
+fn fold_attribute_(at: attribute, fld: ast_fold) -> attribute {
+    spanned { node: { style: at.node.style,
+                      value: *fold_meta_item_(@at.node.value, fld),
+                      is_sugared_doc: at.node.is_sugared_doc },
+              span: fld.new_span(at.span) }
 }
 //used in noop_fold_foreign_item and noop_fold_fn_decl
 fn fold_arg_(a: arg, fld: ast_fold) -> arg {
@@ -124,11 +124,10 @@ fn fold_arg_(a: arg, fld: ast_fold) -> arg {
 }
 //used in noop_fold_expr, and possibly elsewhere in the future
 fn fold_mac_(m: mac, fld: ast_fold) -> mac {
-    return {node:
-             match m.node {
-               mac_invoc_tt(*) => m.node,
-             },
-         span: fld.new_span(m.span)};
+    spanned { node: match m.node {
+                        mac_invoc_tt(*) => m.node,
+                    },
+              span: fld.new_span(m.span) }
 }
 
 fn fold_fn_decl(decl: ast::fn_decl, fld: ast_fold) -> ast::fn_decl {
@@ -206,10 +205,10 @@ fn noop_fold_item(&&i: @item, fld: ast_fold) -> Option<@item> {
 
 fn noop_fold_struct_field(&&sf: @struct_field, fld: ast_fold)
                        -> @struct_field {
-    @{node: {kind: copy sf.node.kind,
-             id: sf.node.id,
-             ty: fld.fold_ty(sf.node.ty)},
-      span: sf.span}
+    @spanned { node: { kind: copy sf.node.kind,
+                       id: sf.node.id,
+                       ty: fld.fold_ty(sf.node.ty) },
+               span: sf.span }
 }
 
 fn noop_fold_item_underscore(i: item_, fld: ast_fold) -> item_ {
@@ -266,9 +265,10 @@ fn fold_struct_def(struct_def: @ast::struct_def, fld: ast_fold)
     let dtor = do option::map(&struct_def.dtor) |dtor| {
         let dtor_body = fld.fold_block(dtor.node.body);
         let dtor_id   = fld.new_id(dtor.node.id);
-        {node: {body: dtor_body,
-                id: dtor_id,.. dtor.node},
-            .. *dtor}};
+        spanned { node: { body: dtor_body,
+                          id: dtor_id, .. dtor.node},
+                  span: dtor.span }
+    };
     return @{
         fields: vec::map(struct_def.fields, |f| fold_struct_field(*f, fld)),
         dtor: dtor,
@@ -281,10 +281,10 @@ fn fold_trait_ref(&&p: @trait_ref, fld: ast_fold) -> @trait_ref {
 }
 
 fn fold_struct_field(&&f: @struct_field, fld: ast_fold) -> @struct_field {
-    @{node: {kind: copy f.node.kind,
-             id: fld.new_id(f.node.id),
-             ty: fld.fold_ty(f.node.ty)},
-      span: fld.new_span(f.span)}
+    @spanned { node: { kind: copy f.node.kind,
+                       id: fld.new_id(f.node.id),
+                       ty: fld.fold_ty(f.node.ty) },
+               span: fld.new_span(f.span) }
 }
 
 fn noop_fold_method(&&m: @method, fld: ast_fold) -> @method {
@@ -390,11 +390,10 @@ fn wrap<T>(f: fn@(T, ast_fold) -> T)
 
 fn noop_fold_expr(e: expr_, fld: ast_fold) -> expr_ {
     fn fold_field_(field: field, fld: ast_fold) -> field {
-        return {node:
-                 {mutbl: field.node.mutbl,
-                  ident: fld.fold_ident(field.node.ident),
-                  expr: fld.fold_expr(field.node.expr)},
-             span: fld.new_span(field.span)};
+        spanned { node: { mutbl: field.node.mutbl,
+                          ident: fld.fold_ident(field.node.ident),
+                          expr: fld.fold_expr(field.node.expr)},
+                  span: fld.new_span(field.span) }
     }
     let fold_field = |x| fold_field_(x, fld);
 
@@ -508,9 +507,9 @@ fn noop_fold_ty(t: ty_, fld: ast_fold) -> ty_ {
         {ty: fld.fold_ty(mt.ty), mutbl: mt.mutbl}
     }
     fn fold_field(f: ty_field, fld: ast_fold) -> ty_field {
-        {node: {ident: fld.fold_ident(f.node.ident),
-                mt: fold_mt(f.node.mt, fld)},
-         span: fld.new_span(f.span)}
+        spanned { node: { ident: fld.fold_ident(f.node.ident),
+                          mt: fold_mt(f.node.mt, fld) },
+                  span: fld.new_span(f.span) }
     }
     match t {
       ty_nil | ty_bot | ty_infer => copy t,
@@ -566,9 +565,10 @@ fn noop_fold_variant(v: variant_, fld: ast_fold) -> variant_ {
             let dtor = do option::map(&struct_def.dtor) |dtor| {
                 let dtor_body = fld.fold_block(dtor.node.body);
                 let dtor_id   = fld.new_id(dtor.node.id);
-                {node: {body: dtor_body,
-                        id: dtor_id,.. dtor.node},
-                    .. *dtor}};
+                spanned { node: { body: dtor_body,
+                                  id: dtor_id, .. dtor.node},
+                          .. *dtor }
+            };
             kind = struct_variant_kind(@{
                 fields: vec::map(struct_def.fields,
                                  |f| fld.fold_struct_field(*f)),
@@ -661,7 +661,7 @@ impl ast_fold_precursor: ast_fold {
     /* naturally, a macro to write these would be nice */
     fn fold_crate(c: crate) -> crate {
         let (n, s) = (self.fold_crate)(c.node, c.span, self as ast_fold);
-        return {node: n, span: (self.new_span)(s)};
+        spanned { node: n, span: (self.new_span)(s) }
     }
     fn fold_view_item(&&x: @view_item) ->
        @view_item {
@@ -679,10 +679,10 @@ impl ast_fold_precursor: ast_fold {
         return (self.fold_item)(i, self as ast_fold);
     }
     fn fold_struct_field(&&sf: @struct_field) -> @struct_field {
-        @{node: {kind: copy sf.node.kind,
-                 id: sf.node.id,
-                 ty: (self as ast_fold).fold_ty(sf.node.ty)},
-          span: (self.new_span)(sf.span)}
+        @spanned { node: { kind: copy sf.node.kind,
+                           id: sf.node.id,
+                           ty: (self as ast_fold).fold_ty(sf.node.ty) },
+                   span: (self.new_span)(sf.span) }
     }
     fn fold_item_underscore(i: item_) ->
        item_ {
@@ -694,11 +694,11 @@ impl ast_fold_precursor: ast_fold {
     }
     fn fold_block(x: blk) -> blk {
         let (n, s) = (self.fold_block)(x.node, x.span, self as ast_fold);
-        return {node: n, span: (self.new_span)(s)};
+        spanned { node: n, span: (self.new_span)(s) }
     }
     fn fold_stmt(&&x: @stmt) -> @stmt {
         let (n, s) = (self.fold_stmt)(x.node, x.span, self as ast_fold);
-        return @{node: n, span: (self.new_span)(s)};
+        @spanned { node: n, span: (self.new_span)(s) }
     }
     fn fold_arm(x: arm) -> arm {
         return (self.fold_arm)(x, self as ast_fold);
@@ -711,7 +711,7 @@ impl ast_fold_precursor: ast_fold {
     }
     fn fold_decl(&&x: @decl) -> @decl {
         let (n, s) = (self.fold_decl)(x.node, x.span, self as ast_fold);
-        return @{node: n, span: (self.new_span)(s)};
+        @spanned { node: n, span: (self.new_span)(s) }
     }
     fn fold_expr(&&x: @expr) -> @expr {
         let (n, s) = (self.fold_expr)(x.node, x.span, self as ast_fold);
@@ -734,7 +734,7 @@ impl ast_fold_precursor: ast_fold {
     fn fold_variant(x: variant) ->
        variant {
         let (n, s) = (self.fold_variant)(x.node, x.span, self as ast_fold);
-        return {node: n, span: (self.new_span)(s)};
+        spanned { node: n, span: (self.new_span)(s) }
     }
     fn fold_ident(&&x: ident) -> ident {
         return (self.fold_ident)(x, self as ast_fold);
@@ -744,7 +744,7 @@ impl ast_fold_precursor: ast_fold {
     }
     fn fold_local(&&x: @local) -> @local {
         let (n, s) = (self.fold_local)(x.node, x.span, self as ast_fold);
-        return @{node: n, span: (self.new_span)(s)};
+        @spanned { node: n, span: (self.new_span)(s) }
     }
     fn map_exprs(f: fn@(&&v: @expr) -> @expr, e: ~[@expr]) -> ~[@expr] {
         (self.map_exprs)(f, e)
diff --git a/src/libsyntax/parse/classify.rs b/src/libsyntax/parse/classify.rs
index 7f57c777833..04316e05b64 100644
--- a/src/libsyntax/parse/classify.rs
+++ b/src/libsyntax/parse/classify.rs
@@ -30,7 +30,8 @@ fn expr_requires_semi_to_be_stmt(e: @ast::expr) -> bool {
 
 fn expr_is_simple_block(e: @ast::expr) -> bool {
     match e.node {
-      ast::expr_block({node: {rules: ast::default_blk, _}, _}) => true,
+      ast::expr_block(ast::spanned {node: {rules: ast::default_blk, _}, _}) =>
+        true,
       _ => false
     }
 }
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index 80fd04f0e10..1a549fc93d5 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -772,7 +772,7 @@ impl Parser {
             self.bump();
             self.lit_from_token(tok)
         };
-        return {node: lit, span: mk_sp(lo, self.last_span.hi)};
+        spanned { node: lit, span: mk_sp(lo, self.last_span.hi) }
     }
 
     fn parse_path_without_tps() -> @path {
@@ -844,7 +844,7 @@ impl Parser {
                 self.parse_seq_lt_gt(Some(token::COMMA),
                                      |p| p.parse_ty(false))
             } else {
-                {node: ~[], span: path.span}
+                spanned {node: ~[], span: path.span}
             }
         };
 
@@ -880,14 +880,14 @@ impl Parser {
     fn mk_mac_expr(+lo: BytePos, +hi: BytePos, m: mac_) -> @expr {
         return @{id: self.get_id(),
               callee_id: self.get_id(),
-              node: expr_mac({node: m, span: mk_sp(lo, hi)}),
+              node: expr_mac(spanned {node: m, span: mk_sp(lo, hi)}),
               span: mk_sp(lo, hi)};
     }
 
     fn mk_lit_u32(i: u32) -> @expr {
         let span = self.span;
-        let lv_lit = @{node: lit_uint(i as u64, ty_u32),
-                       span: span};
+        let lv_lit = @spanned { node: lit_uint(i as u64, ty_u32),
+                                span: span };
 
         return @{id: self.get_id(), callee_id: self.get_id(),
               node: expr_lit(lv_lit), span: span};
@@ -1363,7 +1363,7 @@ impl Parser {
                 hi = e.span.hi;
                 // HACK: turn &[...] into a &-evec
                 ex = match e.node {
-                  expr_vec(*) | expr_lit(@{node: lit_str(_), span: _})
+                  expr_vec(*) | expr_lit(@spanned {node: lit_str(_), span: _})
                   if m == m_imm => {
                     expr_vstore(e, expr_vstore_slice)
                   }
@@ -1386,7 +1386,7 @@ impl Parser {
               expr_vec(*) if m == m_mutbl =>
                 expr_vstore(e, expr_vstore_mut_box),
               expr_vec(*) if m == m_imm => expr_vstore(e, expr_vstore_box),
-              expr_lit(@{node: lit_str(_), span: _}) if m == m_imm =>
+              expr_lit(@spanned {node: lit_str(_), span: _}) if m == m_imm =>
                 expr_vstore(e, expr_vstore_box),
               _ => expr_unary(box(m), e)
             };
@@ -1398,7 +1398,7 @@ impl Parser {
             hi = e.span.hi;
             // HACK: turn ~[...] into a ~-evec
             ex = match e.node {
-              expr_vec(*) | expr_lit(@{node: lit_str(_), span: _})
+              expr_vec(*) | expr_lit(@spanned {node: lit_str(_), span: _})
               if m == m_imm => expr_vstore(e, expr_vstore_uniq),
               _ => expr_unary(uniq(m), e)
             };
@@ -1748,12 +1748,12 @@ impl Parser {
                 self.eat(token::COMMA);
             }
 
-            let blk = {node: {view_items: ~[],
-                              stmts: ~[],
-                              expr: Some(expr),
-                              id: self.get_id(),
-                              rules: default_blk},
-                       span: expr.span};
+            let blk = spanned { node: { view_items: ~[],
+                                        stmts: ~[],
+                                        expr: Some(expr),
+                                        id: self.get_id(),
+                                        rules: default_blk},
+                                span: expr.span };
 
             arms.push({pats: pats, guard: guard, body: blk});
         }
@@ -1893,7 +1893,7 @@ impl Parser {
             // HACK: parse @"..." as a literal of a vstore @str
             pat = match sub.node {
               pat_lit(e@@{
-                node: expr_lit(@{node: lit_str(_), span: _}), _
+                node: expr_lit(@spanned {node: lit_str(_), span: _}), _
               }) => {
                 let vst = @{id: self.get_id(), callee_id: self.get_id(),
                             node: expr_vstore(e, expr_vstore_box),
@@ -1910,7 +1910,7 @@ impl Parser {
             // HACK: parse ~"..." as a literal of a vstore ~str
             pat = match sub.node {
               pat_lit(e@@{
-                node: expr_lit(@{node: lit_str(_), span: _}), _
+                node: expr_lit(@spanned {node: lit_str(_), span: _}), _
               }) => {
                 let vst = @{id: self.get_id(), callee_id: self.get_id(),
                             node: expr_vstore(e, expr_vstore_uniq),
@@ -1929,7 +1929,7 @@ impl Parser {
               // HACK: parse &"..." as a literal of a borrowed str
               pat = match sub.node {
                   pat_lit(e@@{
-                      node: expr_lit(@{node: lit_str(_), span: _}), _
+                      node: expr_lit(@spanned {node: lit_str(_), span: _}), _
                   }) => {
                       let vst = @{
                           id: self.get_id(),
@@ -1954,7 +1954,7 @@ impl Parser {
             if self.token == token::RPAREN {
                 hi = self.span.hi;
                 self.bump();
-                let lit = @{node: lit_nil, span: mk_sp(lo, hi)};
+                let lit = @spanned {node: lit_nil, span: mk_sp(lo, hi)};
                 let expr = self.mk_expr(lo, hi, expr_lit(lit));
                 pat = pat_lit(expr);
             } else {
@@ -2319,8 +2319,9 @@ impl Parser {
                             match self.token {
                                 token::SEMI => {
                                     self.bump();
-                                    stmts.push(@{node: stmt_semi(e, stmt_id),
-                                                 ..*stmt});
+                                    stmts.push(@spanned {
+                                        node: stmt_semi(e, stmt_id),
+                                        .. *stmt});
                                 }
                                 token::RBRACE => {
                                     expr = Some(e);
@@ -2343,8 +2344,9 @@ impl Parser {
                             match self.token {
                                 token::SEMI => {
                                     self.bump();
-                                    stmts.push(@{node: stmt_mac((*m), true),
-                                                 ..*stmt});
+                                    stmts.push(@spanned {
+                                        node: stmt_mac((*m), true),
+                                        .. *stmt});
                                 }
                                 token::RBRACE => {
                                     // if a block ends in `m!(arg)` without
@@ -2811,11 +2813,11 @@ impl Parser {
 
         let actual_dtor = do the_dtor.map |dtor| {
             let (d_body, d_attrs, d_s) = *dtor;
-            {node: {id: self.get_id(),
-                    attrs: d_attrs,
-                    self_id: self.get_id(),
-                    body: d_body},
-             span: d_s}};
+            spanned { node: { id: self.get_id(),
+                              attrs: d_attrs,
+                              self_id: self.get_id(),
+                              body: d_body},
+                       span: d_s}};
         let _ = self.get_id();  // XXX: Workaround for crazy bug.
         let new_id = self.get_id();
         (class_name,
@@ -3308,11 +3310,11 @@ impl Parser {
         self.bump();
         let mut actual_dtor = do the_dtor.map |dtor| {
             let (d_body, d_attrs, d_s) = *dtor;
-            {node: {id: self.get_id(),
-                    attrs: d_attrs,
-                    self_id: self.get_id(),
-                    body: d_body},
-             span: d_s}
+            spanned { node: { id: self.get_id(),
+                              attrs: d_attrs,
+                              self_id: self.get_id(),
+                              body: d_body },
+                      span: d_s }
         };
 
         return @{
@@ -3592,9 +3594,9 @@ impl Parser {
               _ => self.fatal(~"expected open delimiter")
             };
             let m = ast::mac_invoc_tt(pth, tts);
-            let m: ast::mac = {node: m,
-                               span: mk_sp(self.span.lo,
-                                           self.span.hi)};
+            let m: ast::mac = spanned { node: m,
+                                        span: mk_sp(self.span.lo,
+                                                    self.span.hi) };
             let item_ = item_mac(m);
             return iovi_item(self.mk_item(lo, self.last_span.hi, id, item_,
                                           visibility, attrs));
diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs
index c121bc30b96..dda83aa2d0e 100644
--- a/src/libsyntax/print/pprust.rs
+++ b/src/libsyntax/print/pprust.rs
@@ -599,7 +599,8 @@ fn print_item(s: ps, &&item: @ast::item) {
         }
         bclose(s, item.span);
       }
-      ast::item_mac({node: ast::mac_invoc_tt(pth, ref tts), _}) => {
+      ast::item_mac(ast::spanned { node: ast::mac_invoc_tt(pth, ref tts),
+                                   _}) => {
         print_visibility(s, item.vis);
         print_path(s, pth, false);
         word(s.s, ~"! ");