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:
parent
a77247acb1
commit
e2b6f4c662
|
@ -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,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 \
|
||||||
|
|
Loading…
Reference in New Issue