aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_def/src/nameres
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2020-03-13 15:05:46 +0000
committerAleksey Kladov <[email protected]>2020-03-16 16:42:30 +0000
commit9faea2364dee4fbc9391ad233c570b70256ef002 (patch)
tree160af959553ce57fdfcbc0a6c79bafcc3611aeea /crates/ra_hir_def/src/nameres
parent648df02953a6ebf87a5876668eceba208687e8a7 (diff)
Use `dyn Trait` for working with databse
It improves compile time in `--release` mode quite a bit, it doesn't really slow things down and, conceptually, it seems closer to what we want the physical architecture to look like (we don't want to monomorphise EVERYTHING in a single leaf crate).
Diffstat (limited to 'crates/ra_hir_def/src/nameres')
-rw-r--r--crates/ra_hir_def/src/nameres/collector.rs22
-rw-r--r--crates/ra_hir_def/src/nameres/mod_resolution.rs4
-rw-r--r--crates/ra_hir_def/src/nameres/path_resolution.rs8
-rw-r--r--crates/ra_hir_def/src/nameres/raw.rs8
4 files changed, 16 insertions, 26 deletions
diff --git a/crates/ra_hir_def/src/nameres/collector.rs b/crates/ra_hir_def/src/nameres/collector.rs
index db9838cb5..7a042e69f 100644
--- a/crates/ra_hir_def/src/nameres/collector.rs
+++ b/crates/ra_hir_def/src/nameres/collector.rs
@@ -30,7 +30,7 @@ use crate::{
30 TraitLoc, TypeAliasLoc, UnionLoc, 30 TraitLoc, TypeAliasLoc, UnionLoc,
31}; 31};
32 32
33pub(super) fn collect_defs(db: &impl DefDatabase, mut def_map: CrateDefMap) -> CrateDefMap { 33pub(super) fn collect_defs(db: &dyn DefDatabase, mut def_map: CrateDefMap) -> CrateDefMap {
34 let crate_graph = db.crate_graph(); 34 let crate_graph = db.crate_graph();
35 35
36 // populate external prelude 36 // populate external prelude
@@ -112,8 +112,8 @@ struct DeriveDirective {
112} 112}
113 113
114/// Walks the tree of module recursively 114/// Walks the tree of module recursively
115struct DefCollector<'a, DB> { 115struct DefCollector<'a> {
116 db: &'a DB, 116 db: &'a dyn DefDatabase,
117 def_map: CrateDefMap, 117 def_map: CrateDefMap,
118 glob_imports: FxHashMap<LocalModuleId, Vec<(LocalModuleId, Visibility)>>, 118 glob_imports: FxHashMap<LocalModuleId, Vec<(LocalModuleId, Visibility)>>,
119 unresolved_imports: Vec<ImportDirective>, 119 unresolved_imports: Vec<ImportDirective>,
@@ -124,10 +124,7 @@ struct DefCollector<'a, DB> {
124 cfg_options: &'a CfgOptions, 124 cfg_options: &'a CfgOptions,
125} 125}
126 126
127impl<DB> DefCollector<'_, DB> 127impl DefCollector<'_> {
128where
129 DB: DefDatabase,
130{
131 fn collect(&mut self) { 128 fn collect(&mut self) {
132 let file_id = self.db.crate_graph()[self.def_map.krate].root_file_id; 129 let file_id = self.db.crate_graph()[self.def_map.krate].root_file_id;
133 let raw_items = self.db.raw_items(file_id.into()); 130 let raw_items = self.db.raw_items(file_id.into());
@@ -605,8 +602,8 @@ where
605} 602}
606 603
607/// Walks a single module, populating defs, imports and macros 604/// Walks a single module, populating defs, imports and macros
608struct ModCollector<'a, D> { 605struct ModCollector<'a, 'b> {
609 def_collector: D, 606 def_collector: &'a mut DefCollector<'b>,
610 macro_depth: usize, 607 macro_depth: usize,
611 module_id: LocalModuleId, 608 module_id: LocalModuleId,
612 file_id: HirFileId, 609 file_id: HirFileId,
@@ -614,10 +611,7 @@ struct ModCollector<'a, D> {
614 mod_dir: ModDir, 611 mod_dir: ModDir,
615} 612}
616 613
617impl<DB> ModCollector<'_, &'_ mut DefCollector<'_, DB>> 614impl ModCollector<'_, '_> {
618where
619 DB: DefDatabase,
620{
621 fn collect(&mut self, items: &[raw::RawItem]) { 615 fn collect(&mut self, items: &[raw::RawItem]) {
622 // Note: don't assert that inserted value is fresh: it's simply not true 616 // Note: don't assert that inserted value is fresh: it's simply not true
623 // for macros. 617 // for macros.
@@ -950,7 +944,7 @@ mod tests {
950 944
951 use super::*; 945 use super::*;
952 946
953 fn do_collect_defs(db: &impl DefDatabase, def_map: CrateDefMap) -> CrateDefMap { 947 fn do_collect_defs(db: &dyn DefDatabase, def_map: CrateDefMap) -> CrateDefMap {
954 let mut collector = DefCollector { 948 let mut collector = DefCollector {
955 db, 949 db,
956 def_map, 950 def_map,
diff --git a/crates/ra_hir_def/src/nameres/mod_resolution.rs b/crates/ra_hir_def/src/nameres/mod_resolution.rs
index 14fb8ba3a..386c5cade 100644
--- a/crates/ra_hir_def/src/nameres/mod_resolution.rs
+++ b/crates/ra_hir_def/src/nameres/mod_resolution.rs
@@ -40,12 +40,12 @@ impl ModDir {
40 40
41 pub(super) fn resolve_declaration( 41 pub(super) fn resolve_declaration(
42 &self, 42 &self,
43 db: &impl DefDatabase, 43 db: &dyn DefDatabase,
44 file_id: HirFileId, 44 file_id: HirFileId,
45 name: &Name, 45 name: &Name,
46 attr_path: Option<&SmolStr>, 46 attr_path: Option<&SmolStr>,
47 ) -> Result<(FileId, ModDir), RelativePathBuf> { 47 ) -> Result<(FileId, ModDir), RelativePathBuf> {
48 let file_id = file_id.original_file(db); 48 let file_id = file_id.original_file(db.upcast());
49 49
50 let mut candidate_files = Vec::new(); 50 let mut candidate_files = Vec::new();
51 match attr_to_path(attr_path) { 51 match attr_to_path(attr_path) {
diff --git a/crates/ra_hir_def/src/nameres/path_resolution.rs b/crates/ra_hir_def/src/nameres/path_resolution.rs
index c058e70aa..35a0a0c98 100644
--- a/crates/ra_hir_def/src/nameres/path_resolution.rs
+++ b/crates/ra_hir_def/src/nameres/path_resolution.rs
@@ -70,7 +70,7 @@ impl CrateDefMap {
70 70
71 pub(crate) fn resolve_visibility( 71 pub(crate) fn resolve_visibility(
72 &self, 72 &self,
73 db: &impl DefDatabase, 73 db: &dyn DefDatabase,
74 original_module: LocalModuleId, 74 original_module: LocalModuleId,
75 visibility: &RawVisibility, 75 visibility: &RawVisibility,
76 ) -> Option<Visibility> { 76 ) -> Option<Visibility> {
@@ -98,7 +98,7 @@ impl CrateDefMap {
98 // the result. 98 // the result.
99 pub(super) fn resolve_path_fp_with_macro( 99 pub(super) fn resolve_path_fp_with_macro(
100 &self, 100 &self,
101 db: &impl DefDatabase, 101 db: &dyn DefDatabase,
102 mode: ResolveMode, 102 mode: ResolveMode,
103 original_module: LocalModuleId, 103 original_module: LocalModuleId,
104 path: &ModPath, 104 path: &ModPath,
@@ -262,7 +262,7 @@ impl CrateDefMap {
262 262
263 fn resolve_name_in_module( 263 fn resolve_name_in_module(
264 &self, 264 &self,
265 db: &impl DefDatabase, 265 db: &dyn DefDatabase,
266 module: LocalModuleId, 266 module: LocalModuleId,
267 name: &Name, 267 name: &Name,
268 shadow: BuiltinShadowMode, 268 shadow: BuiltinShadowMode,
@@ -304,7 +304,7 @@ impl CrateDefMap {
304 from_crate_root.or(from_extern_prelude) 304 from_crate_root.or(from_extern_prelude)
305 } 305 }
306 306
307 fn resolve_in_prelude(&self, db: &impl DefDatabase, name: &Name) -> PerNs { 307 fn resolve_in_prelude(&self, db: &dyn DefDatabase, name: &Name) -> PerNs {
308 if let Some(prelude) = self.prelude { 308 if let Some(prelude) = self.prelude {
309 let keep; 309 let keep;
310 let def_map = if prelude.krate == self.krate { 310 let def_map = if prelude.krate == self.krate {
diff --git a/crates/ra_hir_def/src/nameres/raw.rs b/crates/ra_hir_def/src/nameres/raw.rs
index ea3c00da8..0e4931f58 100644
--- a/crates/ra_hir_def/src/nameres/raw.rs
+++ b/crates/ra_hir_def/src/nameres/raw.rs
@@ -9,7 +9,6 @@ use std::{ops::Index, sync::Arc};
9 9
10use hir_expand::{ 10use hir_expand::{
11 ast_id_map::AstIdMap, 11 ast_id_map::AstIdMap,
12 db::AstDatabase,
13 hygiene::Hygiene, 12 hygiene::Hygiene,
14 name::{AsName, Name}, 13 name::{AsName, Name},
15}; 14};
@@ -45,16 +44,13 @@ pub struct RawItems {
45} 44}
46 45
47impl RawItems { 46impl RawItems {
48 pub(crate) fn raw_items_query( 47 pub(crate) fn raw_items_query(db: &dyn DefDatabase, file_id: HirFileId) -> Arc<RawItems> {
49 db: &(impl DefDatabase + AstDatabase),
50 file_id: HirFileId,
51 ) -> Arc<RawItems> {
52 let _p = profile("raw_items_query"); 48 let _p = profile("raw_items_query");
53 let mut collector = RawItemsCollector { 49 let mut collector = RawItemsCollector {
54 raw_items: RawItems::default(), 50 raw_items: RawItems::default(),
55 source_ast_id_map: db.ast_id_map(file_id), 51 source_ast_id_map: db.ast_id_map(file_id),
56 file_id, 52 file_id,
57 hygiene: Hygiene::new(db, file_id), 53 hygiene: Hygiene::new(db.upcast(), file_id),
58 }; 54 };
59 if let Some(node) = db.parse_or_expand(file_id) { 55 if let Some(node) = db.parse_or_expand(file_id) {
60 if let Some(source_file) = ast::SourceFile::cast(node.clone()) { 56 if let Some(source_file) = ast::SourceFile::cast(node.clone()) {