Skip to content

Commit

Permalink
Auto merge of rust-lang#132886 - fmease:rustdoc-perf-clean-middle-arg…
Browse files Browse the repository at this point in the history
…s, r=<try>

[perf] rustdoc: Perform less work when cleaning parenthesized generic args

CC rust-lang#132697. I presume the perf regression it caused (if real) boils down to query invocation overhead (namely, of `def_kind` & `trait_def`). I won't address that because it would worsen the clean middle API. So I'm simply trying to attack some low-hanging fruits in the vicinity.

r? ghost
  • Loading branch information
bors committed Nov 11, 2024
2 parents 143ce09 + e51bfa6 commit 66ae3a1
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 24 deletions.
4 changes: 2 additions & 2 deletions src/librustdoc/clean/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2119,7 +2119,7 @@ pub(crate) fn clean_middle_ty<'tcx>(
})
.collect::<Vec<_>>();

let bindings = obj
let constraints = obj
.projection_bounds()
.map(|pb| AssocItemConstraint {
assoc: projection_to_path_segment(
Expand Down Expand Up @@ -2155,7 +2155,7 @@ pub(crate) fn clean_middle_ty<'tcx>(
.collect();
let late_bound_regions = late_bound_regions.into_iter().collect();

let path = clean_middle_path(cx, did, false, bindings, args);
let path = clean_middle_path(cx, did, false, constraints, args);
bounds.insert(0, PolyTrait { trait_: path, generic_params: late_bound_regions });

DynTrait(bounds, lifetime)
Expand Down
38 changes: 16 additions & 22 deletions src/librustdoc/clean/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,6 @@ pub(crate) fn clean_middle_generic_args<'tcx>(
return None;
}

// Elide internal host effect args.
let param = generics.param_at(index, cx.tcx);
let arg = ty::Binder::bind_with_vars(arg, bound_vars);

Expand Down Expand Up @@ -201,35 +200,30 @@ fn clean_middle_generic_args_with_constraints<'tcx>(
cx: &mut DocContext<'tcx>,
did: DefId,
has_self: bool,
constraints: ThinVec<AssocItemConstraint>,
mut constraints: ThinVec<AssocItemConstraint>,
ty_args: ty::Binder<'tcx, GenericArgsRef<'tcx>>,
) -> GenericArgs {
let args = clean_middle_generic_args(cx, ty_args.map_bound(|args| &args[..]), has_self, did);

if cx.tcx.is_trait(did) && cx.tcx.trait_def(did).paren_sugar {
let ty = ty_args
if cx.tcx.is_trait(did)
&& cx.tcx.trait_def(did).paren_sugar
&& let ty::Tuple(tys) = ty_args.skip_binder().type_at(has_self as usize).kind()
{
let inputs = tys
.iter()
.nth(if has_self { 1 } else { 0 })
.unwrap()
.map_bound(|arg| arg.expect_ty());
let inputs =
// The trait's first substitution is the one after self, if there is one.
match ty.skip_binder().kind() {
ty::Tuple(tys) => tys.iter().map(|t| clean_middle_ty(ty.rebind(t), cx, None, None)).collect::<Vec<_>>().into(),
_ => return GenericArgs::AngleBracketed { args: args.into(), constraints },
};
let output = constraints.into_iter().next().and_then(|binding| match binding.kind {
AssocItemConstraintKind::Equality { term: Term::Type(ty) }
if ty != Type::Tuple(Vec::new()) =>
{
.map(|ty| clean_middle_ty(ty_args.rebind(ty), cx, None, None))
.collect::<Vec<_>>()
.into();
let output = constraints.pop().and_then(|constraint| match constraint.kind {
AssocItemConstraintKind::Equality { term: Term::Type(ty) } if !ty.is_unit() => {
Some(Box::new(ty))
}
_ => None,
});
GenericArgs::Parenthesized { inputs, output }
} else {
GenericArgs::AngleBracketed { args: args.into(), constraints }
return GenericArgs::Parenthesized { inputs, output };
}

let args = clean_middle_generic_args(cx, ty_args.map_bound(|args| &args[..]), has_self, did);

GenericArgs::AngleBracketed { args: args.into(), constraints }
}

pub(super) fn clean_middle_path<'tcx>(
Expand Down

0 comments on commit 66ae3a1

Please sign in to comment.