Allow controlling Tailwind via the language_servers
setting (#11012)
This PR adds the ability for the Tailwind language server (`tailwindcss-language-server`) to be controlled by the `language_servers` setting. Now in your settings you can indicate that the Tailwind language server should be used for a given language, even if that language does not have the Tailwind language server registered for it already: ```json { "languages": { "My Language": { "language_servers": ["tailwindcss-language-server", "..."] } } } ``` Release Notes: - N/A
This commit is contained in:
parent
c833a7e662
commit
3eac581a62
4 changed files with 113 additions and 18 deletions
|
@ -46,6 +46,8 @@ struct LanguageRegistryState {
|
|||
available_languages: Vec<AvailableLanguage>,
|
||||
grammars: HashMap<Arc<str>, AvailableGrammar>,
|
||||
lsp_adapters: HashMap<Arc<str>, Vec<Arc<CachedLspAdapter>>>,
|
||||
available_lsp_adapters:
|
||||
HashMap<LanguageServerName, Arc<dyn Fn() -> Arc<CachedLspAdapter> + 'static + Send + Sync>>,
|
||||
loading_languages: HashMap<LanguageId, Vec<oneshot::Sender<Result<Arc<Language>>>>>,
|
||||
subscription: (watch::Sender<()>, watch::Receiver<()>),
|
||||
theme: Option<Arc<Theme>>,
|
||||
|
@ -153,6 +155,7 @@ impl LanguageRegistry {
|
|||
language_settings: Default::default(),
|
||||
loading_languages: Default::default(),
|
||||
lsp_adapters: Default::default(),
|
||||
available_lsp_adapters: HashMap::default(),
|
||||
subscription: watch::channel(),
|
||||
theme: Default::default(),
|
||||
version: 0,
|
||||
|
@ -213,6 +216,38 @@ impl LanguageRegistry {
|
|||
)
|
||||
}
|
||||
|
||||
/// Registers an available language server adapter.
|
||||
///
|
||||
/// The language server is registered under the language server name, but
|
||||
/// not bound to a particular language.
|
||||
///
|
||||
/// When a language wants to load this particular language server, it will
|
||||
/// invoke the `load` function.
|
||||
pub fn register_available_lsp_adapter(
|
||||
&self,
|
||||
name: LanguageServerName,
|
||||
load: impl Fn() -> Arc<dyn LspAdapter> + 'static + Send + Sync,
|
||||
) {
|
||||
self.state.write().available_lsp_adapters.insert(
|
||||
name,
|
||||
Arc::new(move || {
|
||||
let lsp_adapter = load();
|
||||
CachedLspAdapter::new(lsp_adapter, true)
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
/// Loads the language server adapter for the language server with the given name.
|
||||
pub fn load_available_lsp_adapter(
|
||||
&self,
|
||||
name: &LanguageServerName,
|
||||
) -> Option<Arc<CachedLspAdapter>> {
|
||||
let state = self.state.read();
|
||||
let load_lsp_adapter = state.available_lsp_adapters.get(name)?;
|
||||
|
||||
Some(load_lsp_adapter())
|
||||
}
|
||||
|
||||
pub fn register_lsp_adapter(&self, language_name: Arc<str>, adapter: Arc<dyn LspAdapter>) {
|
||||
self.state
|
||||
.write()
|
||||
|
|
|
@ -789,5 +789,24 @@ mod tests {
|
|||
),
|
||||
language_server_names(&["deno", "eslint", "tailwind"])
|
||||
);
|
||||
|
||||
// Adding a language server not in the list of available languages servers adds it to the list.
|
||||
assert_eq!(
|
||||
LanguageSettings::resolve_language_servers(
|
||||
&[
|
||||
"my-cool-language-server".into(),
|
||||
LanguageSettings::REST_OF_LANGUAGE_SERVERS.into()
|
||||
],
|
||||
&available_language_servers
|
||||
),
|
||||
language_server_names(&[
|
||||
"my-cool-language-server",
|
||||
"typescript-language-server",
|
||||
"biome",
|
||||
"deno",
|
||||
"eslint",
|
||||
"tailwind",
|
||||
])
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue