Skip to content

Commit 4660316

Browse files
committed
[perf] rustdoc: Perform less work when cleaning parenthesized generic args
1 parent 143ce09 commit 4660316

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)