3
3
use std:: ops;
4
4
5
5
pub ( crate ) use gen_trait_fn_body:: gen_trait_fn_body;
6
- use hir:: { db:: HirDatabase , known , HasAttrs as HirHasAttrs , HirDisplay , InFile , Semantics } ;
6
+ use hir:: { db:: HirDatabase , HasAttrs as HirHasAttrs , HirDisplay , InFile , Semantics } ;
7
7
use ide_db:: {
8
8
famous_defs:: FamousDefs , path_transform:: PathTransform ,
9
9
syntax_helpers:: insert_whitespace_into_node:: insert_ws_into, RootDatabase , SnippetCap ,
@@ -685,32 +685,10 @@ pub(crate) fn convert_reference_type(
685
685
. map ( |( conversion, impls_deref) | ReferenceConversion { ty, conversion, impls_deref } )
686
686
}
687
687
688
- fn impls_deref_for_target (
689
- ty : & hir:: Type ,
690
- target : hir:: Type ,
691
- db : & dyn HirDatabase ,
692
- famous_defs : & FamousDefs < ' _ , ' _ > ,
693
- ) -> bool {
694
- if let Some ( deref_trait) = famous_defs. core_ops_Deref ( ) {
695
- if ty. impls_trait ( db, deref_trait, & [ ] ) {
696
- let assoc_type_item = deref_trait. items ( db) . into_iter ( ) . find_map ( |item| match item {
697
- hir:: AssocItem :: TypeAlias ( alias) if alias. name ( db) == known:: Target => Some ( alias) ,
698
- _ => None ,
699
- } ) ;
700
- if let Some ( assoc_type_item) = assoc_type_item {
701
- matches ! (
702
- ty. normalize_trait_assoc_type( db, & [ ] , assoc_type_item) ,
703
- Some ( ty) if ty. could_coerce_to( db, & target) ,
704
- )
705
- } else {
706
- false
707
- }
708
- } else {
709
- false
710
- }
711
- } else {
712
- false
713
- }
688
+ fn could_deref_to_target ( ty : & hir:: Type , target : & hir:: Type , db : & dyn HirDatabase ) -> bool {
689
+ let ty_ref = hir: Type :: reference ( ty, hir:: Mutability :: Shared ) ;
690
+ let target_ref = hir: Type :: reference ( target, hir:: Mutability :: Shared ) ;
691
+ ty_ref. could_coerece_to ( db, & target_ref)
714
692
}
715
693
716
694
fn handle_copy ( ty : & hir:: Type , db : & dyn HirDatabase ) -> Option < ( ReferenceConversionType , bool ) > {
@@ -726,7 +704,7 @@ fn handle_as_ref_str(
726
704
727
705
ty. impls_trait ( db, famous_defs. core_convert_AsRef ( ) ?, & [ str_type. clone ( ) ] ) . then_some ( (
728
706
ReferenceConversionType :: AsRefStr ,
729
- impls_deref_for_target ( ty, str_type, db, famous_defs ) ,
707
+ could_deref_to_target ( ty, & str_type, db) ,
730
708
) )
731
709
}
732
710
@@ -740,7 +718,7 @@ fn handle_as_ref_slice(
740
718
741
719
ty. impls_trait ( db, famous_defs. core_convert_AsRef ( ) ?, & [ slice_type. clone ( ) ] ) . then_some ( (
742
720
ReferenceConversionType :: AsRefSlice ,
743
- impls_deref_for_target ( ty, slice_type, db, famous_defs ) ,
721
+ could_deref_to_target ( ty, & slice_type, db) ,
744
722
) )
745
723
}
746
724
@@ -753,7 +731,7 @@ fn handle_dereferenced(
753
731
754
732
ty. impls_trait ( db, famous_defs. core_convert_AsRef ( ) ?, & [ type_argument. clone ( ) ] ) . then_some ( (
755
733
ReferenceConversionType :: Dereferenced ,
756
- impls_deref_for_target ( ty, type_argument, db, famous_defs ) ,
734
+ could_deref_to_target ( ty, & type_argument, db) ,
757
735
) )
758
736
}
759
737
0 commit comments