From 9faea2364dee4fbc9391ad233c570b70256ef002 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 13 Mar 2020 16:05:46 +0100 Subject: 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). --- crates/ra_hir_def/src/nameres/collector.rs | 22 ++++++++-------------- crates/ra_hir_def/src/nameres/mod_resolution.rs | 4 ++-- crates/ra_hir_def/src/nameres/path_resolution.rs | 8 ++++---- crates/ra_hir_def/src/nameres/raw.rs | 8 ++------ 4 files changed, 16 insertions(+), 26 deletions(-) (limited to 'crates/ra_hir_def/src/nameres') 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::{ TraitLoc, TypeAliasLoc, UnionLoc, }; -pub(super) fn collect_defs(db: &impl DefDatabase, mut def_map: CrateDefMap) -> CrateDefMap { +pub(super) fn collect_defs(db: &dyn DefDatabase, mut def_map: CrateDefMap) -> CrateDefMap { let crate_graph = db.crate_graph(); // populate external prelude @@ -112,8 +112,8 @@ struct DeriveDirective { } /// Walks the tree of module recursively -struct DefCollector<'a, DB> { - db: &'a DB, +struct DefCollector<'a> { + db: &'a dyn DefDatabase, def_map: CrateDefMap, glob_imports: FxHashMap>, unresolved_imports: Vec, @@ -124,10 +124,7 @@ struct DefCollector<'a, DB> { cfg_options: &'a CfgOptions, } -impl DefCollector<'_, DB> -where - DB: DefDatabase, -{ +impl DefCollector<'_> { fn collect(&mut self) { let file_id = self.db.crate_graph()[self.def_map.krate].root_file_id; let raw_items = self.db.raw_items(file_id.into()); @@ -605,8 +602,8 @@ where } /// Walks a single module, populating defs, imports and macros -struct ModCollector<'a, D> { - def_collector: D, +struct ModCollector<'a, 'b> { + def_collector: &'a mut DefCollector<'b>, macro_depth: usize, module_id: LocalModuleId, file_id: HirFileId, @@ -614,10 +611,7 @@ struct ModCollector<'a, D> { mod_dir: ModDir, } -impl ModCollector<'_, &'_ mut DefCollector<'_, DB>> -where - DB: DefDatabase, -{ +impl ModCollector<'_, '_> { fn collect(&mut self, items: &[raw::RawItem]) { // Note: don't assert that inserted value is fresh: it's simply not true // for macros. @@ -950,7 +944,7 @@ mod tests { use super::*; - fn do_collect_defs(db: &impl DefDatabase, def_map: CrateDefMap) -> CrateDefMap { + fn do_collect_defs(db: &dyn DefDatabase, def_map: CrateDefMap) -> CrateDefMap { let mut collector = DefCollector { db, 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 { pub(super) fn resolve_declaration( &self, - db: &impl DefDatabase, + db: &dyn DefDatabase, file_id: HirFileId, name: &Name, attr_path: Option<&SmolStr>, ) -> Result<(FileId, ModDir), RelativePathBuf> { - let file_id = file_id.original_file(db); + let file_id = file_id.original_file(db.upcast()); let mut candidate_files = Vec::new(); 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 { pub(crate) fn resolve_visibility( &self, - db: &impl DefDatabase, + db: &dyn DefDatabase, original_module: LocalModuleId, visibility: &RawVisibility, ) -> Option { @@ -98,7 +98,7 @@ impl CrateDefMap { // the result. pub(super) fn resolve_path_fp_with_macro( &self, - db: &impl DefDatabase, + db: &dyn DefDatabase, mode: ResolveMode, original_module: LocalModuleId, path: &ModPath, @@ -262,7 +262,7 @@ impl CrateDefMap { fn resolve_name_in_module( &self, - db: &impl DefDatabase, + db: &dyn DefDatabase, module: LocalModuleId, name: &Name, shadow: BuiltinShadowMode, @@ -304,7 +304,7 @@ impl CrateDefMap { from_crate_root.or(from_extern_prelude) } - fn resolve_in_prelude(&self, db: &impl DefDatabase, name: &Name) -> PerNs { + fn resolve_in_prelude(&self, db: &dyn DefDatabase, name: &Name) -> PerNs { if let Some(prelude) = self.prelude { let keep; 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}; use hir_expand::{ ast_id_map::AstIdMap, - db::AstDatabase, hygiene::Hygiene, name::{AsName, Name}, }; @@ -45,16 +44,13 @@ pub struct RawItems { } impl RawItems { - pub(crate) fn raw_items_query( - db: &(impl DefDatabase + AstDatabase), - file_id: HirFileId, - ) -> Arc { + pub(crate) fn raw_items_query(db: &dyn DefDatabase, file_id: HirFileId) -> Arc { let _p = profile("raw_items_query"); let mut collector = RawItemsCollector { raw_items: RawItems::default(), source_ast_id_map: db.ast_id_map(file_id), file_id, - hygiene: Hygiene::new(db, file_id), + hygiene: Hygiene::new(db.upcast(), file_id), }; if let Some(node) = db.parse_or_expand(file_id) { if let Some(source_file) = ast::SourceFile::cast(node.clone()) { -- cgit v1.2.3