Skip to content

Commit f2ee673

Browse files
committed
Refactored Option<Vec> to Vec and some cleanup
1 parent 22b452b commit f2ee673

File tree

12 files changed

+90
-128
lines changed

12 files changed

+90
-128
lines changed

helix-core/src/syntax.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,8 @@ pub struct LanguageConfiguration {
8888
#[serde(skip)]
8989
pub(crate) highlight_config: OnceCell<Option<Arc<HighlightConfiguration>>>,
9090
// tags_config OnceCell<> https://github.com/tree-sitter/tree-sitter/pull/583
91-
#[serde(skip_serializing_if = "Option::is_none")]
92-
pub language_servers: Option<Vec<LanguageServerConfiguration>>,
91+
#[serde(default, skip_serializing_if = "Vec::is_empty")]
92+
pub language_servers: Vec<LanguageServerConfiguration>,
9393
#[serde(skip_serializing_if = "Option::is_none")]
9494
pub indent: Option<IndentationConfiguration>,
9595

helix-lsp/src/lib.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -326,10 +326,11 @@ impl Registry {
326326
}
327327

328328
pub fn get(&mut self, language_config: &LanguageConfiguration) -> Result<Vec<Arc<Client>>> {
329-
let configs = match &language_config.language_servers {
330-
Some(configs) => configs,
331-
None => return Err(Error::LspNotDefined),
332-
};
329+
let configs = &language_config.language_servers;
330+
331+
if configs.is_empty() {
332+
return Err(Error::LspNotDefined);
333+
}
333334

334335
match self.inner.entry(language_config.scope.clone()) {
335336
Entry::Occupied(entry) => Ok(entry.get().iter().map(|(_, c)| c.clone()).collect()),

helix-term/src/application.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -433,9 +433,7 @@ impl Application {
433433
}
434434

435435
let docs = self.editor.documents().filter(|doc| {
436-
doc.language_servers()
437-
.map(|ls| ls.iter().any(|l| l.id() == server_id))
438-
== Some(true)
436+
doc.language_servers().iter().any(|l| l.id() == server_id)
439437
});
440438

441439
// trigger textDocument/didOpen for docs that are already open
@@ -458,8 +456,9 @@ impl Application {
458456
if let Some(doc) = doc {
459457
let language_server = doc
460458
.language_servers()
461-
.as_ref()
462-
.and_then(|ls| ls.iter().find(|l| l.id() == server_id).map(|l| *l))
459+
.iter()
460+
.find(|l| l.id() == server_id)
461+
.map(|l| *l)
463462
.unwrap();
464463
let lang_conf = doc.language_config();
465464
let text = doc.text();

helix-term/src/commands.rs

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2668,12 +2668,7 @@ pub mod insert {
26682668
use helix_lsp::lsp;
26692669
// if ch matches completion char, trigger completion
26702670
let doc = doc_mut!(cx.editor);
2671-
let language_servers = match doc.language_servers() {
2672-
Some(language_servers) => language_servers,
2673-
None => return,
2674-
};
2675-
2676-
let trigger_completion = language_servers.iter().any(|language_server| {
2671+
let trigger_completion = doc.language_servers().iter().any(|language_server| {
26772672
let capabilities = language_server.capabilities();
26782673

26792674
// TODO: what if trigger is multiple chars long
@@ -2696,12 +2691,7 @@ pub mod insert {
26962691
use helix_lsp::lsp;
26972692
// if ch matches signature_help char, trigger
26982693
let doc = doc_mut!(cx.editor);
2699-
let language_servers = match doc.language_servers() {
2700-
Some(language_servers) => language_servers,
2701-
None => return,
2702-
};
2703-
2704-
let is_trigger = language_servers.iter().any(|language_server| {
2694+
let is_trigger = doc.language_servers().iter().any(|language_server| {
27052695
let capabilities = language_server.capabilities();
27062696

27072697
match capabilities {
@@ -3434,11 +3424,8 @@ fn format_selections(cx: &mut Context) {
34343424
// via lsp if available
34353425
// else via tree-sitter indentation calculations
34363426

3437-
let language_server = match doc.language_servers() {
3438-
Some(language_servers) => match language_servers.first() {
3439-
Some(language_server) => *language_server,
3440-
None => return,
3441-
},
3427+
let language_server = match doc.language_servers().first() {
3428+
Some(language_server) => *language_server,
34423429
None => return,
34433430
};
34443431

@@ -3576,11 +3563,8 @@ pub fn completion(cx: &mut Context) {
35763563

35773564
// TODO merge completion items of multiple language servers,
35783565
// instead of taking the first language server for completion
3579-
let language_server = match doc.language_servers() {
3580-
Some(language_servers) => match language_servers.first() {
3581-
Some(language_server) => *language_server,
3582-
None => return,
3583-
},
3566+
let language_server = match doc.language_servers().first() {
3567+
Some(language_server) => *language_server,
35843568
None => return,
35853569
};
35863570

helix-term/src/commands/lsp.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use std::borrow::Cow;
2020
#[macro_export]
2121
macro_rules! language_server {
2222
($editor:expr, $doc:expr) => {
23-
match $doc.language_servers().as_ref().and_then(|ls| ls.first()) {
23+
match $doc.language_servers().first() {
2424
Some(language_server) => &**language_server,
2525
None => {
2626
$editor.set_status("Language server not active for current buffer");

helix-term/src/commands/typed.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ fn write_impl(
227227
if path.is_some() {
228228
let id = doc.id();
229229
doc.detect_language(cx.editor.syn_loader.clone());
230-
let _ = cx.editor.refresh_language_server(id);
230+
let _ = cx.editor.refresh_language_servers(id);
231231
}
232232
Ok(())
233233
}
@@ -1007,7 +1007,7 @@ fn language(
10071007
doc.set_language_by_language_id(&args[0], cx.editor.syn_loader.clone());
10081008

10091009
let id = doc.id();
1010-
cx.editor.refresh_language_server(id);
1010+
cx.editor.refresh_language_servers(id);
10111011
Ok(())
10121012
}
10131013

helix-term/src/health.rs

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -144,11 +144,7 @@ pub fn languages_all() -> std::io::Result<()> {
144144
column(&lang.language_id, Color::Reset);
145145

146146
// TODO multiple language servers
147-
let lsp = lang
148-
.language_servers
149-
.as_ref()
150-
.and_then(|lsps| lsps.first())
151-
.map(|lsp| lsp.command.to_string());
147+
let lsp = lang.language_servers.first().map(|lsp| lsp.command.clone());
152148
check_binary(lsp);
153149

154150
let dap = lang.debugger.as_ref().map(|dap| dap.command.to_string());
@@ -220,11 +216,7 @@ pub fn language(lang_str: String) -> std::io::Result<()> {
220216
// TODO multiple language servers
221217
probe_protocol(
222218
"language server",
223-
lang
224-
.language_servers
225-
.as_ref()
226-
.and_then(|lsps| lsps.first())
227-
.map(|lsp| lsp.command.to_string()),
219+
lang.language_servers.first().map(|lsp| lsp.command.clone()),
228220
)?;
229221

230222
probe_protocol(

helix-term/src/ui/completion.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ impl Completion {
225225
completion_item: lsp::CompletionItem,
226226
) -> Option<CompletionItem> {
227227
// TODO support multiple language servers instead of taking the first language server
228-
let language_server = doc.language_servers().as_ref().and_then(|ls| ls.first().map(|l| *l))?;
228+
let language_server = doc.language_servers().first().map(|l| *l)?;
229229
let completion_resolve_provider = language_server
230230
.capabilities()
231231
.completion_provider

helix-term/src/ui/editor.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -652,15 +652,14 @@ impl EditorView {
652652
Mode::Select => "SEL",
653653
Mode::Normal => "NOR",
654654
};
655+
// TODO handle multiple language servers
655656
let progress = doc
656657
.language_servers()
657-
.and_then(|ls| {
658-
// TODO handle multiple language servers
659-
ls.first().and_then(|srv| {
660-
self.spinners
661-
.get(srv.id())
662-
.and_then(|spinner| spinner.frame())
663-
})
658+
.first()
659+
.and_then(|srv| {
660+
self.spinners
661+
.get(srv.id())
662+
.and_then(|spinner| spinner.frame())
664663
})
665664
.unwrap_or("");
666665

helix-view/src/document.rs

Lines changed: 43 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ pub struct Document {
119119
pub(crate) modified_since_accessed: bool,
120120

121121
diagnostics: Vec<Diagnostic>,
122-
language_servers: Option<Vec<Arc<helix_lsp::Client>>>,
122+
language_servers: Vec<Arc<helix_lsp::Client>>,
123123
}
124124

125125
use std::{fmt, mem};
@@ -359,7 +359,7 @@ impl Document {
359359
savepoint: None,
360360
last_saved_revision: 0,
361361
modified_since_accessed: false,
362-
language_servers: None,
362+
language_servers: Vec::new(),
363363
}
364364
}
365365

@@ -407,22 +407,22 @@ impl Document {
407407
/// If supported, returns the changes that should be applied to this document in order
408408
/// to format it nicely.
409409
pub fn format(&self) -> Option<impl Future<Output = LspFormatting> + 'static> {
410-
let language_servers = self.language_servers()?;
411410
let text = self.text.clone();
412411
// finds first language server that supports formatting and then formats
413-
let (offset_encoding, request) = language_servers.iter().find_map(|language_server| {
414-
let offset_encoding = language_server.offset_encoding();
415-
let request = language_server.text_document_formatting(
416-
self.identifier(),
417-
lsp::FormattingOptions {
418-
tab_size: self.tab_width() as u32,
419-
insert_spaces: matches!(self.indent_style, IndentStyle::Spaces(_)),
420-
..Default::default()
421-
},
422-
None,
423-
)?;
424-
Some((offset_encoding, request))
425-
})?;
412+
let (offset_encoding, request) =
413+
self.language_servers().iter().find_map(|language_server| {
414+
let offset_encoding = language_server.offset_encoding();
415+
let request = language_server.text_document_formatting(
416+
self.identifier(),
417+
lsp::FormattingOptions {
418+
tab_size: self.tab_width() as u32,
419+
insert_spaces: matches!(self.indent_style, IndentStyle::Spaces(_)),
420+
..Default::default()
421+
},
422+
None,
423+
)?;
424+
Some((offset_encoding, request))
425+
})?;
426426

427427
let fut = async move {
428428
let edits = request.await.unwrap_or_else(|e| {
@@ -501,16 +501,14 @@ impl Document {
501501
let mut file = File::create(path).await?;
502502
to_writer(&mut file, encoding, &text).await?;
503503

504-
if let Some(language_servers) = language_servers {
505-
for language_server in language_servers {
506-
if !language_server.is_initialized() {
507-
return Ok(());
508-
}
509-
if let Some(notification) =
510-
language_server.text_document_did_save(identifier.clone(), &text)
511-
{
512-
notification.await?;
513-
}
504+
for language_server in language_servers {
505+
if !language_server.is_initialized() {
506+
return Ok(());
507+
}
508+
if let Some(notification) =
509+
language_server.text_document_did_save(identifier.clone(), &text)
510+
{
511+
notification.await?;
514512
}
515513
}
516514

@@ -631,7 +629,7 @@ impl Document {
631629
}
632630

633631
/// Set the LSP.
634-
pub fn set_language_servers(&mut self, language_servers: Option<Vec<Arc<helix_lsp::Client>>>) {
632+
pub fn set_language_servers(&mut self, language_servers: Vec<Arc<helix_lsp::Client>>) {
635633
self.language_servers = language_servers;
636634
}
637635

@@ -698,18 +696,16 @@ impl Document {
698696
}
699697

700698
// emit lsp notification
701-
if let Some(language_servers) = self.language_servers() {
702-
for language_server in language_servers {
703-
let notify = language_server.text_document_did_change(
704-
self.versioned_identifier(),
705-
&old_doc,
706-
self.text(),
707-
transaction.changes(),
708-
);
709-
710-
if let Some(notify) = notify {
711-
tokio::spawn(notify);
712-
}
699+
for language_server in self.language_servers() {
700+
let notify = language_server.text_document_did_change(
701+
self.versioned_identifier(),
702+
&old_doc,
703+
self.text(),
704+
transaction.changes(),
705+
);
706+
707+
if let Some(notify) = notify {
708+
tokio::spawn(notify);
713709
}
714710
}
715711
}
@@ -863,9 +859,9 @@ impl Document {
863859
pub fn language_id(&self) -> Option<&str> {
864860
// TODO is it safe to get the language_id from the first language server that defines it?
865861
self.language_config()
866-
.and_then(|config| config.language_servers.as_ref())
867-
.and_then(|lsp_configs| {
868-
lsp_configs
862+
.and_then(|config| {
863+
config
864+
.language_servers
869865
.iter()
870866
.find_map(|lsp_config| lsp_config.language_id.as_deref())
871867
})
@@ -883,12 +879,11 @@ impl Document {
883879
}
884880

885881
/// Language server if it has been initialized.
886-
pub fn language_servers(&self) -> Option<Vec<&helix_lsp::Client>> {
887-
self.language_servers.as_ref().map(|ls| {
888-
ls.iter()
889-
.filter_map(|l| if l.is_initialized() { Some(&**l) } else { None })
890-
.collect()
891-
})
882+
pub fn language_servers(&self) -> Vec<&helix_lsp::Client> {
883+
self.language_servers
884+
.iter()
885+
.filter_map(|l| if l.is_initialized() { Some(&**l) } else { None })
886+
.collect()
892887
}
893888

894889
#[inline]

0 commit comments

Comments
 (0)