Start language servers based on buffers' languages
Co-Authored-By: Nathan Sobo <nathan@zed.dev>
This commit is contained in:
co-authored by
Nathan Sobo
parent
a66b81d60a
commit
8d3f42de52
@@ -1,6 +1,7 @@
|
||||
use crate::HighlightMap;
|
||||
use anyhow::Result;
|
||||
use gpui::AppContext;
|
||||
use gpui::{executor::Background, AppContext};
|
||||
use lsp::LanguageServer;
|
||||
use parking_lot::Mutex;
|
||||
use serde::Deserialize;
|
||||
use std::{collections::HashSet, path::Path, str, sync::Arc};
|
||||
@@ -16,10 +17,13 @@ pub struct LanguageConfig {
|
||||
pub language_server: Option<LanguageServerConfig>,
|
||||
}
|
||||
|
||||
#[derive(Deserialize)]
|
||||
#[derive(Default, Deserialize)]
|
||||
pub struct LanguageServerConfig {
|
||||
pub binary: String,
|
||||
pub disk_based_diagnostic_sources: HashSet<String>,
|
||||
#[cfg(any(test, feature = "test-support"))]
|
||||
#[serde(skip)]
|
||||
pub fake_server: Option<(Arc<LanguageServer>, Arc<std::sync::atomic::AtomicBool>)>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Deserialize)]
|
||||
@@ -117,6 +121,12 @@ impl Language {
|
||||
cx: &AppContext,
|
||||
) -> Result<Option<Arc<lsp::LanguageServer>>> {
|
||||
if let Some(config) = &self.config.language_server {
|
||||
#[cfg(any(test, feature = "test-support"))]
|
||||
if let Some((server, started)) = &config.fake_server {
|
||||
started.store(true, std::sync::atomic::Ordering::SeqCst);
|
||||
return Ok(Some(server.clone()));
|
||||
}
|
||||
|
||||
const ZED_BUNDLE: Option<&'static str> = option_env!("ZED_BUNDLE");
|
||||
let binary_path = if ZED_BUNDLE.map_or(Ok(false), |b| b.parse())? {
|
||||
cx.platform()
|
||||
@@ -151,6 +161,23 @@ impl Language {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(any(test, feature = "test-support"))]
|
||||
impl LanguageServerConfig {
|
||||
pub async fn fake(executor: Arc<Background>) -> (Self, lsp::FakeLanguageServer) {
|
||||
let (server, fake) = lsp::LanguageServer::fake(executor).await;
|
||||
fake.started
|
||||
.store(false, std::sync::atomic::Ordering::SeqCst);
|
||||
let started = fake.started.clone();
|
||||
(
|
||||
Self {
|
||||
fake_server: Some((server, started)),
|
||||
..Default::default()
|
||||
},
|
||||
fake,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
@@ -6,7 +6,7 @@ mod tests;
|
||||
|
||||
pub use self::{
|
||||
highlight_map::{HighlightId, HighlightMap},
|
||||
language::{BracketPair, Language, LanguageConfig, LanguageRegistry},
|
||||
language::{BracketPair, Language, LanguageConfig, LanguageRegistry, LanguageServerConfig},
|
||||
};
|
||||
use anyhow::{anyhow, Result};
|
||||
pub use buffer::{Buffer as TextBuffer, Operation as _, *};
|
||||
@@ -37,6 +37,9 @@ use std::{
|
||||
use tree_sitter::{InputEdit, Parser, QueryCursor, Tree};
|
||||
use util::{post_inc, TryFutureExt as _};
|
||||
|
||||
#[cfg(any(test, feature = "test-support"))]
|
||||
pub use tree_sitter_rust;
|
||||
|
||||
pub use lsp::DiagnosticSeverity;
|
||||
|
||||
thread_local! {
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
use super::*;
|
||||
use crate::language::LanguageServerConfig;
|
||||
use gpui::{ModelHandle, MutableAppContext};
|
||||
use std::{iter::FromIterator, rc::Rc};
|
||||
use std::rc::Rc;
|
||||
use unindent::Unindent as _;
|
||||
|
||||
#[gpui::test]
|
||||
@@ -676,10 +675,7 @@ fn rust_lang() -> Option<Arc<Language>> {
|
||||
LanguageConfig {
|
||||
name: "Rust".to_string(),
|
||||
path_suffixes: vec!["rs".to_string()],
|
||||
language_server: Some(LanguageServerConfig {
|
||||
binary: "rust-analyzer".to_string(),
|
||||
disk_based_diagnostic_sources: HashSet::from_iter(vec!["rustc".to_string()]),
|
||||
}),
|
||||
language_server: None,
|
||||
..Default::default()
|
||||
},
|
||||
tree_sitter_rust::language(),
|
||||
|
||||
Reference in New Issue
Block a user