diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 35e1f752be..ecf883272d 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -754,7 +754,7 @@ impl ImplBlock { let environment = TraitEnvironment::lower(db, &resolver); let ty = Ty::from_hir(db, &resolver, &impl_data.target_type); Type { - krate: self.id.lookup(db).container.krate, + krate: self.id.lookup(db).container.module(db).krate, ty: InEnvironment { value: ty, environment }, } } @@ -768,7 +768,7 @@ impl ImplBlock { } pub fn module(&self, db: &impl DefDatabase) -> Module { - self.id.lookup(db).container.into() + self.id.lookup(db).container.module(db).into() } pub fn krate(&self, db: &impl DefDatabase) -> Crate { diff --git a/crates/ra_hir_def/src/lib.rs b/crates/ra_hir_def/src/lib.rs index faeb2fc8ac..d11b573e5f 100644 --- a/crates/ra_hir_def/src/lib.rs +++ b/crates/ra_hir_def/src/lib.rs @@ -160,27 +160,8 @@ impl_intern!(TypeAliasId, TypeAliasLoc, intern_type_alias, lookup_intern_type_al #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct ImplId(salsa::InternId); -impl_intern_key!(ImplId); - -#[derive(Debug, Clone, PartialEq, Eq, Hash)] -pub struct ImplLoc { - pub container: ModuleId, - pub ast_id: AstId, -} - -impl Intern for ImplLoc { - type ID = ImplId; - fn intern(self, db: &impl db::DefDatabase) -> ImplId { - db.intern_impl(self) - } -} - -impl Lookup for ImplId { - type Data = ImplLoc; - fn lookup(&self, db: &impl db::DefDatabase) -> ImplLoc { - db.lookup_intern_impl(*self) - } -} +type ImplLoc = ItemLoc; +impl_intern!(ImplId, ImplLoc, intern_impl, lookup_intern_impl); #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct TypeParamId { @@ -379,7 +360,7 @@ impl HasModule for AssocContainerId { fn module(&self, db: &impl db::DefDatabase) -> ModuleId { match *self { AssocContainerId::ContainerId(it) => it.module(db), - AssocContainerId::ImplId(it) => it.lookup(db).container, + AssocContainerId::ImplId(it) => it.lookup(db).container.module(db), AssocContainerId::TraitId(it) => it.lookup(db).container.module(db), } } @@ -431,7 +412,7 @@ impl HasModule for GenericDefId { GenericDefId::AdtId(it) => it.module(db), GenericDefId::TraitId(it) => it.lookup(db).container.module(db), GenericDefId::TypeAliasId(it) => it.lookup(db).module(db), - GenericDefId::ImplId(it) => it.lookup(db).container, + GenericDefId::ImplId(it) => it.lookup(db).container.module(db), GenericDefId::EnumVariantId(it) => it.parent.lookup(db).container.module(db), GenericDefId::ConstId(it) => it.lookup(db).module(db), } diff --git a/crates/ra_hir_def/src/nameres/collector.rs b/crates/ra_hir_def/src/nameres/collector.rs index a1ea130e08..e68bf48688 100644 --- a/crates/ra_hir_def/src/nameres/collector.rs +++ b/crates/ra_hir_def/src/nameres/collector.rs @@ -661,9 +661,10 @@ where krate: self.def_collector.def_map.krate, local_id: self.module_id, }; + let container = ContainerId::ModuleId(module); let ast_id = self.raw_items[imp].ast_id; let impl_id = - ImplLoc { container: module, ast_id: AstId::new(self.file_id, ast_id) } + ImplLoc { container, ast_id: AstId::new(self.file_id, ast_id) } .intern(self.def_collector.db); self.def_collector.def_map.modules[self.module_id].impls.push(impl_id) } diff --git a/crates/ra_hir_ty/src/method_resolution.rs b/crates/ra_hir_ty/src/method_resolution.rs index 1b2f4014c6..92fb4c0817 100644 --- a/crates/ra_hir_ty/src/method_resolution.rs +++ b/crates/ra_hir_ty/src/method_resolution.rs @@ -134,7 +134,7 @@ impl Ty { LangItemTarget::ImplBlockId(it) => Some(it), _ => None, }) - .map(|it| it.lookup(db).container.krate) + .map(|it| it.lookup(db).container.module(db).krate) .collect(); Some(res) } diff --git a/crates/ra_hir_ty/src/traits/chalk.rs b/crates/ra_hir_ty/src/traits/chalk.rs index dd4fa9664a..5eb032d86a 100644 --- a/crates/ra_hir_ty/src/traits/chalk.rs +++ b/crates/ra_hir_ty/src/traits/chalk.rs @@ -673,7 +673,7 @@ fn impl_block_datum( let bound_vars = Substs::bound_vars(&generic_params); let trait_ref = trait_ref.subst(&bound_vars); let trait_ = trait_ref.trait_; - let impl_type = if impl_id.lookup(db).container.krate == krate { + let impl_type = if impl_id.lookup(db).container.module(db).krate == krate { chalk_rust_ir::ImplType::Local } else { chalk_rust_ir::ImplType::External