about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2015-06-02 20:05:49 +0000
committerbors <bors@rust-lang.org>2015-06-02 20:05:49 +0000
commitdc1e79b3c215ac71285f468ed4e7715528e7e9f4 (patch)
tree6fa425a4e5a2c987f4f179b681d92bc7578058c5 /src
parentcc85db4ce6b8f6a6b0cf7cbd6811b385e3b2a1d7 (diff)
parent9c837c0450b60c6e84d6c343613d3505352007d7 (diff)
downloadrust-dc1e79b3c215ac71285f468ed4e7715528e7e9f4.tar.gz
rust-dc1e79b3c215ac71285f468ed4e7715528e7e9f4.zip
Auto merge of #25926 - Ms2ger:enum_variant_ids, r=alexcrichton
Diffstat (limited to 'src')
-rw-r--r--src/librustc/metadata/decoder.rs34
1 files changed, 26 insertions, 8 deletions
diff --git a/src/librustc/metadata/decoder.rs b/src/librustc/metadata/decoder.rs
index 30886c84fd4..be285d975b8 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<ast::DefId> {
-    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<ast::DefId> {
+        self.iter.next().map(|p| translated_def_id(self.cdata, p))
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        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<ast_map::PathElem> {
@@ -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<IdentInterner>, 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<IdentInterner>, 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
         })