From 5965af701090591edad308e9877d72bbe2221b48 Mon Sep 17 00:00:00 2001 From: León Orell Valerian Liehr Date: Wed, 2 Nov 2022 15:10:36 +0100 Subject: rustdoc: render late-bound lifetimes in generic parameter list of cross-crate functions and methods --- src/librustdoc/clean/inline.rs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'src/librustdoc/clean/inline.rs') diff --git a/src/librustdoc/clean/inline.rs b/src/librustdoc/clean/inline.rs index 841c4f9d530..bfbe143c202 100644 --- a/src/librustdoc/clean/inline.rs +++ b/src/librustdoc/clean/inline.rs @@ -243,10 +243,22 @@ pub(crate) fn build_external_trait(cx: &mut DocContext<'_>, did: DefId) -> clean fn build_external_function<'tcx>(cx: &mut DocContext<'tcx>, did: DefId) -> Box { let sig = cx.tcx.fn_sig(did); - let predicates = cx.tcx.predicates_of(did); + let late_bound_regions = sig.bound_vars().into_iter().filter_map(|var| match var { + ty::BoundVariableKind::Region(ty::BrNamed(_, name)) if name != kw::UnderscoreLifetime => { + Some(clean::GenericParamDef { + name, + kind: clean::GenericParamDefKind::Lifetime { outlives: Vec::new() }, + }) + } + _ => None, + }); + + let predicates = cx.tcx.explicit_predicates_of(did); let (generics, decl) = clean::enter_impl_trait(cx, |cx| { // NOTE: generics need to be cleaned before the decl! - let generics = clean_ty_generics(cx, cx.tcx.generics_of(did), predicates); + let mut generics = clean_ty_generics(cx, cx.tcx.generics_of(did), predicates); + // FIXME: This does not place parameters in source order (late-bound ones come last) + generics.params.extend(late_bound_regions); let decl = clean_fn_decl_from_did_and_sig(cx, Some(did), sig); (generics, decl) }); -- cgit 1.4.1-3-g733a5 From 5ccaed212e111e0850a764c1c090261c0c431413 Mon Sep 17 00:00:00 2001 From: León Orell Valerian Liehr Date: Wed, 2 Nov 2022 15:56:28 +0100 Subject: rustdoc: create helper `GenericParamDef::lifetime` --- src/librustdoc/clean/auto_trait.rs | 5 +---- src/librustdoc/clean/inline.rs | 5 +---- src/librustdoc/clean/mod.rs | 22 ++++++---------------- src/librustdoc/clean/simplify.rs | 5 +---- src/librustdoc/clean/types.rs | 4 ++++ 5 files changed, 13 insertions(+), 28 deletions(-) (limited to 'src/librustdoc/clean/inline.rs') diff --git a/src/librustdoc/clean/auto_trait.rs b/src/librustdoc/clean/auto_trait.rs index 84e77e69ecf..85bd8446640 100644 --- a/src/librustdoc/clean/auto_trait.rs +++ b/src/librustdoc/clean/auto_trait.rs @@ -336,10 +336,7 @@ where match br { // We only care about named late bound regions, as we need to add them // to the 'for<>' section - ty::BrNamed(_, name) => Some(GenericParamDef { - name, - kind: GenericParamDefKind::Lifetime { outlives: vec![] }, - }), + ty::BrNamed(_, name) => Some(GenericParamDef::lifetime(name)), _ => None, } }) diff --git a/src/librustdoc/clean/inline.rs b/src/librustdoc/clean/inline.rs index bfbe143c202..8a5463c10f2 100644 --- a/src/librustdoc/clean/inline.rs +++ b/src/librustdoc/clean/inline.rs @@ -245,10 +245,7 @@ fn build_external_function<'tcx>(cx: &mut DocContext<'tcx>, did: DefId) -> Box { - Some(clean::GenericParamDef { - name, - kind: clean::GenericParamDefKind::Lifetime { outlives: Vec::new() }, - }) + Some(clean::GenericParamDef::lifetime(name)) } _ => None, }); diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs index d9947e59bf8..a83a57bfec3 100644 --- a/src/librustdoc/clean/mod.rs +++ b/src/librustdoc/clean/mod.rs @@ -182,10 +182,9 @@ fn clean_poly_trait_ref_with_bindings<'tcx>( .collect_referenced_late_bound_regions(&poly_trait_ref) .into_iter() .filter_map(|br| match br { - ty::BrNamed(_, name) if name != kw::UnderscoreLifetime => Some(GenericParamDef { - name, - kind: GenericParamDefKind::Lifetime { outlives: vec![] }, - }), + ty::BrNamed(_, name) if name != kw::UnderscoreLifetime => { + Some(GenericParamDef::lifetime(name)) + } _ => None, }) .collect(); @@ -741,10 +740,7 @@ fn clean_ty_generics<'tcx>( p.get_bound_params() .into_iter() .flatten() - .map(|param| GenericParamDef { - name: param.0, - kind: GenericParamDefKind::Lifetime { outlives: Vec::new() }, - }) + .map(|param| GenericParamDef::lifetime(param.0)) .collect(), )); } @@ -1156,10 +1152,7 @@ pub(crate) fn clean_middle_assoc_item<'tcx>( ty::BoundVariableKind::Region(ty::BrNamed(_, name)) if name != kw::UnderscoreLifetime => { - Some(GenericParamDef { - name, - kind: GenericParamDefKind::Lifetime { outlives: Vec::new() }, - }) + Some(GenericParamDef::lifetime(name)) } _ => None, }); @@ -1720,10 +1713,7 @@ pub(crate) fn clean_middle_ty<'tcx>( ty::BoundVariableKind::Region(ty::BrNamed(_, name)) if name != kw::UnderscoreLifetime => { - Some(GenericParamDef { - name, - kind: GenericParamDefKind::Lifetime { outlives: vec![] }, - }) + Some(GenericParamDef::lifetime(name)) } _ => None, }) diff --git a/src/librustdoc/clean/simplify.rs b/src/librustdoc/clean/simplify.rs index cd9dab1b1d5..7d97d2994e4 100644 --- a/src/librustdoc/clean/simplify.rs +++ b/src/librustdoc/clean/simplify.rs @@ -51,10 +51,7 @@ pub(crate) fn where_clauses(cx: &DocContext<'_>, clauses: Vec) -> ThinVec Self { + Self { name, kind: GenericParamDefKind::Lifetime { outlives: Vec::new() } } + } + pub(crate) fn is_synthetic_type_param(&self) -> bool { match self.kind { GenericParamDefKind::Lifetime { .. } | GenericParamDefKind::Const { .. } => false, -- cgit 1.4.1-3-g733a5