Move top-level Clean impl to function

This allows us to pass it a `&mut DocContext` which will allow removal
of RefCells, etc. in the following commits. It's also somewhat a unique
Clean impl in that it previously ignored `self` (re-retriveing
hir::Crate), which it no longer needs to do.
This commit is contained in:
Mark Rousskov 2019-08-12 07:10:55 -04:00
parent a77247acb1
commit e2b6f4c662
2 changed files with 78 additions and 82 deletions

View File

@ -136,94 +136,90 @@ pub struct Crate {
pub collapsed: bool, pub collapsed: bool,
} }
impl Clean<Crate> for hir::Crate { pub fn krate(cx: &mut DocContext<'a>) -> Crate {
// note that self here is ignored in favor of `cx.tcx.hir().krate()` since use crate::visit_lib::LibEmbargoVisitor;
// that gets around tying self's lifetime to the '_ in cx.
fn clean(&self, cx: &DocContext<'_>) -> Crate {
use crate::visit_lib::LibEmbargoVisitor;
let v = crate::visit_ast::RustdocVisitor::new(&cx); let v = crate::visit_ast::RustdocVisitor::new(&cx);
let module = v.visit(cx.tcx.hir().krate()); let module = v.visit(cx.tcx.hir().krate());
{ {
let mut r = cx.renderinfo.borrow_mut(); let mut r = cx.renderinfo.borrow_mut();
r.deref_trait_did = cx.tcx.lang_items().deref_trait(); r.deref_trait_did = cx.tcx.lang_items().deref_trait();
r.deref_mut_trait_did = cx.tcx.lang_items().deref_mut_trait(); r.deref_mut_trait_did = cx.tcx.lang_items().deref_mut_trait();
r.owned_box_did = cx.tcx.lang_items().owned_box(); r.owned_box_did = cx.tcx.lang_items().owned_box();
} }
let mut externs = Vec::new(); let mut externs = Vec::new();
for &cnum in cx.tcx.crates().iter() { for &cnum in cx.tcx.crates().iter() {
externs.push((cnum, cnum.clean(cx))); externs.push((cnum, cnum.clean(cx)));
// Analyze doc-reachability for extern items // Analyze doc-reachability for extern items
LibEmbargoVisitor::new(cx).visit_lib(cnum); LibEmbargoVisitor::new(cx).visit_lib(cnum);
} }
externs.sort_by(|&(a, _), &(b, _)| a.cmp(&b)); externs.sort_by(|&(a, _), &(b, _)| a.cmp(&b));
// Clean the crate, translating the entire libsyntax AST to one that is // Clean the crate, translating the entire libsyntax AST to one that is
// understood by rustdoc. // understood by rustdoc.
let mut module = module.clean(cx); let mut module = module.clean(cx);
let mut masked_crates = FxHashSet::default(); let mut masked_crates = FxHashSet::default();
match module.inner { match module.inner {
ModuleItem(ref module) => { ModuleItem(ref module) => {
for it in &module.items { for it in &module.items {
// `compiler_builtins` should be masked too, but we can't apply // `compiler_builtins` should be masked too, but we can't apply
// `#[doc(masked)]` to the injected `extern crate` because it's unstable. // `#[doc(masked)]` to the injected `extern crate` because it's unstable.
if it.is_extern_crate() if it.is_extern_crate()
&& (it.attrs.has_doc_flag(sym::masked) && (it.attrs.has_doc_flag(sym::masked)
|| cx.tcx.is_compiler_builtins(it.def_id.krate)) || cx.tcx.is_compiler_builtins(it.def_id.krate))
{ {
masked_crates.insert(it.def_id.krate); masked_crates.insert(it.def_id.krate);
}
} }
} }
}
_ => unreachable!(),
}
let ExternalCrate { name, src, primitives, keywords, .. } = LOCAL_CRATE.clean(cx);
{
let m = match module.inner {
ModuleItem(ref mut m) => m,
_ => unreachable!(), _ => unreachable!(),
} };
m.items.extend(primitives.iter().map(|&(def_id, prim, ref attrs)| {
Item {
source: Span::empty(),
name: Some(prim.to_url_str().to_string()),
attrs: attrs.clone(),
visibility: Some(Public),
stability: get_stability(cx, def_id),
deprecation: get_deprecation(cx, def_id),
def_id,
inner: PrimitiveItem(prim),
}
}));
m.items.extend(keywords.into_iter().map(|(def_id, kw, attrs)| {
Item {
source: Span::empty(),
name: Some(kw.clone()),
attrs: attrs,
visibility: Some(Public),
stability: get_stability(cx, def_id),
deprecation: get_deprecation(cx, def_id),
def_id,
inner: KeywordItem(kw),
}
}));
}
let ExternalCrate { name, src, primitives, keywords, .. } = LOCAL_CRATE.clean(cx); Crate {
{ name,
let m = match module.inner { version: None,
ModuleItem(ref mut m) => m, src,
_ => unreachable!(), module: Some(module),
}; externs,
m.items.extend(primitives.iter().map(|&(def_id, prim, ref attrs)| { primitives,
Item { external_traits: cx.external_traits.clone(),
source: Span::empty(), masked_crates,
name: Some(prim.to_url_str().to_string()), collapsed: false,
attrs: attrs.clone(),
visibility: Some(Public),
stability: get_stability(cx, def_id),
deprecation: get_deprecation(cx, def_id),
def_id,
inner: PrimitiveItem(prim),
}
}));
m.items.extend(keywords.into_iter().map(|(def_id, kw, attrs)| {
Item {
source: Span::empty(),
name: Some(kw.clone()),
attrs: attrs,
visibility: Some(Public),
stability: get_stability(cx, def_id),
deprecation: get_deprecation(cx, def_id),
def_id,
inner: KeywordItem(kw),
}
}));
}
Crate {
name,
version: None,
src,
module: Some(module),
externs,
primitives,
external_traits: cx.external_traits.clone(),
masked_crates,
collapsed: false,
}
} }
} }

View File

@ -30,7 +30,7 @@ use std::rc::Rc;
use crate::config::{Options as RustdocOptions, RenderOptions}; use crate::config::{Options as RustdocOptions, RenderOptions};
use crate::clean; use crate::clean;
use crate::clean::{Clean, MAX_DEF_ID, AttributesExt}; use crate::clean::{MAX_DEF_ID, AttributesExt};
use crate::html::render::RenderInfo; use crate::html::render::RenderInfo;
use crate::passes; use crate::passes;
@ -363,7 +363,7 @@ pub fn run_core(options: RustdocOptions) -> (clean::Crate, RenderInfo, RenderOpt
let mut renderinfo = RenderInfo::default(); let mut renderinfo = RenderInfo::default();
renderinfo.access_levels = access_levels; renderinfo.access_levels = access_levels;
let ctxt = DocContext { let mut ctxt = DocContext {
tcx, tcx,
resolver, resolver,
cstore: compiler.cstore().clone(), cstore: compiler.cstore().clone(),
@ -383,7 +383,7 @@ pub fn run_core(options: RustdocOptions) -> (clean::Crate, RenderInfo, RenderOpt
}; };
debug!("crate: {:?}", tcx.hir().krate()); debug!("crate: {:?}", tcx.hir().krate());
let mut krate = tcx.hir().krate().clean(&ctxt); let mut krate = clean::krate(&mut ctxt);
fn report_deprecated_attr(name: &str, diag: &errors::Handler) { fn report_deprecated_attr(name: &str, diag: &errors::Handler) {
let mut msg = diag.struct_warn(&format!("the `#![doc({})]` attribute is \ let mut msg = diag.struct_warn(&format!("the `#![doc({})]` attribute is \