X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Flibrustdoc%2Fcore.rs;h=1813367f789a12068713f245d0d5fa3565a6a623;hb=7958166300cc92da90b95a8c13cbf8f469832485;hp=d79c47bbe3de652fe804204259b91df3d63ff977;hpb=0c25d154bd5b48819f490ac4a630f28fcfe4d321;p=rust.git diff --git a/src/librustdoc/core.rs b/src/librustdoc/core.rs index d79c47bbe3d..1813367f789 100644 --- a/src/librustdoc/core.rs +++ b/src/librustdoc/core.rs @@ -26,12 +26,10 @@ use std::mem; use std::rc::Rc; -use std::{ - cell::{Cell, RefCell}, - collections::hash_map::Entry, -}; +use std::{cell::RefCell, collections::hash_map::Entry}; use crate::clean; +use crate::clean::inline::build_external_trait; use crate::clean::{AttributesExt, MAX_DEF_IDX}; use crate::config::{Options as RustdocOptions, RenderOptions}; use crate::config::{OutputFormat, RenderInfo}; @@ -48,7 +46,7 @@ /// Used for normalization. /// /// Most of this logic is copied from rustc_lint::late. - crate param_env: Cell>, + crate param_env: ParamEnv<'tcx>, /// Later on moved into `cache` crate renderinfo: RefCell, /// Later on moved through `clean::Crate` into `cache` @@ -83,14 +81,14 @@ } impl<'tcx> DocContext<'tcx> { - crate fn sess(&self) -> &Session { + crate fn sess(&self) -> &'tcx Session { &self.tcx.sess } - crate fn with_param_env T>(&self, def_id: DefId, f: F) -> T { - let old_param_env = self.param_env.replace(self.tcx.param_env(def_id)); - let ret = f(); - self.param_env.set(old_param_env); + crate fn with_param_env T>(&mut self, def_id: DefId, f: F) -> T { + let old_param_env = mem::replace(&mut self.param_env, self.tcx.param_env(def_id)); + let ret = f(self); + self.param_env = old_param_env; ret } @@ -104,24 +102,24 @@ impl<'tcx> DocContext<'tcx> { /// Call the closure with the given parameters set as /// the substitutions for a type alias' RHS. crate fn enter_alias( - &self, + &mut self, ty_substs: FxHashMap, lt_substs: FxHashMap, ct_substs: FxHashMap, f: F, ) -> R where - F: FnOnce() -> R, + F: FnOnce(&mut Self) -> R, { let (old_tys, old_lts, old_cts) = ( - mem::replace(&mut *self.ty_substs.borrow_mut(), ty_substs), - mem::replace(&mut *self.lt_substs.borrow_mut(), lt_substs), - mem::replace(&mut *self.ct_substs.borrow_mut(), ct_substs), + mem::replace(&mut *self.ty_substs.get_mut(), ty_substs), + mem::replace(&mut *self.lt_substs.get_mut(), lt_substs), + mem::replace(&mut *self.ct_substs.get_mut(), ct_substs), ); - let r = f(); - *self.ty_substs.borrow_mut() = old_tys; - *self.lt_substs.borrow_mut() = old_lts; - *self.ct_substs.borrow_mut() = old_cts; + let r = f(self); + *self.ty_substs.get_mut() = old_tys; + *self.lt_substs.get_mut() = old_lts; + *self.ct_substs.get_mut() = old_cts; r } @@ -161,7 +159,7 @@ impl<'tcx> DocContext<'tcx> { } Entry::Occupied(e) => e.into_mut(), }; - *def_index = DefIndex::from(*def_index + 1); + *def_index = *def_index + 1; DefId { krate: crate_num, index: *def_index } } @@ -510,7 +508,7 @@ pub(crate) fn init_lints( let mut ctxt = DocContext { tcx, resolver, - param_env: Cell::new(ParamEnv::empty()), + param_env: ParamEnv::empty(), external_traits: Default::default(), active_extern_traits: Default::default(), renderinfo: RefCell::new(renderinfo), @@ -530,6 +528,16 @@ pub(crate) fn init_lints( module_trait_cache: RefCell::new(FxHashMap::default()), cache: Cache::default(), }; + + // Small hack to force the Sized trait to be present. + // + // Note that in case of `#![no_core]`, the trait is not available. + if let Some(sized_trait_did) = ctxt.tcx.lang_items().sized_trait() { + let mut sized_trait = build_external_trait(&mut ctxt, sized_trait_did); + sized_trait.is_auto = true; + ctxt.external_traits.borrow_mut().insert(sized_trait_did, sized_trait); + } + debug!("crate: {:?}", tcx.hir().krate()); let mut krate = tcx.sess.time("clean_crate", || clean::krate(&mut ctxt)); @@ -627,7 +635,7 @@ fn report_deprecated_attr(name: &str, diag: &rustc_errors::Handler) { }; if run { debug!("running pass {}", p.pass.name); - krate = ctxt.tcx.sess.time(p.pass.name, || (p.pass.run)(krate, &ctxt)); + krate = ctxt.tcx.sess.time(p.pass.name, || (p.pass.run)(krate, &mut ctxt)); } }