about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2021-10-06 20:54:27 +0000
committerGitHub <noreply@github.com>2021-10-06 20:54:27 +0000
commitf30b62b7513f6d75d56b8c0c8ef9230fe11f11e2 (patch)
tree7da9fe07ce74694ae499247cc7856f49291d0876
parent12d33eafaf3da93072a53769ac01cfd37d05ec1e (diff)
parentcda9668289868239b87954b44296f14842679490 (diff)
downloadrust-f30b62b7513f6d75d56b8c0c8ef9230fe11f11e2.tar.gz
rust-f30b62b7513f6d75d56b8c0c8ef9230fe11f11e2.zip
Merge #10479
10479: fix: fix "index out of bounds" panic in name resolution r=jonas-schievink a=jonas-schievink

Closes https://github.com/rust-analyzer/rust-analyzer/issues/10084
Closes https://github.com/rust-analyzer/rust-analyzer/issues/9163

This is really just a salsa update to a version that removes the problematic code (see https://github.com/rust-analyzer/rust-analyzer/issues/10084#issuecomment-934445711)

bors r+

Co-authored-by: Jonas Schievink <jonasschievink@gmail.com>
-rw-r--r--Cargo.lock8
-rw-r--r--crates/base_db/Cargo.toml2
-rw-r--r--crates/hir_def/src/nameres/tests/incremental.rs5
-rw-r--r--crates/ide/src/lib.rs3
-rw-r--r--crates/ide_db/src/apply_change.rs65
5 files changed, 13 insertions, 70 deletions
diff --git a/Cargo.lock b/Cargo.lock
index e414d39b8d7..17795ead23e 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1380,9 +1380,9 @@ checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e"
 
 [[package]]
 name = "salsa"
-version = "0.17.0-pre.1"
+version = "0.17.0-pre.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "58038261ea8cd5a7730c4d8c97a22063d7c7eb1c2809e55c3c15f0a5903e5582"
+checksum = "9b223dccb46c32753144d0b51290da7230bb4aedcd8379d6b4c9a474c18bf17a"
 dependencies = [
  "crossbeam-utils",
  "indexmap",
@@ -1397,9 +1397,9 @@ dependencies = [
 
 [[package]]
 name = "salsa-macros"
-version = "0.17.0-pre.1"
+version = "0.17.0-pre.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2e2fc060627fa5d44bffac98f6089b9497779e2deccc26687f60adc2638e32fb"
+checksum = "ac6c2e352df550bf019da7b16164ed2f7fa107c39653d1311d1bba42d1582ff7"
 dependencies = [
  "heck",
  "proc-macro2",
diff --git a/crates/base_db/Cargo.toml b/crates/base_db/Cargo.toml
index b43e5efb2a0..15ada0f34a8 100644
--- a/crates/base_db/Cargo.toml
+++ b/crates/base_db/Cargo.toml
@@ -9,7 +9,7 @@ edition = "2018"
 doctest = false
 
 [dependencies]
-salsa = "0.17.0-pre.1"
+salsa = "0.17.0-pre.2"
 rustc-hash = "1.1.0"
 
 syntax = { path = "../syntax", version = "0.0.0" }
diff --git a/crates/hir_def/src/nameres/tests/incremental.rs b/crates/hir_def/src/nameres/tests/incremental.rs
index 7bf152e26cc..b2828831a15 100644
--- a/crates/hir_def/src/nameres/tests/incremental.rs
+++ b/crates/hir_def/src/nameres/tests/incremental.rs
@@ -1,6 +1,6 @@
 use std::sync::Arc;
 
-use base_db::{salsa::SweepStrategy, SourceDatabaseExt};
+use base_db::SourceDatabaseExt;
 
 use crate::{AdtId, ModuleDefId};
 
@@ -199,8 +199,7 @@ pub type Ty = ();
     }
 
     // Delete the parse tree.
-    let sweep = SweepStrategy::default().discard_values().sweep_all_revisions();
-    base_db::ParseQuery.in_db(&db).sweep(sweep);
+    base_db::ParseQuery.in_db(&db).purge();
 
     {
         let events = db.log_executed(|| {
diff --git a/crates/ide/src/lib.rs b/crates/ide/src/lib.rs
index 35b6a758d41..396e893bf93 100644
--- a/crates/ide/src/lib.rs
+++ b/crates/ide/src/lib.rs
@@ -161,9 +161,6 @@ impl AnalysisHost {
         self.db.apply_change(change)
     }
 
-    pub fn collect_garbage(&mut self) {
-        self.db.collect_garbage();
-    }
     /// NB: this clears the database
     pub fn per_query_memory_usage(&mut self) -> Vec<(String, profile::Bytes)> {
         self.db.per_query_memory_usage()
diff --git a/crates/ide_db/src/apply_change.rs b/crates/ide_db/src/apply_change.rs
index d9bf7c9cc71..0df0b0035d4 100644
--- a/crates/ide_db/src/apply_change.rs
+++ b/crates/ide_db/src/apply_change.rs
@@ -3,7 +3,7 @@
 use std::sync::Arc;
 
 use base_db::{
-    salsa::{Database, Durability, SweepStrategy},
+    salsa::{Database, Durability},
     Change, SourceRootId,
 };
 use profile::{memory_usage, Bytes};
@@ -38,32 +38,6 @@ impl RootDatabase {
         change.apply(self);
     }
 
-    pub fn collect_garbage(&mut self) {
-        if cfg!(target_arch = "wasm32") {
-            return;
-        }
-
-        let _p = profile::span("RootDatabase::collect_garbage");
-
-        let sweep = SweepStrategy::default().discard_values().sweep_all_revisions();
-
-        base_db::ParseQuery.in_db(self).sweep(sweep);
-        hir::db::ParseMacroExpansionQuery.in_db(self).sweep(sweep);
-
-        // Macros do take significant space, but less then the syntax trees
-        // self.query(hir::db::MacroDefQuery).sweep(sweep);
-        // self.query(hir::db::MacroArgTextQuery).sweep(sweep);
-        // self.query(hir::db::MacroExpandQuery).sweep(sweep);
-
-        hir::db::AstIdMapQuery.in_db(self).sweep(sweep);
-
-        hir::db::BodyWithSourceMapQuery.in_db(self).sweep(sweep);
-
-        hir::db::ExprScopesQuery.in_db(self).sweep(sweep);
-        hir::db::InferQueryQuery.in_db(self).sweep(sweep);
-        hir::db::BodyQuery.in_db(self).sweep(sweep);
-    }
-
     // Feature: Memory Usage
     //
     // Clears rust-analyzer's internal database and prints memory usage statistics.
@@ -76,32 +50,17 @@ impl RootDatabase {
     // image::https://user-images.githubusercontent.com/48062697/113065592-08559f00-91b1-11eb-8c96-64b88068ec02.gif[]
     pub fn per_query_memory_usage(&mut self) -> Vec<(String, Bytes)> {
         let mut acc: Vec<(String, Bytes)> = vec![];
-        let sweep = SweepStrategy::default().discard_values().sweep_all_revisions();
-        macro_rules! sweep_each_query {
+        macro_rules! purge_each_query {
             ($($q:path)*) => {$(
                 let before = memory_usage().allocated;
-                $q.in_db(self).sweep(sweep);
-                let after = memory_usage().allocated;
-                let q: $q = Default::default();
-                let name = format!("{:?}", q);
-                acc.push((name, before - after));
-
-                let before = memory_usage().allocated;
-                $q.in_db(self).sweep(sweep.discard_everything());
-                let after = memory_usage().allocated;
-                let q: $q = Default::default();
-                let name = format!("{:?} (deps)", q);
-                acc.push((name, before - after));
-
-                let before = memory_usage().allocated;
                 $q.in_db(self).purge();
                 let after = memory_usage().allocated;
                 let q: $q = Default::default();
-                let name = format!("{:?} (purge)", q);
+                let name = format!("{:?}", q);
                 acc.push((name, before - after));
             )*}
         }
-        sweep_each_query![
+        purge_each_query![
             // SourceDatabase
             base_db::ParseQuery
             base_db::CrateGraphQuery
@@ -119,6 +78,7 @@ impl RootDatabase {
             hir::db::ParseMacroExpansionQuery
             hir::db::MacroExpandQuery
             hir::db::HygieneFrameQuery
+            hir::db::InternMacroQuery
 
             // DefDatabase
             hir::db::FileItemTreeQuery
@@ -174,6 +134,7 @@ impl RootDatabase {
             hir::db::InternClosureQuery
             hir::db::AssociatedTyValueQuery
             hir::db::TraitSolveQueryQuery
+            hir::db::InternTypeParamIdQuery
 
             // SymbolsDatabase
             crate::symbol_index::FileSymbolsQuery
@@ -183,17 +144,6 @@ impl RootDatabase {
 
             // LineIndexDatabase
             crate::LineIndexQuery
-        ];
-
-        // To collect interned data, we need to bump the revision counter by performing a synthetic
-        // write.
-        // We do this after collecting the non-interned queries to correctly attribute memory used
-        // by interned data.
-        self.salsa_runtime_mut().synthetic_write(Durability::HIGH);
-
-        sweep_each_query![
-            // AstDatabase
-            hir::db::InternMacroQuery
 
             // InternDatabase
             hir::db::InternFunctionQuery
@@ -205,9 +155,6 @@ impl RootDatabase {
             hir::db::InternTraitQuery
             hir::db::InternTypeAliasQuery
             hir::db::InternImplQuery
-
-            // HirDatabase
-            hir::db::InternTypeParamIdQuery
         ];
 
         acc.sort_by_key(|it| std::cmp::Reverse(it.1));