about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMs2ger <ms2ger@gmail.com>2015-05-17 18:14:40 +0200
committerMs2ger <ms2ger@gmail.com>2015-05-19 19:31:54 +0200
commitfb7c0b44bb8dd47de07a05d6a17813dd614e3dff (patch)
treeaf7271e5ace18189589b2f7a6ac8a3066dc96053
parentde9deefb22519c2cd2233f517199c127c935250e (diff)
downloadrust-fb7c0b44bb8dd47de07a05d6a17813dd614e3dff.tar.gz
rust-fb7c0b44bb8dd47de07a05d6a17813dd614e3dff.zip
Return the iterator from reader::docs.
-rw-r--r--src/librbml/lib.rs10
-rw-r--r--src/librustc/metadata/decoder.rs17
-rw-r--r--src/librustc/middle/astencode.rs5
3 files changed, 11 insertions, 21 deletions
diff --git a/src/librbml/lib.rs b/src/librbml/lib.rs
index 66fb579b180..65433c528bc 100644
--- a/src/librbml/lib.rs
+++ b/src/librbml/lib.rs
@@ -397,12 +397,10 @@ pub mod reader {
         }
     }
 
-    pub fn docs<F>(d: Doc, mut it: F) -> bool where
-        F: FnMut(usize, Doc) -> bool,
-    {
-        DocsIterator { d: d }.all(|(value, doc)| {
-            it(value, doc)
-        })
+    pub fn docs<'a>(d: Doc<'a>) -> DocsIterator<'a> {
+        DocsIterator {
+            d: d
+        }
     }
 
     pub struct DocsIterator<'a> {
diff --git a/src/librustc/metadata/decoder.rs b/src/librustc/metadata/decoder.rs
index 2f2a5d31c9f..2c11ee8baa9 100644
--- a/src/librustc/metadata/decoder.rs
+++ b/src/librustc/metadata/decoder.rs
@@ -275,25 +275,18 @@ fn enum_variant_ids(item: rbml::Doc, cdata: Cmd) -> Vec<ast::DefId> {
 
 fn item_path(item_doc: rbml::Doc) -> Vec<ast_map::PathElem> {
     let path_doc = reader::get_doc(item_doc, tag_path);
-
-    let len_doc = reader::get_doc(path_doc, tag_path_len);
-    let len = reader::doc_as_u32(len_doc) as usize;
-
-    let mut result = Vec::with_capacity(len);
-    reader::docs(path_doc, |tag, elt_doc| {
+    reader::docs(path_doc).filter_map(|(tag, elt_doc)| {
         if tag == tag_path_elem_mod {
             let s = elt_doc.as_str_slice();
-            result.push(ast_map::PathMod(token::intern(s)));
+            Some(ast_map::PathMod(token::intern(s)))
         } else if tag == tag_path_elem_name {
             let s = elt_doc.as_str_slice();
-            result.push(ast_map::PathName(token::intern(s)));
+            Some(ast_map::PathName(token::intern(s)))
         } else {
             // ignore tag_path_len element
+            None
         }
-        true
-    });
-
-    result
+    }).collect()
 }
 
 fn item_name(intr: &IdentInterner, item: rbml::Doc) -> ast::Name {
diff --git a/src/librustc/middle/astencode.rs b/src/librustc/middle/astencode.rs
index 328972c54e3..894a7db21be 100644
--- a/src/librustc/middle/astencode.rs
+++ b/src/librustc/middle/astencode.rs
@@ -1706,7 +1706,7 @@ impl<'a, 'tcx> rbml_decoder_decoder_helpers<'tcx> for reader::Decoder<'a> {
 fn decode_side_tables(dcx: &DecodeContext,
                       ast_doc: rbml::Doc) {
     let tbl_doc = ast_doc.get(c::tag_table as usize);
-    reader::docs(tbl_doc, |tag, entry_doc| {
+    for (tag, entry_doc) in reader::docs(tbl_doc) {
         let mut entry_dsr = reader::Decoder::new(entry_doc);
         let id0: ast::NodeId = Decodable::decode(&mut entry_dsr).unwrap();
         let id = dcx.tr_id(id0);
@@ -1815,8 +1815,7 @@ fn decode_side_tables(dcx: &DecodeContext,
         }
 
         debug!(">< Side table doc loaded");
-        true
-    });
+    }
 }
 
 // ______________________________________________________________________