diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2020-03-16 16:42:58 +0000 |
---|---|---|
committer | GitHub <[email protected]> | 2020-03-16 16:42:58 +0000 |
commit | adcc89137d3feea8f19fad461bbde6f4bce048e5 (patch) | |
tree | 160af959553ce57fdfcbc0a6c79bafcc3611aeea /crates/ra_hir_def/src/nameres | |
parent | 648df02953a6ebf87a5876668eceba208687e8a7 (diff) | |
parent | 9faea2364dee4fbc9391ad233c570b70256ef002 (diff) |
Merge #3584
3584: Switch to dynamic dispatch r=matklad a=matklad
Benches are in https://github.com/rust-analyzer/rust-analyzer/issues/1987#issuecomment-598807185
TL;DR:
* 33% faster release build
* slightly worse/same perf
* no changes for debug build
* slightly smaller binary
cc @flodiebold I genuinely don't know if it is a good idea or not.
Co-authored-by: Aleksey Kladov <[email protected]>
Diffstat (limited to 'crates/ra_hir_def/src/nameres')
-rw-r--r-- | crates/ra_hir_def/src/nameres/collector.rs | 22 | ||||
-rw-r--r-- | crates/ra_hir_def/src/nameres/mod_resolution.rs | 4 | ||||
-rw-r--r-- | crates/ra_hir_def/src/nameres/path_resolution.rs | 8 | ||||
-rw-r--r-- | crates/ra_hir_def/src/nameres/raw.rs | 8 |
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 | ||
33 | pub(super) fn collect_defs(db: &impl DefDatabase, mut def_map: CrateDefMap) -> CrateDefMap { | 33 | pub(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 |
115 | struct DefCollector<'a, DB> { | 115 | struct 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 | ||
127 | impl<DB> DefCollector<'_, DB> | 127 | impl DefCollector<'_> { |
128 | where | ||
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 |
608 | struct ModCollector<'a, D> { | 605 | struct 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 | ||
617 | impl<DB> ModCollector<'_, &'_ mut DefCollector<'_, DB>> | 614 | impl ModCollector<'_, '_> { |
618 | where | ||
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 | ||
10 | use hir_expand::{ | 10 | use 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 | ||
47 | impl RawItems { | 46 | impl 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()) { |