Skip to content

Commit 2a60229

Browse files
committed
rustdoc: Clean up handling of lifetime bounds
Previously, rustdoc recorded lifetime bounds by rendering them into the name of the lifetime parameter. Now, it leaves the name as the actual name and instead records lifetime bounds in an `outlives` list, similar to how type parameter bounds are recorded.
1 parent 50171c3 commit 2a60229

File tree

8 files changed

+51
-35
lines changed

8 files changed

+51
-35
lines changed

src/librustdoc/clean/auto_trait.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -331,9 +331,10 @@ impl<'a, 'tcx> AutoTraitFinder<'a, 'tcx> {
331331
match br {
332332
// We only care about named late bound regions, as we need to add them
333333
// to the 'for<>' section
334-
ty::BrNamed(_, name) => {
335-
Some(GenericParamDef { name, kind: GenericParamDefKind::Lifetime })
336-
}
334+
ty::BrNamed(_, name) => Some(GenericParamDef {
335+
name,
336+
kind: GenericParamDefKind::Lifetime { outlives: vec![] },
337+
}),
337338
_ => None,
338339
}
339340
})
@@ -659,7 +660,7 @@ impl<'a, 'tcx> AutoTraitFinder<'a, 'tcx> {
659660
bounds.insert(0, GenericBound::maybe_sized(self.cx));
660661
}
661662
}
662-
GenericParamDefKind::Lifetime => {}
663+
GenericParamDefKind::Lifetime { .. } => {}
663664
GenericParamDefKind::Const { ref mut default, .. } => {
664665
// We never want something like `impl<const N: usize = 10>`
665666
default.take();

src/librustdoc/clean/mod.rs

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -199,9 +199,10 @@ impl Clean<GenericBound> for (ty::PolyTraitRef<'_>, &[TypeBinding]) {
199199
.collect_referenced_late_bound_regions(&poly_trait_ref)
200200
.into_iter()
201201
.filter_map(|br| match br {
202-
ty::BrNamed(_, name) => {
203-
Some(GenericParamDef { name, kind: GenericParamDefKind::Lifetime })
204-
}
202+
ty::BrNamed(_, name) => Some(GenericParamDef {
203+
name,
204+
kind: GenericParamDefKind::Lifetime { outlives: vec![] },
205+
}),
205206
_ => None,
206207
})
207208
.collect();
@@ -412,7 +413,9 @@ impl<'tcx> Clean<Type> for ty::ProjectionTy<'tcx> {
412413
impl Clean<GenericParamDef> for ty::GenericParamDef {
413414
fn clean(&self, cx: &mut DocContext<'_>) -> GenericParamDef {
414415
let (name, kind) = match self.kind {
415-
ty::GenericParamDefKind::Lifetime => (self.name, GenericParamDefKind::Lifetime),
416+
ty::GenericParamDefKind::Lifetime => {
417+
(self.name, GenericParamDefKind::Lifetime { outlives: vec![] })
418+
}
416419
ty::GenericParamDefKind::Type { has_default, synthetic, .. } => {
417420
let default = if has_default {
418421
let mut default = cx.tcx.type_of(self.def_id).clean(cx);
@@ -462,21 +465,15 @@ impl Clean<GenericParamDef> for hir::GenericParam<'_> {
462465
fn clean(&self, cx: &mut DocContext<'_>) -> GenericParamDef {
463466
let (name, kind) = match self.kind {
464467
hir::GenericParamKind::Lifetime { .. } => {
465-
let name = if !self.bounds.is_empty() {
466-
let mut bounds = self.bounds.iter().map(|bound| match bound {
467-
hir::GenericBound::Outlives(lt) => lt,
468+
let outlives = self
469+
.bounds
470+
.iter()
471+
.map(|bound| match bound {
472+
hir::GenericBound::Outlives(lt) => lt.clean(cx),
468473
_ => panic!(),
469-
});
470-
let name = bounds.next().expect("no more bounds").name.ident();
471-
let mut s = format!("{}: {}", self.name.ident(), name);
472-
for bound in bounds {
473-
s.push_str(&format!(" + {}", bound.name.ident()));
474-
}
475-
Symbol::intern(&s)
476-
} else {
477-
self.name.ident().name
478-
};
479-
(name, GenericParamDefKind::Lifetime)
474+
})
475+
.collect();
476+
(self.name.ident().name, GenericParamDefKind::Lifetime { outlives })
480477
}
481478
hir::GenericParamKind::Type { ref default, synthetic } => (
482479
self.name.ident().name,
@@ -536,7 +533,7 @@ impl Clean<Generics> for hir::Generics<'_> {
536533
.map(|param| {
537534
let param: GenericParamDef = param.clean(cx);
538535
match param.kind {
539-
GenericParamDefKind::Lifetime => unreachable!(),
536+
GenericParamDefKind::Lifetime { .. } => unreachable!(),
540537
GenericParamDefKind::Type { did, ref bounds, .. } => {
541538
cx.impl_trait_bounds.insert(did.into(), bounds.clone());
542539
}
@@ -569,7 +566,7 @@ impl Clean<Generics> for hir::Generics<'_> {
569566
{
570567
for param in &mut generics.params {
571568
match param.kind {
572-
GenericParamDefKind::Lifetime => {}
569+
GenericParamDefKind::Lifetime { .. } => {}
573570
GenericParamDefKind::Type { bounds: ref mut ty_bounds, .. } => {
574571
if &param.name == name {
575572
mem::swap(bounds, ty_bounds);

src/librustdoc/clean/types.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1231,7 +1231,9 @@ impl WherePredicate {
12311231

12321232
#[derive(Clone, PartialEq, Eq, Debug, Hash)]
12331233
crate enum GenericParamDefKind {
1234-
Lifetime,
1234+
Lifetime {
1235+
outlives: Vec<Lifetime>,
1236+
},
12351237
Type {
12361238
did: DefId,
12371239
bounds: Vec<GenericBound>,
@@ -1257,7 +1259,7 @@ impl GenericParamDefKind {
12571259
match self {
12581260
GenericParamDefKind::Type { default, .. } => default.clone(),
12591261
GenericParamDefKind::Const { ty, .. } => Some(ty.clone()),
1260-
GenericParamDefKind::Lifetime => None,
1262+
GenericParamDefKind::Lifetime { .. } => None,
12611263
}
12621264
}
12631265
}
@@ -1271,7 +1273,7 @@ crate struct GenericParamDef {
12711273
impl GenericParamDef {
12721274
crate fn is_synthetic_type_param(&self) -> bool {
12731275
match self.kind {
1274-
GenericParamDefKind::Lifetime | GenericParamDefKind::Const { .. } => false,
1276+
GenericParamDefKind::Lifetime { .. } | GenericParamDefKind::Const { .. } => false,
12751277
GenericParamDefKind::Type { ref synthetic, .. } => synthetic.is_some(),
12761278
}
12771279
}

src/librustdoc/html/format.rs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -155,9 +155,23 @@ impl clean::GenericParamDef {
155155
&'a self,
156156
cx: &'a Context<'tcx>,
157157
) -> impl fmt::Display + 'a + Captures<'tcx> {
158-
display_fn(move |f| match self.kind {
159-
clean::GenericParamDefKind::Lifetime => write!(f, "{}", self.name),
160-
clean::GenericParamDefKind::Type { ref bounds, ref default, .. } => {
158+
display_fn(move |f| match &self.kind {
159+
clean::GenericParamDefKind::Lifetime { outlives } => {
160+
write!(f, "{}", self.name)?;
161+
162+
if !outlives.is_empty() {
163+
f.write_str(": ")?;
164+
for (i, lt) in outlives.iter().enumerate() {
165+
if i != 0 {
166+
f.write_str(" + ")?;
167+
}
168+
write!(f, "{}", lt.print())?;
169+
}
170+
}
171+
172+
Ok(())
173+
}
174+
clean::GenericParamDefKind::Type { bounds, default, .. } => {
161175
f.write_str(&*self.name.as_str())?;
162176

163177
if !bounds.is_empty() {
@@ -178,7 +192,7 @@ impl clean::GenericParamDef {
178192

179193
Ok(())
180194
}
181-
clean::GenericParamDefKind::Const { ref ty, ref default, .. } => {
195+
clean::GenericParamDefKind::Const { ty, default, .. } => {
182196
if f.alternate() {
183197
write!(f, "const {}: {:#}", self.name, ty.print(cx))?;
184198
} else {

src/librustdoc/json/conversions.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,9 @@ impl FromWithTcx<clean::GenericParamDefKind> for GenericParamDefKind {
326326
fn from_tcx(kind: clean::GenericParamDefKind, tcx: TyCtxt<'_>) -> Self {
327327
use clean::GenericParamDefKind::*;
328328
match kind {
329-
Lifetime => GenericParamDefKind::Lifetime,
329+
Lifetime { outlives } => GenericParamDefKind::Lifetime {
330+
outlives: outlives.into_iter().map(|lt| lt.0.to_string()).collect(),
331+
},
330332
Type { did: _, bounds, default, synthetic: _ } => GenericParamDefKind::Type {
331333
bounds: bounds.into_iter().map(|x| x.into_tcx(tcx)).collect(),
332334
default: default.map(|x| x.into_tcx(tcx)),

src/librustdoc/json/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ impl<'tcx> FormatRenderer<'tcx> for JsonRenderer<'tcx> {
234234
)
235235
})
236236
.collect(),
237-
format_version: 6,
237+
format_version: 7,
238238
};
239239
let mut p = self.out_path.clone();
240240
p.push(output.index.get(&output.root).unwrap().name.clone().unwrap());

src/rustdoc-json-types/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ pub struct GenericParamDef {
323323
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
324324
#[serde(rename_all = "snake_case")]
325325
pub enum GenericParamDefKind {
326-
Lifetime,
326+
Lifetime { outlives: Vec<String> },
327327
Type { bounds: Vec<GenericBound>, default: Option<Type> },
328328
Const { ty: Type, default: Option<String> },
329329
}

src/test/rustdoc-json/structs/with_primitives.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// @has with_primitives.json "$.index[*][?(@.name=='WithPrimitives')].visibility" \"public\"
22
// @has - "$.index[*][?(@.name=='WithPrimitives')].kind" \"struct\"
33
// @has - "$.index[*][?(@.name=='WithPrimitives')].inner.generics.params[0].name" \"\'a\"
4-
// @has - "$.index[*][?(@.name=='WithPrimitives')].inner.generics.params[0].kind" \"lifetime\"
4+
// @has - "$.index[*][?(@.name=='WithPrimitives')].inner.generics.params[0].kind.lifetime.outlives" []
55
// @has - "$.index[*][?(@.name=='WithPrimitives')].inner.struct_type" \"plain\"
66
// @has - "$.index[*][?(@.name=='WithPrimitives')].inner.fields_stripped" true
77
pub struct WithPrimitives<'a> {

0 commit comments

Comments
 (0)