Move all configuration of individual LSP servers to LspAdapter
This commit is contained in:
@@ -1,8 +1,7 @@
|
||||
pub use crate::{
|
||||
diagnostic_set::DiagnosticSet,
|
||||
highlight_map::{HighlightId, HighlightMap},
|
||||
proto, BracketPair, Grammar, Language, LanguageConfig, LanguageRegistry, LanguageServerConfig,
|
||||
PLAIN_TEXT,
|
||||
proto, BracketPair, Grammar, Language, LanguageConfig, LanguageRegistry, PLAIN_TEXT,
|
||||
};
|
||||
use crate::{
|
||||
diagnostic_set::{DiagnosticEntry, DiagnosticGroup},
|
||||
|
||||
@@ -8,7 +8,7 @@ mod tests;
|
||||
|
||||
use anyhow::{anyhow, Context, Result};
|
||||
use client::http::{self, HttpClient};
|
||||
use collections::{HashMap, HashSet};
|
||||
use collections::HashMap;
|
||||
use futures::{
|
||||
future::{BoxFuture, Shared},
|
||||
FutureExt, TryFutureExt,
|
||||
@@ -52,7 +52,6 @@ lazy_static! {
|
||||
brackets: Default::default(),
|
||||
autoclose_before: Default::default(),
|
||||
line_comment: None,
|
||||
language_server: Default::default(),
|
||||
},
|
||||
None,
|
||||
));
|
||||
@@ -100,6 +99,14 @@ pub trait LspAdapter: 'static + Send + Sync {
|
||||
fn initialization_options(&self) -> Option<Value> {
|
||||
None
|
||||
}
|
||||
|
||||
fn disk_based_diagnostic_sources(&self) -> &'static [&'static str] {
|
||||
Default::default()
|
||||
}
|
||||
|
||||
fn disk_based_diagnostics_progress_token(&self) -> Option<&'static str> {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, Eq)]
|
||||
@@ -117,8 +124,6 @@ pub struct LanguageConfig {
|
||||
#[serde(default)]
|
||||
pub autoclose_before: String,
|
||||
pub line_comment: Option<String>,
|
||||
#[serde(default)]
|
||||
pub language_server: LanguageServerConfig,
|
||||
}
|
||||
|
||||
impl Default for LanguageConfig {
|
||||
@@ -129,22 +134,17 @@ impl Default for LanguageConfig {
|
||||
brackets: Default::default(),
|
||||
autoclose_before: Default::default(),
|
||||
line_comment: Default::default(),
|
||||
language_server: Default::default(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Default, Deserialize)]
|
||||
pub struct LanguageServerConfig {
|
||||
pub disk_based_diagnostic_sources: HashSet<String>,
|
||||
pub disk_based_diagnostics_progress_token: Option<String>,
|
||||
}
|
||||
|
||||
#[cfg(any(test, feature = "test-support"))]
|
||||
pub struct FakeLspAdapter {
|
||||
pub name: &'static str,
|
||||
pub capabilities: lsp::ServerCapabilities,
|
||||
pub initializer: Option<Box<dyn 'static + Send + Sync + Fn(&mut lsp::FakeLanguageServer)>>,
|
||||
pub disk_based_diagnostics_progress_token: Option<&'static str>,
|
||||
pub disk_based_diagnostics_sources: &'static [&'static str],
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Deserialize)]
|
||||
@@ -500,15 +500,16 @@ impl Language {
|
||||
self.config.line_comment.as_deref()
|
||||
}
|
||||
|
||||
pub fn disk_based_diagnostic_sources(&self) -> &HashSet<String> {
|
||||
&self.config.language_server.disk_based_diagnostic_sources
|
||||
pub fn disk_based_diagnostic_sources(&self) -> &'static [&'static str] {
|
||||
self.adapter.as_ref().map_or(&[] as &[_], |adapter| {
|
||||
adapter.disk_based_diagnostic_sources()
|
||||
})
|
||||
}
|
||||
|
||||
pub fn disk_based_diagnostics_progress_token(&self) -> Option<&String> {
|
||||
self.config
|
||||
.language_server
|
||||
.disk_based_diagnostics_progress_token
|
||||
pub fn disk_based_diagnostics_progress_token(&self) -> Option<&'static str> {
|
||||
self.adapter
|
||||
.as_ref()
|
||||
.and_then(|adapter| adapter.disk_based_diagnostics_progress_token())
|
||||
}
|
||||
|
||||
pub fn process_diagnostics(&self, diagnostics: &mut lsp::PublishDiagnosticsParams) {
|
||||
@@ -621,10 +622,13 @@ impl Default for FakeLspAdapter {
|
||||
name: "the-fake-language-server",
|
||||
capabilities: lsp::LanguageServer::full_capabilities(),
|
||||
initializer: None,
|
||||
disk_based_diagnostics_progress_token: None,
|
||||
disk_based_diagnostics_sources: &[],
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(any(test, feature = "test-support"))]
|
||||
impl LspAdapter for FakeLspAdapter {
|
||||
fn name(&self) -> LanguageServerName {
|
||||
LanguageServerName(self.name.into())
|
||||
@@ -651,6 +655,14 @@ impl LspAdapter for FakeLspAdapter {
|
||||
}
|
||||
|
||||
fn process_diagnostics(&self, _: &mut lsp::PublishDiagnosticsParams) {}
|
||||
|
||||
fn disk_based_diagnostic_sources(&self) -> &'static [&'static str] {
|
||||
self.disk_based_diagnostics_sources
|
||||
}
|
||||
|
||||
fn disk_based_diagnostics_progress_token(&self) -> Option<&'static str> {
|
||||
self.disk_based_diagnostics_progress_token
|
||||
}
|
||||
}
|
||||
|
||||
impl ToLspPosition for PointUtf16 {
|
||||
|
||||
@@ -1536,7 +1536,7 @@ impl Project {
|
||||
|
||||
match event {
|
||||
LanguageServerEvent::WorkStart { token } => {
|
||||
if Some(&token) == disk_diagnostics_token {
|
||||
if Some(token.as_str()) == disk_diagnostics_token {
|
||||
language_server_status.pending_diagnostic_updates += 1;
|
||||
if language_server_status.pending_diagnostic_updates == 1 {
|
||||
self.disk_based_diagnostics_started(cx);
|
||||
@@ -1558,7 +1558,7 @@ impl Project {
|
||||
}
|
||||
}
|
||||
LanguageServerEvent::WorkProgress { token, progress } => {
|
||||
if Some(&token) != disk_diagnostics_token {
|
||||
if Some(token.as_str()) != disk_diagnostics_token {
|
||||
self.on_lsp_work_progress(
|
||||
language_server_id,
|
||||
token.clone(),
|
||||
@@ -1578,7 +1578,7 @@ impl Project {
|
||||
}
|
||||
}
|
||||
LanguageServerEvent::WorkEnd { token } => {
|
||||
if Some(&token) == disk_diagnostics_token {
|
||||
if Some(token.as_str()) == disk_diagnostics_token {
|
||||
language_server_status.pending_diagnostic_updates -= 1;
|
||||
if language_server_status.pending_diagnostic_updates == 0 {
|
||||
self.disk_based_diagnostics_finished(cx);
|
||||
@@ -1708,7 +1708,7 @@ impl Project {
|
||||
pub fn update_diagnostics(
|
||||
&mut self,
|
||||
params: lsp::PublishDiagnosticsParams,
|
||||
disk_based_sources: &HashSet<String>,
|
||||
disk_based_sources: &[&str],
|
||||
cx: &mut ModelContext<Self>,
|
||||
) -> Result<()> {
|
||||
let abs_path = params
|
||||
@@ -1751,8 +1751,9 @@ impl Project {
|
||||
);
|
||||
} else {
|
||||
let group_id = post_inc(&mut next_group_id);
|
||||
let is_disk_based =
|
||||
source.map_or(false, |source| disk_based_sources.contains(source));
|
||||
let is_disk_based = source.map_or(false, |source| {
|
||||
disk_based_sources.contains(&source.as_str())
|
||||
});
|
||||
|
||||
sources_by_group_id.insert(group_id, source);
|
||||
primary_diagnostic_group_ids
|
||||
@@ -4606,8 +4607,8 @@ mod tests {
|
||||
use futures::StreamExt;
|
||||
use gpui::test::subscribe;
|
||||
use language::{
|
||||
tree_sitter_rust, Diagnostic, FakeLspAdapter, LanguageConfig, LanguageServerConfig,
|
||||
OffsetRangeExt, Point, ToPoint,
|
||||
tree_sitter_rust, Diagnostic, FakeLspAdapter, LanguageConfig, OffsetRangeExt, Point,
|
||||
ToPoint,
|
||||
};
|
||||
use lsp::Url;
|
||||
use serde_json::json;
|
||||
@@ -4906,20 +4907,20 @@ mod tests {
|
||||
async fn test_disk_based_diagnostics_progress(cx: &mut gpui::TestAppContext) {
|
||||
cx.foreground().forbid_parking();
|
||||
|
||||
let progress_token = "the-progress-token".to_string();
|
||||
let progress_token = "the-progress-token";
|
||||
let mut language = Language::new(
|
||||
LanguageConfig {
|
||||
name: "Rust".into(),
|
||||
path_suffixes: vec!["rs".to_string()],
|
||||
language_server: LanguageServerConfig {
|
||||
disk_based_diagnostics_progress_token: Some(progress_token.clone()),
|
||||
..Default::default()
|
||||
},
|
||||
..Default::default()
|
||||
},
|
||||
Some(tree_sitter_rust::language()),
|
||||
);
|
||||
let mut fake_servers = language.set_fake_lsp_adapter(Default::default());
|
||||
let mut fake_servers = language.set_fake_lsp_adapter(FakeLspAdapter {
|
||||
disk_based_diagnostics_progress_token: Some(progress_token),
|
||||
disk_based_diagnostics_sources: &["disk"],
|
||||
..Default::default()
|
||||
});
|
||||
|
||||
let fs = FakeFs::new(cx.background());
|
||||
fs.insert_tree(
|
||||
@@ -4956,15 +4957,15 @@ mod tests {
|
||||
let mut events = subscribe(&project, cx);
|
||||
|
||||
let mut fake_server = fake_servers.next().await.unwrap();
|
||||
fake_server.start_progress(&progress_token).await;
|
||||
fake_server.start_progress(progress_token).await;
|
||||
assert_eq!(
|
||||
events.next().await.unwrap(),
|
||||
Event::DiskBasedDiagnosticsStarted
|
||||
);
|
||||
|
||||
fake_server.start_progress(&progress_token).await;
|
||||
fake_server.end_progress(&progress_token).await;
|
||||
fake_server.start_progress(&progress_token).await;
|
||||
fake_server.start_progress(progress_token).await;
|
||||
fake_server.end_progress(progress_token).await;
|
||||
fake_server.start_progress(progress_token).await;
|
||||
|
||||
fake_server.notify::<lsp::notification::PublishDiagnostics>(
|
||||
lsp::PublishDiagnosticsParams {
|
||||
@@ -4983,8 +4984,8 @@ mod tests {
|
||||
Event::DiagnosticsUpdated((worktree_id, Path::new("a.rs")).into())
|
||||
);
|
||||
|
||||
fake_server.end_progress(&progress_token).await;
|
||||
fake_server.end_progress(&progress_token).await;
|
||||
fake_server.end_progress(progress_token).await;
|
||||
fake_server.end_progress(progress_token).await;
|
||||
assert_eq!(
|
||||
events.next().await.unwrap(),
|
||||
Event::DiskBasedDiagnosticsUpdated
|
||||
@@ -5024,20 +5025,18 @@ mod tests {
|
||||
async fn test_transforming_diagnostics(cx: &mut gpui::TestAppContext) {
|
||||
cx.foreground().forbid_parking();
|
||||
|
||||
// let (mut lsp_config, mut fake_servers) = LanguageServerConfig::fake();
|
||||
let mut language = Language::new(
|
||||
LanguageConfig {
|
||||
name: "Rust".into(),
|
||||
path_suffixes: vec!["rs".to_string()],
|
||||
language_server: LanguageServerConfig {
|
||||
disk_based_diagnostic_sources: ["disk".to_string()].into_iter().collect(),
|
||||
..Default::default()
|
||||
},
|
||||
..Default::default()
|
||||
},
|
||||
Some(tree_sitter_rust::language()),
|
||||
);
|
||||
let mut fake_servers = language.set_fake_lsp_adapter(Default::default());
|
||||
let mut fake_servers = language.set_fake_lsp_adapter(FakeLspAdapter {
|
||||
disk_based_diagnostics_sources: &["disk"],
|
||||
..Default::default()
|
||||
});
|
||||
|
||||
let text = "
|
||||
fn a() { A }
|
||||
@@ -6551,9 +6550,7 @@ mod tests {
|
||||
};
|
||||
|
||||
project
|
||||
.update(cx, |p, cx| {
|
||||
p.update_diagnostics(message, &Default::default(), cx)
|
||||
})
|
||||
.update(cx, |p, cx| p.update_diagnostics(message, &[], cx))
|
||||
.unwrap();
|
||||
let buffer = buffer.read_with(cx, |buffer, _| buffer.snapshot());
|
||||
|
||||
|
||||
@@ -5001,6 +5001,7 @@ mod tests {
|
||||
});
|
||||
}
|
||||
})),
|
||||
..Default::default()
|
||||
});
|
||||
host_language_registry.add(Arc::new(language));
|
||||
|
||||
|
||||
@@ -112,6 +112,14 @@ impl LspAdapter for RustLspAdapter {
|
||||
.boxed()
|
||||
}
|
||||
|
||||
fn disk_based_diagnostic_sources(&self) -> &'static [&'static str] {
|
||||
&["rustc"]
|
||||
}
|
||||
|
||||
fn disk_based_diagnostics_progress_token(&self) -> Option<&'static str> {
|
||||
Some("rustAnalyzer/cargo check")
|
||||
}
|
||||
|
||||
fn process_diagnostics(&self, params: &mut lsp::PublishDiagnosticsParams) {
|
||||
lazy_static! {
|
||||
static ref REGEX: Regex = Regex::new("(?m)`([^`]+)\n`$").unwrap();
|
||||
|
||||
@@ -10,7 +10,3 @@ brackets = [
|
||||
{ start = "\"", end = "\"", close = true, newline = false },
|
||||
{ start = "/*", end = " */", close = true, newline = false },
|
||||
]
|
||||
|
||||
[language_server]
|
||||
disk_based_diagnostic_sources = ["rustc"]
|
||||
disk_based_diagnostics_progress_token = "rustAnalyzer/cargo check"
|
||||
|
||||
Reference in New Issue
Block a user