add gc request

This commit is contained in:
Aleksey Kladov 2019-01-25 19:11:58 +03:00
parent 6df1f71b7d
commit f6adb85b68
7 changed files with 44 additions and 11 deletions

View file

@ -72,13 +72,14 @@ impl db::RootDatabase {
self.set_source_root(root_id, Arc::new(source_root));
}
#[allow(unused)]
/// Ideally, we should call this function from time to time to collect heavy
/// syntax trees. However, if we actually do that, everything is recomputed
/// for some reason. Needs investigation.
fn gc_syntax_trees(&mut self) {
pub(crate) fn collect_garbage(&mut self) {
self.query(ra_db::SourceFileQuery)
.sweep(salsa::SweepStrategy::default().discard_values());
self.query(hir::db::HirSourceFileQuery)
.sweep(salsa::SweepStrategy::default().discard_values());
self.query(hir::db::FileItemsQuery)
.sweep(salsa::SweepStrategy::default().discard_values());
self.query(hir::db::FileItemQuery)

View file

@ -285,6 +285,10 @@ impl AnalysisHost {
pub fn apply_change(&mut self, change: AnalysisChange) {
self.db.apply_change(change)
}
pub fn collect_garbage(&mut self) {
self.db.collect_garbage();
}
}
/// Analysis is a snapshot of a world state at a moment in time. It is the main

View file

@ -205,17 +205,26 @@ fn main_loop_inner(
Some(req) => req,
None => return Ok(()),
};
match on_request(state, pending_requests, pool, &task_sender, req)? {
None => (),
Some(req) => {
log::error!("unknown request: {:?}", req);
let resp = RawResponse::err(
req.id,
ErrorCode::MethodNotFound as i32,
"unknown request".to_string(),
);
match req.cast::<req::CollectGarbage>() {
Ok((id, ())) => {
state.collect_garbadge();
let resp = RawResponse::ok::<req::CollectGarbage>(id, &());
msg_sender.send(RawMessage::Response(resp)).unwrap()
}
Err(req) => {
match on_request(state, pending_requests, pool, &task_sender, req)? {
None => (),
Some(req) => {
log::error!("unknown request: {:?}", req);
let resp = RawResponse::err(
req.id,
ErrorCode::MethodNotFound as i32,
"unknown request".to_string(),
);
msg_sender.send(RawMessage::Response(resp)).unwrap()
}
}
}
}
}
RawMessage::Notification(not) => {

View file

@ -19,6 +19,14 @@ impl Request for AnalyzerStatus {
const METHOD: &'static str = "ra/analyzerStatus";
}
pub enum CollectGarbage {}
impl Request for CollectGarbage {
type Params = ();
type Result = ();
const METHOD: &'static str = "ra/collectGarbage";
}
pub enum SyntaxTree {}
impl Request for SyntaxTree {

View file

@ -231,6 +231,10 @@ impl ServerWorldState {
vfs: Arc::clone(&self.vfs),
}
}
pub fn collect_garbadge(&mut self) {
self.analysis_host.collect_garbage()
}
}
impl ServerWorld {

View file

@ -98,6 +98,10 @@
{
"command": "ra-lsp.analyzerStatus",
"title": "Status of rust-analyzer (debug)"
},
{
"command": "ra-lsp.collectGarbage",
"title": "Run rust-analyzer's GC"
}
],
"keybindings": [

View file

@ -49,6 +49,9 @@ export function activate(context: vscode.ExtensionContext) {
'ra-lsp.analyzerStatus',
commands.analyzerStatus.makeCommand(context)
);
registerCommand('ra-lsp.collectGarbage', () =>
Server.client.sendRequest<null>('ra/collectGarbage', null)
);
registerCommand('ra-lsp.syntaxTree', commands.syntaxTree.handle);
registerCommand('ra-lsp.extendSelection', commands.extendSelection.handle);
registerCommand('ra-lsp.matchingBrace', commands.matchingBrace.handle);