Skip to content

Commit b3af37a

Browse files
authored
Rollup merge of #88810 - camelid:cleanup-pt1, r=jyn514
rustdoc: Cleanup `clean` part 1 Split out from #88379. These commits are completely independent of each other, and each is a fairly small change (the last few are new commits; they are not from #88379): - Remove unnecessary `Cache.*_did` fields - rustdoc: Get symbol for `TyParam` directly - Create a valid `Res` in `external_path()` - Remove unused `hir_id` parameter from `resolve_type` - Fix redundant arguments in `external_path()` - Remove unnecessary `is_trait` argument - rustdoc: Cleanup a pattern match in `external_generic_args()` r? ``@jyn514``
2 parents b87d0d0 + 280fc2d commit b3af37a

File tree

6 files changed

+59
-84
lines changed

6 files changed

+59
-84
lines changed

Diff for: src/librustdoc/clean/mod.rs

+10-26
Original file line numberDiff line numberDiff line change
@@ -164,14 +164,7 @@ impl Clean<Type> for (ty::TraitRef<'_>, &[TypeBinding]) {
164164
);
165165
}
166166
inline::record_extern_fqn(cx, trait_ref.def_id, kind);
167-
let path = external_path(
168-
cx,
169-
cx.tcx.item_name(trait_ref.def_id),
170-
Some(trait_ref.def_id),
171-
true,
172-
bounds.to_vec(),
173-
trait_ref.substs,
174-
);
167+
let path = external_path(cx, trait_ref.def_id, true, bounds.to_vec(), trait_ref.substs);
175168

176169
debug!("ty::TraitRef\n subst: {:?}\n", trait_ref.substs);
177170

@@ -906,7 +899,7 @@ impl Clean<bool> for hir::IsAuto {
906899
impl Clean<Type> for hir::TraitRef<'_> {
907900
fn clean(&self, cx: &mut DocContext<'_>) -> Type {
908901
let path = self.path.clean(cx);
909-
resolve_type(cx, path, self.hir_ref_id)
902+
resolve_type(cx, path)
910903
}
911904
}
912905

@@ -1164,7 +1157,7 @@ impl Clean<Item> for ty::AssocItem {
11641157

11651158
fn clean_qpath(hir_ty: &hir::Ty<'_>, cx: &mut DocContext<'_>) -> Type {
11661159
use rustc_hir::GenericParamCount;
1167-
let hir::Ty { hir_id, span, ref kind } = *hir_ty;
1160+
let hir::Ty { hir_id: _, span, ref kind } = *hir_ty;
11681161
let qpath = match kind {
11691162
hir::TyKind::Path(qpath) => qpath,
11701163
_ => unreachable!(),
@@ -1271,7 +1264,7 @@ fn clean_qpath(hir_ty: &hir::Ty<'_>, cx: &mut DocContext<'_>) -> Type {
12711264
return cx.enter_alias(ty_substs, lt_substs, ct_substs, |cx| ty.clean(cx));
12721265
}
12731266
let path = path.clean(cx);
1274-
resolve_type(cx, path, hir_id)
1267+
resolve_type(cx, path)
12751268
}
12761269
hir::QPath::Resolved(Some(ref qself), ref p) => {
12771270
// Try to normalize `<X as Y>::T` to a type
@@ -1292,7 +1285,7 @@ fn clean_qpath(hir_ty: &hir::Ty<'_>, cx: &mut DocContext<'_>) -> Type {
12921285
name: p.segments.last().expect("segments were empty").ident.name,
12931286
self_def_id: Some(DefId::local(qself.hir_id.owner.local_def_index)),
12941287
self_type: Box::new(qself.clean(cx)),
1295-
trait_: Box::new(resolve_type(cx, trait_path, hir_id)),
1288+
trait_: Box::new(resolve_type(cx, trait_path)),
12961289
}
12971290
}
12981291
hir::QPath::TypeRelative(ref qself, ref segment) => {
@@ -1308,7 +1301,7 @@ fn clean_qpath(hir_ty: &hir::Ty<'_>, cx: &mut DocContext<'_>) -> Type {
13081301
name: segment.ident.name,
13091302
self_def_id: res.opt_def_id(),
13101303
self_type: Box::new(qself.clean(cx)),
1311-
trait_: Box::new(resolve_type(cx, trait_path, hir_id)),
1304+
trait_: Box::new(resolve_type(cx, trait_path)),
13121305
}
13131306
}
13141307
hir::QPath::LangItem(..) => bug!("clean: requiring documentation of lang item"),
@@ -1448,19 +1441,12 @@ impl<'tcx> Clean<Type> for Ty<'tcx> {
14481441
AdtKind::Enum => ItemType::Enum,
14491442
};
14501443
inline::record_extern_fqn(cx, did, kind);
1451-
let path = external_path(cx, cx.tcx.item_name(did), None, false, vec![], substs);
1444+
let path = external_path(cx, did, false, vec![], substs);
14521445
ResolvedPath { path, did, is_generic: false }
14531446
}
14541447
ty::Foreign(did) => {
14551448
inline::record_extern_fqn(cx, did, ItemType::ForeignType);
1456-
let path = external_path(
1457-
cx,
1458-
cx.tcx.item_name(did),
1459-
None,
1460-
false,
1461-
vec![],
1462-
InternalSubsts::empty(),
1463-
);
1449+
let path = external_path(cx, did, false, vec![], InternalSubsts::empty());
14641450
ResolvedPath { path, did, is_generic: false }
14651451
}
14661452
ty::Dynamic(ref obj, ref reg) => {
@@ -1484,8 +1470,7 @@ impl<'tcx> Clean<Type> for Ty<'tcx> {
14841470

14851471
for did in dids {
14861472
let empty = cx.tcx.intern_substs(&[]);
1487-
let path =
1488-
external_path(cx, cx.tcx.item_name(did), Some(did), false, vec![], empty);
1473+
let path = external_path(cx, did, false, vec![], empty);
14891474
inline::record_extern_fqn(cx, did, ItemType::Trait);
14901475
let bound = PolyTrait {
14911476
trait_: ResolvedPath { path, did, is_generic: false },
@@ -1502,8 +1487,7 @@ impl<'tcx> Clean<Type> for Ty<'tcx> {
15021487
});
15031488
}
15041489

1505-
let path =
1506-
external_path(cx, cx.tcx.item_name(did), Some(did), false, bindings, substs);
1490+
let path = external_path(cx, did, false, bindings, substs);
15071491
bounds.insert(
15081492
0,
15091493
PolyTrait {

Diff for: src/librustdoc/clean/types.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1111,7 +1111,7 @@ impl GenericBound {
11111111
crate fn maybe_sized(cx: &mut DocContext<'_>) -> GenericBound {
11121112
let did = cx.tcx.require_lang_item(LangItem::Sized, None);
11131113
let empty = cx.tcx.intern_substs(&[]);
1114-
let path = external_path(cx, cx.tcx.item_name(did), Some(did), false, vec![], empty);
1114+
let path = external_path(cx, did, false, vec![], empty);
11151115
inline::record_extern_fqn(cx, did, ItemType::Trait);
11161116
GenericBound::TraitBound(
11171117
PolyTrait {

Diff for: src/librustdoc/clean/utils.rs

+23-31
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,6 @@ crate fn krate(cx: &mut DocContext<'_>) -> Crate {
2929
let krate = cx.tcx.hir().krate();
3030
let module = crate::visit_ast::RustdocVisitor::new(cx).visit(krate);
3131

32-
cx.cache.deref_trait_did = cx.tcx.lang_items().deref_trait();
33-
cx.cache.deref_mut_trait_did = cx.tcx.lang_items().deref_mut_trait();
34-
cx.cache.owned_box_did = cx.tcx.lang_items().owned_box();
35-
3632
let mut externs = Vec::new();
3733
for &cnum in cx.tcx.crates(()).iter() {
3834
externs.push(ExternalCrate { crate_num: cnum });
@@ -97,7 +93,7 @@ crate fn krate(cx: &mut DocContext<'_>) -> Crate {
9793

9894
fn external_generic_args(
9995
cx: &mut DocContext<'_>,
100-
trait_did: Option<DefId>,
96+
did: DefId,
10197
has_self: bool,
10298
bindings: Vec<TypeBinding>,
10399
substs: SubstsRef<'_>,
@@ -125,42 +121,38 @@ fn external_generic_args(
125121
})
126122
.collect();
127123

128-
match trait_did {
129-
// Attempt to sugar an external path like Fn<(A, B,), C> to Fn(A, B) -> C
130-
Some(did) if cx.tcx.fn_trait_kind_from_lang_item(did).is_some() => {
131-
assert!(ty_kind.is_some());
132-
let inputs = match ty_kind {
133-
Some(ty::Tuple(ref tys)) => tys.iter().map(|t| t.expect_ty().clean(cx)).collect(),
134-
_ => return GenericArgs::AngleBracketed { args, bindings },
135-
};
136-
let output = None;
137-
// FIXME(#20299) return type comes from a projection now
138-
// match types[1].kind {
139-
// ty::Tuple(ref v) if v.is_empty() => None, // -> ()
140-
// _ => Some(types[1].clean(cx))
141-
// };
142-
GenericArgs::Parenthesized { inputs, output }
143-
}
144-
_ => GenericArgs::AngleBracketed { args, bindings },
124+
if cx.tcx.fn_trait_kind_from_lang_item(did).is_some() {
125+
let inputs = match ty_kind.unwrap() {
126+
ty::Tuple(tys) => tys.iter().map(|t| t.expect_ty().clean(cx)).collect(),
127+
_ => return GenericArgs::AngleBracketed { args, bindings },
128+
};
129+
let output = None;
130+
// FIXME(#20299) return type comes from a projection now
131+
// match types[1].kind {
132+
// ty::Tuple(ref v) if v.is_empty() => None, // -> ()
133+
// _ => Some(types[1].clean(cx))
134+
// };
135+
GenericArgs::Parenthesized { inputs, output }
136+
} else {
137+
GenericArgs::AngleBracketed { args, bindings }
145138
}
146139
}
147140

148-
// trait_did should be set to a trait's DefId if called on a TraitRef, in order to sugar
149-
// from Fn<(A, B,), C> to Fn(A, B) -> C
150141
pub(super) fn external_path(
151142
cx: &mut DocContext<'_>,
152-
name: Symbol,
153-
trait_did: Option<DefId>,
143+
did: DefId,
154144
has_self: bool,
155145
bindings: Vec<TypeBinding>,
156146
substs: SubstsRef<'_>,
157147
) -> Path {
148+
let def_kind = cx.tcx.def_kind(did);
149+
let name = cx.tcx.item_name(did);
158150
Path {
159151
global: false,
160-
res: Res::Err,
152+
res: Res::Def(def_kind, did),
161153
segments: vec![PathSegment {
162154
name,
163-
args: external_generic_args(cx, trait_did, has_self, bindings, substs),
155+
args: external_generic_args(cx, did, has_self, bindings, substs),
164156
}],
165157
}
166158
}
@@ -409,16 +401,16 @@ crate fn print_const_expr(tcx: TyCtxt<'_>, body: hir::BodyId) -> String {
409401
}
410402

411403
/// Given a type Path, resolve it to a Type using the TyCtxt
412-
crate fn resolve_type(cx: &mut DocContext<'_>, path: Path, id: hir::HirId) -> Type {
413-
debug!("resolve_type({:?},{:?})", path, id);
404+
crate fn resolve_type(cx: &mut DocContext<'_>, path: Path) -> Type {
405+
debug!("resolve_type({:?})", path);
414406

415407
let is_generic = match path.res {
416408
Res::PrimTy(p) => return Primitive(PrimitiveType::from(p)),
417409
Res::SelfTy(..) if path.segments.len() == 1 => {
418410
return Generic(kw::SelfUpper);
419411
}
420412
Res::Def(DefKind::TyParam, _) if path.segments.len() == 1 => {
421-
return Generic(Symbol::intern(&path.whole_name()));
413+
return Generic(path.segments[0].name);
422414
}
423415
Res::SelfTy(..) | Res::Def(DefKind::TyParam | DefKind::AssocTy, _) => true,
424416
_ => false,

Diff for: src/librustdoc/formats/cache.rs

-3
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,6 @@ crate struct Cache {
9898
stripped_mod: bool,
9999

100100
crate search_index: Vec<IndexItem>,
101-
crate deref_trait_did: Option<DefId>,
102-
crate deref_mut_trait_did: Option<DefId>,
103-
crate owned_box_did: Option<DefId>,
104101

105102
// In rare case where a structure is defined in one module but implemented
106103
// in another, if the implementing module is parsed before defining module,

Diff for: src/librustdoc/html/render/mod.rs

+24-22
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ use rustc_hir::def::CtorKind;
5151
use rustc_hir::def_id::DefId;
5252
use rustc_hir::Mutability;
5353
use rustc_middle::middle::stability;
54+
use rustc_middle::ty::TyCtxt;
5455
use rustc_span::symbol::{kw, sym, Symbol};
5556
use serde::ser::SerializeSeq;
5657
use serde::{Serialize, Serializer};
@@ -1067,13 +1068,13 @@ fn render_assoc_items(
10671068
return;
10681069
}
10691070
if !traits.is_empty() {
1070-
let deref_impl = traits
1071-
.iter()
1072-
.find(|t| t.inner_impl().trait_.def_id_full(cache) == cache.deref_trait_did);
1071+
let deref_impl = traits.iter().find(|t| {
1072+
t.inner_impl().trait_.def_id_full(cache) == cx.tcx().lang_items().deref_trait()
1073+
});
10731074
if let Some(impl_) = deref_impl {
1074-
let has_deref_mut = traits
1075-
.iter()
1076-
.any(|t| t.inner_impl().trait_.def_id_full(cache) == cache.deref_mut_trait_did);
1075+
let has_deref_mut = traits.iter().any(|t| {
1076+
t.inner_impl().trait_.def_id_full(cache) == cx.tcx().lang_items().deref_mut_trait()
1077+
});
10771078
render_deref_methods(w, cx, impl_, containing_item, has_deref_mut);
10781079
}
10791080
let (synthetic, concrete): (Vec<&&Impl>, Vec<&&Impl>) =
@@ -1163,7 +1164,7 @@ fn render_deref_methods(
11631164
}
11641165
}
11651166

1166-
fn should_render_item(item: &clean::Item, deref_mut_: bool, cache: &Cache) -> bool {
1167+
fn should_render_item(item: &clean::Item, deref_mut_: bool, tcx: TyCtxt<'_>) -> bool {
11671168
let self_type_opt = match *item.kind {
11681169
clean::MethodItem(ref method, _) => method.decl.self_type(),
11691170
clean::TyMethodItem(ref method) => method.decl.self_type(),
@@ -1177,7 +1178,7 @@ fn should_render_item(item: &clean::Item, deref_mut_: bool, cache: &Cache) -> bo
11771178
(mutability == Mutability::Mut, false, false)
11781179
}
11791180
SelfTy::SelfExplicit(clean::ResolvedPath { did, .. }) => {
1180-
(false, Some(did) == cache.owned_box_did, false)
1181+
(false, Some(did) == tcx.lang_items().owned_box(), false)
11811182
}
11821183
SelfTy::SelfValue => (false, false, true),
11831184
_ => (false, false, false),
@@ -1300,7 +1301,7 @@ fn render_impl(
13001301
&& match render_mode {
13011302
RenderMode::Normal => true,
13021303
RenderMode::ForDeref { mut_: deref_mut_ } => {
1303-
should_render_item(&item, deref_mut_, cx.cache())
1304+
should_render_item(&item, deref_mut_, cx.tcx())
13041305
}
13051306
};
13061307

@@ -1798,13 +1799,13 @@ fn get_methods(
17981799
for_deref: bool,
17991800
used_links: &mut FxHashSet<String>,
18001801
deref_mut: bool,
1801-
cache: &Cache,
1802+
tcx: TyCtxt<'_>,
18021803
) -> Vec<String> {
18031804
i.items
18041805
.iter()
18051806
.filter_map(|item| match item.name {
18061807
Some(ref name) if !name.is_empty() && item.is_method() => {
1807-
if !for_deref || should_render_item(item, deref_mut, cache) {
1808+
if !for_deref || should_render_item(item, deref_mut, tcx) {
18081809
Some(format!(
18091810
"<a href=\"#{}\">{}</a>",
18101811
get_next_url(used_links, format!("method.{}", name)),
@@ -1866,7 +1867,9 @@ fn sidebar_assoc_items(cx: &Context<'_>, out: &mut Buffer, it: &clean::Item) {
18661867
let mut ret = v
18671868
.iter()
18681869
.filter(|i| i.inner_impl().trait_.is_none())
1869-
.flat_map(move |i| get_methods(i.inner_impl(), false, used_links_bor, false, cache))
1870+
.flat_map(move |i| {
1871+
get_methods(i.inner_impl(), false, used_links_bor, false, cx.tcx())
1872+
})
18701873
.collect::<Vec<_>>();
18711874
if !ret.is_empty() {
18721875
// We want links' order to be reproducible so we don't use unstable sort.
@@ -1884,11 +1887,9 @@ fn sidebar_assoc_items(cx: &Context<'_>, out: &mut Buffer, it: &clean::Item) {
18841887
}
18851888

18861889
if v.iter().any(|i| i.inner_impl().trait_.is_some()) {
1887-
if let Some(impl_) = v
1888-
.iter()
1889-
.filter(|i| i.inner_impl().trait_.is_some())
1890-
.find(|i| i.inner_impl().trait_.def_id_full(cache) == cache.deref_trait_did)
1891-
{
1890+
if let Some(impl_) = v.iter().filter(|i| i.inner_impl().trait_.is_some()).find(|i| {
1891+
i.inner_impl().trait_.def_id_full(cache) == cx.tcx().lang_items().deref_trait()
1892+
}) {
18921893
sidebar_deref_methods(cx, out, impl_, v);
18931894
}
18941895

@@ -1986,10 +1987,9 @@ fn sidebar_deref_methods(cx: &Context<'_>, out: &mut Buffer, impl_: &Impl, v: &V
19861987
}
19871988
}
19881989
}
1989-
let deref_mut = v
1990-
.iter()
1991-
.filter(|i| i.inner_impl().trait_.is_some())
1992-
.any(|i| i.inner_impl().trait_.def_id_full(c) == c.deref_mut_trait_did);
1990+
let deref_mut = v.iter().filter(|i| i.inner_impl().trait_.is_some()).any(|i| {
1991+
i.inner_impl().trait_.def_id_full(c) == cx.tcx().lang_items().deref_mut_trait()
1992+
});
19931993
let inner_impl = target
19941994
.def_id_full(c)
19951995
.or_else(|| {
@@ -2002,7 +2002,9 @@ fn sidebar_deref_methods(cx: &Context<'_>, out: &mut Buffer, impl_: &Impl, v: &V
20022002
let mut ret = impls
20032003
.iter()
20042004
.filter(|i| i.inner_impl().trait_.is_none())
2005-
.flat_map(|i| get_methods(i.inner_impl(), true, &mut used_links, deref_mut, c))
2005+
.flat_map(|i| {
2006+
get_methods(i.inner_impl(), true, &mut used_links, deref_mut, cx.tcx())
2007+
})
20062008
.collect::<Vec<_>>();
20072009
if !ret.is_empty() {
20082010
write!(

Diff for: src/test/rustdoc/synthetic_auto/no-redundancy.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ where
1010

1111
// @has no_redundancy/struct.Outer.html
1212
// @has - '//*[@id="synthetic-implementations-list"]//*[@class="impl has-srclink"]//h3[@class="code-header in-band"]' \
13-
// "impl<T> Send for Outer<T> where T: Copy + Send"
13+
// "impl<T> Send for Outer<T> where T: Send + Copy"
1414
pub struct Outer<T> {
1515
inner_field: Inner<T>,
1616
}

0 commit comments

Comments
 (0)