diff options
| author | Mara Bos <m-ou.se@m-ou.se> | 2021-08-30 19:01:34 +0200 |
|---|---|---|
| committer | Mara Bos <m-ou.se@m-ou.se> | 2021-08-30 19:02:06 +0200 |
| commit | e2abf0689035a6ace7bdb2801ee1e53cb3ee2c75 (patch) | |
| tree | 5383efe2df3cdde22128925edc5b2b19960459fc | |
| parent | a4f6d3e5c27e09f9fab591c19391b53a4175b666 (diff) | |
| download | rust-e2abf0689035a6ace7bdb2801ee1e53cb3ee2c75.tar.gz rust-e2abf0689035a6ace7bdb2801ee1e53cb3ee2c75.zip | |
Fix lifetime generics in <T<..> as Trait>::try_from suggestion.
| -rw-r--r-- | compiler/rustc_typeck/src/check/method/prelude2021.rs | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/compiler/rustc_typeck/src/check/method/prelude2021.rs b/compiler/rustc_typeck/src/check/method/prelude2021.rs index 0ab64170e4c..69dada98dc3 100644 --- a/compiler/rustc_typeck/src/check/method/prelude2021.rs +++ b/compiler/rustc_typeck/src/check/method/prelude2021.rs @@ -262,31 +262,35 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { method_name.name )); - let self_ty_name = self + let mut self_ty_name = self .sess() .source_map() .span_to_snippet(self_ty_span) .unwrap_or_else(|_| self_ty.to_string()); - let self_ty_generics_count = match self_ty.kind() { - // Get the number of generics the self type has (if an Adt) unless we can determine that - // the user has written the self type with generics already which we (naively) do by looking - // for a "<" in `self_ty_name`. - Adt(def, _) if !self_ty_name.contains('<') => self.tcx.generics_of(def.did).count(), - _ => 0, - }; - let self_ty_generics = if self_ty_generics_count > 0 { - format!("<{}>", vec!["_"; self_ty_generics_count].join(", ")) - } else { - String::new() - }; + // Get the number of generics the self type has (if an Adt) unless we can determine that + // the user has written the self type with generics already which we (naively) do by looking + // for a "<" in `self_ty_name`. + if !self_ty_name.contains('<') { + if let Adt(def, _) = self_ty.kind() { + let generics = self.tcx.generics_of(def.did); + if !generics.params.is_empty() { + let counts = generics.own_counts(); + self_ty_name += &format!( + "<{}>", + std::iter::repeat("'_") + .take(counts.lifetimes) + .chain(std::iter::repeat("_").take(counts.types + counts.consts)) + .collect::<Vec<_>>() + .join(", ") + ); + } + } + } lint.span_suggestion( span, "disambiguate the associated function", - format!( - "<{}{} as {}>::{}", - self_ty_name, self_ty_generics, trait_name, method_name.name, - ), + format!("<{} as {}>::{}", self_ty_name, trait_name, method_name.name,), Applicability::MachineApplicable, ); |
