diff options
| author | Patrick Walton <pcwalton@mimiga.net> | 2014-08-05 19:44:21 -0700 |
|---|---|---|
| committer | Patrick Walton <pcwalton@mimiga.net> | 2014-09-17 16:38:57 -0700 |
| commit | 78a841810eb36e486ba68e6b9fa80e45d805cc4f (patch) | |
| tree | b1c7c6d9c49f84e03b374b5b70cb0c9d0b60a7de /src/librustc/middle/astencode.rs | |
| parent | 8067f4425d245a210c732a0333245fbe83190e89 (diff) | |
| download | rust-78a841810eb36e486ba68e6b9fa80e45d805cc4f.tar.gz rust-78a841810eb36e486ba68e6b9fa80e45d805cc4f.zip | |
librustc: Implement associated types behind a feature gate.
The implementation essentially desugars during type collection and AST type conversion time into the parameter scheme we have now. Only fully qualified names--e.g. `<T as Foo>::Bar`--are supported.
Diffstat (limited to 'src/librustc/middle/astencode.rs')
| -rw-r--r-- | src/librustc/middle/astencode.rs | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/src/librustc/middle/astencode.rs b/src/librustc/middle/astencode.rs index 880445ff38d..399313ddd8e 100644 --- a/src/librustc/middle/astencode.rs +++ b/src/librustc/middle/astencode.rs @@ -83,7 +83,9 @@ pub fn encode_inlined_item(ecx: &e::EncodeContext, e::IIForeignRef(i) => i.id, e::IITraitItemRef(_, &ast::ProvidedMethod(ref m)) => m.id, e::IITraitItemRef(_, &ast::RequiredMethod(ref m)) => m.id, - e::IIImplItemRef(_, &ast::MethodImplItem(ref m)) => m.id + e::IITraitItemRef(_, &ast::TypeTraitItem(ref ti)) => ti.id, + e::IIImplItemRef(_, &ast::MethodImplItem(ref m)) => m.id, + e::IIImplItemRef(_, &ast::TypeImplItem(ref ti)) => ti.id, }; debug!("> Encoding inlined item: {} ({})", ecx.tcx.map.path_to_string(id), @@ -155,12 +157,14 @@ pub fn decode_inlined_item<'tcx>(cdata: &cstore::crate_metadata, ast::IITraitItem(_, ref ti) => { match *ti { ast::ProvidedMethod(ref m) => m.pe_ident(), - ast::RequiredMethod(ref ty_m) => ty_m.ident + ast::RequiredMethod(ref ty_m) => ty_m.ident, + ast::TypeTraitItem(ref ti) => ti.ident, } }, ast::IIImplItem(_, ref m) => { match *m { - ast::MethodImplItem(ref m) => m.pe_ident() + ast::MethodImplItem(ref m) => m.pe_ident(), + ast::TypeImplItem(ref ti) => ti.ident, } } }; @@ -392,6 +396,12 @@ fn simplify_ast(ii: e::InlinedItemRef) -> ast::InlinedItem { ast::RequiredMethod( fold::noop_fold_type_method(ty_m.clone(), &mut fld)) } + ast::TypeTraitItem(ref associated_type) => { + ast::TypeTraitItem( + P(fold::noop_fold_associated_type( + (**associated_type).clone(), + &mut fld))) + } }) } e::IIImplItemRef(d, m) => { @@ -402,6 +412,10 @@ fn simplify_ast(ii: e::InlinedItemRef) -> ast::InlinedItem { .expect_one("noop_fold_method must produce \ exactly one method")) } + ast::TypeImplItem(ref td) => { + ast::TypeImplItem( + P(fold::noop_fold_typedef((**td).clone(), &mut fld))) + } }) } e::IIForeignRef(i) => { @@ -455,6 +469,7 @@ impl tr for def::Def { }, def::DefTrait(did) => def::DefTrait(did.tr(dcx)), def::DefTy(did, is_enum) => def::DefTy(did.tr(dcx), is_enum), + def::DefAssociatedTy(did) => def::DefAssociatedTy(did.tr(dcx)), def::DefPrimTy(p) => def::DefPrimTy(p), def::DefTyParam(s, did, v) => def::DefTyParam(s, did.tr(dcx), v), def::DefBinding(nid, bm) => def::DefBinding(dcx.tr_id(nid), bm), |
