summaryrefslogtreecommitdiff
path: root/helix-view/src/editor.rs
diff options
context:
space:
mode:
authorPhilipp Mildenberger2023-03-19 22:37:41 +0000
committerPhilipp Mildenberger2023-05-18 19:48:32 +0000
commit2eeac10755e6b88e3d5861dee7e2016a10c01c9f (patch)
tree81d338cb10f0718e3bbf280015ecf4a96dc460c7 /helix-view/src/editor.rs
parentb1199c552be39eec8cb428310c8bb2a952454b04 (diff)
Refactor doc language servers to a HashMap, and the config to use a Vec to retain order
Diffstat (limited to 'helix-view/src/editor.rs')
-rw-r--r--helix-view/src/editor.rs58
1 files changed, 29 insertions, 29 deletions
diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs
index bca97815..ca2144fd 100644
--- a/helix-view/src/editor.rs
+++ b/helix-view/src/editor.rs
@@ -689,7 +689,7 @@ pub struct WhitespaceCharacters {
impl Default for WhitespaceCharacters {
fn default() -> Self {
Self {
- space: '·', // U+00B7
+ space: '·', // U+00B7
nbsp: '⍽', // U+237D
tab: '→', // U+2192
newline: '⏎', // U+23CE
@@ -1103,9 +1103,9 @@ impl Editor {
if !self.config().lsp.enable {
return None;
}
-
// if doc doesn't have a URL it's a scratch buffer, ignore it
- let doc = self.document(doc_id)?;
+ let doc = self.documents.get_mut(&doc_id)?;
+ let doc_url = doc.url()?;
let (lang, path) = (doc.language.clone(), doc.path().cloned());
let config = doc.config.load();
let root_dirs = &config.workspace_lsp_roots;
@@ -1124,37 +1124,37 @@ impl Editor {
.ok()
});
- let doc = self.document_mut(doc_id)?;
- let doc_url = doc.url()?;
-
if let Some(language_servers) = language_servers {
- // only spawn new lang servers if the servers aren't the same
- // TODO simplify?
- let doc_language_servers = doc.language_servers().collect::<Vec<_>>();
- let spawn_new_servers = language_servers.len() != doc_language_servers.len()
- || language_servers
- .iter()
- .zip(doc_language_servers.iter())
- .any(|(l, dl)| l.id() != dl.id());
- if spawn_new_servers {
- for doc_language_server in doc_language_servers {
- tokio::spawn(doc_language_server.text_document_did_close(doc.identifier()));
- }
+ let language_id = doc.language_id().map(ToOwned::to_owned).unwrap_or_default();
- let language_id = doc.language_id().map(ToOwned::to_owned).unwrap_or_default();
+ // only spawn new language servers if the servers aren't the same
- for language_server in &language_servers {
- // TODO: this now races with on_init code if the init happens too quickly
- tokio::spawn(language_server.text_document_did_open(
- doc_url.clone(),
- doc.version(),
- doc.text(),
- language_id.clone(),
- ));
- }
+ let doc_language_servers_not_in_registry =
+ doc.language_servers.iter().filter(|(name, doc_ls)| {
+ !language_servers.contains_key(*name)
+ || language_servers[*name].id() != doc_ls.id()
+ });
- doc.set_language_servers(language_servers);
+ for (_, language_server) in doc_language_servers_not_in_registry {
+ tokio::spawn(language_server.text_document_did_close(doc.identifier()));
}
+
+ let language_servers_not_in_doc = language_servers.iter().filter(|(name, ls)| {
+ !doc.language_servers.contains_key(*name)
+ || doc.language_servers[*name].id() != ls.id()
+ });
+
+ for (_, language_server) in language_servers_not_in_doc {
+ // TODO: this now races with on_init code if the init happens too quickly
+ tokio::spawn(language_server.text_document_did_open(
+ doc_url.clone(),
+ doc.version(),
+ doc.text(),
+ language_id.clone(),
+ ));
+ }
+
+ doc.language_servers = language_servers;
}
Some(())
}