diff options
| author | lcnr <rust@lcnr.de> | 2022-06-03 20:00:39 +0200 |
|---|---|---|
| committer | lcnr <rust@lcnr.de> | 2022-06-08 10:13:00 +0200 |
| commit | 2ea468e386230375229c68a09affcba23cd79487 (patch) | |
| tree | 019b1d3fdaccd198cecae355e8b28fd0fc3785a3 /compiler/rustc_middle/src/ty/print | |
| parent | 154eba64b9e845f58ab4214cfcb6f202dfa5c210 (diff) | |
| download | rust-2ea468e386230375229c68a09affcba23cd79487.tar.gz rust-2ea468e386230375229c68a09affcba23cd79487.zip | |
dedup diagnostics default params handling
Diffstat (limited to 'compiler/rustc_middle/src/ty/print')
| -rw-r--r-- | compiler/rustc_middle/src/ty/print/mod.rs | 39 | ||||
| -rw-r--r-- | compiler/rustc_middle/src/ty/print/pretty.rs | 27 |
2 files changed, 13 insertions, 53 deletions
diff --git a/compiler/rustc_middle/src/ty/print/mod.rs b/compiler/rustc_middle/src/ty/print/mod.rs index 9d8124eb25d..5ad93d77820 100644 --- a/compiler/rustc_middle/src/ty/print/mod.rs +++ b/compiler/rustc_middle/src/ty/print/mod.rs @@ -149,7 +149,7 @@ pub trait Printer<'tcx>: Sized { // on top of the same path, but without its own generics. _ => { if !generics.params.is_empty() && substs.len() >= generics.count() { - let args = self.generic_args_to_print(generics, substs); + let args = generics.own_substs_no_defaults(self.tcx(), substs); return self.path_generic_args( |cx| cx.print_def_path(def_id, parent_substs), args, @@ -184,43 +184,6 @@ pub trait Printer<'tcx>: Sized { } } - fn generic_args_to_print( - &self, - generics: &'tcx ty::Generics, - substs: &'tcx [GenericArg<'tcx>], - ) -> &'tcx [GenericArg<'tcx>] { - let mut own_params = generics.parent_count..generics.count(); - - // Don't print args for `Self` parameters (of traits). - if generics.has_self && own_params.start == 0 { - own_params.start = 1; - } - - // Don't print args that are the defaults of their respective parameters. - own_params.end -= generics - .params - .iter() - .rev() - .take_while(|param| match param.kind { - ty::GenericParamDefKind::Lifetime => false, - ty::GenericParamDefKind::Type { has_default, .. } => { - has_default - && substs[param.index as usize] - == GenericArg::from( - self.tcx().bound_type_of(param.def_id).subst(self.tcx(), substs), - ) - } - ty::GenericParamDefKind::Const { has_default } => { - has_default - && substs[param.index as usize] - == GenericArg::from(self.tcx().const_param_default(param.def_id)) - } - }) - .count(); - - &substs[own_params] - } - fn default_print_impl_path( self, impl_def_id: DefId, diff --git a/compiler/rustc_middle/src/ty/print/pretty.rs b/compiler/rustc_middle/src/ty/print/pretty.rs index 7328b18a328..53a97a46b2d 100644 --- a/compiler/rustc_middle/src/ty/print/pretty.rs +++ b/compiler/rustc_middle/src/ty/print/pretty.rs @@ -825,12 +825,11 @@ pub trait PrettyPrinter<'tcx>: for (fn_once_trait_ref, entry) in fn_traits { // Get the (single) generic ty (the args) of this FnOnce trait ref. - let generics = self.generic_args_to_print( - self.tcx().generics_of(fn_once_trait_ref.def_id()), - fn_once_trait_ref.skip_binder().substs, - ); + let generics = self.tcx().generics_of(fn_once_trait_ref.def_id()); + let args = + generics.own_substs_no_defaults(self.tcx(), fn_once_trait_ref.skip_binder().substs); - match (entry.return_ty, generics[0].expect_ty()) { + match (entry.return_ty, args[0].expect_ty()) { // We can only print `impl Fn() -> ()` if we have a tuple of args and we recorded // a return type. (Some(return_ty), arg_tys) if matches!(arg_tys.kind(), ty::Tuple(_)) => { @@ -892,15 +891,13 @@ pub trait PrettyPrinter<'tcx>: print(trait_ref.skip_binder().print_only_trait_name()) ); - let generics = self.generic_args_to_print( - self.tcx().generics_of(trait_ref.def_id()), - trait_ref.skip_binder().substs, - ); + let generics = self.tcx().generics_of(trait_ref.def_id()); + let args = generics.own_substs_no_defaults(self.tcx(), trait_ref.skip_binder().substs); - if !generics.is_empty() || !assoc_items.is_empty() { + if !args.is_empty() || !assoc_items.is_empty() { let mut first = true; - for ty in generics { + for ty in args { if first { p!("<"); first = false; @@ -1071,10 +1068,10 @@ pub trait PrettyPrinter<'tcx>: let dummy_cx = cx.tcx().mk_ty_infer(ty::FreshTy(0)); let principal = principal.with_self_ty(cx.tcx(), dummy_cx); - let args = cx.generic_args_to_print( - cx.tcx().generics_of(principal.def_id), - principal.substs, - ); + let args = cx + .tcx() + .generics_of(principal.def_id) + .own_substs_no_defaults(cx.tcx(), principal.substs); // Don't print `'_` if there's no unerased regions. let print_regions = args.iter().any(|arg| match arg.unpack() { |
