@@ -704,27 +704,13 @@ impl<'a> InferenceContext<'a> {
704
704
type_mismatches. retain ( |_, mismatch| {
705
705
mismatch. expected = table. resolve_completely ( mismatch. expected . clone ( ) ) ;
706
706
mismatch. actual = table. resolve_completely ( mismatch. actual . clone ( ) ) ;
707
- let unresolved_ty_mismatch = || {
708
- chalk_ir:: zip:: Zip :: zip_with (
709
- & mut UnknownMismatch ( self . db , |ty| matches ! ( ty. kind( Interner ) , TyKind :: Error ) ) ,
710
- Variance :: Invariant ,
711
- & mismatch. expected ,
712
- & mismatch. actual ,
713
- )
714
- . is_ok ( )
715
- } ;
716
-
717
- let unresolved_projections_mismatch = || {
718
- chalk_ir:: zip:: Zip :: zip_with (
719
- & mut UnknownMismatch ( self . db , |ty| ty. contains_unknown ( ) && ty. is_projection ( ) ) ,
720
- chalk_ir:: Variance :: Invariant ,
721
- & mismatch. expected ,
722
- & mismatch. actual ,
723
- )
724
- . is_ok ( )
725
- } ;
726
-
727
- unresolved_ty_mismatch ( ) && unresolved_projections_mismatch ( )
707
+ chalk_ir:: zip:: Zip :: zip_with (
708
+ & mut UnknownMismatch ( self . db ) ,
709
+ Variance :: Invariant ,
710
+ & mismatch. expected ,
711
+ & mismatch. actual ,
712
+ )
713
+ . is_ok ( )
728
714
} ) ;
729
715
diagnostics. retain_mut ( |diagnostic| {
730
716
use InferenceDiagnostic :: * ;
@@ -1666,16 +1652,13 @@ impl std::ops::BitOrAssign for Diverges {
1666
1652
* self = * self | other;
1667
1653
}
1668
1654
}
1669
- /// A zipper that checks for unequal `{unknown}` occurrences in the two types.
1670
- /// Types that have different constructors are filtered out and tested by the
1671
- /// provided closure `F`. Commonly used to filter out mismatch diagnostics that
1672
- /// only differ in `{unknown}`. These mismatches are usually not helpful, as the
1673
- /// cause is usually an underlying name resolution problem.
1674
- ///
1675
- /// E.g. when F is `|ty| matches!(ty.kind(Interer), TyKind::Unknown)`, the zipper
1676
- /// will skip over all mismatches that only differ in `{unknown}`.
1677
- struct UnknownMismatch < ' db , F : Fn ( & Ty ) -> bool > ( & ' db dyn HirDatabase , F ) ;
1678
- impl < F : Fn ( & Ty ) -> bool > chalk_ir:: zip:: Zipper < Interner > for UnknownMismatch < ' _ , F > {
1655
+
1656
+ /// A zipper that checks for unequal occurrences of `{unknown}` and unresolved projections
1657
+ /// in the two types. Used to filter out mismatch diagnostics that only differ in
1658
+ /// `{unknown}` and unresolved projections. These mismatches are usually not helpful.
1659
+ /// As the cause is usually an underlying name resolution problem
1660
+ struct UnknownMismatch < ' db > ( & ' db dyn HirDatabase ) ;
1661
+ impl chalk_ir:: zip:: Zipper < Interner > for UnknownMismatch < ' _ > {
1679
1662
fn zip_tys ( & mut self , variance : Variance , a : & Ty , b : & Ty ) -> chalk_ir:: Fallible < ( ) > {
1680
1663
let zip_substs = |this : & mut Self ,
1681
1664
variances,
@@ -1746,7 +1729,12 @@ impl<F: Fn(&Ty) -> bool> chalk_ir::zip::Zipper<Interner> for UnknownMismatch<'_,
1746
1729
zip_substs ( self , None , & fn_ptr_a. substitution . 0 , & fn_ptr_b. substitution . 0 ) ?
1747
1730
}
1748
1731
( TyKind :: Error , TyKind :: Error ) => ( ) ,
1749
- _ if ( self . 1 ) ( a) || ( self . 1 ) ( b) => return Err ( chalk_ir:: NoSolution ) ,
1732
+ ( TyKind :: Error , _)
1733
+ | ( _, TyKind :: Error )
1734
+ | ( TyKind :: Alias ( AliasTy :: Projection ( _) ) | TyKind :: AssociatedType ( _, _) , _)
1735
+ | ( _, TyKind :: Alias ( AliasTy :: Projection ( _) ) | TyKind :: AssociatedType ( _, _) ) => {
1736
+ return Err ( chalk_ir:: NoSolution )
1737
+ }
1750
1738
_ => ( ) ,
1751
1739
}
1752
1740
0 commit comments