Skip to content

Commit

Permalink
Auto merge of rust-lang#9146 - arieluy:type_params, r=dswij
Browse files Browse the repository at this point in the history
Fix `mismatching_type_param_order` false positive

changelog: Don't lint `mismatching_type_param_order` on complicated generic params

fixes rust-lang#8962
  • Loading branch information
bors committed Jul 18, 2022
2 parents 79a0d23 + 8cf39a8 commit f4c9183
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 9 deletions.
24 changes: 15 additions & 9 deletions clippy_lints/src/mismatching_type_param_order.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,11 @@ declare_clippy_lint! {
/// Naming type parameters inconsistently may cause you to refer to the
/// wrong type parameter.
///
/// ### Limitations
/// This lint only applies to impl blocks with simple generic params, e.g.
/// `A`. If there is anything more complicated, such as a tuple, it will be
/// ignored.
///
/// ### Example
/// ```rust
/// struct Foo<A, B> {
Expand Down Expand Up @@ -53,14 +58,15 @@ impl<'tcx> LateLintPass<'tcx> for TypeParamMismatch {
if !generic_args.args.is_empty();
then {
// get the name and span of the generic parameters in the Impl
let impl_params = generic_args.args.iter()
.filter_map(|p|
let mut impl_params = Vec::new();
for p in generic_args.args.iter() {
match p {
GenericArg::Type(Ty {kind: TyKind::Path(QPath::Resolved(_, path)), ..}) =>
Some((path.segments[0].ident.to_string(), path.span)),
_ => None,
}
);
impl_params.push((path.segments[0].ident.to_string(), path.span)),
GenericArg::Type(_) => return,
_ => (),
};
}

// find the type that the Impl is for
// only lint on struct/enum/union for now
Expand All @@ -83,16 +89,16 @@ impl<'tcx> LateLintPass<'tcx> for TypeParamMismatch {
type_param_names.iter().enumerate().map(|(i, param)| (param, i)).collect();

let type_name = segment.ident;
for (i, (impl_param_name, impl_param_span)) in impl_params.enumerate() {
if mismatch_param_name(i, &impl_param_name, &type_param_names_hashmap) {
for (i, (impl_param_name, impl_param_span)) in impl_params.iter().enumerate() {
if mismatch_param_name(i, impl_param_name, &type_param_names_hashmap) {
let msg = format!("`{}` has a similarly named generic type parameter `{}` in its declaration, but in a different order",
type_name, impl_param_name);
let help = format!("try `{}`, or a name that does not conflict with `{}`'s generic params",
type_param_names[i], type_name);
span_lint_and_help(
cx,
MISMATCHING_TYPE_PARAM_ORDER,
impl_param_span,
*impl_param_span,
&msg,
None,
&help
Expand Down
4 changes: 4 additions & 0 deletions tests/ui/mismatching_type_param_order.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,4 +57,8 @@ fn main() {
B: Copy,
{
}

// if the types are complicated, do not lint
impl<K, V, B> Foo<(K, V), B> {}
impl<K, V, A> Foo<(K, V), A> {}
}

0 comments on commit f4c9183

Please sign in to comment.