]> git.lizzy.rs Git - rust.git/commitdiff
Remove some allocs
authorLukas Wirth <lukastw97@gmail.com>
Thu, 9 Dec 2021 17:04:32 +0000 (18:04 +0100)
committerLukas Wirth <lukastw97@gmail.com>
Thu, 9 Dec 2021 17:04:32 +0000 (18:04 +0100)
crates/hir_def/src/resolver.rs

index 8b2eea9d586266a6069a6739182855893f15a008..9f68b800a55ebd8571ef5654c1e3452fcb36f8e2 100644 (file)
@@ -8,7 +8,7 @@
 };
 use indexmap::IndexMap;
 use rustc_hash::FxHashSet;
-use smallvec::SmallVec;
+use smallvec::{smallvec, SmallVec};
 
 use crate::{
     body::scope::{ExprScopes, ScopeId},
@@ -567,6 +567,8 @@ pub fn resolver_for_scope(
     let mut r = owner.resolver(db);
     let scopes = db.expr_scopes(owner);
     let scope_chain = scopes.scope_chain(scope_id).collect::<Vec<_>>();
+    r.scopes.reserve(scope_chain.len());
+
     for scope in scope_chain.into_iter().rev() {
         if let Some(block) = scopes.block(scope) {
             if let Some(def_map) = db.block_def_map(block) {
@@ -739,12 +741,13 @@ pub trait HasResolver: Copy {
 impl HasResolver for ModuleId {
     fn resolver(self, db: &dyn DefDatabase) -> Resolver {
         let mut def_map = self.def_map(db);
-        let mut modules = vec![(def_map.clone(), self.local_id)];
+        let mut modules: SmallVec<[_; 2]> = smallvec![(def_map.clone(), self.local_id)];
         while let Some(parent) = def_map.parent() {
             def_map = parent.def_map(db);
             modules.push((def_map.clone(), parent.local_id));
         }
         let mut resolver = Resolver::default();
+        resolver.scopes.reserve(modules.len());
         for (def_map, module) in modules.into_iter().rev() {
             resolver = resolver.push_module_scope(def_map, module);
         }