From c90256429bf41958ff6c7390dfd5fa25123eabb3 Mon Sep 17 00:00:00 2001 From: uHOOCCOOHu Date: Sat, 7 Sep 2019 22:46:44 +0800 Subject: Replace with immutable map to avoid heavy cloning --- crates/ra_hir/src/nameres.rs | 7 +++++-- crates/ra_hir/src/nameres/collector.rs | 3 +++ 2 files changed, 8 insertions(+), 2 deletions(-) (limited to 'crates/ra_hir/src') diff --git a/crates/ra_hir/src/nameres.rs b/crates/ra_hir/src/nameres.rs index befbb2a9b..7e5138d05 100644 --- a/crates/ra_hir/src/nameres.rs +++ b/crates/ra_hir/src/nameres.rs @@ -54,6 +54,7 @@ mod mod_resolution; #[cfg(test)] mod tests; +use std::hash::BuildHasherDefault; use std::sync::Arc; use once_cell::sync::Lazy; @@ -61,7 +62,7 @@ use ra_arena::{impl_arena_id, Arena, RawId}; use ra_db::{Edition, FileId}; use ra_prof::profile; use ra_syntax::ast; -use rustc_hash::{FxHashMap, FxHashSet}; +use rustc_hash::{FxHashMap, FxHashSet, FxHasher}; use test_utils::tested_by; use crate::{ @@ -73,6 +74,8 @@ use crate::{ AstId, BuiltinType, Crate, HirFileId, MacroDef, Module, ModuleDef, Name, Path, PathKind, Trait, }; +pub(crate) type ImmFxHashMap = im::HashMap>; + pub(crate) use self::raw::{ImportSourceMap, RawItems}; pub use self::{ @@ -139,7 +142,7 @@ pub(crate) struct ModuleData { pub struct ModuleScope { items: FxHashMap, macros: FxHashMap, - textual_macros: FxHashMap, + textual_macros: ImmFxHashMap, } static BUILTIN_SCOPE: Lazy> = Lazy::new(|| { diff --git a/crates/ra_hir/src/nameres/collector.rs b/crates/ra_hir/src/nameres/collector.rs index 10c32ffa1..3803c7185 100644 --- a/crates/ra_hir/src/nameres/collector.rs +++ b/crates/ra_hir/src/nameres/collector.rs @@ -631,6 +631,7 @@ where modules[res].parent = Some(self.module_id); modules[res].declaration = Some(declaration); modules[res].definition = definition; + // Cloning immutable map is lazy and fast modules[res].scope.textual_macros = modules[self.module_id].scope.textual_macros.clone(); modules[self.module_id].children.insert(name.clone(), res); let resolution = Resolution { @@ -707,6 +708,8 @@ where } fn import_all_textual_macros(&mut self, module_id: CrateModuleId) { + // `clone()` is needed here to avoid mutable borrow `self.def_collector` when first borrow is alive + // Cloning immutable map is lazy and fast let macros = self.def_collector.def_map[module_id].scope.textual_macros.clone(); for (name, macro_) in macros { self.def_collector.define_textual_macro(self.module_id, name.clone(), macro_.id); -- cgit v1.2.3