Rollup merge of #127692 - veera-sivarajan:bugfix-125139, r=estebank
Suggest `impl Trait` for References to Bare Trait in Function Header Fixes #125139 This PR suggests `impl Trait` when `&Trait` is found as a function parameter type or return type. This makes use of existing diagnostics by adding `peel_refs()` when checking for type equality. Additionaly, it makes a few other improvements: 1. Checks if functions inside impl blocks have bare trait in their headers. 2. Introduces a trait `NextLifetimeParamName` similar to the existing `NextTypeParamName` for suggesting a lifetime name. Also, abstracts out the common logic between the two trait impls. ### Related Issues I ran into a bunch of related diagnostic issues but couldn't fix them within the scope of this PR. So, I have created the following issues: 1. [Misleading Suggestion when Returning a Reference to a Bare Trait from a Function](https://github.com/rust-lang/rust/issues/127689) 2. [Verbose Error When a Function Takes a Bare Trait as Parameter](https://github.com/rust-lang/rust/issues/127690) 3. [Incorrect Suggestion when Returning a Bare Trait from a Function](https://github.com/rust-lang/rust/issues/127691) r? ```@estebank``` since you implemented #119148
This commit is contained in:
commit
f75a1954eb
5 changed files with 891 additions and 28 deletions
|
@ -5023,24 +5023,32 @@ impl<'v> Visitor<'v> for AwaitsVisitor {
|
|||
}
|
||||
}
|
||||
|
||||
/// Suggest a new type parameter name for diagnostic purposes.
|
||||
///
|
||||
/// `name` is the preferred name you'd like to suggest if it's not in use already.
|
||||
pub trait NextTypeParamName {
|
||||
fn next_type_param_name(&self, name: Option<&str>) -> String;
|
||||
}
|
||||
|
||||
impl NextTypeParamName for &[hir::GenericParam<'_>] {
|
||||
fn next_type_param_name(&self, name: Option<&str>) -> String {
|
||||
// This is the list of possible parameter names that we might suggest.
|
||||
// Type names are usually single letters in uppercase. So convert the first letter of input string to uppercase.
|
||||
let name = name.and_then(|n| n.chars().next()).map(|c| c.to_uppercase().to_string());
|
||||
let name = name.as_deref();
|
||||
|
||||
// This is the list of possible parameter names that we might suggest.
|
||||
let possible_names = [name.unwrap_or("T"), "T", "U", "V", "X", "Y", "Z", "A", "B", "C"];
|
||||
let used_names = self
|
||||
|
||||
// Filter out used names based on `filter_fn`.
|
||||
let used_names: Vec<Symbol> = self
|
||||
.iter()
|
||||
.filter_map(|p| match p.name {
|
||||
.filter_map(|param| match param.name {
|
||||
hir::ParamName::Plain(ident) => Some(ident.name),
|
||||
_ => None,
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
.collect();
|
||||
|
||||
// Find a name from `possible_names` that is not in `used_names`.
|
||||
possible_names
|
||||
.iter()
|
||||
.find(|n| !used_names.contains(&Symbol::intern(n)))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue