Skip to content

Commit 9c837c0

Browse files
committed
Return an iterator from enum_variant_ids.
1 parent 243e85f commit 9c837c0

File tree

1 file changed

+26
-8
lines changed

1 file changed

+26
-8
lines changed

src/librustc/metadata/decoder.rs

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -268,10 +268,28 @@ fn item_trait_ref<'tcx>(doc: rbml::Doc, tcx: &ty::ctxt<'tcx>, cdata: Cmd)
268268
doc_trait_ref(tp, tcx, cdata)
269269
}
270270

271-
fn enum_variant_ids(item: rbml::Doc, cdata: Cmd) -> Vec<ast::DefId> {
272-
reader::tagged_docs(item, tag_items_data_item_variant)
273-
.map(|p| translated_def_id(cdata, p))
274-
.collect()
271+
struct EnumVariantIds<'a> {
272+
iter: reader::TaggedDocsIterator<'a>,
273+
cdata: Cmd<'a>,
274+
}
275+
276+
impl<'a> Iterator for EnumVariantIds<'a> {
277+
type Item = ast::DefId;
278+
279+
fn next(&mut self) -> Option<ast::DefId> {
280+
self.iter.next().map(|p| translated_def_id(self.cdata, p))
281+
}
282+
283+
fn size_hint(&self) -> (usize, Option<usize>) {
284+
self.iter.size_hint()
285+
}
286+
}
287+
288+
fn enum_variant_ids<'a>(item: rbml::Doc<'a>, cdata: Cmd<'a>) -> EnumVariantIds<'a> {
289+
EnumVariantIds {
290+
iter: reader::tagged_docs(item, tag_items_data_item_variant),
291+
cdata: cdata,
292+
}
275293
}
276294

277295
fn item_path(item_doc: rbml::Doc) -> Vec<ast_map::PathElem> {
@@ -719,11 +737,11 @@ pub fn get_enum_variant_defs(intr: &IdentInterner,
719737
let data = cdata.data();
720738
let items = reader::get_doc(rbml::Doc::new(data), tag_items);
721739
let item = find_item(id, items);
722-
enum_variant_ids(item, cdata).iter().map(|did| {
740+
enum_variant_ids(item, cdata).map(|did| {
723741
let item = find_item(did.node, items);
724742
let name = item_name(intr, item);
725743
let visibility = item_visibility(item);
726-
match item_to_def_like(cdata, item, *did) {
744+
match item_to_def_like(cdata, item, did) {
727745
DlDef(def @ def::DefVariant(..)) => (def, name, visibility),
728746
_ => unreachable!()
729747
}
@@ -736,7 +754,7 @@ pub fn get_enum_variants<'tcx>(intr: Rc<IdentInterner>, cdata: Cmd, id: ast::Nod
736754
let items = reader::get_doc(rbml::Doc::new(data), tag_items);
737755
let item = find_item(id, items);
738756
let mut disr_val = 0;
739-
enum_variant_ids(item, cdata).iter().map(|did| {
757+
enum_variant_ids(item, cdata).map(|did| {
740758
let item = find_item(did.node, items);
741759
let ctor_ty = item_type(ast::DefId { krate: cdata.cnum, node: id},
742760
item, tcx, cdata);
@@ -771,7 +789,7 @@ pub fn get_enum_variants<'tcx>(intr: Rc<IdentInterner>, cdata: Cmd, id: ast::Nod
771789
name: name,
772790
// I'm not even sure if we encode visibility
773791
// for variants -- TEST -- tjc
774-
id: *did,
792+
id: did,
775793
disr_val: old_disr_val,
776794
vis: ast::Inherited
777795
})

0 commit comments

Comments
 (0)