Add language server control tool into the status bar (#32490)
Release Notes: - Added the language server control tool into the status bar --------- Co-authored-by: Nate Butler <iamnbutler@gmail.com>
This commit is contained in:
parent
91c9281cea
commit
c0acd8e8b1
32 changed files with 1992 additions and 312 deletions
|
@ -81,7 +81,7 @@ use language::{
|
|||
};
|
||||
use lsp::{
|
||||
CodeActionKind, CompletionContext, CompletionItemKind, DocumentHighlightKind, InsertTextMode,
|
||||
LanguageServerId, LanguageServerName, MessageActionItem,
|
||||
LanguageServerId, LanguageServerName, LanguageServerSelector, MessageActionItem,
|
||||
};
|
||||
use lsp_command::*;
|
||||
use lsp_store::{CompletionDocumentation, LspFormatTarget, OpenLspBufferHandle};
|
||||
|
@ -251,6 +251,7 @@ enum BufferOrderedMessage {
|
|||
LanguageServerUpdate {
|
||||
language_server_id: LanguageServerId,
|
||||
message: proto::update_language_server::Variant,
|
||||
name: Option<LanguageServerName>,
|
||||
},
|
||||
Resync,
|
||||
}
|
||||
|
@ -1790,7 +1791,7 @@ impl Project {
|
|||
pub fn has_open_buffer(&self, path: impl Into<ProjectPath>, cx: &App) -> bool {
|
||||
self.buffer_store
|
||||
.read(cx)
|
||||
.get_by_path(&path.into(), cx)
|
||||
.get_by_path(&path.into())
|
||||
.is_some()
|
||||
}
|
||||
|
||||
|
@ -2500,7 +2501,7 @@ impl Project {
|
|||
cx: &mut App,
|
||||
) -> OpenLspBufferHandle {
|
||||
self.lsp_store.update(cx, |lsp_store, cx| {
|
||||
lsp_store.register_buffer_with_language_servers(&buffer, false, cx)
|
||||
lsp_store.register_buffer_with_language_servers(&buffer, HashSet::default(), false, cx)
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -2590,7 +2591,7 @@ impl Project {
|
|||
}
|
||||
|
||||
pub fn get_open_buffer(&self, path: &ProjectPath, cx: &App) -> Option<Entity<Buffer>> {
|
||||
self.buffer_store.read(cx).get_by_path(path, cx)
|
||||
self.buffer_store.read(cx).get_by_path(path)
|
||||
}
|
||||
|
||||
fn register_buffer(&mut self, buffer: &Entity<Buffer>, cx: &mut Context<Self>) -> Result<()> {
|
||||
|
@ -2640,7 +2641,7 @@ impl Project {
|
|||
}
|
||||
|
||||
async fn send_buffer_ordered_messages(
|
||||
this: WeakEntity<Self>,
|
||||
project: WeakEntity<Self>,
|
||||
rx: UnboundedReceiver<BufferOrderedMessage>,
|
||||
cx: &mut AsyncApp,
|
||||
) -> Result<()> {
|
||||
|
@ -2677,7 +2678,7 @@ impl Project {
|
|||
let mut changes = rx.ready_chunks(MAX_BATCH_SIZE);
|
||||
|
||||
while let Some(changes) = changes.next().await {
|
||||
let is_local = this.read_with(cx, |this, _| this.is_local())?;
|
||||
let is_local = project.read_with(cx, |this, _| this.is_local())?;
|
||||
|
||||
for change in changes {
|
||||
match change {
|
||||
|
@ -2697,7 +2698,7 @@ impl Project {
|
|||
|
||||
BufferOrderedMessage::Resync => {
|
||||
operations_by_buffer_id.clear();
|
||||
if this
|
||||
if project
|
||||
.update(cx, |this, cx| this.synchronize_remote_buffers(cx))?
|
||||
.await
|
||||
.is_ok()
|
||||
|
@ -2709,9 +2710,10 @@ impl Project {
|
|||
BufferOrderedMessage::LanguageServerUpdate {
|
||||
language_server_id,
|
||||
message,
|
||||
name,
|
||||
} => {
|
||||
flush_operations(
|
||||
&this,
|
||||
&project,
|
||||
&mut operations_by_buffer_id,
|
||||
&mut needs_resync_with_host,
|
||||
is_local,
|
||||
|
@ -2719,12 +2721,14 @@ impl Project {
|
|||
)
|
||||
.await?;
|
||||
|
||||
this.read_with(cx, |this, _| {
|
||||
if let Some(project_id) = this.remote_id() {
|
||||
this.client
|
||||
project.read_with(cx, |project, _| {
|
||||
if let Some(project_id) = project.remote_id() {
|
||||
project
|
||||
.client
|
||||
.send(proto::UpdateLanguageServer {
|
||||
project_id,
|
||||
language_server_id: language_server_id.0 as u64,
|
||||
server_name: name.map(|name| String::from(name.0)),
|
||||
language_server_id: language_server_id.to_proto(),
|
||||
variant: Some(message),
|
||||
})
|
||||
.log_err();
|
||||
|
@ -2735,7 +2739,7 @@ impl Project {
|
|||
}
|
||||
|
||||
flush_operations(
|
||||
&this,
|
||||
&project,
|
||||
&mut operations_by_buffer_id,
|
||||
&mut needs_resync_with_host,
|
||||
is_local,
|
||||
|
@ -2856,12 +2860,14 @@ impl Project {
|
|||
LspStoreEvent::LanguageServerUpdate {
|
||||
language_server_id,
|
||||
message,
|
||||
name,
|
||||
} => {
|
||||
if self.is_local() {
|
||||
self.enqueue_buffer_ordered_message(
|
||||
BufferOrderedMessage::LanguageServerUpdate {
|
||||
language_server_id: *language_server_id,
|
||||
message: message.clone(),
|
||||
name: name.clone(),
|
||||
},
|
||||
)
|
||||
.ok();
|
||||
|
@ -3140,20 +3146,22 @@ impl Project {
|
|||
pub fn restart_language_servers_for_buffers(
|
||||
&mut self,
|
||||
buffers: Vec<Entity<Buffer>>,
|
||||
only_restart_servers: HashSet<LanguageServerSelector>,
|
||||
cx: &mut Context<Self>,
|
||||
) {
|
||||
self.lsp_store.update(cx, |lsp_store, cx| {
|
||||
lsp_store.restart_language_servers_for_buffers(buffers, cx)
|
||||
lsp_store.restart_language_servers_for_buffers(buffers, only_restart_servers, cx)
|
||||
})
|
||||
}
|
||||
|
||||
pub fn stop_language_servers_for_buffers(
|
||||
&mut self,
|
||||
buffers: Vec<Entity<Buffer>>,
|
||||
also_restart_servers: HashSet<LanguageServerSelector>,
|
||||
cx: &mut Context<Self>,
|
||||
) {
|
||||
self.lsp_store.update(cx, |lsp_store, cx| {
|
||||
lsp_store.stop_language_servers_for_buffers(buffers, cx)
|
||||
lsp_store.stop_language_servers_for_buffers(buffers, also_restart_servers, cx)
|
||||
})
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue