diff --git a/src/librustc/metadata/decoder.rs b/src/librustc/metadata/decoder.rs index 30886c84fd440..be285d975b81d 100644 --- a/src/librustc/metadata/decoder.rs +++ b/src/librustc/metadata/decoder.rs @@ -268,10 +268,28 @@ fn item_trait_ref<'tcx>(doc: rbml::Doc, tcx: &ty::ctxt<'tcx>, cdata: Cmd) doc_trait_ref(tp, tcx, cdata) } -fn enum_variant_ids(item: rbml::Doc, cdata: Cmd) -> Vec { - reader::tagged_docs(item, tag_items_data_item_variant) - .map(|p| translated_def_id(cdata, p)) - .collect() +struct EnumVariantIds<'a> { + iter: reader::TaggedDocsIterator<'a>, + cdata: Cmd<'a>, +} + +impl<'a> Iterator for EnumVariantIds<'a> { + type Item = ast::DefId; + + fn next(&mut self) -> Option { + self.iter.next().map(|p| translated_def_id(self.cdata, p)) + } + + fn size_hint(&self) -> (usize, Option) { + self.iter.size_hint() + } +} + +fn enum_variant_ids<'a>(item: rbml::Doc<'a>, cdata: Cmd<'a>) -> EnumVariantIds<'a> { + EnumVariantIds { + iter: reader::tagged_docs(item, tag_items_data_item_variant), + cdata: cdata, + } } fn item_path(item_doc: rbml::Doc) -> Vec { @@ -719,11 +737,11 @@ pub fn get_enum_variant_defs(intr: &IdentInterner, let data = cdata.data(); let items = reader::get_doc(rbml::Doc::new(data), tag_items); let item = find_item(id, items); - enum_variant_ids(item, cdata).iter().map(|did| { + enum_variant_ids(item, cdata).map(|did| { let item = find_item(did.node, items); let name = item_name(intr, item); let visibility = item_visibility(item); - match item_to_def_like(cdata, item, *did) { + match item_to_def_like(cdata, item, did) { DlDef(def @ def::DefVariant(..)) => (def, name, visibility), _ => unreachable!() } @@ -736,7 +754,7 @@ pub fn get_enum_variants<'tcx>(intr: Rc, cdata: Cmd, id: ast::Nod let items = reader::get_doc(rbml::Doc::new(data), tag_items); let item = find_item(id, items); let mut disr_val = 0; - enum_variant_ids(item, cdata).iter().map(|did| { + enum_variant_ids(item, cdata).map(|did| { let item = find_item(did.node, items); let ctor_ty = item_type(ast::DefId { krate: cdata.cnum, node: id}, item, tcx, cdata); @@ -771,7 +789,7 @@ pub fn get_enum_variants<'tcx>(intr: Rc, cdata: Cmd, id: ast::Nod name: name, // I'm not even sure if we encode visibility // for variants -- TEST -- tjc - id: *did, + id: did, disr_val: old_disr_val, vis: ast::Inherited })