on master help sign in
Detect filetype on :write (#1141)

fixes #1136 * removed a log::info * removed temp.rs * cargo clippy no longer complains * new get_lang_server function * get_lang_server is now launch_language_server * launch_lang_server will now close the previous one * better code readability * remove resfresh_ls(and a wrong comment)

commit103b5125e4bc51965d98a38cdbeed2151ed816fa authorRustyStriker <61246040+RustyStriker@users.noreply.github.com> dateSun 28 Nov 2021, 03:19 (5 years ago) parent3b2b734
2 files changed+54−32
helix-term/src/commands.rs+6−1 helix-view/src/editor.rs+48−31
helix-term/src/commands.rs+6−1
@@ -1907,7 +1907,7 @@ mod cmd {
19071907 let jobs = &mut cx.jobs;
19081908 let (_, doc) = current!(cx.editor);
19091909
1910− if let Some(path) = path {
1910+ if let Some(ref path) = path {
19111911 doc.set_path(Some(path.as_ref()))
19121912 .context("invalid filepath")?;
19131913 }
@@ -1927,6 +1927,11 @@ mod cmd {
19271927 });
19281928 let future = doc.format_and_save(fmt);
19291929 cx.jobs.add(Job::new(future).wait_before_exiting());
1930+
1931+ if path.is_some() {
1932+ let id = doc.id();
1933+ let _ = cx.editor.refresh_language_server(id);
1934+ }
19301935 Ok(())
19311936 }
19321937
helix-view/src/editor.rs+48−31
@@ -271,6 +271,53 @@ impl Editor {
271271 Ok(())
272272 }
273273
274+ /// Refreshes the language server for a given document
275+ pub fn refresh_language_server(&mut self, doc_id: DocumentId) -> Option<()> {
276+ let doc = self.documents.get_mut(&doc_id)?;
277+ doc.detect_language(Some(&self.theme), &self.syn_loader);
278+ Self::launch_language_server(&mut self.language_servers, doc)
279+ }
280+
281+ /// Launch a language server for a given document
282+ fn launch_language_server(ls: &mut helix_lsp::Registry, doc: &mut Document) -> Option<()> {
283+ // try to find a language server based on the language name
284+ let language_server = doc.language.as_ref().and_then(|language| {
285+ ls.get(language)
286+ .map_err(|e| {
287+ log::error!(
288+ "Failed to initialize the LSP for `{}` {{ {} }}",
289+ language.scope(),
290+ e
291+ )
292+ })
293+ .ok()
294+ });
295+ if let Some(language_server) = language_server {
296+ // only spawn a new lang server if the servers aren't the same
297+ if Some(language_server.id()) != doc.language_server().map(|server| server.id()) {
298+ if let Some(language_server) = doc.language_server() {
299+ tokio::spawn(language_server.text_document_did_close(doc.identifier()));
300+ }
301+ let language_id = doc
302+ .language()
303+ .and_then(|s| s.split('.').last()) // source.rust
304+ .map(ToOwned::to_owned)
305+ .unwrap_or_default();
306+
307+ // TODO: this now races with on_init code if the init happens too quickly
308+ tokio::spawn(language_server.text_document_did_open(
309+ doc.url().unwrap(),
310+ doc.version(),
311+ doc.text(),
312+ language_id,
313+ ));
314+
315+ doc.set_language_server(Some(language_server));
316+ }
317+ }
318+ Some(())
319+ }
320+
274321 fn _refresh(&mut self) {
275322 for (view, _) in self.tree.views_mut() {
276323 let doc = &self.documents[&view.doc];
@@ -401,37 +448,7 @@ impl Editor {
401448 } else {
402449 let mut doc = Document::open(&path, None, Some(&self.theme), Some(&self.syn_loader))?;
403450
404− // try to find a language server based on the language name
405− let language_server = doc.language.as_ref().and_then(|language| {
406− self.language_servers
407− .get(language)
408− .map_err(|e| {
409− log::error!(
410− "Failed to initialize the LSP for `{}` {{ {} }}",
411− language.scope(),
412− e
413− )
414− })
415− .ok()
416− });
417−
418− if let Some(language_server) = language_server {
419− let language_id = doc
420− .language()
421− .and_then(|s| s.split('.').last()) // source.rust
422− .map(ToOwned::to_owned)
423− .unwrap_or_default();
424−
425− // TODO: this now races with on_init code if the init happens too quickly
426− tokio::spawn(language_server.text_document_did_open(
427− doc.url().unwrap(),
428− doc.version(),
429− doc.text(),
430− language_id,
431− ));
432−
433− doc.set_language_server(Some(language_server));
434− }
451+ let _ = Self::launch_language_server(&mut self.language_servers, &mut doc);
435452
436453 self.new_document(doc)
437454 };