@@ -55,6 +55,7 @@ pub mod visibility;
5555
5656use intern:: Interned ;
5757pub use rustc_abi as layout;
58+ use src:: HasSource ;
5859use triomphe:: Arc ;
5960
6061#[ cfg( test) ]
@@ -77,6 +78,7 @@ use hir_expand::{
7778 builtin:: { BuiltinAttrExpander , BuiltinDeriveExpander , BuiltinFnLikeExpander , EagerExpander } ,
7879 db:: ExpandDatabase ,
7980 eager:: expand_eager_macro_input,
81+ files:: InFileWrapper ,
8082 impl_intern_lookup,
8183 name:: Name ,
8284 proc_macro:: { CustomProcMacroExpander , ProcMacroKind } ,
@@ -519,6 +521,41 @@ pub struct FieldId {
519521 pub local_id : LocalFieldId ,
520522}
521523
524+ impl FieldId {
525+ pub fn record_field_source (
526+ & self ,
527+ db : & dyn DefDatabase ,
528+ ) -> InFileWrapper < HirFileId , Option < ast:: RecordField > > {
529+ let field_list = match self . parent {
530+ crate :: VariantId :: EnumVariantId ( it) => {
531+ let s = it. lookup ( db) ;
532+ s. source ( db) . map ( |it| {
533+ it. field_list ( ) . and_then ( |it| match it {
534+ ast:: FieldList :: RecordFieldList ( it) => Some ( it) ,
535+ _ => None ,
536+ } )
537+ } )
538+ }
539+ crate :: VariantId :: StructId ( it) => {
540+ let s = it. lookup ( db) ;
541+ s. source ( db) . map ( |it| {
542+ it. field_list ( ) . and_then ( |it| match it {
543+ ast:: FieldList :: RecordFieldList ( it) => Some ( it) ,
544+ _ => None ,
545+ } )
546+ } )
547+ }
548+ crate :: VariantId :: UnionId ( it) => {
549+ let s = it. lookup ( db) ;
550+ s. source ( db) . map ( |it| it. record_field_list ( ) )
551+ }
552+ } ;
553+ field_list. map ( |it| {
554+ it. and_then ( |it| it. fields ( ) . nth ( self . local_id . into_raw ( ) . into_u32 ( ) as usize ) )
555+ } )
556+ }
557+ }
558+
522559pub type LocalFieldId = Idx < data:: adt:: FieldData > ;
523560
524561#[ derive( Debug , Clone , Copy , PartialEq , Eq , Hash ) ]
@@ -686,6 +723,7 @@ pub enum TypeOwnerId {
686723 TypeAliasId ( TypeAliasId ) ,
687724 ImplId ( ImplId ) ,
688725 EnumVariantId ( EnumVariantId ) ,
726+ FieldId ( FieldId ) ,
689727}
690728
691729impl TypeOwnerId {
@@ -703,6 +741,11 @@ impl TypeOwnerId {
703741 GenericDefId :: AdtId ( AdtId :: EnumId ( it. lookup ( db) . parent ) )
704742 }
705743 TypeOwnerId :: InTypeConstId ( _) => return None ,
744+ TypeOwnerId :: FieldId ( it) => GenericDefId :: AdtId ( match it. parent {
745+ VariantId :: EnumVariantId ( it) => AdtId :: EnumId ( it. lookup ( db) . parent ) ,
746+ VariantId :: StructId ( it) => it. into ( ) ,
747+ VariantId :: UnionId ( it) => it. into ( ) ,
748+ } ) ,
706749 } )
707750 }
708751}
@@ -717,7 +760,8 @@ impl_from!(
717760 TraitAliasId ,
718761 TypeAliasId ,
719762 ImplId ,
720- EnumVariantId
763+ EnumVariantId ,
764+ FieldId
721765 for TypeOwnerId
722766) ;
723767
@@ -730,6 +774,7 @@ impl From<DefWithBodyId> for TypeOwnerId {
730774 DefWithBodyId :: ConstId ( it) => it. into ( ) ,
731775 DefWithBodyId :: InTypeConstId ( it) => it. into ( ) ,
732776 DefWithBodyId :: VariantId ( it) => it. into ( ) ,
777+ DefWithBodyId :: FieldId ( it) => it. into ( ) ,
733778 }
734779 }
735780}
@@ -885,6 +930,7 @@ pub enum DefWithBodyId {
885930 ConstId ( ConstId ) ,
886931 InTypeConstId ( InTypeConstId ) ,
887932 VariantId ( EnumVariantId ) ,
933+ FieldId ( FieldId ) ,
888934}
889935
890936impl_from ! ( FunctionId , ConstId , StaticId , InTypeConstId for DefWithBodyId ) ;
@@ -905,6 +951,7 @@ impl DefWithBodyId {
905951 // FIXME: stable rust doesn't allow generics in constants, but we should
906952 // use `TypeOwnerId::as_generic_def_id` when it does.
907953 DefWithBodyId :: InTypeConstId ( _) => None ,
954+ DefWithBodyId :: FieldId ( _) => None ,
908955 }
909956 }
910957}
@@ -1309,6 +1356,12 @@ impl HasModule for VariantId {
13091356 }
13101357}
13111358
1359+ impl HasModule for FieldId {
1360+ fn module ( & self , db : & dyn DefDatabase ) -> ModuleId {
1361+ self . parent . module ( db)
1362+ }
1363+ }
1364+
13121365impl HasModule for MacroId {
13131366 fn module ( & self , db : & dyn DefDatabase ) -> ModuleId {
13141367 match * self {
@@ -1332,6 +1385,7 @@ impl HasModule for TypeOwnerId {
13321385 TypeOwnerId :: ImplId ( it) => it. module ( db) ,
13331386 TypeOwnerId :: EnumVariantId ( it) => it. module ( db) ,
13341387 TypeOwnerId :: InTypeConstId ( it) => it. lookup ( db) . owner . module ( db) ,
1388+ TypeOwnerId :: FieldId ( it) => it. module ( db) ,
13351389 }
13361390 }
13371391}
@@ -1344,6 +1398,7 @@ impl HasModule for DefWithBodyId {
13441398 DefWithBodyId :: ConstId ( it) => it. module ( db) ,
13451399 DefWithBodyId :: VariantId ( it) => it. module ( db) ,
13461400 DefWithBodyId :: InTypeConstId ( it) => it. lookup ( db) . owner . module ( db) ,
1401+ DefWithBodyId :: FieldId ( it) => it. module ( db) ,
13471402 }
13481403 }
13491404}
0 commit comments