@@ -28,8 +28,8 @@ use crate::{
28
28
lang_item:: LangItem ,
29
29
nameres:: { ModuleOrigin , ModuleSource } ,
30
30
src:: { HasChildSource , HasSource } ,
31
- AdtId , AttrDefId , EnumId , GenericParamId , LocalEnumVariantId , LocalFieldId , Lookup , MacroId ,
32
- VariantId ,
31
+ AdtId , AssocItemLoc , AttrDefId , EnumId , GenericParamId , ItemLoc , LocalEnumVariantId ,
32
+ LocalFieldId , Lookup , MacroId , VariantId ,
33
33
} ;
34
34
35
35
/// Holds documentation
@@ -421,23 +421,24 @@ impl AttrsWithOwner {
421
421
AttrDefId :: EnumVariantId ( it) => {
422
422
return db. variants_attrs ( it. parent ) [ it. local_id ] . clone ( ) ;
423
423
}
424
+ // FIXME: DRY this up
424
425
AttrDefId :: AdtId ( it) => match it {
425
- AdtId :: StructId ( it) => attrs_from_item_tree ( it . lookup ( db ) . id , db ) ,
426
- AdtId :: EnumId ( it) => attrs_from_item_tree ( it . lookup ( db ) . id , db ) ,
427
- AdtId :: UnionId ( it) => attrs_from_item_tree ( it . lookup ( db ) . id , db ) ,
426
+ AdtId :: StructId ( it) => attrs_from_item_tree_loc ( db , it ) ,
427
+ AdtId :: EnumId ( it) => attrs_from_item_tree_loc ( db , it ) ,
428
+ AdtId :: UnionId ( it) => attrs_from_item_tree_loc ( db , it ) ,
428
429
} ,
429
- AttrDefId :: TraitId ( it) => attrs_from_item_tree ( it . lookup ( db ) . id , db ) ,
430
- AttrDefId :: TraitAliasId ( it) => attrs_from_item_tree ( it . lookup ( db ) . id , db ) ,
430
+ AttrDefId :: TraitId ( it) => attrs_from_item_tree_loc ( db , it ) ,
431
+ AttrDefId :: TraitAliasId ( it) => attrs_from_item_tree_loc ( db , it ) ,
431
432
AttrDefId :: MacroId ( it) => match it {
432
- MacroId :: Macro2Id ( it) => attrs_from_item_tree ( it. lookup ( db) . id , db ) ,
433
- MacroId :: MacroRulesId ( it) => attrs_from_item_tree ( it. lookup ( db) . id , db ) ,
434
- MacroId :: ProcMacroId ( it) => attrs_from_item_tree ( it. lookup ( db) . id , db ) ,
433
+ MacroId :: Macro2Id ( it) => attrs_from_item_tree ( db , it. lookup ( db) . id ) ,
434
+ MacroId :: MacroRulesId ( it) => attrs_from_item_tree ( db , it. lookup ( db) . id ) ,
435
+ MacroId :: ProcMacroId ( it) => attrs_from_item_tree ( db , it. lookup ( db) . id ) ,
435
436
} ,
436
- AttrDefId :: ImplId ( it) => attrs_from_item_tree ( it . lookup ( db ) . id , db ) ,
437
- AttrDefId :: ConstId ( it) => attrs_from_item_tree ( it . lookup ( db ) . id , db ) ,
438
- AttrDefId :: StaticId ( it) => attrs_from_item_tree ( it . lookup ( db ) . id , db ) ,
439
- AttrDefId :: FunctionId ( it) => attrs_from_item_tree ( it . lookup ( db ) . id , db ) ,
440
- AttrDefId :: TypeAliasId ( it) => attrs_from_item_tree ( it . lookup ( db ) . id , db ) ,
437
+ AttrDefId :: ImplId ( it) => attrs_from_item_tree_loc ( db , it ) ,
438
+ AttrDefId :: ConstId ( it) => attrs_from_item_tree_assoc ( db , it ) ,
439
+ AttrDefId :: StaticId ( it) => attrs_from_item_tree_assoc ( db , it ) ,
440
+ AttrDefId :: FunctionId ( it) => attrs_from_item_tree_assoc ( db , it ) ,
441
+ AttrDefId :: TypeAliasId ( it) => attrs_from_item_tree_assoc ( db , it ) ,
441
442
AttrDefId :: GenericParamId ( it) => match it {
442
443
GenericParamId :: ConstParamId ( it) => {
443
444
let src = it. parent ( ) . child_source ( db) ;
@@ -458,7 +459,7 @@ impl AttrsWithOwner {
458
459
RawAttrs :: from_attrs_owner ( db. upcast ( ) , src. with_value ( & src. value [ it. local_id ] ) )
459
460
}
460
461
} ,
461
- AttrDefId :: ExternBlockId ( it) => attrs_from_item_tree ( it . lookup ( db ) . id , db ) ,
462
+ AttrDefId :: ExternBlockId ( it) => attrs_from_item_tree_loc ( db , it ) ,
462
463
} ;
463
464
464
465
let attrs = raw_attrs. filter ( db. upcast ( ) , def. krate ( db) ) ;
@@ -506,28 +507,28 @@ impl AttrsWithOwner {
506
507
InFile :: new ( file_id, owner)
507
508
}
508
509
AttrDefId :: AdtId ( adt) => match adt {
509
- AdtId :: StructId ( id) => id . lookup ( db) . source ( db ) . map ( ast :: AnyHasAttrs :: new ) ,
510
- AdtId :: UnionId ( id) => id . lookup ( db) . source ( db ) . map ( ast :: AnyHasAttrs :: new ) ,
511
- AdtId :: EnumId ( id) => id . lookup ( db) . source ( db ) . map ( ast :: AnyHasAttrs :: new ) ,
510
+ AdtId :: StructId ( id) => any_has_attrs ( db, id ) ,
511
+ AdtId :: UnionId ( id) => any_has_attrs ( db, id ) ,
512
+ AdtId :: EnumId ( id) => any_has_attrs ( db, id ) ,
512
513
} ,
513
- AttrDefId :: FunctionId ( id) => id . lookup ( db) . source ( db ) . map ( ast :: AnyHasAttrs :: new ) ,
514
+ AttrDefId :: FunctionId ( id) => any_has_attrs ( db, id ) ,
514
515
AttrDefId :: EnumVariantId ( id) => {
515
516
let map = db. variants_attrs_source_map ( id. parent ) ;
516
517
let file_id = id. parent . lookup ( db) . id . file_id ( ) ;
517
518
let root = db. parse_or_expand ( file_id) ;
518
519
InFile :: new ( file_id, ast:: AnyHasAttrs :: new ( map[ id. local_id ] . to_node ( & root) ) )
519
520
}
520
- AttrDefId :: StaticId ( id) => id . lookup ( db) . source ( db ) . map ( ast :: AnyHasAttrs :: new ) ,
521
- AttrDefId :: ConstId ( id) => id . lookup ( db) . source ( db ) . map ( ast :: AnyHasAttrs :: new ) ,
522
- AttrDefId :: TraitId ( id) => id . lookup ( db) . source ( db ) . map ( ast :: AnyHasAttrs :: new ) ,
523
- AttrDefId :: TraitAliasId ( id) => id . lookup ( db) . source ( db ) . map ( ast :: AnyHasAttrs :: new ) ,
524
- AttrDefId :: TypeAliasId ( id) => id . lookup ( db) . source ( db ) . map ( ast :: AnyHasAttrs :: new ) ,
521
+ AttrDefId :: StaticId ( id) => any_has_attrs ( db, id ) ,
522
+ AttrDefId :: ConstId ( id) => any_has_attrs ( db, id ) ,
523
+ AttrDefId :: TraitId ( id) => any_has_attrs ( db, id ) ,
524
+ AttrDefId :: TraitAliasId ( id) => any_has_attrs ( db, id ) ,
525
+ AttrDefId :: TypeAliasId ( id) => any_has_attrs ( db, id ) ,
525
526
AttrDefId :: MacroId ( id) => match id {
526
- MacroId :: Macro2Id ( id) => id . lookup ( db) . source ( db ) . map ( ast :: AnyHasAttrs :: new ) ,
527
- MacroId :: MacroRulesId ( id) => id . lookup ( db) . source ( db ) . map ( ast :: AnyHasAttrs :: new ) ,
528
- MacroId :: ProcMacroId ( id) => id . lookup ( db) . source ( db ) . map ( ast :: AnyHasAttrs :: new ) ,
527
+ MacroId :: Macro2Id ( id) => any_has_attrs ( db, id ) ,
528
+ MacroId :: MacroRulesId ( id) => any_has_attrs ( db, id ) ,
529
+ MacroId :: ProcMacroId ( id) => any_has_attrs ( db, id ) ,
529
530
} ,
530
- AttrDefId :: ImplId ( id) => id . lookup ( db) . source ( db ) . map ( ast :: AnyHasAttrs :: new ) ,
531
+ AttrDefId :: ImplId ( id) => any_has_attrs ( db, id ) ,
531
532
AttrDefId :: GenericParamId ( id) => match id {
532
533
GenericParamId :: ConstParamId ( id) => id
533
534
. parent ( )
@@ -542,7 +543,7 @@ impl AttrsWithOwner {
542
543
. child_source ( db)
543
544
. map ( |source| ast:: AnyHasAttrs :: new ( source[ id. local_id ] . clone ( ) ) ) ,
544
545
} ,
545
- AttrDefId :: ExternBlockId ( id) => id . lookup ( db) . source ( db ) . map ( ast :: AnyHasAttrs :: new ) ,
546
+ AttrDefId :: ExternBlockId ( id) => any_has_attrs ( db, id ) ,
546
547
} ;
547
548
548
549
AttrSourceMap :: new ( owner. as_ref ( ) . map ( |node| node as & dyn HasAttrs ) )
@@ -769,12 +770,35 @@ impl<'attr> AttrQuery<'attr> {
769
770
}
770
771
}
771
772
772
- fn attrs_from_item_tree < N : ItemTreeNode > ( id : ItemTreeId < N > , db : & dyn DefDatabase ) -> RawAttrs {
773
+ fn any_has_attrs (
774
+ db : & dyn DefDatabase ,
775
+ id : impl Lookup < Data = impl HasSource < Value = impl ast:: HasAttrs > > ,
776
+ ) -> InFile < ast:: AnyHasAttrs > {
777
+ id. lookup ( db) . source ( db) . map ( ast:: AnyHasAttrs :: new)
778
+ }
779
+
780
+ fn attrs_from_item_tree < N : ItemTreeNode > ( db : & dyn DefDatabase , id : ItemTreeId < N > ) -> RawAttrs {
773
781
let tree = id. item_tree ( db) ;
774
782
let mod_item = N :: id_to_mod_item ( id. value ) ;
775
783
tree. raw_attrs ( mod_item. into ( ) ) . clone ( )
776
784
}
777
785
786
+ fn attrs_from_item_tree_loc < N : ItemTreeNode > (
787
+ db : & dyn DefDatabase ,
788
+ lookup : impl Lookup < Data = ItemLoc < N > > ,
789
+ ) -> RawAttrs {
790
+ let id = lookup. lookup ( db) . id ;
791
+ attrs_from_item_tree ( db, id)
792
+ }
793
+
794
+ fn attrs_from_item_tree_assoc < N : ItemTreeNode > (
795
+ db : & dyn DefDatabase ,
796
+ lookup : impl Lookup < Data = AssocItemLoc < N > > ,
797
+ ) -> RawAttrs {
798
+ let id = lookup. lookup ( db) . id ;
799
+ attrs_from_item_tree ( db, id)
800
+ }
801
+
778
802
pub ( crate ) fn variants_attrs_source_map (
779
803
db : & dyn DefDatabase ,
780
804
def : EnumId ,
0 commit comments