mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-29 14:33:29 +00:00
Merge #2609
2609: Use generic ItemLoc for impls r=matklad a=matklad Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
This commit is contained in:
commit
fbc2cf2b69
5 changed files with 61 additions and 198 deletions
|
@ -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 {
|
||||||
|
|
|
@ -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),
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue