11#![ allow( clippy:: wildcard_imports, clippy:: enum_glob_use) ]
22
3- use clippy_utils:: ast_utils:: { eq_field_pat, eq_id, eq_pat, eq_path} ;
3+ use clippy_utils:: ast_utils:: { eq_field_pat, eq_id, eq_maybe_qself , eq_pat, eq_path} ;
44use clippy_utils:: diagnostics:: span_lint_and_then;
55use clippy_utils:: { meets_msrv, msrvs, over} ;
66use rustc_ast:: mut_visit:: * ;
@@ -273,16 +273,17 @@ fn transform_with_focus_on_idx(alternatives: &mut Vec<P<Pat>>, focus_idx: usize)
273273 |k| always_pat ! ( k, Tuple ( ps) => ps) ,
274274 ) ,
275275 // Transform `S(pre, x, post) | ... | S(pre, y, post)` into `S(pre, x | y, post)`.
276- TupleStruct ( path1, ps1) => extend_with_matching_product (
276+ TupleStruct ( qself1 , path1, ps1) => extend_with_matching_product (
277277 ps1, start, alternatives,
278278 |k, ps1, idx| matches ! (
279279 k,
280- TupleStruct ( path2, ps2) if eq_path( path1, path2) && eq_pre_post( ps1, ps2, idx)
280+ TupleStruct ( qself2, path2, ps2)
281+ if eq_maybe_qself( qself1, qself2) && eq_path( path1, path2) && eq_pre_post( ps1, ps2, idx)
281282 ) ,
282- |k| always_pat ! ( k, TupleStruct ( _, ps) => ps) ,
283+ |k| always_pat ! ( k, TupleStruct ( _, _ , ps) => ps) ,
283284 ) ,
284285 // Transform a record pattern `S { fp_0, ..., fp_n }`.
285- Struct ( path1, fps1, rest1) => extend_with_struct_pat ( path1, fps1, * rest1, start, alternatives) ,
286+ Struct ( qself1 , path1, fps1, rest1) => extend_with_struct_pat ( qself1 , path1, fps1, * rest1, start, alternatives) ,
286287 } ;
287288
288289 alternatives[ focus_idx] . kind = focus_kind;
@@ -294,6 +295,7 @@ fn transform_with_focus_on_idx(alternatives: &mut Vec<P<Pat>>, focus_idx: usize)
294295/// So when we fixate on some `ident_k: pat_k`, we try to find `ident_k` in the other pattern
295296/// and check that all `fp_i` where `i ∈ ((0...n) \ k)` between two patterns are equal.
296297fn extend_with_struct_pat (
298+ qself1 : & Option < ast:: QSelf > ,
297299 path1 : & ast:: Path ,
298300 fps1 : & mut Vec < ast:: PatField > ,
299301 rest1 : bool ,
@@ -306,8 +308,9 @@ fn extend_with_struct_pat(
306308 start,
307309 alternatives,
308310 |k| {
309- matches ! ( k, Struct ( path2, fps2, rest2)
311+ matches ! ( k, Struct ( qself2 , path2, fps2, rest2)
310312 if rest1 == * rest2 // If one struct pattern has `..` so must the other.
313+ && eq_maybe_qself( qself1, qself2)
311314 && eq_path( path1, path2)
312315 && fps1. len( ) == fps2. len( )
313316 && fps1. iter( ) . enumerate( ) . all( |( idx_1, fp1) | {
@@ -323,7 +326,7 @@ fn extend_with_struct_pat(
323326 } ) )
324327 } ,
325328 // Extract `p2_k`.
326- |k| always_pat ! ( k, Struct ( _, mut fps, _) => fps. swap_remove( pos_in_2. take( ) . unwrap( ) ) . pat) ,
329+ |k| always_pat ! ( k, Struct ( _, _ , mut fps, _) => fps. swap_remove( pos_in_2. take( ) . unwrap( ) ) . pat) ,
327330 ) ;
328331 extend_with_tail_or ( & mut fps1[ idx] . pat , tail_or)
329332 } )
0 commit comments