@@ -689,7 +689,7 @@ pub enum TypeOwnerId {
689689}
690690
691691impl TypeOwnerId {
692- fn as_generic_def_id ( self ) -> Option < GenericDefId > {
692+ fn as_generic_def_id ( self , db : & dyn DefDatabase ) -> Option < GenericDefId > {
693693 Some ( match self {
694694 TypeOwnerId :: FunctionId ( it) => GenericDefId :: FunctionId ( it) ,
695695 TypeOwnerId :: ConstId ( it) => GenericDefId :: ConstId ( it) ,
@@ -698,7 +698,9 @@ impl TypeOwnerId {
698698 TypeOwnerId :: TraitAliasId ( it) => GenericDefId :: TraitAliasId ( it) ,
699699 TypeOwnerId :: TypeAliasId ( it) => GenericDefId :: TypeAliasId ( it) ,
700700 TypeOwnerId :: ImplId ( it) => GenericDefId :: ImplId ( it) ,
701- TypeOwnerId :: EnumVariantId ( it) => GenericDefId :: EnumVariantId ( it) ,
701+ TypeOwnerId :: EnumVariantId ( it) => {
702+ GenericDefId :: AdtId ( AdtId :: EnumId ( it. lookup ( db) . parent ) )
703+ }
702704 TypeOwnerId :: InTypeConstId ( _) | TypeOwnerId :: StaticId ( _) => return None ,
703705 } )
704706 }
@@ -740,7 +742,6 @@ impl From<GenericDefId> for TypeOwnerId {
740742 GenericDefId :: TraitAliasId ( it) => it. into ( ) ,
741743 GenericDefId :: TypeAliasId ( it) => it. into ( ) ,
742744 GenericDefId :: ImplId ( it) => it. into ( ) ,
743- GenericDefId :: EnumVariantId ( it) => it. into ( ) ,
744745 GenericDefId :: ConstId ( it) => it. into ( ) ,
745746 }
746747 }
@@ -849,8 +850,8 @@ impl GeneralConstId {
849850 pub fn generic_def ( self , db : & dyn DefDatabase ) -> Option < GenericDefId > {
850851 match self {
851852 GeneralConstId :: ConstId ( it) => Some ( it. into ( ) ) ,
852- GeneralConstId :: ConstBlockId ( it) => it. lookup ( db) . parent . as_generic_def_id ( ) ,
853- GeneralConstId :: InTypeConstId ( it) => it. lookup ( db) . owner . as_generic_def_id ( ) ,
853+ GeneralConstId :: ConstBlockId ( it) => it. lookup ( db) . parent . as_generic_def_id ( db ) ,
854+ GeneralConstId :: InTypeConstId ( it) => it. lookup ( db) . owner . as_generic_def_id ( db ) ,
854855 }
855856 }
856857
@@ -888,12 +889,12 @@ impl From<EnumVariantId> for DefWithBodyId {
888889}
889890
890891impl DefWithBodyId {
891- pub fn as_generic_def_id ( self ) -> Option < GenericDefId > {
892+ pub fn as_generic_def_id ( self , db : & dyn DefDatabase ) -> Option < GenericDefId > {
892893 match self {
893894 DefWithBodyId :: FunctionId ( f) => Some ( f. into ( ) ) ,
894895 DefWithBodyId :: StaticId ( _) => None ,
895896 DefWithBodyId :: ConstId ( c) => Some ( c. into ( ) ) ,
896- DefWithBodyId :: VariantId ( c) => Some ( c. into ( ) ) ,
897+ DefWithBodyId :: VariantId ( c) => Some ( c. lookup ( db ) . parent . into ( ) ) ,
897898 // FIXME: stable rust doesn't allow generics in constants, but we should
898899 // use `TypeOwnerId::as_generic_def_id` when it does.
899900 DefWithBodyId :: InTypeConstId ( _) => None ,
@@ -921,10 +922,6 @@ pub enum GenericDefId {
921922 TraitAliasId ( TraitAliasId ) ,
922923 TypeAliasId ( TypeAliasId ) ,
923924 ImplId ( ImplId ) ,
924- // enum variants cannot have generics themselves, but their parent enums
925- // can, and this makes some code easier to write
926- // FIXME: Try to remove this as that will reduce the amount of query slots generated per enum?
927- EnumVariantId ( EnumVariantId ) ,
928925 // consts can have type parameters from their parents (i.e. associated consts of traits)
929926 ConstId ( ConstId ) ,
930927}
@@ -935,7 +932,6 @@ impl_from!(
935932 TraitAliasId ,
936933 TypeAliasId ,
937934 ImplId ,
938- EnumVariantId ,
939935 ConstId
940936 for GenericDefId
941937) ;
@@ -967,7 +963,6 @@ impl GenericDefId {
967963 GenericDefId :: TraitAliasId ( it) => file_id_and_params_of_item_loc ( db, it) ,
968964 GenericDefId :: ImplId ( it) => file_id_and_params_of_item_loc ( db, it) ,
969965 GenericDefId :: ConstId ( it) => ( it. lookup ( db) . id . file_id ( ) , None ) ,
970- GenericDefId :: EnumVariantId ( it) => ( it. lookup ( db) . id . file_id ( ) , None ) ,
971966 }
972967 }
973968
@@ -982,6 +977,14 @@ impl GenericDefId {
982977 _ => None ,
983978 }
984979 }
980+
981+ pub fn from_callable ( db : & dyn DefDatabase , def : CallableDefId ) -> GenericDefId {
982+ match def {
983+ CallableDefId :: FunctionId ( f) => f. into ( ) ,
984+ CallableDefId :: StructId ( s) => s. into ( ) ,
985+ CallableDefId :: EnumVariantId ( e) => e. lookup ( db) . parent . into ( ) ,
986+ }
987+ }
985988}
986989
987990impl From < AssocItemId > for GenericDefId {
@@ -994,6 +997,36 @@ impl From<AssocItemId> for GenericDefId {
994997 }
995998}
996999
1000+ #[ derive( Clone , Copy , Debug , PartialEq , Eq , Hash ) ]
1001+ pub enum CallableDefId {
1002+ FunctionId ( FunctionId ) ,
1003+ StructId ( StructId ) ,
1004+ EnumVariantId ( EnumVariantId ) ,
1005+ }
1006+
1007+ impl InternValueTrivial for CallableDefId { }
1008+
1009+ impl_from ! ( FunctionId , StructId , EnumVariantId for CallableDefId ) ;
1010+ impl From < CallableDefId > for ModuleDefId {
1011+ fn from ( def : CallableDefId ) -> ModuleDefId {
1012+ match def {
1013+ CallableDefId :: FunctionId ( f) => ModuleDefId :: FunctionId ( f) ,
1014+ CallableDefId :: StructId ( s) => ModuleDefId :: AdtId ( AdtId :: StructId ( s) ) ,
1015+ CallableDefId :: EnumVariantId ( e) => ModuleDefId :: EnumVariantId ( e) ,
1016+ }
1017+ }
1018+ }
1019+
1020+ impl CallableDefId {
1021+ pub fn krate ( self , db : & dyn DefDatabase ) -> CrateId {
1022+ match self {
1023+ CallableDefId :: FunctionId ( f) => f. krate ( db) ,
1024+ CallableDefId :: StructId ( s) => s. krate ( db) ,
1025+ CallableDefId :: EnumVariantId ( e) => e. krate ( db) ,
1026+ }
1027+ }
1028+ }
1029+
9971030#[ derive( Clone , Copy , Debug , PartialEq , Eq , Hash ) ]
9981031pub enum AttrDefId {
9991032 ModuleId ( ModuleId ) ,
@@ -1310,7 +1343,6 @@ impl HasModule for GenericDefId {
13101343 GenericDefId :: TraitAliasId ( it) => it. module ( db) ,
13111344 GenericDefId :: TypeAliasId ( it) => it. module ( db) ,
13121345 GenericDefId :: ImplId ( it) => it. module ( db) ,
1313- GenericDefId :: EnumVariantId ( it) => it. module ( db) ,
13141346 GenericDefId :: ConstId ( it) => it. module ( db) ,
13151347 }
13161348 }
0 commit comments