auto merge of #6502 : huonw/rust/no-auto-code, r=graydon

Replace all instances of #[auto_*code] with the appropriate #[deriving] attribute
and remove the majority of the actual auto_* code, leaving stubs to refer the user to
the new syntax.

Also, moves the useful contents of auto_encode.rs to more appropriate spots: tests and comments to deriving/encodable.rs, and the ExtCtxtMethods trait to build.rs (unused so far, but the method syntax might be nicer than using the mk_* fns in many instances).
This commit is contained in:
bors 2013-05-15 18:16:51 -07:00
commit 8257528b6c
19 changed files with 752 additions and 1798 deletions

View File

@ -20,8 +20,7 @@ use syntax::{ast, ast_util, visit};
// A vector of defs representing the free variables referred to in a function.
// (The def_upvar will already have been stripped).
#[auto_encode]
#[auto_decode]
#[deriving(Encodable, Decodable)]
pub struct freevar_entry {
def: ast::def, //< The variable being accessed free.
span: span //< First span where it is accessed (there can be multiple)

View File

@ -221,16 +221,14 @@ use syntax::visit::vt;
use syntax::print::pprust;
use syntax::codemap::span;
#[auto_encode]
#[auto_decode]
#[deriving(Encodable, Decodable)]
pub enum CaptureMode {
CapCopy, // Copy the value into the closure.
CapMove, // Move the value into the closure.
CapRef, // Reference directly from parent stack frame (used by `&fn()`).
}
#[auto_encode]
#[auto_decode]
#[deriving(Encodable, Decodable)]
pub struct CaptureVar {
def: def, // Variable being accessed free
span: span, // Location of an access to this variable

View File

@ -96,9 +96,7 @@ pub struct mt {
mutbl: ast::mutability,
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum vstore {
vstore_fixed(uint),
vstore_uniq,
@ -106,9 +104,7 @@ pub enum vstore {
vstore_slice(Region)
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq, IterBytes)]
#[deriving(Eq, IterBytes, Encodable, Decodable)]
pub enum TraitStore {
BoxTraitStore, // @Trait
UniqTraitStore, // ~Trait
@ -117,9 +113,7 @@ pub enum TraitStore {
// XXX: This should probably go away at some point. Maybe after destructors
// do?
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum SelfMode {
ByCopy,
ByRef,
@ -197,27 +191,22 @@ pub enum ast_ty_to_ty_cache_entry {
pub type opt_region_variance = Option<region_variance>;
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Decodable, Encodable)]
pub enum region_variance { rv_covariant, rv_invariant, rv_contravariant }
#[auto_encode]
#[auto_decode]
#[deriving(Decodable, Encodable)]
pub enum AutoAdjustment {
AutoAddEnv(ty::Region, ast::Sigil),
AutoDerefRef(AutoDerefRef)
}
#[auto_encode]
#[auto_decode]
#[deriving(Decodable, Encodable)]
pub struct AutoDerefRef {
autoderefs: uint,
autoref: Option<AutoRef>
}
#[auto_encode]
#[auto_decode]
#[deriving(Decodable, Encodable)]
pub enum AutoRef {
/// Convert from T to &T
AutoPtr(Region, ast::mutability),
@ -453,9 +442,7 @@ pub struct param_ty {
}
/// Representation of regions:
#[auto_encode]
#[auto_decode]
#[deriving(Eq, IterBytes)]
#[deriving(Eq, IterBytes, Encodable, Decodable)]
pub enum Region {
/// Bound regions are found (primarily) in function types. They indicate
/// region parameters that have yet to be replaced with actual regions
@ -501,17 +488,13 @@ pub impl Region {
}
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq, IterBytes)]
#[deriving(Eq, IterBytes, Encodable, Decodable)]
pub struct FreeRegion {
scope_id: node_id,
bound_region: bound_region
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq, IterBytes)]
#[deriving(Eq, IterBytes, Encodable, Decodable)]
pub enum bound_region {
/// The self region for structs, impls (&T in a type defn or &'self T)
br_self,
@ -742,9 +725,7 @@ pub struct IntVid(uint);
#[deriving(Eq)]
pub struct FloatVid(uint);
#[deriving(Eq)]
#[auto_encode]
#[auto_decode]
#[deriving(Eq, Encodable, Decodable)]
pub struct RegionVid {
id: uint
}
@ -777,8 +758,7 @@ impl to_bytes::IterBytes for InferTy {
}
}
#[auto_encode]
#[auto_decode]
#[deriving(Encodable, Decodable)]
pub enum InferRegion {
ReVar(RegionVid),
ReSkolemized(uint, bound_region)

View File

@ -73,8 +73,7 @@ pub mod infer;
pub mod collect;
pub mod coherence;
#[auto_encode]
#[auto_decode]
#[deriving(Encodable, Decodable)]
pub enum method_origin {
// supertrait method invoked on "self" inside a default method
// first field is supertrait ID;
@ -98,8 +97,7 @@ pub enum method_origin {
// details for a method invoked with a receiver whose type is a type parameter
// with a bounded trait.
#[auto_encode]
#[auto_decode]
#[deriving(Encodable, Decodable)]
pub struct method_param {
// the trait containing the method to be invoked
trait_id: ast::def_id,

View File

@ -1331,26 +1331,20 @@ mod tests {
use std::serialize::Decodable;
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
enum Animal {
Dog,
Frog(~str, int)
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
struct Inner {
a: (),
b: uint,
c: ~[~str],
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
struct Outer {
inner: ~[Inner],
}

View File

@ -29,9 +29,7 @@ pub mod rustrt {
}
/// A record specifying a time value in seconds and nanoseconds.
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct Timespec { sec: i64, nsec: i32 }
/*
@ -100,9 +98,7 @@ pub fn tzset() {
}
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct Tm {
tm_sec: i32, // seconds after the minute ~[0-60]
tm_min: i32, // minutes after the hour ~[0-59]

View File

@ -92,9 +92,7 @@ use core::util::replace;
*
*/
#[deriving(Eq)]
#[auto_encode]
#[auto_decode]
#[deriving(Eq, Encodable, Decodable)]
struct WorkKey {
kind: ~str,
name: ~str

View File

@ -58,9 +58,7 @@ enum AbiArchitecture {
Archs(u32) // Multiple architectures (bitset)
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct AbiSet {
priv bits: u32 // each bit represents one of the abis below
}

View File

@ -47,9 +47,7 @@ pub type SyntaxContext = uint;
pub type SCTable = ~[SyntaxContext_];
pub static empty_ctxt : uint = 0;
#[deriving(Eq)]
#[auto_encode]
#[auto_decode]
#[deriving(Eq, Encodable, Decodable)]
pub enum SyntaxContext_ {
EmptyCtxt,
Mark (Mrk,SyntaxContext),
@ -115,9 +113,7 @@ impl to_bytes::IterBytes for ident {
// Functions may or may not have names.
pub type fn_ident = Option<ident>;
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct Lifetime {
id: node_id,
span: span,
@ -142,9 +138,7 @@ impl to_bytes::IterBytes for Lifetime {
// for instance: core::cmp::Eq . It's represented
// as a sequence of identifiers, along with a bunch
// of supporting information.
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct Path {
span: span,
global: bool,
@ -157,9 +151,7 @@ pub type crate_num = int;
pub type node_id = int;
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct def_id {
crate: crate_num,
node: node_id,
@ -168,9 +160,7 @@ pub struct def_id {
pub static local_crate: crate_num = 0;
pub static crate_node_id: node_id = 0;
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
// The AST represents all type param bounds as types.
// typeck::collect::compute_bounds matches these against
// the "special" built-in traits (see middle::lang_items) and
@ -180,18 +170,14 @@ pub enum TyParamBound {
RegionTyParamBound
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct TyParam {
ident: ident,
id: node_id,
bounds: @OptVec<TyParamBound>
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct Generics {
lifetimes: OptVec<Lifetime>,
ty_params: OptVec<TyParam>
@ -209,9 +195,7 @@ pub impl Generics {
}
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum def {
def_fn(def_id, purity),
def_static_method(/* method */ def_id,
@ -248,9 +232,7 @@ pub type crate_cfg = ~[@meta_item];
pub type crate = spanned<crate_>;
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct crate_ {
module: _mod,
attrs: ~[attribute],
@ -259,9 +241,7 @@ pub struct crate_ {
pub type meta_item = spanned<meta_item_>;
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum meta_item_ {
meta_word(@~str),
meta_list(@~str, ~[@meta_item]),
@ -270,9 +250,7 @@ pub enum meta_item_ {
pub type blk = spanned<blk_>;
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct blk_ {
view_items: ~[@view_item],
stmts: ~[@stmt],
@ -281,26 +259,20 @@ pub struct blk_ {
rules: blk_check_mode,
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct pat {
id: node_id,
node: pat_,
span: span,
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct field_pat {
ident: ident,
pat: @pat,
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum binding_mode {
bind_by_copy,
bind_by_ref(mutability),
@ -334,9 +306,7 @@ impl to_bytes::IterBytes for binding_mode {
}
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum pat_ {
pat_wild,
// A pat_ident may either be a new bound variable,
@ -361,9 +331,7 @@ pub enum pat_ {
pat_vec(~[@pat], Option<@pat>, ~[@pat])
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum mutability { m_mutbl, m_imm, m_const, }
#[cfg(stage0)]
@ -379,9 +347,7 @@ impl to_bytes::IterBytes for mutability {
}
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum Sigil {
BorrowedSigil,
OwnedSigil,
@ -411,9 +377,7 @@ impl ToStr for Sigil {
}
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum vstore {
// FIXME (#3469): Change uint to @expr (actually only constant exprs)
vstore_fixed(Option<uint>), // [1,2,3,4]
@ -422,9 +386,7 @@ pub enum vstore {
vstore_slice(Option<@Lifetime>) // &'foo? [1,2,3,4]
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum expr_vstore {
expr_vstore_uniq, // ~[1,2,3,4]
expr_vstore_box, // @[1,2,3,4]
@ -433,9 +395,7 @@ pub enum expr_vstore {
expr_vstore_mut_slice, // &mut [1,2,3,4]
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum binop {
add,
subtract,
@ -457,9 +417,7 @@ pub enum binop {
gt,
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum unop {
box(mutability),
uniq(mutability),
@ -470,9 +428,7 @@ pub enum unop {
pub type stmt = spanned<stmt_>;
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum stmt_ {
stmt_decl(@decl, node_id),
@ -488,9 +444,7 @@ pub enum stmt_ {
// FIXME (pending discussion of #1697, #2178...): local should really be
// a refinement on pat.
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct local_ {
is_mutbl: bool,
ty: @Ty,
@ -503,23 +457,17 @@ pub type local = spanned<local_>;
pub type decl = spanned<decl_>;
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum decl_ { decl_local(~[@local]), decl_item(@item), }
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct arm {
pats: ~[@pat],
guard: Option<@expr>,
body: blk,
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct field_ {
mutbl: mutability,
ident: ident,
@ -528,14 +476,10 @@ pub struct field_ {
pub type field = spanned<field_>;
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum blk_check_mode { default_blk, unsafe_blk, }
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct expr {
id: node_id,
// Extra node ID is only used for index, assign_op, unary, binary, method
@ -545,18 +489,14 @@ pub struct expr {
span: span,
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum CallSugar {
NoSugar,
DoSugar,
ForSugar
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum expr_ {
expr_vstore(@expr, expr_vstore),
expr_vec(~[@expr], mutability),
@ -627,9 +567,7 @@ pub enum expr_ {
// else knows what to do with them, so you'll probably get a syntax
// error.
//
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
#[doc="For macro invocations; parsing is delegated to the macro"]
pub enum token_tree {
// a single token
@ -702,9 +640,7 @@ pub enum token_tree {
//
pub type matcher = spanned<matcher_>;
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum matcher_ {
// match one token
match_tok(::parse::token::Token),
@ -717,18 +653,14 @@ pub enum matcher_ {
pub type mac = spanned<mac_>;
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum mac_ {
mac_invoc_tt(@Path,~[token_tree]), // new macro-invocation
}
pub type lit = spanned<lit_>;
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum lit_ {
lit_str(@~str),
lit_int(i64, int_ty),
@ -742,17 +674,13 @@ pub enum lit_ {
// NB: If you change this, you'll probably want to change the corresponding
// type structure in middle/ty.rs as well.
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct mt {
ty: @Ty,
mutbl: mutability,
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct ty_field_ {
ident: ident,
mt: mt,
@ -760,9 +688,7 @@ pub struct ty_field_ {
pub type ty_field = spanned<ty_field_>;
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct ty_method {
ident: ident,
attrs: ~[attribute],
@ -774,9 +700,7 @@ pub struct ty_method {
span: span,
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
// A trait method is either required (meaning it doesn't have an
// implementation, just a signature) or provided (meaning it has a default
// implementation).
@ -785,9 +709,7 @@ pub enum trait_method {
provided(@method),
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum int_ty { ty_i, ty_char, ty_i8, ty_i16, ty_i32, ty_i64, }
impl ToStr for int_ty {
@ -809,9 +731,7 @@ impl to_bytes::IterBytes for int_ty {
}
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum uint_ty { ty_u, ty_u8, ty_u16, ty_u32, ty_u64, }
impl ToStr for uint_ty {
@ -833,9 +753,7 @@ impl to_bytes::IterBytes for uint_ty {
}
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum float_ty { ty_f, ty_f32, ty_f64, }
impl ToStr for float_ty {
@ -858,9 +776,7 @@ impl to_bytes::IterBytes for float_ty {
}
// NB Eq method appears below.
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct Ty {
id: node_id,
node: ty_,
@ -868,9 +784,7 @@ pub struct Ty {
}
// Not represented directly in the AST, referred to by name through a ty_path.
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum prim_ty {
ty_int(int_ty),
ty_uint(uint_ty),
@ -879,9 +793,7 @@ pub enum prim_ty {
ty_bool,
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum Onceness {
Once,
Many
@ -909,9 +821,7 @@ impl to_bytes::IterBytes for Onceness {
}
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct TyClosure {
sigil: Sigil,
region: Option<@Lifetime>,
@ -921,9 +831,7 @@ pub struct TyClosure {
decl: fn_decl
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct TyBareFn {
purity: purity,
abis: AbiSet,
@ -931,9 +839,7 @@ pub struct TyBareFn {
decl: fn_decl
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum ty_ {
ty_nil,
ty_bot, /* bottom type */
@ -967,17 +873,13 @@ impl to_bytes::IterBytes for Ty {
}
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum asm_dialect {
asm_att,
asm_intel
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct inline_asm {
asm: @~str,
clobbers: @~str,
@ -988,9 +890,7 @@ pub struct inline_asm {
dialect: asm_dialect
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct arg {
is_mutbl: bool,
ty: @Ty,
@ -998,18 +898,14 @@ pub struct arg {
id: node_id,
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct fn_decl {
inputs: ~[arg],
output: @Ty,
cf: ret_style,
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum purity {
pure_fn, // declared with "pure fn"
unsafe_fn, // declared with "unsafe fn"
@ -1041,9 +937,7 @@ impl to_bytes::IterBytes for purity {
}
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum ret_style {
noreturn, // functions with return type _|_ that always
// raise an error or exit (i.e. never return to the caller)
@ -1063,9 +957,7 @@ impl to_bytes::IterBytes for ret_style {
}
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum explicit_self_ {
sty_static, // no self
sty_value, // `self`
@ -1102,9 +994,7 @@ impl to_bytes::IterBytes for explicit_self_ {
pub type explicit_self = spanned<explicit_self_>;
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct method {
ident: ident,
attrs: ~[attribute],
@ -1119,23 +1009,17 @@ pub struct method {
vis: visibility,
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct _mod {
view_items: ~[@view_item],
items: ~[@item],
}
// Foreign mods can be named or anonymous
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum foreign_mod_sort { named, anonymous }
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct foreign_mod {
sort: foreign_mod_sort,
abis: AbiSet,
@ -1143,32 +1027,24 @@ pub struct foreign_mod {
items: ~[@foreign_item],
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct variant_arg {
ty: @Ty,
id: node_id,
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum variant_kind {
tuple_variant_kind(~[variant_arg]),
struct_variant_kind(@struct_def),
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct enum_def {
variants: ~[variant],
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct variant_ {
name: ident,
attrs: ~[attribute],
@ -1180,9 +1056,7 @@ pub struct variant_ {
pub type variant = spanned<variant_>;
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct path_list_ident_ {
name: ident,
id: node_id,
@ -1192,9 +1066,7 @@ pub type path_list_ident = spanned<path_list_ident_>;
pub type view_path = spanned<view_path_>;
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum view_path_ {
// quux = foo::bar::baz
@ -1211,9 +1083,7 @@ pub enum view_path_ {
view_path_list(@Path, ~[path_list_ident], node_id)
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct view_item {
node: view_item_,
attrs: ~[attribute],
@ -1221,9 +1091,7 @@ pub struct view_item {
span: span,
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum view_item_ {
view_item_extern_mod(ident, ~[@meta_item], node_id),
view_item_use(~[@view_path]),
@ -1235,15 +1103,11 @@ pub type attribute = spanned<attribute_>;
// Distinguishes between attributes that decorate items and attributes that
// are contained as statements within items. These two cases need to be
// distinguished for pretty-printing.
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum attr_style { attr_outer, attr_inner, }
// doc-comments are promoted to attributes that have is_sugared_doc = true
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct attribute_ {
style: attr_style,
value: @meta_item,
@ -1257,17 +1121,13 @@ pub struct attribute_ {
If this impl is an item_impl, the impl_id is redundant (it could be the
same as the impl's node id).
*/
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct trait_ref {
path: @Path,
ref_id: node_id,
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum visibility { public, private, inherited }
impl visibility {
@ -1279,9 +1139,7 @@ impl visibility {
}
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct struct_field_ {
kind: struct_field_kind,
id: node_id,
@ -1291,17 +1149,13 @@ pub struct struct_field_ {
pub type struct_field = spanned<struct_field_>;
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum struct_field_kind {
named_field(ident, visibility),
unnamed_field // element of a tuple-like struct
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct struct_def {
fields: ~[@struct_field], /* fields, not including ctor */
/* ID of the constructor. This is only used for tuple- or enum-like
@ -1313,9 +1167,7 @@ pub struct struct_def {
FIXME (#3300): Should allow items to be anonymous. Right now
we just use dummy names for anon items.
*/
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct item {
ident: ident,
attrs: ~[attribute],
@ -1325,9 +1177,7 @@ pub struct item {
span: span,
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum item_ {
item_const(@Ty, @expr),
item_fn(fn_decl, purity, AbiSet, Generics, blk),
@ -1345,9 +1195,7 @@ pub enum item_ {
item_mac(mac),
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct foreign_item {
ident: ident,
attrs: ~[attribute],
@ -1357,9 +1205,7 @@ pub struct foreign_item {
vis: visibility,
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum foreign_item_ {
foreign_item_fn(fn_decl, purity, Generics),
foreign_item_const(@Ty)
@ -1368,9 +1214,7 @@ pub enum foreign_item_ {
// The data we save and restore about an inlined item or method. This is not
// part of the AST that we parse from a file, but it becomes part of the tree
// that we trans.
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub enum inlined_item {
ii_item(@item),
ii_method(def_id /* impl id */, @method),

View File

@ -370,8 +370,7 @@ pub fn empty_generics() -> Generics {
// ______________________________________________________________________
// Enumerating the IDs which appear in an AST
#[auto_encode]
#[auto_decode]
#[deriving(Encodable, Decodable)]
pub struct id_range {
min: node_id,
max: node_id,

View File

@ -127,9 +127,7 @@ pub struct span {
expn_info: Option<@ExpnInfo>
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Eq, Encodable, Decodable)]
pub struct spanned<T> { node: T, span: span }
impl cmp::Eq for span {

File diff suppressed because it is too large Load Diff

View File

@ -538,3 +538,301 @@ pub fn duplicate_expr(cx: @ext_ctxt, expr: @ast::expr) -> @ast::expr {
folder.fold_expr(expr)
}
// Transitional reexports so qquote can find the paths it is looking for
mod syntax {
pub use ext;
pub use parse;
}
trait ExtCtxtMethods {
fn bind_path(&self,
span: span,
ident: ast::ident,
path: @ast::Path,
bounds: @OptVec<ast::TyParamBound>)
-> ast::TyParam;
fn expr(&self, span: span, node: ast::expr_) -> @ast::expr;
fn path(&self, span: span, strs: ~[ast::ident]) -> @ast::Path;
fn path_global(&self, span: span, strs: ~[ast::ident]) -> @ast::Path;
fn path_tps(&self, span: span, strs: ~[ast::ident], tps: ~[@ast::Ty])
-> @ast::Path;
fn path_tps_global(&self,
span: span,
strs: ~[ast::ident],
tps: ~[@ast::Ty])
-> @ast::Path;
fn ty_path(&self, span: span, strs: ~[ast::ident], tps: ~[@ast::Ty])
-> @ast::Ty;
fn binder_pat(&self, span: span, nm: ast::ident) -> @ast::pat;
fn stmt(&self, expr: @ast::expr) -> @ast::stmt;
fn lit_str(&self, span: span, s: @~str) -> @ast::expr;
fn lit_uint(&self, span: span, i: uint) -> @ast::expr;
fn lambda0(&self, blk: ast::blk) -> @ast::expr;
fn lambda1(&self, blk: ast::blk, ident: ast::ident) -> @ast::expr;
fn blk(&self, span: span, stmts: ~[@ast::stmt]) -> ast::blk;
fn expr_blk(&self, expr: @ast::expr) -> ast::blk;
fn expr_path(&self, span: span, strs: ~[ast::ident]) -> @ast::expr;
fn expr_path_global(&self, span: span, strs: ~[ast::ident]) -> @ast::expr;
fn expr_var(&self, span: span, var: &str) -> @ast::expr;
fn expr_self(&self, span: span) -> @ast::expr;
fn expr_field(&self, span: span, expr: @ast::expr, ident: ast::ident)
-> @ast::expr;
fn expr_call(&self, span: span, expr: @ast::expr, args: ~[@ast::expr])
-> @ast::expr;
fn expr_method_call(&self,
span: span,
expr: @ast::expr,
ident: ast::ident,
args: ~[@ast::expr])
-> @ast::expr;
fn lambda_expr_0(&self, expr: @ast::expr) -> @ast::expr;
fn lambda_expr_1(&self, expr: @ast::expr, ident: ast::ident)
-> @ast::expr;
fn lambda_stmts_0(&self, span: span, stmts: ~[@ast::stmt]) -> @ast::expr;
fn lambda_stmts_1(&self,
span: span,
stmts: ~[@ast::stmt],
ident: ast::ident)
-> @ast::expr;
}
impl ExtCtxtMethods for @ext_ctxt {
fn bind_path(
&self,
_span: span,
ident: ast::ident,
path: @ast::Path,
bounds: @OptVec<ast::TyParamBound>
) -> ast::TyParam {
let bound = ast::TraitTyParamBound(@ast::trait_ref {
ref_id: self.next_id(),
path: path
});
ast::TyParam {
ident: ident,
id: self.next_id(),
bounds: @bounds.prepend(bound)
}
}
fn expr(&self, span: span, node: ast::expr_) -> @ast::expr {
@ast::expr {
id: self.next_id(),
callee_id: self.next_id(),
node: node,
span: span,
}
}
fn path(&self, span: span, strs: ~[ast::ident]) -> @ast::Path {
@ast::Path {
span: span,
global: false,
idents: strs,
rp: None,
types: ~[]
}
}
fn path_global(&self, span: span, strs: ~[ast::ident]) -> @ast::Path {
@ast::Path {
span: span,
global: true,
idents: strs,
rp: None,
types: ~[]
}
}
fn path_tps(
&self,
span: span,
strs: ~[ast::ident],
tps: ~[@ast::Ty]
) -> @ast::Path {
@ast::Path {
span: span,
global: false,
idents: strs,
rp: None,
types: tps
}
}
fn path_tps_global(
&self,
span: span,
strs: ~[ast::ident],
tps: ~[@ast::Ty]
) -> @ast::Path {
@ast::Path {
span: span,
global: true,
idents: strs,
rp: None,
types: tps
}
}
fn ty_path(
&self,
span: span,
strs: ~[ast::ident],
tps: ~[@ast::Ty]
) -> @ast::Ty {
@ast::Ty {
id: self.next_id(),
node: ast::ty_path(
self.path_tps(span, strs, tps),
self.next_id()),
span: span,
}
}
fn binder_pat(&self, span: span, nm: ast::ident) -> @ast::pat {
@ast::pat {
id: self.next_id(),
node: ast::pat_ident(
ast::bind_by_ref(ast::m_imm),
self.path(span, ~[nm]),
None),
span: span,
}
}
fn stmt(&self, expr: @ast::expr) -> @ast::stmt {
@codemap::spanned { node: ast::stmt_semi(expr, self.next_id()),
span: expr.span }
}
fn lit_str(&self, span: span, s: @~str) -> @ast::expr {
self.expr(
span,
ast::expr_vstore(
self.expr(
span,
ast::expr_lit(
@codemap::spanned { node: ast::lit_str(s),
span: span})),
ast::expr_vstore_uniq))
}
fn lit_uint(&self, span: span, i: uint) -> @ast::expr {
self.expr(
span,
ast::expr_lit(
@codemap::spanned { node: ast::lit_uint(i as u64, ast::ty_u),
span: span}))
}
fn lambda0(&self, blk: ast::blk) -> @ast::expr {
let ext_cx = *self;
let blk_e = self.expr(copy blk.span, ast::expr_block(copy blk));
quote_expr!( || $blk_e )
}
fn lambda1(&self, blk: ast::blk, ident: ast::ident) -> @ast::expr {
let ext_cx = *self;
let blk_e = self.expr(copy blk.span, ast::expr_block(copy blk));
quote_expr!( |$ident| $blk_e )
}
fn blk(&self, span: span, stmts: ~[@ast::stmt]) -> ast::blk {
codemap::spanned {
node: ast::blk_ {
view_items: ~[],
stmts: stmts,
expr: None,
id: self.next_id(),
rules: ast::default_blk,
},
span: span,
}
}
fn expr_blk(&self, expr: @ast::expr) -> ast::blk {
codemap::spanned {
node: ast::blk_ {
view_items: ~[],
stmts: ~[],
expr: Some(expr),
id: self.next_id(),
rules: ast::default_blk,
},
span: expr.span,
}
}
fn expr_path(&self, span: span, strs: ~[ast::ident]) -> @ast::expr {
self.expr(span, ast::expr_path(self.path(span, strs)))
}
fn expr_path_global(
&self,
span: span,
strs: ~[ast::ident]
) -> @ast::expr {
self.expr(span, ast::expr_path(self.path_global(span, strs)))
}
fn expr_var(&self, span: span, var: &str) -> @ast::expr {
self.expr_path(span, ~[self.ident_of(var)])
}
fn expr_self(&self, span: span) -> @ast::expr {
self.expr(span, ast::expr_self)
}
fn expr_field(
&self,
span: span,
expr: @ast::expr,
ident: ast::ident
) -> @ast::expr {
self.expr(span, ast::expr_field(expr, ident, ~[]))
}
fn expr_call(
&self,
span: span,
expr: @ast::expr,
args: ~[@ast::expr]
) -> @ast::expr {
self.expr(span, ast::expr_call(expr, args, ast::NoSugar))
}
fn expr_method_call(
&self,
span: span,
expr: @ast::expr,
ident: ast::ident,
args: ~[@ast::expr]
) -> @ast::expr {
self.expr(span,
ast::expr_method_call(expr, ident, ~[], args, ast::NoSugar))
}
fn lambda_expr_0(&self, expr: @ast::expr) -> @ast::expr {
self.lambda0(self.expr_blk(expr))
}
fn lambda_expr_1(&self, expr: @ast::expr, ident: ast::ident)
-> @ast::expr {
self.lambda1(self.expr_blk(expr), ident)
}
fn lambda_stmts_0(&self, span: span, stmts: ~[@ast::stmt]) -> @ast::expr {
self.lambda0(self.blk(span, stmts))
}
fn lambda_stmts_1(&self,
span: span,
stmts: ~[@ast::stmt],
ident: ast::ident)
-> @ast::expr {
self.lambda1(self.blk(span, stmts), ident)
}
}

View File

@ -8,6 +8,11 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
/*!
The compiler code necessary for #[deriving(Decodable)]. See
encodable.rs for more.
*/
use ast;
use ast::*;
use ext::base::ext_ctxt;

View File

@ -8,6 +8,74 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
/*!
The compiler code necessary to implement the #[deriving(Encodable)]
(and Decodable, in decodable.rs) extension. The idea here is that
type-defining items may be tagged with #[deriving(Encodable,
Decodable)].
For example, a type like:
#[deriving(Encodable, Decodable)]
struct Node {id: uint}
would generate two implementations like:
impl<S:std::serialize::Encoder> Encodable<S> for Node {
fn encode(&self, s: &S) {
do s.emit_struct("Node", 1) {
s.emit_field("id", 0, || s.emit_uint(self.id))
}
}
}
impl<D:Decoder> Decodable for node_id {
fn decode(d: &D) -> Node {
do d.read_struct("Node", 1) {
Node {
id: d.read_field(~"x", 0, || decode(d))
}
}
}
}
Other interesting scenarios are whe the item has type parameters or
references other non-built-in types. A type definition like:
#[deriving(Encodable, Decodable)]
struct spanned<T> {node: T, span: span}
would yield functions like:
impl<
S: Encoder,
T: Encodable<S>
> spanned<T>: Encodable<S> {
fn encode<S:Encoder>(s: &S) {
do s.emit_rec {
s.emit_field("node", 0, || self.node.encode(s));
s.emit_field("span", 1, || self.span.encode(s));
}
}
}
impl<
D: Decoder,
T: Decodable<D>
> spanned<T>: Decodable<D> {
fn decode(d: &D) -> spanned<T> {
do d.read_rec {
{
node: d.read_field(~"node", 0, || decode(d)),
span: d.read_field(~"span", 1, || decode(d)),
}
}
}
}
*/
use ast;
use ast::*;
use ext::base::ext_ctxt;
@ -403,3 +471,247 @@ fn expand_deriving_encodable_enum_method(
// Create the method.
create_encode_method(cx, span, ~[stmt])
}
#[cfg(test)]
mod test {
extern mod std;
use core::option::{None, Some};
use std::serialize::Encodable;
use std::serialize::Encoder;
// just adding the ones I want to test, for now:
#[deriving(Eq)]
pub enum call {
CallToEmitEnum(~str),
CallToEmitEnumVariant(~str, uint, uint),
CallToEmitEnumVariantArg(uint),
CallToEmitUint(uint),
CallToEmitNil,
CallToEmitStruct(~str,uint),
CallToEmitField(~str,uint),
CallToEmitOption,
CallToEmitOptionNone,
CallToEmitOptionSome,
// all of the ones I was too lazy to handle:
CallToOther
}
// using `@mut` rather than changing the
// type of self in every method of every encoder everywhere.
pub struct TestEncoder {call_log : @mut ~[call]}
pub impl TestEncoder {
// these self's should be &mut self's, as well....
fn add_to_log (&self, c : call) {
self.call_log.push(copy c);
}
fn add_unknown_to_log (&self) {
self.add_to_log (CallToOther)
}
}
impl Encoder for TestEncoder {
fn emit_nil(&mut self) { self.add_to_log(CallToEmitNil) }
fn emit_uint(&mut self, v: uint) {
self.add_to_log(CallToEmitUint(v));
}
fn emit_u64(&mut self, _v: u64) { self.add_unknown_to_log(); }
fn emit_u32(&mut self, _v: u32) { self.add_unknown_to_log(); }
fn emit_u16(&mut self, _v: u16) { self.add_unknown_to_log(); }
fn emit_u8(&mut self, _v: u8) { self.add_unknown_to_log(); }
fn emit_int(&mut self, _v: int) { self.add_unknown_to_log(); }
fn emit_i64(&mut self, _v: i64) { self.add_unknown_to_log(); }
fn emit_i32(&mut self, _v: i32) { self.add_unknown_to_log(); }
fn emit_i16(&mut self, _v: i16) { self.add_unknown_to_log(); }
fn emit_i8(&mut self, _v: i8) { self.add_unknown_to_log(); }
fn emit_bool(&mut self, _v: bool) { self.add_unknown_to_log(); }
fn emit_f64(&mut self, _v: f64) { self.add_unknown_to_log(); }
fn emit_f32(&mut self, _v: f32) { self.add_unknown_to_log(); }
fn emit_float(&mut self, _v: float) { self.add_unknown_to_log(); }
fn emit_char(&mut self, _v: char) { self.add_unknown_to_log(); }
fn emit_str(&mut self, _v: &str) { self.add_unknown_to_log(); }
fn emit_enum(&mut self, name: &str, f: &fn(&mut TestEncoder)) {
self.add_to_log(CallToEmitEnum(name.to_str()));
f(self);
}
fn emit_enum_variant(&mut self,
name: &str,
id: uint,
cnt: uint,
f: &fn(&mut TestEncoder)) {
self.add_to_log(CallToEmitEnumVariant(name.to_str(), id, cnt));
f(self);
}
fn emit_enum_variant_arg(&mut self,
idx: uint,
f: &fn(&mut TestEncoder)) {
self.add_to_log(CallToEmitEnumVariantArg(idx));
f(self);
}
fn emit_enum_struct_variant(&mut self,
name: &str,
id: uint,
cnt: uint,
f: &fn(&mut TestEncoder)) {
self.emit_enum_variant(name, id, cnt, f)
}
fn emit_enum_struct_variant_field(&mut self,
_name: &str,
idx: uint,
f: &fn(&mut TestEncoder)) {
self.emit_enum_variant_arg(idx, f)
}
fn emit_struct(&mut self,
name: &str,
len: uint,
f: &fn(&mut TestEncoder)) {
self.add_to_log(CallToEmitStruct (name.to_str(),len));
f(self);
}
fn emit_struct_field(&mut self,
name: &str,
idx: uint,
f: &fn(&mut TestEncoder)) {
self.add_to_log(CallToEmitField (name.to_str(),idx));
f(self);
}
fn emit_tuple(&mut self, _len: uint, f: &fn(&mut TestEncoder)) {
self.add_unknown_to_log();
f(self);
}
fn emit_tuple_arg(&mut self, _idx: uint, f: &fn(&mut TestEncoder)) {
self.add_unknown_to_log();
f(self);
}
fn emit_tuple_struct(&mut self,
_name: &str,
_len: uint,
f: &fn(&mut TestEncoder)) {
self.add_unknown_to_log();
f(self);
}
fn emit_tuple_struct_arg(&mut self,
_idx: uint,
f: &fn(&mut TestEncoder)) {
self.add_unknown_to_log();
f(self);
}
fn emit_option(&mut self, f: &fn(&mut TestEncoder)) {
self.add_to_log(CallToEmitOption);
f(self);
}
fn emit_option_none(&mut self) {
self.add_to_log(CallToEmitOptionNone);
}
fn emit_option_some(&mut self, f: &fn(&mut TestEncoder)) {
self.add_to_log(CallToEmitOptionSome);
f(self);
}
fn emit_seq(&mut self, _len: uint, f: &fn(&mut TestEncoder)) {
self.add_unknown_to_log();
f(self);
}
fn emit_seq_elt(&mut self, _idx: uint, f: &fn(&mut TestEncoder)) {
self.add_unknown_to_log();
f(self);
}
fn emit_map(&mut self, _len: uint, f: &fn(&mut TestEncoder)) {
self.add_unknown_to_log();
f(self);
}
fn emit_map_elt_key(&mut self, _idx: uint, f: &fn(&mut TestEncoder)) {
self.add_unknown_to_log();
f(self);
}
fn emit_map_elt_val(&mut self, _idx: uint, f: &fn(&mut TestEncoder)) {
self.add_unknown_to_log();
f(self);
}
}
fn to_call_log<E:Encodable<TestEncoder>>(val: E) -> ~[call] {
let mut te = TestEncoder {
call_log: @mut ~[]
};
val.encode(&mut te);
copy *te.call_log
}
#[deriving(Encodable)]
enum Written {
Book(uint,uint),
Magazine(~str)
}
#[test]
fn test_encode_enum() {
assert_eq!(
to_call_log(Book(34,44)),
~[
CallToEmitEnum(~"Written"),
CallToEmitEnumVariant(~"Book",0,2),
CallToEmitEnumVariantArg(0),
CallToEmitUint(34),
CallToEmitEnumVariantArg(1),
CallToEmitUint(44),
]
);
}
pub struct BPos(uint);
#[deriving(Encodable)]
pub struct HasPos { pos : BPos }
#[test]
fn test_encode_newtype() {
assert_eq!(
to_call_log(HasPos { pos:BPos(48) }),
~[
CallToEmitStruct(~"HasPos",1),
CallToEmitField(~"pos",0),
CallToEmitUint(48),
]
);
}
#[test]
fn test_encode_option() {
let mut v = None;
assert_eq!(
to_call_log(v),
~[
CallToEmitOption,
CallToEmitOptionNone,
]
);
v = Some(54u);
assert_eq!(
to_call_log(v),
~[
CallToEmitOption,
CallToEmitOptionSome,
CallToEmitUint(54)
]
);
}
}

View File

@ -8,8 +8,15 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
/// The compiler code necessary to implement the #[deriving(Eq)] and
/// #[deriving(IterBytes)] extensions.
/*!
The compiler code necessary to implement the #[deriving] extensions.
FIXME (#2810)--Hygiene. Search for "__" strings (in other files too).
We also assume "std" is the standard library, and "core" is the core
library.
*/
use ast;
use ast::{Ty, enum_def, expr, ident, item, Generics, meta_item, struct_def};
@ -203,8 +210,6 @@ pub fn create_derived_impl(cx: @ext_ctxt,
*
* where B1, B2, ... are the bounds given by `bounds_paths`.
*
* FIXME(#5090): Remove code duplication between this and the
* code in auto_encode.rs
*/
// Copy the lifetimes

View File

@ -20,8 +20,7 @@ use core::prelude::*;
use core::old_iter;
use core::old_iter::BaseIter;
#[auto_encode]
#[auto_decode]
#[deriving(Encodable, Decodable)]
pub enum OptVec<T> {
Empty,
Vec(~[T])

View File

@ -18,9 +18,7 @@ use core::cmp::Equiv;
use core::hashmap::HashSet;
use core::to_bytes;
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Encodable, Decodable, Eq)]
pub enum binop {
PLUS,
MINUS,
@ -34,9 +32,7 @@ pub enum binop {
SHR,
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Encodable, Decodable, Eq)]
pub enum Token {
/* Expression-operator symbols. */
EQ,
@ -97,9 +93,7 @@ pub enum Token {
EOF,
}
#[auto_encode]
#[auto_decode]
#[deriving(Eq)]
#[deriving(Encodable, Decodable, Eq)]
/// For interpolation during macro expansion.
pub enum nonterminal {
nt_item(@ast::item),

View File

@ -0,0 +1,15 @@
// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#[auto_encode] //~ ERROR: `#[auto_encode]` is deprecated
#[auto_decode] //~ ERROR: `#[auto_decode]` is deprecated
struct A;
fn main() {}