Skip to content

Commit ec239b8

Browse files
committed
Auto merge of rust-lang#132886 - fmease:rustdoc-perf-clean-middle-args, r=GuillaumeGomez
[perf] rustdoc: Perform less work when cleaning middle::ty 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` as we don't seem to be decoding more often from the crate metadata. I won't try the obvious and reduce the amount of query calls by threading information via params as that would render the code awkward. So instead I'm simply trying to attack some low-hanging fruits in the vicinity. --- Previously, we would `clean_middle_generic_args` *unconditionally* inside `clean_middle_generic_args_with_constraints` even though we didn't actually use its result for parenthesized generic args (`Trait(...) -> ...`). Now, we only call `clean_middle_generic_args` when necessary. Lastly, I've simplified `clean_middle_generic_args_with_constraints`. --- r? ghost
2 parents 44f233f + 4660316 commit ec239b8

File tree

2 files changed

+19
-25
lines changed

2 files changed

+19
-25
lines changed

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -2119,7 +2119,7 @@ pub(crate) fn clean_middle_ty<'tcx>(
21192119
})
21202120
.collect::<Vec<_>>();
21212121

2122-
let bindings = obj
2122+
let constraints = obj
21232123
.projection_bounds()
21242124
.map(|pb| AssocItemConstraint {
21252125
assoc: projection_to_path_segment(
@@ -2155,7 +2155,7 @@ pub(crate) fn clean_middle_ty<'tcx>(
21552155
.collect();
21562156
let late_bound_regions = late_bound_regions.into_iter().collect();
21572157

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

21612161
DynTrait(bounds, lifetime)

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

+17-23
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,6 @@ pub(crate) fn clean_middle_generic_args<'tcx>(
112112
return None;
113113
}
114114

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

@@ -201,35 +200,30 @@ fn clean_middle_generic_args_with_constraints<'tcx>(
201200
cx: &mut DocContext<'tcx>,
202201
did: DefId,
203202
has_self: bool,
204-
constraints: ThinVec<AssocItemConstraint>,
205-
ty_args: ty::Binder<'tcx, GenericArgsRef<'tcx>>,
203+
mut constraints: ThinVec<AssocItemConstraint>,
204+
args: ty::Binder<'tcx, GenericArgsRef<'tcx>>,
206205
) -> GenericArgs {
207-
let args = clean_middle_generic_args(cx, ty_args.map_bound(|args| &args[..]), has_self, did);
208-
209-
if cx.tcx.is_trait(did) && cx.tcx.trait_def(did).paren_sugar {
210-
let ty = ty_args
206+
if cx.tcx.is_trait(did)
207+
&& cx.tcx.trait_def(did).paren_sugar
208+
&& let ty::Tuple(tys) = args.skip_binder().type_at(has_self as usize).kind()
209+
{
210+
let inputs = tys
211211
.iter()
212-
.nth(if has_self { 1 } else { 0 })
213-
.unwrap()
214-
.map_bound(|arg| arg.expect_ty());
215-
let inputs =
216-
// The trait's first substitution is the one after self, if there is one.
217-
match ty.skip_binder().kind() {
218-
ty::Tuple(tys) => tys.iter().map(|t| clean_middle_ty(ty.rebind(t), cx, None, None)).collect::<Vec<_>>().into(),
219-
_ => return GenericArgs::AngleBracketed { args: args.into(), constraints },
220-
};
221-
let output = constraints.into_iter().next().and_then(|binding| match binding.kind {
222-
AssocItemConstraintKind::Equality { term: Term::Type(ty) }
223-
if ty != Type::Tuple(Vec::new()) =>
224-
{
212+
.map(|ty| clean_middle_ty(args.rebind(ty), cx, None, None))
213+
.collect::<Vec<_>>()
214+
.into();
215+
let output = constraints.pop().and_then(|constraint| match constraint.kind {
216+
AssocItemConstraintKind::Equality { term: Term::Type(ty) } if !ty.is_unit() => {
225217
Some(Box::new(ty))
226218
}
227219
_ => None,
228220
});
229-
GenericArgs::Parenthesized { inputs, output }
230-
} else {
231-
GenericArgs::AngleBracketed { args: args.into(), constraints }
221+
return GenericArgs::Parenthesized { inputs, output };
232222
}
223+
224+
let args = clean_middle_generic_args(cx, args.map_bound(|args| &args[..]), has_self, did);
225+
226+
GenericArgs::AngleBracketed { args: args.into(), constraints }
233227
}
234228

235229
pub(super) fn clean_middle_path<'tcx>(

0 commit comments

Comments
 (0)