Map the new interface
# Conflicts: # crates/project/src/lsp_store.rs # Conflicts: # crates/project/src/lsp_store.rs # Conflicts: # crates/editor/src/editor.rs # crates/project/src/lsp_store.rs
This commit is contained in:
parent
64b14ef848
commit
ee3245c9a5
6 changed files with 127 additions and 42 deletions
|
@ -14,6 +14,9 @@ pub mod json_language_server_ext;
|
|||
pub mod lsp_ext_command;
|
||||
pub mod rust_analyzer_ext;
|
||||
|
||||
mod inlay_hint_cache;
|
||||
|
||||
use self::inlay_hint_cache::InlayHintCache;
|
||||
use crate::{
|
||||
CodeAction, ColorPresentation, Completion, CompletionResponse, CompletionSource,
|
||||
CoreCompletion, DocumentColor, Hover, InlayHint, LocationLink, LspAction, LspPullDiagnostics,
|
||||
|
@ -564,7 +567,7 @@ impl LocalLspStore {
|
|||
}
|
||||
|
||||
fn setup_lsp_messages(
|
||||
this: WeakEntity<LspStore>,
|
||||
lsp_store: WeakEntity<LspStore>,
|
||||
fs: Arc<dyn Fs>,
|
||||
language_server: &LanguageServer,
|
||||
delegate: Arc<dyn LspAdapterDelegate>,
|
||||
|
@ -575,7 +578,7 @@ impl LocalLspStore {
|
|||
language_server
|
||||
.on_notification::<lsp::notification::PublishDiagnostics, _>({
|
||||
let adapter = adapter.clone();
|
||||
let this = this.clone();
|
||||
let this = lsp_store.clone();
|
||||
move |mut params, cx| {
|
||||
let adapter = adapter.clone();
|
||||
if let Some(this) = this.upgrade() {
|
||||
|
@ -619,7 +622,7 @@ impl LocalLspStore {
|
|||
.on_request::<lsp::request::WorkspaceConfiguration, _, _>({
|
||||
let adapter = adapter.adapter.clone();
|
||||
let delegate = delegate.clone();
|
||||
let this = this.clone();
|
||||
let this = lsp_store.clone();
|
||||
let fs = fs.clone();
|
||||
move |params, cx| {
|
||||
let adapter = adapter.clone();
|
||||
|
@ -667,7 +670,7 @@ impl LocalLspStore {
|
|||
|
||||
language_server
|
||||
.on_request::<lsp::request::WorkspaceFoldersRequest, _, _>({
|
||||
let this = this.clone();
|
||||
let this = lsp_store.clone();
|
||||
move |_, cx| {
|
||||
let this = this.clone();
|
||||
let cx = cx.clone();
|
||||
|
@ -695,7 +698,7 @@ impl LocalLspStore {
|
|||
// to these requests when initializing.
|
||||
language_server
|
||||
.on_request::<lsp::request::WorkDoneProgressCreate, _, _>({
|
||||
let this = this.clone();
|
||||
let this = lsp_store.clone();
|
||||
move |params, cx| {
|
||||
let this = this.clone();
|
||||
let mut cx = cx.clone();
|
||||
|
@ -716,7 +719,7 @@ impl LocalLspStore {
|
|||
|
||||
language_server
|
||||
.on_request::<lsp::request::RegisterCapability, _, _>({
|
||||
let lsp_store = this.clone();
|
||||
let lsp_store = lsp_store.clone();
|
||||
move |params, cx| {
|
||||
let lsp_store = lsp_store.clone();
|
||||
let mut cx = cx.clone();
|
||||
|
@ -745,7 +748,7 @@ impl LocalLspStore {
|
|||
|
||||
language_server
|
||||
.on_request::<lsp::request::UnregisterCapability, _, _>({
|
||||
let lsp_store = this.clone();
|
||||
let lsp_store = lsp_store.clone();
|
||||
move |params, cx| {
|
||||
let lsp_store = lsp_store.clone();
|
||||
let mut cx = cx.clone();
|
||||
|
@ -774,7 +777,7 @@ impl LocalLspStore {
|
|||
|
||||
language_server
|
||||
.on_request::<lsp::request::ApplyWorkspaceEdit, _, _>({
|
||||
let this = this.clone();
|
||||
let this = lsp_store.clone();
|
||||
move |params, cx| {
|
||||
let mut cx = cx.clone();
|
||||
let this = this.clone();
|
||||
|
@ -793,18 +796,22 @@ impl LocalLspStore {
|
|||
|
||||
language_server
|
||||
.on_request::<lsp::request::InlayHintRefreshRequest, _, _>({
|
||||
let this = this.clone();
|
||||
let lsp_store = lsp_store.clone();
|
||||
move |(), cx| {
|
||||
let this = this.clone();
|
||||
let this = lsp_store.clone();
|
||||
let mut cx = cx.clone();
|
||||
async move {
|
||||
this.update(&mut cx, |this, cx| {
|
||||
cx.emit(LspStoreEvent::RefreshInlayHints);
|
||||
this.downstream_client.as_ref().map(|(client, project_id)| {
|
||||
client.send(proto::RefreshInlayHints {
|
||||
project_id: *project_id,
|
||||
this.update(&mut cx, |lsp_store, cx| {
|
||||
cx.emit(LspStoreEvent::RefreshInlayHints(server_id));
|
||||
lsp_store
|
||||
.downstream_client
|
||||
.as_ref()
|
||||
.map(|(client, project_id)| {
|
||||
client.send(proto::RefreshInlayHints {
|
||||
project_id: *project_id,
|
||||
server_id: server_id.to_proto(),
|
||||
})
|
||||
})
|
||||
})
|
||||
})?
|
||||
.transpose()?;
|
||||
Ok(())
|
||||
|
@ -815,7 +822,7 @@ impl LocalLspStore {
|
|||
|
||||
language_server
|
||||
.on_request::<lsp::request::CodeLensRefresh, _, _>({
|
||||
let this = this.clone();
|
||||
let this = lsp_store.clone();
|
||||
move |(), cx| {
|
||||
let this = this.clone();
|
||||
let mut cx = cx.clone();
|
||||
|
@ -837,7 +844,7 @@ impl LocalLspStore {
|
|||
|
||||
language_server
|
||||
.on_request::<lsp::request::WorkspaceDiagnosticRefresh, _, _>({
|
||||
let this = this.clone();
|
||||
let this = lsp_store.clone();
|
||||
move |(), cx| {
|
||||
let this = this.clone();
|
||||
let mut cx = cx.clone();
|
||||
|
@ -863,7 +870,7 @@ impl LocalLspStore {
|
|||
|
||||
language_server
|
||||
.on_request::<lsp::request::ShowMessageRequest, _, _>({
|
||||
let this = this.clone();
|
||||
let this = lsp_store.clone();
|
||||
let name = name.to_string();
|
||||
move |params, cx| {
|
||||
let this = this.clone();
|
||||
|
@ -901,7 +908,7 @@ impl LocalLspStore {
|
|||
.detach();
|
||||
language_server
|
||||
.on_notification::<lsp::notification::ShowMessage, _>({
|
||||
let this = this.clone();
|
||||
let this = lsp_store.clone();
|
||||
let name = name.to_string();
|
||||
move |params, cx| {
|
||||
let this = this.clone();
|
||||
|
@ -933,7 +940,7 @@ impl LocalLspStore {
|
|||
|
||||
language_server
|
||||
.on_notification::<lsp::notification::Progress, _>({
|
||||
let this = this.clone();
|
||||
let this = lsp_store.clone();
|
||||
move |params, cx| {
|
||||
if let Some(this) = this.upgrade() {
|
||||
this.update(cx, |this, cx| {
|
||||
|
@ -952,7 +959,7 @@ impl LocalLspStore {
|
|||
|
||||
language_server
|
||||
.on_notification::<lsp::notification::LogMessage, _>({
|
||||
let this = this.clone();
|
||||
let this = lsp_store.clone();
|
||||
move |params, cx| {
|
||||
if let Some(this) = this.upgrade() {
|
||||
this.update(cx, |_, cx| {
|
||||
|
@ -970,7 +977,7 @@ impl LocalLspStore {
|
|||
|
||||
language_server
|
||||
.on_notification::<lsp::notification::LogTrace, _>({
|
||||
let this = this.clone();
|
||||
let this = lsp_store.clone();
|
||||
move |params, cx| {
|
||||
let mut cx = cx.clone();
|
||||
if let Some(this) = this.upgrade() {
|
||||
|
@ -988,8 +995,8 @@ impl LocalLspStore {
|
|||
.detach();
|
||||
|
||||
json_language_server_ext::register_requests(this.clone(), language_server);
|
||||
rust_analyzer_ext::register_notifications(this.clone(), language_server);
|
||||
clangd_ext::register_notifications(this, language_server, adapter);
|
||||
rust_analyzer_ext::register_notifications(lsp_store.clone(), language_server);
|
||||
clangd_ext::register_notifications(lsp_store, language_server, adapter);
|
||||
}
|
||||
|
||||
fn shutdown_language_servers_on_quit(
|
||||
|
@ -3491,6 +3498,7 @@ pub struct LspStore {
|
|||
pub(super) lsp_server_capabilities: HashMap<LanguageServerId, lsp::ServerCapabilities>,
|
||||
lsp_document_colors: HashMap<BufferId, DocumentColorData>,
|
||||
lsp_code_lens: HashMap<BufferId, CodeLensData>,
|
||||
inlay_hint_data: HashMap<BufferId, InlayHintCache>,
|
||||
running_lsp_requests: HashMap<TypeId, (Global, HashMap<LspRequestId, Task<()>>)>,
|
||||
}
|
||||
|
||||
|
@ -3540,7 +3548,7 @@ pub enum LspStoreEvent {
|
|||
new_language: Option<Arc<Language>>,
|
||||
},
|
||||
Notification(String),
|
||||
RefreshInlayHints,
|
||||
RefreshInlayHints(LanguageServerId),
|
||||
RefreshCodeLens,
|
||||
DiagnosticsUpdated {
|
||||
server_id: LanguageServerId,
|
||||
|
@ -3762,6 +3770,7 @@ impl LspStore {
|
|||
lsp_server_capabilities: HashMap::default(),
|
||||
lsp_document_colors: HashMap::default(),
|
||||
lsp_code_lens: HashMap::default(),
|
||||
inlay_hint_data: HashMap::default(),
|
||||
running_lsp_requests: HashMap::default(),
|
||||
active_entry: None,
|
||||
_maintain_workspace_config,
|
||||
|
@ -3824,6 +3833,7 @@ impl LspStore {
|
|||
lsp_server_capabilities: HashMap::default(),
|
||||
lsp_document_colors: HashMap::default(),
|
||||
lsp_code_lens: HashMap::default(),
|
||||
inlay_hint_data: HashMap::default(),
|
||||
running_lsp_requests: HashMap::default(),
|
||||
active_entry: None,
|
||||
|
||||
|
@ -4125,6 +4135,7 @@ impl LspStore {
|
|||
if refcount == 0 {
|
||||
lsp_store.lsp_document_colors.remove(&buffer_id);
|
||||
lsp_store.lsp_code_lens.remove(&buffer_id);
|
||||
lsp_store.inlay_hint_data.remove(&buffer_id);
|
||||
let local = lsp_store.as_local_mut().unwrap();
|
||||
local.registered_buffers.remove(&buffer_id);
|
||||
local.buffers_opened_in_servers.remove(&buffer_id);
|
||||
|
@ -9524,7 +9535,7 @@ impl LspStore {
|
|||
if let Some(work) = status.pending_work.remove(&token)
|
||||
&& !work.is_disk_based_diagnostics_progress
|
||||
{
|
||||
cx.emit(LspStoreEvent::RefreshInlayHints);
|
||||
cx.emit(LspStoreEvent::RefreshInlayHints(language_server_id));
|
||||
}
|
||||
cx.notify();
|
||||
}
|
||||
|
@ -9656,12 +9667,14 @@ impl LspStore {
|
|||
}
|
||||
|
||||
async fn handle_refresh_inlay_hints(
|
||||
this: Entity<Self>,
|
||||
_: TypedEnvelope<proto::RefreshInlayHints>,
|
||||
lsp_store: Entity<Self>,
|
||||
envelope: TypedEnvelope<proto::RefreshInlayHints>,
|
||||
mut cx: AsyncApp,
|
||||
) -> Result<proto::Ack> {
|
||||
this.update(&mut cx, |_, cx| {
|
||||
cx.emit(LspStoreEvent::RefreshInlayHints);
|
||||
lsp_store.update(&mut cx, |_, cx| {
|
||||
cx.emit(LspStoreEvent::RefreshInlayHints(
|
||||
LanguageServerId::from_proto(envelope.payload.server_id),
|
||||
));
|
||||
})?;
|
||||
Ok(proto::Ack {})
|
||||
}
|
||||
|
@ -10913,7 +10926,7 @@ impl LspStore {
|
|||
language_server.name(),
|
||||
Some(key.worktree_id),
|
||||
));
|
||||
cx.emit(LspStoreEvent::RefreshInlayHints);
|
||||
cx.emit(LspStoreEvent::RefreshInlayHints(server_id));
|
||||
|
||||
let server_capabilities = language_server.capabilities();
|
||||
if let Some((downstream_client, project_id)) = self.downstream_client.as_ref() {
|
||||
|
@ -11517,6 +11530,10 @@ impl LspStore {
|
|||
buffer_servers.remove(&for_server);
|
||||
}
|
||||
}
|
||||
|
||||
for inlay_hint_cache in self.inlay_hint_data.values_mut() {
|
||||
inlay_hint_cache.remove_server_data(for_server);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn result_id(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue