Gc syntax trees after every modification

This commit is contained in:
Aleksey Kladov 2018-12-19 00:35:13 +03:00
parent d05790b947
commit e7aa17b560
2 changed files with 17 additions and 8 deletions

View File

@ -10,7 +10,7 @@ use ra_syntax::{
SyntaxKind::*,
SyntaxNodeRef, TextRange, TextUnit,
};
use ra_db::{FilesDatabase, SourceRoot, SourceRootId, WORKSPACE, SyntaxDatabase, SourceFileQuery};
use ra_db::{FilesDatabase, SourceRoot, SourceRootId, WORKSPACE, SyntaxDatabase};
use rayon::prelude::*;
use rustc_hash::FxHashSet;
use salsa::{Database, ParallelDatabase};
@ -43,6 +43,7 @@ impl AnalysisHostImpl {
}
pub fn apply_change(&mut self, change: AnalysisChange) {
log::info!("apply_change {:?}", change);
self.gc_syntax_trees();
for (file_id, text) in change.files_changed {
self.db
@ -115,6 +116,21 @@ impl AnalysisHostImpl {
.set((), Arc::new(crate_graph))
}
}
fn gc_syntax_trees(&mut self) {
self.db
.query(ra_db::SourceFileQuery)
.sweep(salsa::SweepStrategy::default().discard_values());
self.db
.query(hir::db::FnSyntaxQuery)
.sweep(salsa::SweepStrategy::default().discard_values());
self.db
.query(hir::db::SourceFileItemsQuery)
.sweep(salsa::SweepStrategy::default().discard_values());
self.db
.query(hir::db::FileItemQuery)
.sweep(salsa::SweepStrategy::default().discard_values());
}
}
pub(crate) struct AnalysisImpl {
@ -160,9 +176,6 @@ impl AnalysisImpl {
.filter_map(|it| it.ok())
.collect()
};
self.db
.query(SourceFileQuery)
.sweep(salsa::SweepStrategy::default().discard_values());
Ok(query.search(&buf))
}
/// This returns `Vec` because a module may be included from several places. We

View File

@ -27,20 +27,16 @@ pub trait HirDatabase: SyntaxDatabase
}
fn fn_syntax(fn_id: FnId) -> FnDefNode {
type FnSyntaxQuery;
// Don't retain syntax trees in memory
storage dependencies;
use fn query_definitions::fn_syntax;
}
fn file_items(file_id: FileId) -> Arc<SourceFileItems> {
type SourceFileItemsQuery;
storage dependencies;
use fn query_definitions::file_items;
}
fn file_item(source_item_id: SourceItemId) -> SyntaxNode {
type FileItemQuery;
storage dependencies;
use fn query_definitions::file_item;
}