Skip to content

Commit 4660316

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

2 files changed

Lines changed: 19 additions & 25 deletions

File tree

‎src/librustdoc/clean/mod.rs‎

Lines changed: 2 additions & 2 deletions
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-
letbindings = obj
2122+
letconstraints = 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)

‎src/librustdoc/clean/utils.rs‎

Lines changed: 17 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,6 @@ pub(crate) fn clean_middle_generic_args<'tcx>(
112112
returnNone;
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:&mutDocContext<'tcx>,
202201
did:DefId,
203202
has_self:bool,
204-
constraints:ThinVec<AssocItemConstraint>,
205-
ty_args: ty::Binder<'tcx,GenericArgsRef<'tcx>>,
203+
mutconstraints: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 asusize).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-
_ => returnGenericArgs::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+
returnGenericArgs::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)fnclean_middle_path<'tcx>(

0 commit comments

Comments
 (0)