Clean up LSP servers on worktree release
This commit is contained in:
parent
5a9f1e4eb7
commit
351914f4bd
4 changed files with 62 additions and 4 deletions
|
@ -70,6 +70,10 @@ impl TextSystem {
|
||||||
|
|
||||||
/// Get a list of all available font names from the operating system.
|
/// Get a list of all available font names from the operating system.
|
||||||
pub fn all_font_names(&self) -> Vec<String> {
|
pub fn all_font_names(&self) -> Vec<String> {
|
||||||
|
eprintln!(
|
||||||
|
"~~~~~~~~~~~~~ all_font_names called {}",
|
||||||
|
std::backtrace::Backtrace::capture()
|
||||||
|
);
|
||||||
let mut names: BTreeSet<_> = self
|
let mut names: BTreeSet<_> = self
|
||||||
.platform_text_system
|
.platform_text_system
|
||||||
.all_font_names()
|
.all_font_names()
|
||||||
|
|
|
@ -16,7 +16,7 @@ use language::{
|
||||||
language_settings::{Formatter, LanguageSettings},
|
language_settings::{Formatter, LanguageSettings},
|
||||||
Buffer, Language, LanguageServerName, LocalFile,
|
Buffer, Language, LanguageServerName, LocalFile,
|
||||||
};
|
};
|
||||||
use lsp::LanguageServerId;
|
use lsp::{LanguageServer, LanguageServerId};
|
||||||
use node_runtime::NodeRuntime;
|
use node_runtime::NodeRuntime;
|
||||||
use prettier::Prettier;
|
use prettier::Prettier;
|
||||||
use util::{paths::DEFAULT_PRETTIER_DIR, ResultExt, TryFutureExt};
|
use util::{paths::DEFAULT_PRETTIER_DIR, ResultExt, TryFutureExt};
|
||||||
|
@ -212,6 +212,10 @@ impl PrettierInstance {
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn server(&self) -> Option<Arc<LanguageServer>> {
|
||||||
|
self.prettier.clone()?.await.ok()?.server().cloned()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn start_default_prettier(
|
fn start_default_prettier(
|
||||||
|
|
|
@ -632,7 +632,7 @@ impl Project {
|
||||||
let copilot_lsp_subscription =
|
let copilot_lsp_subscription =
|
||||||
Copilot::global(cx).map(|copilot| subscribe_for_copilot_events(&copilot, cx));
|
Copilot::global(cx).map(|copilot| subscribe_for_copilot_events(&copilot, cx));
|
||||||
Self {
|
Self {
|
||||||
worktrees: Default::default(),
|
worktrees: Vec::new(),
|
||||||
buffer_ordered_messages_tx: tx,
|
buffer_ordered_messages_tx: tx,
|
||||||
collaborators: Default::default(),
|
collaborators: Default::default(),
|
||||||
next_buffer_id: 0,
|
next_buffer_id: 0,
|
||||||
|
@ -973,7 +973,7 @@ impl Project {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start all the newly-enabled language servers.
|
// Start all the newly-enabled language servers.
|
||||||
for (worktree, language) in language_servers_to_start {
|
for (worktree, language) in dbg!(language_servers_to_start) {
|
||||||
let worktree_path = worktree.read(cx).abs_path();
|
let worktree_path = worktree.read(cx).abs_path();
|
||||||
self.start_language_servers(&worktree, worktree_path, language, cx);
|
self.start_language_servers(&worktree, worktree_path, language, cx);
|
||||||
}
|
}
|
||||||
|
@ -6370,6 +6370,55 @@ impl Project {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn remove_worktree(&mut self, id_to_remove: WorktreeId, cx: &mut ModelContext<Self>) {
|
pub fn remove_worktree(&mut self, id_to_remove: WorktreeId, cx: &mut ModelContext<Self>) {
|
||||||
|
let mut servers_to_remove = HashMap::default();
|
||||||
|
let mut servers_to_preserve = HashSet::default();
|
||||||
|
for ((worktree_id, server_name), &server_id) in &self.language_server_ids {
|
||||||
|
if worktree_id == &id_to_remove {
|
||||||
|
servers_to_remove.insert(server_id, server_name.clone());
|
||||||
|
} else {
|
||||||
|
servers_to_preserve.insert(server_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
servers_to_remove.retain(|server_id, _| !servers_to_preserve.contains(server_id));
|
||||||
|
for (server_id_to_remove, server_name) in servers_to_remove {
|
||||||
|
self.language_server_ids
|
||||||
|
.remove(&(id_to_remove, server_name));
|
||||||
|
self.language_server_statuses.remove(&server_id_to_remove);
|
||||||
|
self.last_workspace_edits_by_language_server
|
||||||
|
.remove(&server_id_to_remove);
|
||||||
|
self.language_servers.remove(&server_id_to_remove);
|
||||||
|
cx.emit(Event::LanguageServerRemoved(server_id_to_remove));
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut prettier_instances_to_clean = FuturesUnordered::new();
|
||||||
|
if let Some(prettier_paths) = self.prettiers_per_worktree.remove(&id_to_remove) {
|
||||||
|
for path in prettier_paths.iter().flatten() {
|
||||||
|
if let Some(prettier_instance) = self.prettier_instances.remove(path) {
|
||||||
|
prettier_instances_to_clean.push(async move {
|
||||||
|
prettier_instance
|
||||||
|
.server()
|
||||||
|
.await
|
||||||
|
.map(|server| server.server_id())
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cx.spawn(|project, mut cx| async move {
|
||||||
|
while let Some(prettier_server_id) = prettier_instances_to_clean.next().await {
|
||||||
|
if let Some(prettier_server_id) = prettier_server_id {
|
||||||
|
project
|
||||||
|
.update(&mut cx, |project, cx| {
|
||||||
|
project
|
||||||
|
.supplementary_language_servers
|
||||||
|
.remove(&prettier_server_id);
|
||||||
|
cx.emit(Event::LanguageServerRemoved(prettier_server_id));
|
||||||
|
})
|
||||||
|
.ok();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.detach();
|
||||||
|
|
||||||
self.worktrees.retain(|worktree| {
|
self.worktrees.retain(|worktree| {
|
||||||
if let Some(worktree) = worktree.upgrade() {
|
if let Some(worktree) = worktree.upgrade() {
|
||||||
let id = worktree.read(cx).id();
|
let id = worktree.read(cx).id();
|
||||||
|
|
|
@ -1355,7 +1355,7 @@ impl Workspace {
|
||||||
Some(visible) => match this
|
Some(visible) => match this
|
||||||
.update(&mut cx, |this, cx| {
|
.update(&mut cx, |this, cx| {
|
||||||
Workspace::project_path_for_path(
|
Workspace::project_path_for_path(
|
||||||
this.project.clone(),
|
dbg!(this.project.clone()),
|
||||||
abs_path,
|
abs_path,
|
||||||
visible,
|
visible,
|
||||||
cx,
|
cx,
|
||||||
|
@ -1368,6 +1368,7 @@ impl Workspace {
|
||||||
},
|
},
|
||||||
None => None,
|
None => None,
|
||||||
};
|
};
|
||||||
|
dbg!(&project_path);
|
||||||
|
|
||||||
let this = this.clone();
|
let this = this.clone();
|
||||||
let abs_path = abs_path.clone();
|
let abs_path = abs_path.clone();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue