From aeb5e061a8912b3b80bef3d1e8155c6c2f32855a Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 15 Nov 2019 19:04:00 +0300 Subject: Reduce visibility --- crates/ra_hir_def/src/nameres.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'crates/ra_hir_def/src') diff --git a/crates/ra_hir_def/src/nameres.rs b/crates/ra_hir_def/src/nameres.rs index 21d5f62e0..dfcec6443 100644 --- a/crates/ra_hir_def/src/nameres.rs +++ b/crates/ra_hir_def/src/nameres.rs @@ -131,7 +131,7 @@ pub(crate) struct Declarations { #[derive(Debug, Default, PartialEq, Eq, Clone)] pub struct ModuleScope { - pub items: FxHashMap, + items: FxHashMap, /// Macros visable in current module in legacy textual scope /// /// For macros invoked by an unquatified identifier like `bar!()`, `legacy_macros` will be searched in first. -- cgit v1.2.3 From 080dd31f8460cba0298405fbcfcab8b61a4667ff Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 15 Nov 2019 19:14:50 +0300 Subject: Add ImplId --- crates/ra_hir_def/src/db.rs | 19 ++++++++++--------- crates/ra_hir_def/src/lib.rs | 12 ++++++++++++ 2 files changed, 22 insertions(+), 9 deletions(-) (limited to 'crates/ra_hir_def/src') diff --git a/crates/ra_hir_def/src/db.rs b/crates/ra_hir_def/src/db.rs index 40b5920d9..40e68a3c3 100644 --- a/crates/ra_hir_def/src/db.rs +++ b/crates/ra_hir_def/src/db.rs @@ -12,26 +12,27 @@ use crate::{ raw::{ImportSourceMap, RawItems}, CrateDefMap, }, - DefWithBodyId, EnumId, StructOrUnionId, + DefWithBodyId, EnumId, ItemLoc, StructOrUnionId, }; #[salsa::query_group(InternDatabaseStorage)] pub trait InternDatabase: SourceDatabase { #[salsa::interned] - fn intern_function(&self, loc: crate::ItemLoc) -> crate::FunctionId; + fn intern_function(&self, loc: ItemLoc) -> crate::FunctionId; #[salsa::interned] - fn intern_struct_or_union(&self, loc: crate::ItemLoc) - -> crate::StructOrUnionId; + fn intern_struct_or_union(&self, loc: ItemLoc) -> crate::StructOrUnionId; #[salsa::interned] - fn intern_enum(&self, loc: crate::ItemLoc) -> crate::EnumId; + fn intern_enum(&self, loc: ItemLoc) -> crate::EnumId; #[salsa::interned] - fn intern_const(&self, loc: crate::ItemLoc) -> crate::ConstId; + fn intern_const(&self, loc: ItemLoc) -> crate::ConstId; #[salsa::interned] - fn intern_static(&self, loc: crate::ItemLoc) -> crate::StaticId; + fn intern_static(&self, loc: ItemLoc) -> crate::StaticId; #[salsa::interned] - fn intern_trait(&self, loc: crate::ItemLoc) -> crate::TraitId; + fn intern_trait(&self, loc: ItemLoc) -> crate::TraitId; #[salsa::interned] - fn intern_type_alias(&self, loc: crate::ItemLoc) -> crate::TypeAliasId; + fn intern_type_alias(&self, loc: ItemLoc) -> crate::TypeAliasId; + #[salsa::interned] + fn intern_impl(&self, loc: ItemLoc) -> crate::ImplId; } #[salsa::query_group(DefDatabase2Storage)] diff --git a/crates/ra_hir_def/src/lib.rs b/crates/ra_hir_def/src/lib.rs index 3fab7965c..22650db8b 100644 --- a/crates/ra_hir_def/src/lib.rs +++ b/crates/ra_hir_def/src/lib.rs @@ -321,6 +321,18 @@ impl AstItemDef for TypeAliasId { } } +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub struct ImplId(salsa::InternId); +impl_intern_key!(ImplId); +impl AstItemDef for ImplId { + fn intern(db: &impl InternDatabase, loc: ItemLoc) -> Self { + db.intern_impl(loc) + } + fn lookup_intern(self, db: &impl InternDatabase) -> ItemLoc { + db.lookup_intern_impl(self) + } +} + macro_rules! impl_froms { ($e:ident: $($v:ident $(($($sv:ident),*))?),*) => { $( -- cgit v1.2.3 From ea3540c1a8efb3b9c56847f831b08abb3be2d978 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 15 Nov 2019 19:32:56 +0300 Subject: Store impls in CrateDefMap --- crates/ra_hir_def/src/nameres.rs | 3 ++- crates/ra_hir_def/src/nameres/collector.rs | 11 ++++++++++- crates/ra_hir_def/src/nameres/raw.rs | 29 +++++++++++++++++++++++++++-- 3 files changed, 39 insertions(+), 4 deletions(-) (limited to 'crates/ra_hir_def/src') diff --git a/crates/ra_hir_def/src/nameres.rs b/crates/ra_hir_def/src/nameres.rs index dfcec6443..49e33ccc4 100644 --- a/crates/ra_hir_def/src/nameres.rs +++ b/crates/ra_hir_def/src/nameres.rs @@ -73,7 +73,7 @@ use crate::{ diagnostics::DefDiagnostic, path_resolution::ResolveMode, per_ns::PerNs, raw::ImportId, }, path::Path, - AstId, CrateModuleId, FunctionId, ModuleDefId, ModuleId, TraitId, + AstId, CrateModuleId, FunctionId, ImplId, ModuleDefId, ModuleId, TraitId, }; /// Contains all top-level defs from a macro-expanded crate @@ -122,6 +122,7 @@ pub struct ModuleData { /// /// Note that non-inline modules, by definition, live inside non-macro file. pub definition: Option, + pub impls: Vec, } #[derive(Default, Debug, PartialEq, Eq, Clone)] diff --git a/crates/ra_hir_def/src/nameres/collector.rs b/crates/ra_hir_def/src/nameres/collector.rs index 5c899aff3..c9ccb9023 100644 --- a/crates/ra_hir_def/src/nameres/collector.rs +++ b/crates/ra_hir_def/src/nameres/collector.rs @@ -19,7 +19,7 @@ use crate::{ per_ns::PerNs, raw, CrateDefMap, ModuleData, Resolution, ResolveMode, }, path::{Path, PathKind}, - AdtId, AstId, AstItemDef, ConstId, CrateModuleId, EnumId, EnumVariantId, FunctionId, + AdtId, AstId, AstItemDef, ConstId, CrateModuleId, EnumId, EnumVariantId, FunctionId, ImplId, LocationCtx, ModuleDefId, ModuleId, StaticId, StructId, StructOrUnionId, TraitId, TypeAliasId, UnionId, }; @@ -571,6 +571,15 @@ where .push((self.module_id, import_id, self.raw_items[import_id].clone())), raw::RawItemKind::Def(def) => self.define_def(&self.raw_items[def]), raw::RawItemKind::Macro(mac) => self.collect_macro(&self.raw_items[mac]), + raw::RawItemKind::Impl(imp) => { + let module = ModuleId { + krate: self.def_collector.def_map.krate, + module_id: self.module_id, + }; + let ctx = LocationCtx::new(self.def_collector.db, module, self.file_id); + let imp_id = ImplId::from_ast_id(ctx, self.raw_items[imp].ast_id); + self.def_collector.def_map.modules[self.module_id].impls.push(imp_id) + } } } } diff --git a/crates/ra_hir_def/src/nameres/raw.rs b/crates/ra_hir_def/src/nameres/raw.rs index f52002bc0..a0a2c7273 100644 --- a/crates/ra_hir_def/src/nameres/raw.rs +++ b/crates/ra_hir_def/src/nameres/raw.rs @@ -28,6 +28,7 @@ pub struct RawItems { imports: Arena, defs: Arena, macros: Arena, + impls: Arena, /// items for top-level module items: Vec, } @@ -121,6 +122,13 @@ impl Index for RawItems { } } +impl Index for RawItems { + type Output = ImplData; + fn index(&self, idx: Impl) -> &ImplData { + &self.impls[idx] + } +} + // Avoid heap allocation on items without attributes. type Attrs = Option>; @@ -142,6 +150,7 @@ pub(super) enum RawItemKind { Import(ImportId), Def(Def), Macro(Macro), + Impl(Impl), } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] @@ -203,6 +212,15 @@ pub(super) struct MacroData { pub(super) builtin: bool, } +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub(super) struct Impl(RawId); +impl_arena_id!(Impl); + +#[derive(Debug, PartialEq, Eq)] +pub(super) struct ImplData { + pub(super) ast_id: FileAstId, +} + struct RawItemsCollector { raw_items: RawItems, source_ast_id_map: Arc, @@ -236,8 +254,8 @@ impl RawItemsCollector { self.add_extern_crate_item(current_module, extern_crate); return; } - ast::ModuleItem::ImplBlock(_) => { - // impls don't participate in name resolution + ast::ModuleItem::ImplBlock(it) => { + self.add_impl(current_module, it); return; } ast::ModuleItem::StructDef(it) => { @@ -376,6 +394,13 @@ impl RawItemsCollector { self.push_item(current_module, attrs, RawItemKind::Macro(m)); } + fn add_impl(&mut self, current_module: Option, imp: ast::ImplBlock) { + let attrs = self.parse_attrs(&imp); + let ast_id = self.source_ast_id_map.ast_id(&imp); + let imp = self.raw_items.impls.alloc(ImplData { ast_id }); + self.push_item(current_module, attrs, RawItemKind::Impl(imp)) + } + fn push_import( &mut self, current_module: Option, -- cgit v1.2.3 From b21829f7edd71fb14911fc6ba47fe715757e415f Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 15 Nov 2019 21:28:00 +0300 Subject: Remove old impls infrastructure --- crates/ra_hir_def/src/db.rs | 6 +++- crates/ra_hir_def/src/imp.rs | 71 ++++++++++++++++++++++++++++++++++++++++++++ crates/ra_hir_def/src/lib.rs | 13 ++++++++ 3 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 crates/ra_hir_def/src/imp.rs (limited to 'crates/ra_hir_def/src') diff --git a/crates/ra_hir_def/src/db.rs b/crates/ra_hir_def/src/db.rs index 40e68a3c3..348aca07f 100644 --- a/crates/ra_hir_def/src/db.rs +++ b/crates/ra_hir_def/src/db.rs @@ -8,11 +8,12 @@ use ra_syntax::ast; use crate::{ adt::{EnumData, StructData}, body::{scope::ExprScopes, Body, BodySourceMap}, + imp::ImplData, nameres::{ raw::{ImportSourceMap, RawItems}, CrateDefMap, }, - DefWithBodyId, EnumId, ItemLoc, StructOrUnionId, + DefWithBodyId, EnumId, ImplId, ItemLoc, StructOrUnionId, }; #[salsa::query_group(InternDatabaseStorage)] @@ -55,6 +56,9 @@ pub trait DefDatabase2: InternDatabase + AstDatabase { #[salsa::invoke(EnumData::enum_data_query)] fn enum_data(&self, e: EnumId) -> Arc; + #[salsa::invoke(ImplData::impl_data_query)] + fn impl_data(&self, e: ImplId) -> Arc; + #[salsa::invoke(Body::body_with_source_map_query)] fn body_with_source_map(&self, def: DefWithBodyId) -> (Arc, Arc); diff --git a/crates/ra_hir_def/src/imp.rs b/crates/ra_hir_def/src/imp.rs new file mode 100644 index 000000000..717991c40 --- /dev/null +++ b/crates/ra_hir_def/src/imp.rs @@ -0,0 +1,71 @@ +//! Defines hir-level representation of impls. +//! +//! The handling is similar, but is not quite the same as for other items, +//! because `impl`s don't have names. + +use std::sync::Arc; + +use ra_syntax::ast; + +use crate::{ + db::DefDatabase2, type_ref::TypeRef, AssocItemId, AstItemDef, ConstId, FunctionId, ImplId, + LocationCtx, TypeAliasId, +}; + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct ImplData { + target_trait: Option, + target_type: TypeRef, + items: Vec, + negative: bool, +} + +impl ImplData { + pub(crate) fn impl_data_query(db: &impl DefDatabase2, id: ImplId) -> Arc { + let src = id.source(db); + let items = db.ast_id_map(src.file_id); + + let target_trait = src.ast.target_trait().map(TypeRef::from_ast); + let target_type = TypeRef::from_ast_opt(src.ast.target_type()); + let negative = src.ast.is_negative(); + + let items = if let Some(item_list) = src.ast.item_list() { + let ctx = LocationCtx::new(db, id.module(db), src.file_id); + item_list + .impl_items() + .map(|item_node| match item_node { + ast::ImplItem::FnDef(it) => { + FunctionId::from_ast_id(ctx, items.ast_id(&it)).into() + } + ast::ImplItem::ConstDef(it) => { + ConstId::from_ast_id(ctx, items.ast_id(&it)).into() + } + ast::ImplItem::TypeAliasDef(it) => { + TypeAliasId::from_ast_id(ctx, items.ast_id(&it)).into() + } + }) + .collect() + } else { + Vec::new() + }; + + let res = ImplData { target_trait, target_type, items, negative }; + Arc::new(res) + } + + pub fn target_trait(&self) -> Option<&TypeRef> { + self.target_trait.as_ref() + } + + pub fn target_type(&self) -> &TypeRef { + &self.target_type + } + + pub fn items(&self) -> &[AssocItemId] { + &self.items + } + + pub fn is_negative(&self) -> bool { + self.negative + } +} diff --git a/crates/ra_hir_def/src/lib.rs b/crates/ra_hir_def/src/lib.rs index 22650db8b..0a59c4ad7 100644 --- a/crates/ra_hir_def/src/lib.rs +++ b/crates/ra_hir_def/src/lib.rs @@ -13,6 +13,7 @@ pub mod path; pub mod type_ref; pub mod builtin_type; pub mod adt; +pub mod imp; pub mod diagnostics; pub mod expr; pub mod body; @@ -396,3 +397,15 @@ pub enum DefWithBodyId { } impl_froms!(DefWithBodyId: FunctionId, ConstId, StaticId); + +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +pub enum AssocItemId { + FunctionId(FunctionId), + ConstId(ConstId), + TypeAliasId(TypeAliasId), +} +// FIXME: not every function, ... is actually an assoc item. maybe we should make +// sure that you can only turn actual assoc items into AssocItemIds. This would +// require not implementing From, and instead having some checked way of +// casting them, and somehow making the constructors private, which would be annoying. +impl_froms!(AssocItemId: FunctionId, ConstId, TypeAliasId); -- cgit v1.2.3