diff options
| author | Ariel Ben-Yehuda <arielb1@mail.tau.ac.il> | 2015-05-26 17:12:39 +0300 |
|---|---|---|
| committer | Ariel Ben-Yehuda <arielb1@mail.tau.ac.il> | 2015-05-26 17:22:29 +0300 |
| commit | ae10e478eb61e75ebf3a7bf672b34b582555fd8e (patch) | |
| tree | b4fb3e99356b26a885cc53d73f6924d7bc45c25e /src/librustc/metadata | |
| parent | c654a07d29c77b5a023cb9d36dfc61811349f64e (diff) | |
Implement defaults for associated types
Diffstat (limited to 'src/librustc/metadata')
| -rw-r--r-- | src/librustc/metadata/decoder.rs | 35 | ||||
| -rw-r--r-- | src/librustc/metadata/encoder.rs | 23 |
2 files changed, 36 insertions, 22 deletions
diff --git a/src/librustc/metadata/decoder.rs b/src/librustc/metadata/decoder.rs index 42dcc9661ca..5eefb99b058 100644 --- a/src/librustc/metadata/decoder.rs +++ b/src/librustc/metadata/decoder.rs @@ -252,6 +252,13 @@ fn doc_type<'tcx>(doc: rbml::Doc, tcx: &ty::ctxt<'tcx>, cdata: Cmd) -> Ty<'tcx> |_, did| translate_def_id(cdata, did)) } +fn maybe_doc_type<'tcx>(doc: rbml::Doc, tcx: &ty::ctxt<'tcx>, cdata: Cmd) -> Option<Ty<'tcx>> { + reader::maybe_get_doc(doc, tag_items_data_item_type).map(|tp| { + parse_ty_data(tp.data, cdata.cnum, tp.start, tcx, + |_, did| translate_def_id(cdata, did)) + }) +} + fn doc_method_fty<'tcx>(doc: rbml::Doc, tcx: &ty::ctxt<'tcx>, cdata: Cmd) -> ty::BareFnTy<'tcx> { let tp = reader::get_doc(doc, tag_item_method_fty); @@ -875,24 +882,24 @@ pub fn get_impl_or_trait_item<'tcx>(intr: Rc<IdentInterner>, id: ast::NodeId, tcx: &ty::ctxt<'tcx>) -> ty::ImplOrTraitItem<'tcx> { - let method_doc = lookup_item(id, cdata.data()); + let item_doc = lookup_item(id, cdata.data()); - let def_id = item_def_id(method_doc, cdata); + let def_id = item_def_id(item_doc, cdata); - let container_id = item_require_parent_item(cdata, method_doc); + let container_id = item_require_parent_item(cdata, item_doc); let container_doc = lookup_item(container_id.node, cdata.data()); let container = match item_family(container_doc) { Trait => TraitContainer(container_id), _ => ImplContainer(container_id), }; - let name = item_name(&*intr, method_doc); - let vis = item_visibility(method_doc); + let name = item_name(&*intr, item_doc); + let vis = item_visibility(item_doc); - match item_sort(method_doc) { + match item_sort(item_doc) { Some('C') => { - let ty = doc_type(method_doc, tcx, cdata); - let default = get_provided_source(method_doc, cdata); + let ty = doc_type(item_doc, tcx, cdata); + let default = get_provided_source(item_doc, cdata); ty::ConstTraitItem(Rc::new(ty::AssociatedConst { name: name, ty: ty, @@ -903,11 +910,11 @@ pub fn get_impl_or_trait_item<'tcx>(intr: Rc<IdentInterner>, })) } Some('r') | Some('p') => { - let generics = doc_generics(method_doc, tcx, cdata, tag_method_ty_generics); - let predicates = doc_predicates(method_doc, tcx, cdata, tag_method_ty_generics); - let fty = doc_method_fty(method_doc, tcx, cdata); - let explicit_self = get_explicit_self(method_doc); - let provided_source = get_provided_source(method_doc, cdata); + let generics = doc_generics(item_doc, tcx, cdata, tag_method_ty_generics); + let predicates = doc_predicates(item_doc, tcx, cdata, tag_method_ty_generics); + let fty = doc_method_fty(item_doc, tcx, cdata); + let explicit_self = get_explicit_self(item_doc); + let provided_source = get_provided_source(item_doc, cdata); ty::MethodTraitItem(Rc::new(ty::Method::new(name, generics, @@ -920,8 +927,10 @@ pub fn get_impl_or_trait_item<'tcx>(intr: Rc<IdentInterner>, provided_source))) } Some('t') => { + let ty = maybe_doc_type(item_doc, tcx, cdata); ty::TypeTraitItem(Rc::new(ty::AssociatedType { name: name, + ty: ty, vis: vis, def_id: def_id, container: container, diff --git a/src/librustc/metadata/encoder.rs b/src/librustc/metadata/encoder.rs index 0908ffd249f..8eefb4d5011 100644 --- a/src/librustc/metadata/encoder.rs +++ b/src/librustc/metadata/encoder.rs @@ -894,12 +894,12 @@ fn encode_info_for_method<'a, 'tcx>(ecx: &EncodeContext<'a, 'tcx>, rbml_w.end_tag(); } -fn encode_info_for_associated_type(ecx: &EncodeContext, - rbml_w: &mut Encoder, - associated_type: &ty::AssociatedType, - impl_path: PathElems, - parent_id: NodeId, - impl_item_opt: Option<&ast::ImplItem>) { +fn encode_info_for_associated_type<'a, 'tcx>(ecx: &EncodeContext<'a, 'tcx>, + rbml_w: &mut Encoder, + associated_type: &ty::AssociatedType<'tcx>, + impl_path: PathElems, + parent_id: NodeId, + impl_item_opt: Option<&ast::ImplItem>) { debug!("encode_info_for_associated_type({:?},{:?})", associated_type.def_id, token::get_name(associated_type.name)); @@ -913,8 +913,6 @@ fn encode_info_for_associated_type(ecx: &EncodeContext, encode_parent_item(rbml_w, local_def(parent_id)); encode_item_sort(rbml_w, 't'); - encode_bounds_and_type_for_item(rbml_w, ecx, associated_type.def_id.local_id()); - let stab = stability::lookup(ecx.tcx, associated_type.def_id); encode_stability(rbml_w, stab); @@ -923,7 +921,14 @@ fn encode_info_for_associated_type(ecx: &EncodeContext, if let Some(ii) = impl_item_opt { encode_attributes(rbml_w, &ii.attrs); - encode_type(ecx, rbml_w, ty::node_id_to_type(ecx.tcx, ii.id)); + } else { + encode_predicates(rbml_w, ecx, + &ty::lookup_predicates(ecx.tcx, associated_type.def_id), + tag_item_generics); + } + + if let Some(ty) = associated_type.ty { + encode_type(ecx, rbml_w, ty); } rbml_w.end_tag(); |
