]> git.lizzy.rs Git - rust.git/commitdiff
Merge #10975
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>
Thu, 9 Dec 2021 17:41:01 +0000 (17:41 +0000)
committerGitHub <noreply@github.com>
Thu, 9 Dec 2021 17:41:01 +0000 (17:41 +0000)
10975: internal: Shrink TraitImpls and InherentImpls HashMaps r=Veykril a=Veykril

bors r+

Co-authored-by: Lukas Wirth <lukastw97@gmail.com>
crates/hir_ty/src/method_resolution.rs

index 1e53d392e8e8dcf783bba87f228607c383ffb8f8..3fbb6fea197740a8911646314428ebdab9856af3 100644 (file)
@@ -142,6 +142,7 @@ pub(crate) fn trait_impls_in_crate_query(db: &dyn HirDatabase, krate: CrateId) -
 
         let crate_def_map = db.crate_def_map(krate);
         impls.collect_def_map(db, &crate_def_map);
+        impls.shrink_to_fit();
 
         Arc::new(impls)
     }
@@ -155,10 +156,32 @@ pub(crate) fn trait_impls_in_block_query(
 
         let block_def_map = db.block_def_map(block)?;
         impls.collect_def_map(db, &block_def_map);
+        impls.shrink_to_fit();
 
         Some(Arc::new(impls))
     }
 
+    pub(crate) fn trait_impls_in_deps_query(db: &dyn HirDatabase, krate: CrateId) -> Arc<Self> {
+        let _p = profile::span("trait_impls_in_deps_query");
+        let crate_graph = db.crate_graph();
+        let mut res = Self { map: FxHashMap::default() };
+
+        for krate in crate_graph.transitive_deps(krate) {
+            res.merge(&db.trait_impls_in_crate(krate));
+        }
+        res.shrink_to_fit();
+
+        Arc::new(res)
+    }
+
+    fn shrink_to_fit(&mut self) {
+        self.map.shrink_to_fit();
+        self.map.values_mut().for_each(|map| {
+            map.shrink_to_fit();
+            map.values_mut().for_each(Vec::shrink_to_fit);
+        });
+    }
+
     fn collect_def_map(&mut self, db: &dyn HirDatabase, def_map: &DefMap) {
         for (_module_id, module_data) in def_map.modules() {
             for impl_id in module_data.scope.impls() {
@@ -187,18 +210,6 @@ fn collect_def_map(&mut self, db: &dyn HirDatabase, def_map: &DefMap) {
         }
     }
 
-    pub(crate) fn trait_impls_in_deps_query(db: &dyn HirDatabase, krate: CrateId) -> Arc<Self> {
-        let _p = profile::span("trait_impls_in_deps_query");
-        let crate_graph = db.crate_graph();
-        let mut res = Self { map: FxHashMap::default() };
-
-        for krate in crate_graph.transitive_deps(krate) {
-            res.merge(&db.trait_impls_in_crate(krate));
-        }
-
-        Arc::new(res)
-    }
-
     fn merge(&mut self, other: &Self) {
         for (trait_, other_map) in &other.map {
             let map = self.map.entry(*trait_).or_default();
@@ -264,6 +275,7 @@ pub(crate) fn inherent_impls_in_crate_query(db: &dyn HirDatabase, krate: CrateId
 
         let crate_def_map = db.crate_def_map(krate);
         impls.collect_def_map(db, &crate_def_map);
+        impls.shrink_to_fit();
 
         return Arc::new(impls);
     }
@@ -275,11 +287,17 @@ pub(crate) fn inherent_impls_in_block_query(
         let mut impls = Self { map: FxHashMap::default() };
         if let Some(block_def_map) = db.block_def_map(block) {
             impls.collect_def_map(db, &block_def_map);
+            impls.shrink_to_fit();
             return Some(Arc::new(impls));
         }
         return None;
     }
 
+    fn shrink_to_fit(&mut self) {
+        self.map.values_mut().for_each(Vec::shrink_to_fit);
+        self.map.shrink_to_fit();
+    }
+
     fn collect_def_map(&mut self, db: &dyn HirDatabase, def_map: &DefMap) {
         for (_module_id, module_data) in def_map.modules() {
             for impl_id in module_data.scope.impls() {