@@ -24,12 +24,12 @@ use triomphe::Arc;
2424
2525use crate :: {
2626 db:: DefDatabase ,
27- item_tree:: { AttrOwner , Fields , ItemTreeId , ItemTreeNode } ,
27+ item_tree:: { AttrOwner , Fields , ItemTreeId , ItemTreeModItemNode } ,
2828 lang_item:: LangItem ,
2929 nameres:: { ModuleOrigin , ModuleSource } ,
3030 src:: { HasChildSource , HasSource } ,
31- AdtId , AssocItemLoc , AttrDefId , EnumId , GenericParamId , ItemLoc , LocalEnumVariantId ,
32- LocalFieldId , Lookup , MacroId , VariantId ,
31+ AdtId , AssocItemLoc , AttrDefId , GenericParamId , ItemLoc , LocalFieldId , Lookup , MacroId ,
32+ VariantId ,
3333} ;
3434
3535#[ derive( Default , Debug , Clone , PartialEq , Eq ) ]
@@ -70,33 +70,6 @@ impl ops::Deref for AttrsWithOwner {
7070impl Attrs {
7171 pub const EMPTY : Self = Self ( RawAttrs :: EMPTY ) ;
7272
73- pub ( crate ) fn variants_attrs_query (
74- db : & dyn DefDatabase ,
75- e : EnumId ,
76- ) -> Arc < ArenaMap < LocalEnumVariantId , Attrs > > {
77- let _p = profile:: span ( "variants_attrs_query" ) ;
78- // FIXME: There should be some proper form of mapping between item tree enum variant ids and hir enum variant ids
79- let mut res = ArenaMap :: default ( ) ;
80-
81- let loc = e. lookup ( db) ;
82- let krate = loc. container . krate ;
83- let item_tree = loc. id . item_tree ( db) ;
84- let enum_ = & item_tree[ loc. id . value ] ;
85- let crate_graph = db. crate_graph ( ) ;
86- let cfg_options = & crate_graph[ krate] . cfg_options ;
87-
88- let mut idx = 0 ;
89- for variant in enum_. variants . clone ( ) {
90- let attrs = item_tree. attrs ( db, krate, variant. into ( ) ) ;
91- if attrs. is_cfg_enabled ( cfg_options) {
92- res. insert ( Idx :: from_raw ( RawIdx :: from ( idx) ) , attrs) ;
93- idx += 1 ;
94- }
95- }
96-
97- Arc :: new ( res)
98- }
99-
10073 pub ( crate ) fn fields_attrs_query (
10174 db : & dyn DefDatabase ,
10275 v : VariantId ,
@@ -108,29 +81,11 @@ impl Attrs {
10881 let crate_graph = db. crate_graph ( ) ;
10982 let ( fields, item_tree, krate) = match v {
11083 VariantId :: EnumVariantId ( it) => {
111- let e = it. parent ;
112- let loc = e. lookup ( db) ;
113- let krate = loc. container . krate ;
84+ let loc = it. lookup ( db) ;
85+ let krate = loc. parent . lookup ( db) . container . krate ;
11486 let item_tree = loc. id . item_tree ( db) ;
115- let enum_ = & item_tree[ loc. id . value ] ;
116-
117- let cfg_options = & crate_graph[ krate] . cfg_options ;
118-
119- let Some ( variant) = enum_
120- . variants
121- . clone ( )
122- . filter ( |variant| {
123- let attrs = item_tree. attrs ( db, krate, ( * variant) . into ( ) ) ;
124- attrs. is_cfg_enabled ( cfg_options)
125- } )
126- . zip ( 0u32 ..)
127- . find ( |( _variant, idx) | it. local_id == Idx :: from_raw ( RawIdx :: from ( * idx) ) )
128- . map ( |( variant, _idx) | variant)
129- else {
130- return Arc :: new ( res) ;
131- } ;
132-
133- ( item_tree[ variant] . fields . clone ( ) , item_tree, krate)
87+ let variant = & item_tree[ loc. id . value ] ;
88+ ( variant. fields . clone ( ) , item_tree, krate)
13489 }
13590 VariantId :: StructId ( it) => {
13691 let loc = it. lookup ( db) ;
@@ -401,10 +356,12 @@ impl AttrsWithOwner {
401356 AttrDefId :: FieldId ( it) => {
402357 return db. fields_attrs ( it. parent ) [ it. local_id ] . clone ( ) ;
403358 }
359+ // FIXME: DRY this up
404360 AttrDefId :: EnumVariantId ( it) => {
405- return db. variants_attrs ( it. parent ) [ it. local_id ] . clone ( ) ;
361+ let id = it. lookup ( db) . id ;
362+ let tree = id. item_tree ( db) ;
363+ tree. raw_attrs ( id. value . into ( ) ) . clone ( )
406364 }
407- // FIXME: DRY this up
408365 AttrDefId :: AdtId ( it) => match it {
409366 AdtId :: StructId ( it) => attrs_from_item_tree_loc ( db, it) ,
410367 AdtId :: EnumId ( it) => attrs_from_item_tree_loc ( db, it) ,
@@ -503,12 +460,7 @@ impl AttrsWithOwner {
503460 AdtId :: EnumId ( id) => any_has_attrs ( db, id) ,
504461 } ,
505462 AttrDefId :: FunctionId ( id) => any_has_attrs ( db, id) ,
506- AttrDefId :: EnumVariantId ( id) => {
507- let map = db. variants_attrs_source_map ( id. parent ) ;
508- let file_id = id. parent . lookup ( db) . id . file_id ( ) ;
509- let root = db. parse_or_expand ( file_id) ;
510- InFile :: new ( file_id, ast:: AnyHasAttrs :: new ( map[ id. local_id ] . to_node ( & root) ) )
511- }
463+ AttrDefId :: EnumVariantId ( id) => any_has_attrs ( db, id) ,
512464 AttrDefId :: StaticId ( id) => any_has_attrs ( db, id) ,
513465 AttrDefId :: ConstId ( id) => any_has_attrs ( db, id) ,
514466 AttrDefId :: TraitId ( id) => any_has_attrs ( db, id) ,
@@ -654,42 +606,31 @@ fn any_has_attrs<'db>(
654606 id. lookup ( db) . source ( db) . map ( ast:: AnyHasAttrs :: new)
655607}
656608
657- fn attrs_from_item_tree < N : ItemTreeNode > ( db : & dyn DefDatabase , id : ItemTreeId < N > ) -> RawAttrs {
609+ fn attrs_from_item_tree < N : ItemTreeModItemNode > (
610+ db : & dyn DefDatabase ,
611+ id : ItemTreeId < N > ,
612+ ) -> RawAttrs {
658613 let tree = id. item_tree ( db) ;
659614 let mod_item = N :: id_to_mod_item ( id. value ) ;
660615 tree. raw_attrs ( mod_item. into ( ) ) . clone ( )
661616}
662617
663- fn attrs_from_item_tree_loc < ' db , N : ItemTreeNode > (
618+ fn attrs_from_item_tree_loc < ' db , N : ItemTreeModItemNode > (
664619 db : & ( dyn DefDatabase + ' db ) ,
665620 lookup : impl Lookup < Database < ' db > = dyn DefDatabase + ' db , Data = ItemLoc < N > > ,
666621) -> RawAttrs {
667622 let id = lookup. lookup ( db) . id ;
668623 attrs_from_item_tree ( db, id)
669624}
670625
671- fn attrs_from_item_tree_assoc < ' db , N : ItemTreeNode > (
626+ fn attrs_from_item_tree_assoc < ' db , N : ItemTreeModItemNode > (
672627 db : & ( dyn DefDatabase + ' db ) ,
673628 lookup : impl Lookup < Database < ' db > = dyn DefDatabase + ' db , Data = AssocItemLoc < N > > ,
674629) -> RawAttrs {
675630 let id = lookup. lookup ( db) . id ;
676631 attrs_from_item_tree ( db, id)
677632}
678633
679- pub ( crate ) fn variants_attrs_source_map (
680- db : & dyn DefDatabase ,
681- def : EnumId ,
682- ) -> Arc < ArenaMap < LocalEnumVariantId , AstPtr < ast:: Variant > > > {
683- let mut res = ArenaMap :: default ( ) ;
684- let child_source = def. child_source ( db) ;
685-
686- for ( idx, variant) in child_source. value . iter ( ) {
687- res. insert ( idx, AstPtr :: new ( variant) ) ;
688- }
689-
690- Arc :: new ( res)
691- }
692-
693634pub ( crate ) fn fields_attrs_source_map (
694635 db : & dyn DefDatabase ,
695636 def : VariantId ,
0 commit comments