diff --git a/crates/ra_hir/src/adt.rs b/crates/ra_hir/src/adt.rs
index baf853a3a47..17ece93a75e 100644
--- a/crates/ra_hir/src/adt.rs
+++ b/crates/ra_hir/src/adt.rs
@@ -13,7 +13,7 @@ use crate::{
     HirDatabase, DefKind,
     SourceItemId,
     type_ref::TypeRef,
-    ids::{StructLoc, EnumLoc},
+    ids::ItemLoc,
 };
 
 impl Struct {
@@ -23,8 +23,8 @@ impl Struct {
         file_id: HirFileId,
         ast: &ast::StructDef,
     ) -> Struct {
-        let loc: StructLoc = StructLoc::from_ast(db, module, file_id, ast);
-        let id = loc.id(db);
+        let loc = ItemLoc::from_ast(db, module, file_id, ast);
+        let id = db.as_ref().structs.loc2id(&loc);
         Struct { id }
     }
 
@@ -40,8 +40,8 @@ impl Enum {
         file_id: HirFileId,
         ast: &ast::EnumDef,
     ) -> Enum {
-        let loc: EnumLoc = EnumLoc::from_ast(db, module, file_id, ast);
-        let id = loc.id(db);
+        let loc = ItemLoc::from_ast(db, module, file_id, ast);
+        let id = db.as_ref().enums.loc2id(&loc);
         Enum { id }
     }
 }
diff --git a/crates/ra_hir/src/code_model_impl/function.rs b/crates/ra_hir/src/code_model_impl/function.rs
index d8dafb10e4e..8a2ab5714cd 100644
--- a/crates/ra_hir/src/code_model_impl/function.rs
+++ b/crates/ra_hir/src/code_model_impl/function.rs
@@ -9,7 +9,7 @@ use crate::{
     type_ref::{TypeRef, Mutability},
     expr::Body,
     impl_block::ImplBlock,
-    ids::FunctionLoc,
+    ids::ItemLoc,
 };
 
 pub use self::scope::{FnScopes, ScopesWithSyntaxMapping, ScopeEntryWithSyntax};
@@ -21,8 +21,8 @@ impl Function {
         file_id: HirFileId,
         ast: &ast::FnDef,
     ) -> Function {
-        let loc: FunctionLoc = FunctionLoc::from_ast(db, module, file_id, ast);
-        let id = loc.id(db);
+        let loc = ItemLoc::from_ast(db, module, file_id, ast);
+        let id = db.as_ref().fns.loc2id(&loc);
         Function { id }
     }
 
diff --git a/crates/ra_hir/src/ids.rs b/crates/ra_hir/src/ids.rs
index 332cec9c86b..6375c76c9c9 100644
--- a/crates/ra_hir/src/ids.rs
+++ b/crates/ra_hir/src/ids.rs
@@ -13,9 +13,9 @@ use crate::{
 pub struct HirInterner {
     defs: LocationIntener<DefLoc, DefId>,
     macros: LocationIntener<MacroCallLoc, MacroCallId>,
-    fns: LocationIntener<FunctionLoc, FunctionId>,
-    structs: LocationIntener<StructLoc, StructId>,
-    enums: LocationIntener<EnumLoc, EnumId>,
+    pub(crate) fns: LocationIntener<ItemLoc<ast::FnDef>, FunctionId>,
+    pub(crate) structs: LocationIntener<ItemLoc<ast::StructDef>, StructId>,
+    pub(crate) enums: LocationIntener<ItemLoc<ast::EnumDef>, EnumId>,
 }
 
 impl HirInterner {
@@ -182,56 +182,32 @@ impl<N: AstNode> Clone for ItemLoc<N> {
 pub struct FunctionId(RawId);
 impl_arena_id!(FunctionId);
 
-pub(crate) type FunctionLoc = ItemLoc<ast::FnDef>;
-
 impl FunctionId {
-    pub(crate) fn loc(self, db: &impl AsRef<HirInterner>) -> FunctionLoc {
+    pub(crate) fn loc(self, db: &impl AsRef<HirInterner>) -> ItemLoc<ast::FnDef> {
         db.as_ref().fns.id2loc(self)
     }
 }
 
-impl FunctionLoc {
-    pub(crate) fn id(&self, db: &impl AsRef<HirInterner>) -> FunctionId {
-        db.as_ref().fns.loc2id(&self)
-    }
-}
-
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
 pub struct StructId(RawId);
 impl_arena_id!(StructId);
 
-pub(crate) type StructLoc = ItemLoc<ast::StructDef>;
-
 impl StructId {
-    pub(crate) fn loc(self, db: &impl AsRef<HirInterner>) -> StructLoc {
+    pub(crate) fn loc(self, db: &impl AsRef<HirInterner>) -> ItemLoc<ast::StructDef> {
         db.as_ref().structs.id2loc(self)
     }
 }
 
-impl StructLoc {
-    pub(crate) fn id(&self, db: &impl AsRef<HirInterner>) -> StructId {
-        db.as_ref().structs.loc2id(&self)
-    }
-}
-
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
 pub struct EnumId(RawId);
 impl_arena_id!(EnumId);
 
-pub(crate) type EnumLoc = ItemLoc<ast::EnumDef>;
-
 impl EnumId {
-    pub(crate) fn loc(self, db: &impl AsRef<HirInterner>) -> EnumLoc {
+    pub(crate) fn loc(self, db: &impl AsRef<HirInterner>) -> ItemLoc<ast::EnumDef> {
         db.as_ref().enums.id2loc(self)
     }
 }
 
-impl EnumLoc {
-    pub(crate) fn id(&self, db: &impl AsRef<HirInterner>) -> EnumId {
-        db.as_ref().enums.loc2id(&self)
-    }
-}
-
 /// Def's are a core concept of hir. A `Def` is an Item (function, module, etc)
 /// in a specific module.
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]