2609: Use generic ItemLoc for impls r=matklad a=matklad



Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
This commit is contained in:
bors[bot] 2019-12-20 12:48:27 +00:00 committed by GitHub
commit fbc2cf2b69
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 61 additions and 198 deletions

View file

@ -754,7 +754,7 @@ impl ImplBlock {
let environment = TraitEnvironment::lower(db, &resolver); let environment = TraitEnvironment::lower(db, &resolver);
let ty = Ty::from_hir(db, &resolver, &impl_data.target_type); let ty = Ty::from_hir(db, &resolver, &impl_data.target_type);
Type { Type {
krate: self.id.lookup(db).container.krate, krate: self.id.lookup(db).container.module(db).krate,
ty: InEnvironment { value: ty, environment }, ty: InEnvironment { value: ty, environment },
} }
} }
@ -768,7 +768,7 @@ impl ImplBlock {
} }
pub fn module(&self, db: &impl DefDatabase) -> Module { 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 { pub fn krate(&self, db: &impl DefDatabase) -> Crate {

View file

@ -45,7 +45,7 @@ use std::hash::Hash;
use hir_expand::{ast_id_map::FileAstId, AstId, HirFileId, InFile, MacroDefId}; use hir_expand::{ast_id_map::FileAstId, AstId, HirFileId, InFile, MacroDefId};
use ra_arena::{impl_arena_id, RawId}; use ra_arena::{impl_arena_id, RawId};
use ra_db::{impl_intern_key, salsa, CrateId}; use ra_db::{impl_intern_key, salsa, CrateId};
use ra_syntax::ast; use ra_syntax::{ast, AstNode};
use crate::builtin_type::BuiltinType; use crate::builtin_type::BuiltinType;
@ -65,101 +65,57 @@ pub struct ModuleId {
pub struct LocalModuleId(RawId); pub struct LocalModuleId(RawId);
impl_arena_id!(LocalModuleId); impl_arena_id!(LocalModuleId);
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] #[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct FunctionId(salsa::InternId); pub struct ItemLoc<N: AstNode> {
impl_intern_key!(FunctionId); pub container: ContainerId,
pub ast_id: AstId<N>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)] #[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct FunctionLoc { pub struct AssocItemLoc<N: AstNode> {
pub container: AssocContainerId, pub container: AssocContainerId,
pub ast_id: AstId<ast::FnDef>, pub ast_id: AstId<N>,
} }
impl Intern for FunctionLoc { macro_rules! impl_intern {
type ID = FunctionId; ($id:ident, $loc:ident, $intern:ident, $lookup:ident) => {
fn intern(self, db: &impl db::DefDatabase) -> FunctionId { impl_intern_key!($id);
db.intern_function(self)
impl Intern for $loc {
type ID = $id;
fn intern(self, db: &impl db::DefDatabase) -> $id {
db.$intern(self)
} }
}
impl Lookup for $id {
type Data = $loc;
fn lookup(&self, db: &impl db::DefDatabase) -> $loc {
db.$lookup(*self)
}
}
};
} }
impl Lookup for FunctionId { #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
type Data = FunctionLoc; pub struct FunctionId(salsa::InternId);
fn lookup(&self, db: &impl db::DefDatabase) -> FunctionLoc { type FunctionLoc = AssocItemLoc<ast::FnDef>;
db.lookup_intern_function(*self) impl_intern!(FunctionId, FunctionLoc, intern_function, lookup_intern_function);
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct StructId(salsa::InternId); pub struct StructId(salsa::InternId);
impl_intern_key!(StructId); type StructLoc = ItemLoc<ast::StructDef>;
impl_intern!(StructId, StructLoc, intern_struct, lookup_intern_struct);
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct StructLoc {
pub container: ContainerId,
pub ast_id: AstId<ast::StructDef>,
}
impl Intern for StructLoc {
type ID = StructId;
fn intern(self, db: &impl db::DefDatabase) -> StructId {
db.intern_struct(self)
}
}
impl Lookup for StructId {
type Data = StructLoc;
fn lookup(&self, db: &impl db::DefDatabase) -> StructLoc {
db.lookup_intern_struct(*self)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct UnionId(salsa::InternId); pub struct UnionId(salsa::InternId);
impl_intern_key!(UnionId); pub type UnionLoc = ItemLoc<ast::UnionDef>;
impl_intern!(UnionId, UnionLoc, intern_union, lookup_intern_union);
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct UnionLoc {
pub container: ContainerId,
pub ast_id: AstId<ast::UnionDef>,
}
impl Intern for UnionLoc {
type ID = UnionId;
fn intern(self, db: &impl db::DefDatabase) -> UnionId {
db.intern_union(self)
}
}
impl Lookup for UnionId {
type Data = UnionLoc;
fn lookup(&self, db: &impl db::DefDatabase) -> UnionLoc {
db.lookup_intern_union(*self)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct EnumId(salsa::InternId); pub struct EnumId(salsa::InternId);
impl_intern_key!(EnumId); pub type EnumLoc = ItemLoc<ast::EnumDef>;
impl_intern!(EnumId, EnumLoc, intern_enum, lookup_intern_enum);
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct EnumLoc {
pub container: ContainerId,
pub ast_id: AstId<ast::EnumDef>,
}
impl Intern for EnumLoc {
type ID = EnumId;
fn intern(self, db: &impl db::DefDatabase) -> EnumId {
db.intern_enum(self)
}
}
impl Lookup for EnumId {
type Data = EnumLoc;
fn lookup(&self, db: &impl db::DefDatabase) -> EnumLoc {
db.lookup_intern_enum(*self)
}
}
// FIXME: rename to `VariantId`, only enums can ave variants // FIXME: rename to `VariantId`, only enums can ave variants
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
@ -184,122 +140,38 @@ impl_arena_id!(LocalStructFieldId);
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct ConstId(salsa::InternId); pub struct ConstId(salsa::InternId);
impl_intern_key!(ConstId); type ConstLoc = AssocItemLoc<ast::ConstDef>;
#[derive(Debug, Clone, PartialEq, Eq, Hash)] impl_intern!(ConstId, ConstLoc, intern_const, lookup_intern_const);
pub struct ConstLoc {
pub container: AssocContainerId,
pub ast_id: AstId<ast::ConstDef>,
}
impl Intern for ConstLoc {
type ID = ConstId;
fn intern(self, db: &impl db::DefDatabase) -> ConstId {
db.intern_const(self)
}
}
impl Lookup for ConstId {
type Data = ConstLoc;
fn lookup(&self, db: &impl db::DefDatabase) -> ConstLoc {
db.lookup_intern_const(*self)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct StaticId(salsa::InternId); pub struct StaticId(salsa::InternId);
impl_intern_key!(StaticId); pub type StaticLoc = ItemLoc<ast::StaticDef>;
impl_intern!(StaticId, StaticLoc, intern_static, lookup_intern_static);
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct StaticLoc {
pub container: ContainerId,
pub ast_id: AstId<ast::StaticDef>,
}
impl Intern for StaticLoc {
type ID = StaticId;
fn intern(self, db: &impl db::DefDatabase) -> StaticId {
db.intern_static(self)
}
}
impl Lookup for StaticId {
type Data = StaticLoc;
fn lookup(&self, db: &impl db::DefDatabase) -> StaticLoc {
db.lookup_intern_static(*self)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct TraitId(salsa::InternId); pub struct TraitId(salsa::InternId);
impl_intern_key!(TraitId); pub type TraitLoc = ItemLoc<ast::TraitDef>;
impl_intern!(TraitId, TraitLoc, intern_trait, lookup_intern_trait);
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct TraitLoc {
pub container: ContainerId,
pub ast_id: AstId<ast::TraitDef>,
}
impl Intern for TraitLoc {
type ID = TraitId;
fn intern(self, db: &impl db::DefDatabase) -> TraitId {
db.intern_trait(self)
}
}
impl Lookup for TraitId {
type Data = TraitLoc;
fn lookup(&self, db: &impl db::DefDatabase) -> TraitLoc {
db.lookup_intern_trait(*self)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct TypeAliasId(salsa::InternId); pub struct TypeAliasId(salsa::InternId);
impl_intern_key!(TypeAliasId); type TypeAliasLoc = AssocItemLoc<ast::TypeAliasDef>;
impl_intern!(TypeAliasId, TypeAliasLoc, intern_type_alias, lookup_intern_type_alias);
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct TypeAliasLoc {
pub container: AssocContainerId,
pub ast_id: AstId<ast::TypeAliasDef>,
}
impl Intern for TypeAliasLoc {
type ID = TypeAliasId;
fn intern(self, db: &impl db::DefDatabase) -> TypeAliasId {
db.intern_type_alias(self)
}
}
impl Lookup for TypeAliasId {
type Data = TypeAliasLoc;
fn lookup(&self, db: &impl db::DefDatabase) -> TypeAliasLoc {
db.lookup_intern_type_alias(*self)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct ImplId(salsa::InternId); pub struct ImplId(salsa::InternId);
impl_intern_key!(ImplId); type ImplLoc = ItemLoc<ast::ImplBlock>;
impl_intern!(ImplId, ImplLoc, intern_impl, lookup_intern_impl);
#[derive(Debug, Clone, PartialEq, Eq, Hash)] #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct ImplLoc { pub struct TypeParamId {
pub container: ModuleId, pub parent: GenericDefId,
pub ast_id: AstId<ast::ImplBlock>, pub local_id: LocalTypeParamId,
} }
impl Intern for ImplLoc { #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
type ID = ImplId; pub struct LocalTypeParamId(RawId);
fn intern(self, db: &impl db::DefDatabase) -> ImplId { impl_arena_id!(LocalTypeParamId);
db.intern_impl(self)
}
}
impl Lookup for ImplId {
type Data = ImplLoc;
fn lookup(&self, db: &impl db::DefDatabase) -> ImplLoc {
db.lookup_intern_impl(*self)
}
}
macro_rules! impl_froms { macro_rules! impl_froms {
($e:ident: $($v:ident $(($($sv:ident),*))?),*) => { ($e:ident: $($v:ident $(($($sv:ident),*))?),*) => {
@ -320,16 +192,6 @@ macro_rules! impl_froms {
} }
} }
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct TypeParamId {
pub parent: GenericDefId,
pub local_id: LocalTypeParamId,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct LocalTypeParamId(RawId);
impl_arena_id!(LocalTypeParamId);
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum ContainerId { pub enum ContainerId {
ModuleId(ModuleId), ModuleId(ModuleId),
@ -498,7 +360,7 @@ impl HasModule for AssocContainerId {
fn module(&self, db: &impl db::DefDatabase) -> ModuleId { fn module(&self, db: &impl db::DefDatabase) -> ModuleId {
match *self { match *self {
AssocContainerId::ContainerId(it) => it.module(db), 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), AssocContainerId::TraitId(it) => it.lookup(db).container.module(db),
} }
} }
@ -550,7 +412,7 @@ impl HasModule for GenericDefId {
GenericDefId::AdtId(it) => it.module(db), GenericDefId::AdtId(it) => it.module(db),
GenericDefId::TraitId(it) => it.lookup(db).container.module(db), GenericDefId::TraitId(it) => it.lookup(db).container.module(db),
GenericDefId::TypeAliasId(it) => it.lookup(db).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::EnumVariantId(it) => it.parent.lookup(db).container.module(db),
GenericDefId::ConstId(it) => it.lookup(db).module(db), GenericDefId::ConstId(it) => it.lookup(db).module(db),
} }

View file

@ -661,9 +661,10 @@ where
krate: self.def_collector.def_map.krate, krate: self.def_collector.def_map.krate,
local_id: self.module_id, local_id: self.module_id,
}; };
let container = ContainerId::ModuleId(module);
let ast_id = self.raw_items[imp].ast_id; let ast_id = self.raw_items[imp].ast_id;
let impl_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); .intern(self.def_collector.db);
self.def_collector.def_map.modules[self.module_id].impls.push(impl_id) self.def_collector.def_map.modules[self.module_id].impls.push(impl_id)
} }

View file

@ -134,7 +134,7 @@ impl Ty {
LangItemTarget::ImplBlockId(it) => Some(it), LangItemTarget::ImplBlockId(it) => Some(it),
_ => None, _ => None,
}) })
.map(|it| it.lookup(db).container.krate) .map(|it| it.lookup(db).container.module(db).krate)
.collect(); .collect();
Some(res) Some(res)
} }

View file

@ -673,7 +673,7 @@ fn impl_block_datum(
let bound_vars = Substs::bound_vars(&generic_params); let bound_vars = Substs::bound_vars(&generic_params);
let trait_ref = trait_ref.subst(&bound_vars); let trait_ref = trait_ref.subst(&bound_vars);
let trait_ = trait_ref.trait_; 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 chalk_rust_ir::ImplType::Local
} else { } else {
chalk_rust_ir::ImplType::External chalk_rust_ir::ImplType::External