@@ -51,7 +51,7 @@ use hir_def::{
51
51
per_ns:: PerNs ,
52
52
resolver:: { HasResolver , Resolver } ,
53
53
src:: HasSource as _,
54
- AdtId , AssocItemId , AssocItemLoc , AttrDefId , ConstId , ConstParamId , DefWithBodyId , EnumId ,
54
+ AssocItemId , AssocItemLoc , AttrDefId , ConstId , ConstParamId , DefWithBodyId , EnumId ,
55
55
EnumVariantId , FunctionId , GenericDefId , HasModule , ImplId , ItemContainerId , LifetimeParamId ,
56
56
LocalEnumVariantId , LocalFieldId , Lookup , MacroExpander , MacroId , ModuleId , StaticId , StructId ,
57
57
TraitAliasId , TraitId , TypeAliasId , TypeOrConstParamId , TypeParamId , UnionId ,
@@ -118,11 +118,9 @@ pub use {
118
118
path:: { ModPath , PathKind } ,
119
119
type_ref:: { Mutability , TypeRef } ,
120
120
visibility:: Visibility ,
121
- // FIXME: This is here since it is input of a method in `HirWrite`
122
- // and things outside of hir need to implement that trait. We probably
123
- // should move whole `hir_ty::display` to this crate so we will become
124
- // able to use `ModuleDef` or `Definition` instead of `ModuleDefId`.
125
- ModuleDefId ,
121
+ // FIXME: This is here since some queries take it as input that are used
122
+ // outside of hir.
123
+ { AdtId , ModuleDefId } ,
126
124
} ,
127
125
hir_expand:: {
128
126
attrs:: Attr ,
@@ -4408,3 +4406,90 @@ impl HasCrate for Module {
4408
4406
Module :: krate ( * self )
4409
4407
}
4410
4408
}
4409
+
4410
+ pub trait HasContainer {
4411
+ fn container ( & self , db : & dyn HirDatabase ) -> ItemContainer ;
4412
+ }
4413
+
4414
+ impl HasContainer for Module {
4415
+ fn container ( & self , db : & dyn HirDatabase ) -> ItemContainer {
4416
+ // FIXME: handle block expressions as modules (their parent is in a different DefMap)
4417
+ let def_map = self . id . def_map ( db. upcast ( ) ) ;
4418
+ match def_map[ self . id . local_id ] . parent {
4419
+ Some ( parent_id) => ItemContainer :: Module ( Module { id : def_map. module_id ( parent_id) } ) ,
4420
+ None => ItemContainer :: Crate ( def_map. krate ( ) ) ,
4421
+ }
4422
+ }
4423
+ }
4424
+
4425
+ impl HasContainer for Function {
4426
+ fn container ( & self , db : & dyn HirDatabase ) -> ItemContainer {
4427
+ container_id_to_hir ( self . id . lookup ( db. upcast ( ) ) . container )
4428
+ }
4429
+ }
4430
+
4431
+ impl HasContainer for Struct {
4432
+ fn container ( & self , db : & dyn HirDatabase ) -> ItemContainer {
4433
+ ItemContainer :: Module ( Module { id : self . id . lookup ( db. upcast ( ) ) . container } )
4434
+ }
4435
+ }
4436
+
4437
+ impl HasContainer for Union {
4438
+ fn container ( & self , db : & dyn HirDatabase ) -> ItemContainer {
4439
+ ItemContainer :: Module ( Module { id : self . id . lookup ( db. upcast ( ) ) . container } )
4440
+ }
4441
+ }
4442
+
4443
+ impl HasContainer for Enum {
4444
+ fn container ( & self , db : & dyn HirDatabase ) -> ItemContainer {
4445
+ ItemContainer :: Module ( Module { id : self . id . lookup ( db. upcast ( ) ) . container } )
4446
+ }
4447
+ }
4448
+
4449
+ impl HasContainer for TypeAlias {
4450
+ fn container ( & self , db : & dyn HirDatabase ) -> ItemContainer {
4451
+ container_id_to_hir ( self . id . lookup ( db. upcast ( ) ) . container )
4452
+ }
4453
+ }
4454
+
4455
+ impl HasContainer for Const {
4456
+ fn container ( & self , db : & dyn HirDatabase ) -> ItemContainer {
4457
+ container_id_to_hir ( self . id . lookup ( db. upcast ( ) ) . container )
4458
+ }
4459
+ }
4460
+
4461
+ impl HasContainer for Static {
4462
+ fn container ( & self , db : & dyn HirDatabase ) -> ItemContainer {
4463
+ container_id_to_hir ( self . id . lookup ( db. upcast ( ) ) . container )
4464
+ }
4465
+ }
4466
+
4467
+ impl HasContainer for Trait {
4468
+ fn container ( & self , db : & dyn HirDatabase ) -> ItemContainer {
4469
+ ItemContainer :: Module ( Module { id : self . id . lookup ( db. upcast ( ) ) . container } )
4470
+ }
4471
+ }
4472
+
4473
+ impl HasContainer for TraitAlias {
4474
+ fn container ( & self , db : & dyn HirDatabase ) -> ItemContainer {
4475
+ ItemContainer :: Module ( Module { id : self . id . lookup ( db. upcast ( ) ) . container } )
4476
+ }
4477
+ }
4478
+
4479
+ fn container_id_to_hir ( c : ItemContainerId ) -> ItemContainer {
4480
+ match c {
4481
+ ItemContainerId :: ExternBlockId ( _id) => ItemContainer :: ExternBlock ( ) ,
4482
+ ItemContainerId :: ModuleId ( id) => ItemContainer :: Module ( Module { id } ) ,
4483
+ ItemContainerId :: ImplId ( id) => ItemContainer :: Impl ( Impl { id } ) ,
4484
+ ItemContainerId :: TraitId ( id) => ItemContainer :: Trait ( Trait { id } ) ,
4485
+ }
4486
+ }
4487
+
4488
+ #[ derive( Debug , Clone , Copy , PartialEq , Eq , Hash ) ]
4489
+ pub enum ItemContainer {
4490
+ Trait ( Trait ) ,
4491
+ Impl ( Impl ) ,
4492
+ Module ( Module ) ,
4493
+ ExternBlock ( ) ,
4494
+ Crate ( CrateId ) ,
4495
+ }
0 commit comments