Fix deadlock while initializing JSON language server

As it turns out both parking-lot and std's `RwLock` disallows taking
multiple read locks on the same thread

Co-Authored-By: Max Brunsfeld <max@zed.dev>
This commit is contained in:
Julia 2023-03-16 17:19:17 -04:00
parent 1fbdea6a03
commit 757f05042d

View file

@ -567,20 +567,25 @@ impl LanguageRegistry {
}
pub fn workspace_configuration(&self, cx: &mut MutableAppContext) -> Task<serde_json::Value> {
let state = self.state.read();
let lsp_adapters = {
let state = self.state.read();
state
.available_languages
.iter()
.filter_map(|l| l.lsp_adapter.clone())
.chain(
state
.languages
.iter()
.filter_map(|l| l.adapter.as_ref().map(|a| a.adapter.clone())),
)
.collect::<Vec<_>>()
};
let mut language_configs = Vec::new();
for language in &state.available_languages {
if let Some(adapter) = language.lsp_adapter.as_ref() {
if let Some(language_config) = adapter.workspace_configuration(cx) {
language_configs.push(language_config);
}
}
}
for language in &state.languages {
if let Some(adapter) = language.lsp_adapter() {
if let Some(language_config) = adapter.workspace_configuration(cx) {
language_configs.push(language_config);
}
for adapter in &lsp_adapters {
if let Some(language_config) = adapter.workspace_configuration(cx) {
language_configs.push(language_config);
}
}