@@ -1188,71 +1188,80 @@ impl Editor {
1190 /// Refreshes the language server for a given document
1190 /// Refreshes the language server for a given document
1191− pub fn refresh_language_servers(&mut self, doc_id: DocumentId) -> Option<()> {
1191+ pub fn refresh_language_servers(&mut self, doc_id: DocumentId) {
1192 self.launch_language_servers(doc_id)
1192 self.launch_language_servers(doc_id)
1195 /// Launch a language server for a given document
1195 /// Launch a language server for a given document
1196− fn launch_language_servers(&mut self, doc_id: DocumentId) -> Option<()> {
1196+ fn launch_language_servers(&mut self, doc_id: DocumentId) {
1197 if !self.config().lsp.enable {
1197 if !self.config().lsp.enable {
1198− return None;
1198+ return;
1200 // if doc doesn't have a URL it's a scratch buffer, ignore it
1200 // if doc doesn't have a URL it's a scratch buffer, ignore it
1201− let doc = self.documents.get_mut(&doc_id)?;
1201+ let Some(doc) = self.documents.get_mut(&doc_id) else {
1202− let doc_url = doc.url()?;
1204+ let Some(doc_url) = doc.url() else {
1203 let (lang, path) = (doc.language.clone(), doc.path().cloned());
1207 let (lang, path) = (doc.language.clone(), doc.path().cloned());
1204 let config = doc.config.load();
1208 let config = doc.config.load();
1205 let root_dirs = &config.workspace_lsp_roots;
1209 let root_dirs = &config.workspace_lsp_roots;
1207− // try to find language servers based on the language name
1211+ // store only successfully started language servers
1208− let language_servers = lang.as_ref().and_then(|language| {
1212+ let language_servers = lang.as_ref().map_or_else(HashMap::default, |language| {
1209 self.language_servers
1213 self.language_servers
1210 .get(language, path.as_ref(), root_dirs, config.lsp.snippets)
1214 .get(language, path.as_ref(), root_dirs, config.lsp.snippets)
1211− .map_err(|e| {
1215+ .filter_map(|(lang, client)| match client {
1216+ Ok(client) => Some((lang, client)),
1212− log::error!(
1218+ log::error!(
1213− "Failed to initialize the language servers for `{}` {{ {} }}",
1219+ "Failed to initialize the language servers for `{}` - `{}` {{ {} }}",
1214− language.scope(),
1220+ language.scope(),
1218− .ok()
1227+ .collect::<HashMap<_, _>>()
1221− if let Some(language_servers) = language_servers {
1230+ if language_servers.is_empty() {
1222− let language_id = doc.language_id().map(ToOwned::to_owned).unwrap_or_default();
1231+ return;
1224− // only spawn new language servers if the servers aren't the same
1226− let doc_language_servers_not_in_registry =
1227− doc.language_servers.iter().filter(|(name, doc_ls)| {
1230− .map_or(true, |ls| ls.id() != doc_ls.id())
1233− for (_, language_server) in doc_language_servers_not_in_registry {
1234+ let language_id = doc.language_id().map(ToOwned::to_owned).unwrap_or_default();
1234− tokio::spawn(language_server.text_document_did_close(doc.identifier()));
1236+ // only spawn new language servers if the servers aren't the same
1237+ let doc_language_servers_not_in_registry =
1237− let language_servers_not_in_doc = language_servers.iter().filter(|(name, ls)| {
1238+ doc.language_servers.iter().filter(|(name, doc_ls)| {
1238− doc.language_servers
1239+ language_servers
1239 .get(*name)
1240 .get(*name)
1240− .map_or(true, |doc_ls| ls.id() != doc_ls.id())
1241+ .map_or(true, |ls| ls.id() != doc_ls.id())
1243− for (_, language_server) in language_servers_not_in_doc {
1244+ for (_, language_server) in doc_language_servers_not_in_registry {
1244− // TODO: this now races with on_init code if the init happens too quickly
1245− tokio::spawn(language_server.text_document_did_open(
1245+ tokio::spawn(language_server.text_document_did_close(doc.identifier()));
1246− doc_url.clone(),
1246+ }
1247− doc.version(),
1247+
1248− doc.text(),
1248+ let language_servers_not_in_doc = language_servers.iter().filter(|(name, ls)| {
1249− language_id.clone(),
1249+ doc.language_servers
1250− ));
1250+ .get(*name)
1251+ .map_or(true, |doc_ls| ls.id() != doc_ls.id())
1253− doc.language_servers = language_servers;
1254+ for (_, language_server) in language_servers_not_in_doc {
1255+ // TODO: this now races with on_init code if the init happens too quickly
1256+ tokio::spawn(language_server.text_document_did_open(
1260+ language_id.clone(),
1264+ doc.language_servers = language_servers;
1258 fn _refresh(&mut self) {
1267 fn _refresh(&mut self) {
@@ -1454,7 +1463,7 @@ impl Editor {
1454 doc.set_version_control_head(self.diff_providers.get_current_head_name(&path));
1463 doc.set_version_control_head(self.diff_providers.get_current_head_name(&path));
1456 let id = self.new_document(doc);
1465 let id = self.new_document(doc);
1457− let _ = self.launch_language_servers(id);
1466+ self.launch_language_servers(id);