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_pat, eq_path, eq_maybe_qself } ;
44use clippy_utils:: diagnostics:: span_lint_and_then;
55use clippy_utils:: { meets_msrv, msrvs, over} ;
66use rustc_ast:: mut_visit:: * ;
@@ -273,16 +273,16 @@ 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) if eq_maybe_qself ( qself1 , qself2 ) && eq_path( path1, path2) && eq_pre_post( ps1, ps2, idx)
281281 ) ,
282- |k| always_pat ! ( k, TupleStruct ( _, ps) => ps) ,
282+ |k| always_pat ! ( k, TupleStruct ( _, _ , ps) => ps) ,
283283 ) ,
284284 // Transform a record pattern `S { fp_0, ..., fp_n }`.
285- Struct ( path1, fps1, rest1) => extend_with_struct_pat ( path1, fps1, * rest1, start, alternatives) ,
285+ Struct ( qself1 , path1, fps1, rest1) => extend_with_struct_pat ( qself1 , path1, fps1, * rest1, start, alternatives) ,
286286 } ;
287287
288288 alternatives[ focus_idx] . kind = focus_kind;
@@ -294,6 +294,7 @@ fn transform_with_focus_on_idx(alternatives: &mut Vec<P<Pat>>, focus_idx: usize)
294294/// So when we fixate on some `ident_k: pat_k`, we try to find `ident_k` in the other pattern
295295/// and check that all `fp_i` where `i ∈ ((0...n) \ k)` between two patterns are equal.
296296fn extend_with_struct_pat (
297+ qself1 : & Option < ast:: QSelf > ,
297298 path1 : & ast:: Path ,
298299 fps1 : & mut Vec < ast:: PatField > ,
299300 rest1 : bool ,
@@ -306,8 +307,9 @@ fn extend_with_struct_pat(
306307 start,
307308 alternatives,
308309 |k| {
309- matches ! ( k, Struct ( path2, fps2, rest2)
310+ matches ! ( k, Struct ( qself2 , path2, fps2, rest2)
310311 if rest1 == * rest2 // If one struct pattern has `..` so must the other.
312+ && eq_maybe_qself( qself1, qself2)
311313 && eq_path( path1, path2)
312314 && fps1. len( ) == fps2. len( )
313315 && fps1. iter( ) . enumerate( ) . all( |( idx_1, fp1) | {
@@ -323,7 +325,7 @@ fn extend_with_struct_pat(
323325 } ) )
324326 } ,
325327 // Extract `p2_k`.
326- |k| always_pat ! ( k, Struct ( _, mut fps, _) => fps. swap_remove( pos_in_2. take( ) . unwrap( ) ) . pat) ,
328+ |k| always_pat ! ( k, Struct ( _, _ , mut fps, _) => fps. swap_remove( pos_in_2. take( ) . unwrap( ) ) . pat) ,
327329 ) ;
328330 extend_with_tail_or ( & mut fps1[ idx] . pat , tail_or)
329331 } )
0 commit comments