From ab92ea526d455b402efbccc7160c8aec0237c88f Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Mon, 28 Apr 2014 20:36:08 -0700 Subject: std: Modernize the local_data api This commit brings the local_data api up to modern rust standards with a few key improvements: * The `pop` and `set` methods have been combined into one method, `replace` * The `get_mut` method has been removed. All interior mutability should be done through `RefCell`. * All functionality is now exposed as a method on the keys themselves. Instead of importing std::local_data, you now use "key.replace()" and "key.get()". * All closures have been removed in favor of RAII functionality. This means that get() and get_mut() no long require closures, but rather return Option where the smart pointer takes care of relinquishing the borrow and also implements the necessary Deref traits * The modify() function was removed to cut the local_data interface down to its bare essentials (similarly to how RefCell removed set/get). [breaking-change] --- src/librustdoc/html/render.rs | 154 ++++++++++++++++++++---------------------- 1 file changed, 72 insertions(+), 82 deletions(-) (limited to 'src/librustdoc/html/render.rs') diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs index a0d21bbf149..fe80d26d109 100644 --- a/src/librustdoc/html/render.rs +++ b/src/librustdoc/html/render.rs @@ -37,7 +37,6 @@ use collections::{HashMap, HashSet}; use std::fmt; use std::io::{fs, File, BufferedWriter, MemWriter, BufferedReader}; use std::io; -use std::local_data; use std::str; use std::strbuf::StrBuf; @@ -243,24 +242,22 @@ pub fn run(mut krate: clean::Crate, dst: Path) -> io::IoResult<()> { } // Crawl the crate to build various caches used for the output - let mut cache = local_data::get(::analysiskey, |analysis| { - let public_items = analysis.map(|a| a.public_items.clone()); - let public_items = public_items.unwrap_or(NodeSet::new()); - Cache { - impls: HashMap::new(), - typarams: HashMap::new(), - paths: HashMap::new(), - traits: HashMap::new(), - implementors: HashMap::new(), - stack: Vec::new(), - parent_stack: Vec::new(), - search_index: Vec::new(), - extern_locations: HashMap::new(), - privmod: false, - public_items: public_items, - orphan_methods: Vec::new(), - } - }); + let public_items = ::analysiskey.get().map(|a| a.public_items.clone()); + let public_items = public_items.unwrap_or(NodeSet::new()); + let mut cache = Cache { + impls: HashMap::new(), + typarams: HashMap::new(), + paths: HashMap::new(), + traits: HashMap::new(), + implementors: HashMap::new(), + stack: Vec::new(), + parent_stack: Vec::new(), + search_index: Vec::new(), + extern_locations: HashMap::new(), + privmod: false, + public_items: public_items, + orphan_methods: Vec::new(), + }; cache.stack.push(krate.name.clone()); krate = cache.fold_crate(krate); @@ -833,7 +830,7 @@ impl Context { item.name = Some(krate.name); // using a rwarc makes this parallelizable in the future - local_data::set(cache_key, Arc::new(cache)); + cache_key.replace(Some(Arc::new(cache))); let mut work = vec!((self, item)); loop { @@ -859,7 +856,7 @@ impl Context { info!("Rendering an item to {}", w.path().display()); // A little unfortunate that this is done like this, but it sure // does make formatting *a lot* nicer. - local_data::set(current_location_key, cx.current.clone()); + current_location_key.replace(Some(cx.current.clone())); let mut title = StrBuf::from_str(cx.current.connect("::")); if pushname { @@ -1299,31 +1296,28 @@ fn item_trait(w: &mut Writer, it: &clean::Item, try!(write!(w, "")); } - local_data::get(cache_key, |cache| { - let cache = cache.unwrap(); - match cache.implementors.find(&it.id) { - Some(implementors) => { - try!(write!(w, " -

Implementors

- ")); } - Ok(()) - }) + None => {} + } + Ok(()) } fn render_method(w: &mut Writer, meth: &clean::Item) -> fmt::Result { @@ -1550,51 +1544,48 @@ fn render_struct(w: &mut Writer, it: &clean::Item, } fn render_methods(w: &mut Writer, it: &clean::Item) -> fmt::Result { - local_data::get(cache_key, |cache| { - let c = cache.unwrap(); - match c.impls.find(&it.id) { - Some(v) => { - let mut non_trait = v.iter().filter(|p| { - p.ref0().trait_.is_none() - }); - let non_trait = non_trait.collect::)>>(); - let mut traits = v.iter().filter(|p| { - p.ref0().trait_.is_some() - }); - let traits = traits.collect::)>>(); - - if non_trait.len() > 0 { - try!(write!(w, "

Methods

")); - for &(ref i, ref dox) in non_trait.move_iter() { + match cache_key.get().unwrap().impls.find(&it.id) { + Some(v) => { + let mut non_trait = v.iter().filter(|p| { + p.ref0().trait_.is_none() + }); + let non_trait = non_trait.collect::)>>(); + let mut traits = v.iter().filter(|p| { + p.ref0().trait_.is_some() + }); + let traits = traits.collect::)>>(); + + if non_trait.len() > 0 { + try!(write!(w, "

Methods

")); + for &(ref i, ref dox) in non_trait.move_iter() { + try!(render_impl(w, i, dox)); + } + } + if traits.len() > 0 { + try!(write!(w, "

Trait \ + Implementations

")); + let mut any_derived = false; + for & &(ref i, ref dox) in traits.iter() { + if !i.derived { try!(render_impl(w, i, dox)); + } else { + any_derived = true; } } - if traits.len() > 0 { - try!(write!(w, "

Trait \ - Implementations

")); - let mut any_derived = false; - for & &(ref i, ref dox) in traits.iter() { - if !i.derived { + if any_derived { + try!(write!(w, "

Derived Implementations \ +

")); + for &(ref i, ref dox) in traits.move_iter() { + if i.derived { try!(render_impl(w, i, dox)); - } else { - any_derived = true; - } - } - if any_derived { - try!(write!(w, "

Derived Implementations \ -

")); - for &(ref i, ref dox) in traits.move_iter() { - if i.derived { - try!(render_impl(w, i, dox)); - } } } } } - None => {} } - Ok(()) - }) + None => {} + } + Ok(()) } fn render_impl(w: &mut Writer, i: &clean::Impl, @@ -1644,9 +1635,8 @@ fn render_impl(w: &mut Writer, i: &clean::Impl, match trait_id { None => {} Some(id) => { - try!(local_data::get(cache_key, |cache| { - let cache = cache.unwrap(); - match cache.traits.find(&id) { + try!({ + match cache_key.get().unwrap().traits.find(&id) { Some(t) => { for method in t.methods.iter() { let n = method.item().name.clone(); @@ -1661,7 +1651,7 @@ fn render_impl(w: &mut Writer, i: &clean::Impl, None => {} } Ok(()) - })) + }) } } try!(write!(w, "")); -- cgit 1.4.1-3-g733a5