Rename LspAdapterTrait to LspAdapter and LspAdapter to CachedLspAdapter

This commit is contained in:
Isaac Clayton 2022-07-12 09:29:38 +02:00
parent aeb1b89c25
commit d8b22a200e
9 changed files with 45 additions and 45 deletions

View File

@ -66,20 +66,20 @@ pub trait ToLspPosition {
pub struct LanguageServerName(pub Arc<str>); pub struct LanguageServerName(pub Arc<str>);
/// Represents a Language Server, with certain cached sync properties. /// Represents a Language Server, with certain cached sync properties.
/// Uses [`LspAdapterTrait`] under the hood, but calls all 'static' methods /// Uses [`LspAdapter`] under the hood, but calls all 'static' methods
/// once at startup, and caches the results. /// once at startup, and caches the results.
pub struct LspAdapter { pub struct CachedLspAdapter {
pub name: LanguageServerName, pub name: LanguageServerName,
pub server_args: Vec<String>, pub server_args: Vec<String>,
pub initialization_options: Option<Value>, pub initialization_options: Option<Value>,
pub disk_based_diagnostic_sources: Vec<String>, pub disk_based_diagnostic_sources: Vec<String>,
pub disk_based_diagnostics_progress_token: Option<String>, pub disk_based_diagnostics_progress_token: Option<String>,
pub id_for_language: Option<String>, pub id_for_language: Option<String>,
pub adapter: Box<dyn LspAdapterTrait>, pub adapter: Box<dyn LspAdapter>,
} }
impl LspAdapter { impl CachedLspAdapter {
pub async fn new<T: LspAdapterTrait>(adapter: T) -> Arc<Self> { pub async fn new<T: LspAdapter>(adapter: T) -> Arc<Self> {
let adapter = Box::new(adapter); let adapter = Box::new(adapter);
let name = adapter.name().await; let name = adapter.name().await;
let server_args = adapter.server_args().await; let server_args = adapter.server_args().await;
@ -89,7 +89,7 @@ impl LspAdapter {
adapter.disk_based_diagnostics_progress_token().await; adapter.disk_based_diagnostics_progress_token().await;
let id_for_language = adapter.id_for_language(name.0.as_ref()).await; let id_for_language = adapter.id_for_language(name.0.as_ref()).await;
Arc::new(LspAdapter { Arc::new(CachedLspAdapter {
name, name,
server_args, server_args,
initialization_options, initialization_options,
@ -147,7 +147,7 @@ impl LspAdapter {
} }
#[async_trait] #[async_trait]
pub trait LspAdapterTrait: 'static + Send + Sync { pub trait LspAdapter: 'static + Send + Sync {
async fn name(&self) -> LanguageServerName; async fn name(&self) -> LanguageServerName;
async fn fetch_latest_server_version( async fn fetch_latest_server_version(
@ -275,7 +275,7 @@ pub struct BracketPair {
pub struct Language { pub struct Language {
pub(crate) config: LanguageConfig, pub(crate) config: LanguageConfig,
pub(crate) grammar: Option<Arc<Grammar>>, pub(crate) grammar: Option<Arc<Grammar>>,
pub(crate) adapter: Option<Arc<LspAdapter>>, pub(crate) adapter: Option<Arc<CachedLspAdapter>>,
#[cfg(any(test, feature = "test-support"))] #[cfg(any(test, feature = "test-support"))]
fake_adapter: Option<( fake_adapter: Option<(
@ -490,7 +490,7 @@ impl LanguageRegistry {
} }
async fn get_server_binary_path( async fn get_server_binary_path(
adapter: Arc<LspAdapter>, adapter: Arc<CachedLspAdapter>,
language: Arc<Language>, language: Arc<Language>,
http_client: Arc<dyn HttpClient>, http_client: Arc<dyn HttpClient>,
download_dir: Arc<Path>, download_dir: Arc<Path>,
@ -532,7 +532,7 @@ async fn get_server_binary_path(
} }
async fn fetch_latest_server_binary_path( async fn fetch_latest_server_binary_path(
adapter: Arc<LspAdapter>, adapter: Arc<CachedLspAdapter>,
language: Arc<Language>, language: Arc<Language>,
http_client: Arc<dyn HttpClient>, http_client: Arc<dyn HttpClient>,
container_dir: &Path, container_dir: &Path,
@ -581,7 +581,7 @@ impl Language {
} }
} }
pub fn lsp_adapter(&self) -> Option<Arc<LspAdapter>> { pub fn lsp_adapter(&self) -> Option<Arc<CachedLspAdapter>> {
self.adapter.clone() self.adapter.clone()
} }
@ -613,7 +613,7 @@ impl Language {
Arc::get_mut(self.grammar.as_mut().unwrap()).unwrap() Arc::get_mut(self.grammar.as_mut().unwrap()).unwrap()
} }
pub fn with_lsp_adapter(mut self, lsp_adapter: Arc<LspAdapter>) -> Self { pub fn with_lsp_adapter(mut self, lsp_adapter: Arc<CachedLspAdapter>) -> Self {
self.adapter = Some(lsp_adapter); self.adapter = Some(lsp_adapter);
self self
} }
@ -625,7 +625,7 @@ impl Language {
) -> mpsc::UnboundedReceiver<lsp::FakeLanguageServer> { ) -> mpsc::UnboundedReceiver<lsp::FakeLanguageServer> {
let (servers_tx, servers_rx) = mpsc::unbounded(); let (servers_tx, servers_rx) = mpsc::unbounded();
self.fake_adapter = Some((servers_tx, fake_lsp_adapter.clone())); self.fake_adapter = Some((servers_tx, fake_lsp_adapter.clone()));
let adapter = LspAdapter::new(fake_lsp_adapter).await; let adapter = CachedLspAdapter::new(fake_lsp_adapter).await;
self.adapter = Some(adapter); self.adapter = Some(adapter);
servers_rx servers_rx
} }
@ -789,7 +789,7 @@ impl Default for FakeLspAdapter {
#[cfg(any(test, feature = "test-support"))] #[cfg(any(test, feature = "test-support"))]
#[async_trait] #[async_trait]
impl LspAdapterTrait for Arc<FakeLspAdapter> { impl LspAdapter for Arc<FakeLspAdapter> {
async fn name(&self) -> LanguageServerName { async fn name(&self) -> LanguageServerName {
LanguageServerName(self.name.into()) LanguageServerName(self.name.into())
} }

View File

@ -24,9 +24,9 @@ use language::{
deserialize_anchor, deserialize_line_ending, deserialize_version, serialize_anchor, deserialize_anchor, deserialize_line_ending, deserialize_version, serialize_anchor,
serialize_version, serialize_version,
}, },
range_from_lsp, range_to_lsp, Anchor, Bias, Buffer, CharKind, CodeAction, CodeLabel, range_from_lsp, range_to_lsp, Anchor, Bias, Buffer, CachedLspAdapter, CharKind, CodeAction,
Completion, Diagnostic, DiagnosticEntry, DiagnosticSet, Event as BufferEvent, File as _, CodeLabel, Completion, Diagnostic, DiagnosticEntry, DiagnosticSet, Event as BufferEvent,
Language, LanguageRegistry, LanguageServerName, LineEnding, LocalFile, LspAdapter, File as _, Language, LanguageRegistry, LanguageServerName, LineEnding, LocalFile,
OffsetRangeExt, Operation, Patch, PointUtf16, TextBufferSnapshot, ToOffset, ToPointUtf16, OffsetRangeExt, Operation, Patch, PointUtf16, TextBufferSnapshot, ToOffset, ToPointUtf16,
Transaction, Transaction,
}; };
@ -200,7 +200,7 @@ pub enum Event {
pub enum LanguageServerState { pub enum LanguageServerState {
Starting(Task<Option<Arc<LanguageServer>>>), Starting(Task<Option<Arc<LanguageServer>>>),
Running { Running {
adapter: Arc<LspAdapter>, adapter: Arc<CachedLspAdapter>,
server: Arc<LanguageServer>, server: Arc<LanguageServer>,
}, },
} }
@ -2007,7 +2007,7 @@ impl Project {
fn language_servers_for_worktree( fn language_servers_for_worktree(
&self, &self,
worktree_id: WorktreeId, worktree_id: WorktreeId,
) -> impl Iterator<Item = (&Arc<LspAdapter>, &Arc<LanguageServer>)> { ) -> impl Iterator<Item = (&Arc<CachedLspAdapter>, &Arc<LanguageServer>)> {
self.language_server_ids self.language_server_ids
.iter() .iter()
.filter_map(move |((language_server_worktree_id, _), id)| { .filter_map(move |((language_server_worktree_id, _), id)| {
@ -2648,7 +2648,7 @@ impl Project {
this: WeakModelHandle<Self>, this: WeakModelHandle<Self>,
params: lsp::ApplyWorkspaceEditParams, params: lsp::ApplyWorkspaceEditParams,
server_id: usize, server_id: usize,
adapter: Arc<LspAdapter>, adapter: Arc<CachedLspAdapter>,
language_server: Arc<LanguageServer>, language_server: Arc<LanguageServer>,
mut cx: AsyncAppContext, mut cx: AsyncAppContext,
) -> Result<lsp::ApplyWorkspaceEditResponse> { ) -> Result<lsp::ApplyWorkspaceEditResponse> {
@ -3913,7 +3913,7 @@ impl Project {
this: ModelHandle<Self>, this: ModelHandle<Self>,
edit: lsp::WorkspaceEdit, edit: lsp::WorkspaceEdit,
push_to_history: bool, push_to_history: bool,
lsp_adapter: Arc<LspAdapter>, lsp_adapter: Arc<CachedLspAdapter>,
language_server: Arc<LanguageServer>, language_server: Arc<LanguageServer>,
cx: &mut AsyncAppContext, cx: &mut AsyncAppContext,
) -> Result<ProjectTransaction> { ) -> Result<ProjectTransaction> {
@ -5923,7 +5923,7 @@ impl Project {
&self, &self,
buffer: &Buffer, buffer: &Buffer,
cx: &AppContext, cx: &AppContext,
) -> Option<(&Arc<LspAdapter>, &Arc<LanguageServer>)> { ) -> Option<(&Arc<CachedLspAdapter>, &Arc<LanguageServer>)> {
if let Some((file, language)) = File::from_dyn(buffer.file()).zip(buffer.language()) { if let Some((file, language)) = File::from_dyn(buffer.file()).zip(buffer.language()) {
let name = language.lsp_adapter()?.name.clone(); let name = language.lsp_adapter()?.name.clone();
let worktree_id = file.worktree_id(cx); let worktree_id = file.worktree_id(cx);

View File

@ -22,23 +22,23 @@ pub async fn init(languages: Arc<LanguageRegistry>, executor: Arc<Background>) {
( (
"c", "c",
tree_sitter_c::language(), tree_sitter_c::language(),
Some(LspAdapter::new(c::CLspAdapter).await), Some(CachedLspAdapter::new(c::CLspAdapter).await),
), ),
( (
"cpp", "cpp",
tree_sitter_cpp::language(), tree_sitter_cpp::language(),
Some(LspAdapter::new(c::CLspAdapter).await), Some(CachedLspAdapter::new(c::CLspAdapter).await),
), ),
( (
"go", "go",
tree_sitter_go::language(), tree_sitter_go::language(),
Some(LspAdapter::new(go::GoLspAdapter).await), Some(CachedLspAdapter::new(go::GoLspAdapter).await),
), ),
( (
"json", "json",
tree_sitter_json::language(), tree_sitter_json::language(),
match language_plugin::new_json(executor).await.log_err() { match language_plugin::new_json(executor).await.log_err() {
Some(lang) => Some(LspAdapter::new(lang).await), Some(lang) => Some(CachedLspAdapter::new(lang).await),
None => None, None => None,
}, },
), ),
@ -50,12 +50,12 @@ pub async fn init(languages: Arc<LanguageRegistry>, executor: Arc<Background>) {
( (
"python", "python",
tree_sitter_python::language(), tree_sitter_python::language(),
Some(LspAdapter::new(python::PythonLspAdapter).await), Some(CachedLspAdapter::new(python::PythonLspAdapter).await),
), ),
( (
"rust", "rust",
tree_sitter_rust::language(), tree_sitter_rust::language(),
Some(LspAdapter::new(rust::RustLspAdapter).await), Some(CachedLspAdapter::new(rust::RustLspAdapter).await),
), ),
( (
"toml", "toml",
@ -65,17 +65,17 @@ pub async fn init(languages: Arc<LanguageRegistry>, executor: Arc<Background>) {
( (
"tsx", "tsx",
tree_sitter_typescript::language_tsx(), tree_sitter_typescript::language_tsx(),
Some(LspAdapter::new(typescript::TypeScriptLspAdapter).await), Some(CachedLspAdapter::new(typescript::TypeScriptLspAdapter).await),
), ),
( (
"typescript", "typescript",
tree_sitter_typescript::language_typescript(), tree_sitter_typescript::language_typescript(),
Some(LspAdapter::new(typescript::TypeScriptLspAdapter).await), Some(CachedLspAdapter::new(typescript::TypeScriptLspAdapter).await),
), ),
( (
"javascript", "javascript",
tree_sitter_typescript::language_tsx(), tree_sitter_typescript::language_tsx(),
Some(LspAdapter::new(typescript::TypeScriptLspAdapter).await), Some(CachedLspAdapter::new(typescript::TypeScriptLspAdapter).await),
), ),
] { ] {
languages.add(Arc::new(language(name, grammar, lsp_adapter))); languages.add(Arc::new(language(name, grammar, lsp_adapter)));
@ -85,7 +85,7 @@ pub async fn init(languages: Arc<LanguageRegistry>, executor: Arc<Background>) {
pub(crate) fn language( pub(crate) fn language(
name: &str, name: &str,
grammar: tree_sitter::Language, grammar: tree_sitter::Language,
lsp_adapter: Option<Arc<LspAdapter>>, lsp_adapter: Option<Arc<CachedLspAdapter>>,
) -> Language { ) -> Language {
let config = toml::from_slice( let config = toml::from_slice(
&LanguageDir::get(&format!("{}/config.toml", name)) &LanguageDir::get(&format!("{}/config.toml", name))

View File

@ -11,7 +11,7 @@ use util::ResultExt;
pub struct CLspAdapter; pub struct CLspAdapter;
#[async_trait] #[async_trait]
impl super::LspAdapterTrait for CLspAdapter { impl super::LspAdapter for CLspAdapter {
async fn name(&self) -> LanguageServerName { async fn name(&self) -> LanguageServerName {
LanguageServerName("clangd".into()) LanguageServerName("clangd".into())
} }

View File

@ -18,7 +18,7 @@ lazy_static! {
} }
#[async_trait] #[async_trait]
impl super::LspAdapterTrait for GoLspAdapter { impl super::LspAdapter for GoLspAdapter {
async fn name(&self) -> LanguageServerName { async fn name(&self) -> LanguageServerName {
LanguageServerName("gopls".into()) LanguageServerName("gopls".into())
} }
@ -314,7 +314,7 @@ mod tests {
let language = language( let language = language(
"go", "go",
tree_sitter_go::language(), tree_sitter_go::language(),
Some(LspAdapter::new(GoLspAdapter).await), Some(CachedLspAdapter::new(GoLspAdapter).await),
); );
let theme = SyntaxTheme::new(vec![ let theme = SyntaxTheme::new(vec![

View File

@ -3,7 +3,7 @@ use async_trait::async_trait;
use client::http::HttpClient; use client::http::HttpClient;
use futures::lock::Mutex; use futures::lock::Mutex;
use gpui::executor::Background; use gpui::executor::Background;
use language::{LanguageServerName, LspAdapterTrait}; use language::{LanguageServerName, LspAdapter};
use plugin_runtime::{Plugin, PluginBuilder, WasiFn}; use plugin_runtime::{Plugin, PluginBuilder, WasiFn};
use std::{any::Any, path::PathBuf, sync::Arc}; use std::{any::Any, path::PathBuf, sync::Arc};
use util::ResultExt; use util::ResultExt;
@ -55,7 +55,7 @@ impl PluginLspAdapter {
} }
#[async_trait] #[async_trait]
impl LspAdapterTrait for PluginLspAdapter { impl LspAdapter for PluginLspAdapter {
async fn name(&self) -> LanguageServerName { async fn name(&self) -> LanguageServerName {
let name: String = self let name: String = self
.runtime .runtime

View File

@ -3,7 +3,7 @@ use anyhow::{anyhow, Context, Result};
use async_trait::async_trait; use async_trait::async_trait;
use client::http::HttpClient; use client::http::HttpClient;
use futures::StreamExt; use futures::StreamExt;
use language::{LanguageServerName, LspAdapterTrait}; use language::{LanguageServerName, LspAdapter};
use smol::fs; use smol::fs;
use std::{any::Any, path::PathBuf, sync::Arc}; use std::{any::Any, path::PathBuf, sync::Arc};
use util::ResultExt; use util::ResultExt;
@ -15,7 +15,7 @@ impl PythonLspAdapter {
} }
#[async_trait] #[async_trait]
impl LspAdapterTrait for PythonLspAdapter { impl LspAdapter for PythonLspAdapter {
async fn name(&self) -> LanguageServerName { async fn name(&self) -> LanguageServerName {
LanguageServerName("pyright".into()) LanguageServerName("pyright".into())
} }

View File

@ -14,7 +14,7 @@ use util::ResultExt;
pub struct RustLspAdapter; pub struct RustLspAdapter;
#[async_trait] #[async_trait]
impl LspAdapterTrait for RustLspAdapter { impl LspAdapter for RustLspAdapter {
async fn name(&self) -> LanguageServerName { async fn name(&self) -> LanguageServerName {
LanguageServerName("rust-analyzer".into()) LanguageServerName("rust-analyzer".into())
} }
@ -255,7 +255,7 @@ impl LspAdapterTrait for RustLspAdapter {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;
use crate::languages::{language, LspAdapter}; use crate::languages::{language, CachedLspAdapter};
use gpui::{color::Color, MutableAppContext}; use gpui::{color::Color, MutableAppContext};
use theme::SyntaxTheme; use theme::SyntaxTheme;
@ -305,7 +305,7 @@ mod tests {
let language = language( let language = language(
"rust", "rust",
tree_sitter_rust::language(), tree_sitter_rust::language(),
Some(LspAdapter::new(RustLspAdapter).await), Some(CachedLspAdapter::new(RustLspAdapter).await),
); );
let grammar = language.grammar().unwrap(); let grammar = language.grammar().unwrap();
let theme = SyntaxTheme::new(vec![ let theme = SyntaxTheme::new(vec![
@ -390,7 +390,7 @@ mod tests {
let language = language( let language = language(
"rust", "rust",
tree_sitter_rust::language(), tree_sitter_rust::language(),
Some(LspAdapter::new(RustLspAdapter).await), Some(CachedLspAdapter::new(RustLspAdapter).await),
); );
let grammar = language.grammar().unwrap(); let grammar = language.grammar().unwrap();
let theme = SyntaxTheme::new(vec![ let theme = SyntaxTheme::new(vec![

View File

@ -3,7 +3,7 @@ use anyhow::{anyhow, Context, Result};
use async_trait::async_trait; use async_trait::async_trait;
use client::http::HttpClient; use client::http::HttpClient;
use futures::StreamExt; use futures::StreamExt;
use language::{LanguageServerName, LspAdapterTrait}; use language::{LanguageServerName, LspAdapter};
use serde_json::json; use serde_json::json;
use smol::fs; use smol::fs;
use std::{any::Any, path::PathBuf, sync::Arc}; use std::{any::Any, path::PathBuf, sync::Arc};
@ -21,7 +21,7 @@ struct Versions {
} }
#[async_trait] #[async_trait]
impl LspAdapterTrait for TypeScriptLspAdapter { impl LspAdapter for TypeScriptLspAdapter {
async fn name(&self) -> LanguageServerName { async fn name(&self) -> LanguageServerName {
LanguageServerName("typescript-language-server".into()) LanguageServerName("typescript-language-server".into())
} }