diff options
| author | León Orell Valerian Liehr <me@fmease.dev> | 2024-11-11 01:47:56 +0100 |
|---|---|---|
| committer | León Orell Valerian Liehr <me@fmease.dev> | 2024-11-11 15:35:30 +0100 |
| commit | 46603166d7f5cae49f38a3595e2f424a3063c20b (patch) | |
| tree | bb3d99871252b692c7b2da952241120ec359f62a /src/librustdoc/clean/utils.rs | |
| parent | 143ce0920a2307b19831160a01f06f107610f1b2 (diff) | |
| download | rust-46603166d7f5cae49f38a3595e2f424a3063c20b.tar.gz rust-46603166d7f5cae49f38a3595e2f424a3063c20b.zip | |
[perf] rustdoc: Perform less work when cleaning parenthesized generic args
Diffstat (limited to 'src/librustdoc/clean/utils.rs')
| -rw-r--r-- | src/librustdoc/clean/utils.rs | 40 |
1 files changed, 17 insertions, 23 deletions
diff --git a/src/librustdoc/clean/utils.rs b/src/librustdoc/clean/utils.rs index 560831197f0..ec41ad0e8e3 100644 --- a/src/librustdoc/clean/utils.rs +++ b/src/librustdoc/clean/utils.rs @@ -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); @@ -201,35 +200,30 @@ fn clean_middle_generic_args_with_constraints<'tcx>( cx: &mut DocContext<'tcx>, did: DefId, has_self: bool, - constraints: ThinVec<AssocItemConstraint>, - ty_args: ty::Binder<'tcx, GenericArgsRef<'tcx>>, + mut constraints: ThinVec<AssocItemConstraint>, + 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) = 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(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, args.map_bound(|args| &args[..]), has_self, did); + + GenericArgs::AngleBracketed { args: args.into(), constraints } } pub(super) fn clean_middle_path<'tcx>( |
