Skip to content

Commit 1c5feb4

Browse files
committed
chore: cleanup
1 parent 0e8d7d4 commit 1c5feb4

6 files changed

Lines changed: 72 additions & 66 deletions

File tree

helix-term/src/application.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1112,8 +1112,8 @@ impl Application {
11121112
.editor
11131113
.documents
11141114
.values()
1115-
.filter(|x| x.supports_language_server(language_server))
1116-
.map(|x| x.id())
1115+
.filter(|doc| doc.supports_language_server(language_server))
1116+
.map(|doc| doc.id())
11171117
.collect();
11181118

11191119
for document in documents {
@@ -1132,8 +1132,8 @@ impl Application {
11321132
.editor
11331133
.documents
11341134
.values()
1135-
.filter(|x| x.supports_language_server(language_server))
1136-
.map(|x| x.id())
1135+
.filter(|doc| doc.supports_language_server(language_server))
1136+
.map(|doc| doc.id())
11371137
.collect();
11381138

11391139
for document in documents {

helix-term/src/commands/lsp.rs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1470,26 +1470,27 @@ impl ui::menu::Item for lsp::CodeLens {
14701470
}
14711471

14721472
pub fn show_code_lenses_under_cursor(cx: &mut Context) {
1473-
let (_view, doc) = current!(cx.editor);
1473+
let (view, doc) = current!(cx.editor);
14741474
let doc_id = doc.id();
14751475
let language_server =
14761476
language_server_with_feature!(cx.editor, doc, LanguageServerFeature::DocumentHighlight);
14771477
let language_server_id = language_server.id();
1478+
let offset_encoding = language_server.offset_encoding();
1479+
let pos = doc.position(view.id, offset_encoding);
14781480

1479-
// TODO(matoous): this needs to support multiple language servers and resolving the code lens
1480-
// via the right one
1481+
// TODO(matoous): this should eventually support multiple language servers
14811482
let mut futures: FuturesOrdered<_> = doc
14821483
.code_lenses()
14831484
.iter()
1485+
.filter(|c| c.line == pos.line as usize)
14841486
.filter_map(|c| {
1485-
if c.command.is_some() {
1486-
let cloned = c.clone();
1487-
Some(Either::Left(ready(Ok(cloned))))
1487+
if c.lens.command.is_some() {
1488+
Some(Either::Left(ready(Ok(c.lens.clone()))))
14881489
} else {
14891490
// Safety: the command is empty only if the code lens is unresolved and we assume
14901491
// that if the code lens is unresolved the language server support resolution.
14911492
language_server
1492-
.resolve_code_lens(c.clone())
1493+
.resolve_code_lens(c.lens.clone())
14931494
.map(Either::Right)
14941495
}
14951496
})

helix-term/src/handlers/code_lenses.rs

Lines changed: 41 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use std::{collections::HashSet, time::Duration};
22

3-
use futures_util::{stream::FuturesOrdered, StreamExt};
43
use helix_core::syntax::config::LanguageServerFeature;
54
use helix_event::{cancelable_future, register_hook};
65
use helix_view::{
@@ -12,7 +11,6 @@ use tokio::time::Instant;
1211

1312
use crate::job;
1413

15-
// TODO(matoous): use to update code lenses positions on document changes
1614
#[derive(Default)]
1715
#[allow(dead_code)]
1816
pub(super) struct DocumentCodeLensesHandler {
@@ -44,6 +42,10 @@ impl helix_event::AsyncHook for DocumentCodeLensesHandler {
4442
}
4543
}
4644

45+
/// Requests code lenses for a specific document.
46+
///
47+
/// NOTE: currently supports only a single language server, the first one supporting
48+
/// code lenses is used.
4749
pub fn request_document_code_lenses(editor: &mut Editor, doc_id: DocumentId) {
4850
if !editor.config().lsp.display_code_lenses {
4951
return;
@@ -53,77 +55,69 @@ pub fn request_document_code_lenses(editor: &mut Editor, doc_id: DocumentId) {
5355
return;
5456
};
5557

56-
let cancel = doc.color_swatch_controller.restart();
58+
let cancel = doc.code_lenses_controller.restart();
5759

58-
let mut seen_language_servers = HashSet::new();
59-
let mut futures: FuturesOrdered<_> = doc
60+
let language_server = doc
6061
.language_servers_with_feature(LanguageServerFeature::CodeLens)
61-
.filter(|ls| seen_language_servers.insert(ls.id()))
62-
.map(|language_server| {
63-
let text = doc.text().clone();
64-
let offset_encoding = language_server.offset_encoding();
65-
let future = language_server.code_lens(doc.identifier()).unwrap();
66-
67-
async move {
68-
let lenses: Vec<_> = future
69-
.await?
70-
.unwrap_or_default()
71-
.into_iter()
72-
.filter_map(|lens| {
73-
let _pos = helix_lsp::util::lsp_pos_to_pos(
74-
&text,
75-
lens.range.start,
76-
offset_encoding,
77-
)?;
78-
Some(lens)
79-
})
80-
.collect();
81-
anyhow::Ok(lenses)
82-
}
83-
})
84-
.collect();
62+
.next();
63+
let language_server = match language_server {
64+
Some(language_server) => language_server,
65+
None => {
66+
editor.set_error(format!(
67+
"No configured language server supports {}",
68+
LanguageServerFeature::CodeLens
69+
));
70+
return;
71+
}
72+
};
8573

86-
if futures.is_empty() {
87-
return;
88-
}
74+
let text = doc.text().clone();
75+
let offset_encoding = language_server.offset_encoding();
76+
let future = language_server.code_lens(doc.identifier()).unwrap();
8977

9078
tokio::spawn(async move {
91-
let mut code_lenses = Vec::new();
92-
loop {
93-
match cancelable_future(futures.next(), &cancel).await {
94-
Some(Some(Ok(items))) => code_lenses.extend(items),
95-
Some(Some(Err(err))) => log::error!("document color request failed: {err}"),
96-
Some(None) => break,
97-
// The request was cancelled.
98-
None => return,
79+
let lenses: Vec<_> = match cancelable_future(future, &cancel).await {
80+
Some(Ok(Some(items))) => items
81+
.into_iter()
82+
.filter_map(|lens| {
83+
let _pos =
84+
helix_lsp::util::lsp_pos_to_pos(&text, lens.range.start, offset_encoding)?;
85+
Some(lens)
86+
})
87+
.collect(),
88+
Some(Ok(None)) => Vec::new(),
89+
Some(Err(err)) => {
90+
log::error!("document color request failed: {err}");
91+
return;
9992
}
100-
}
93+
None => return,
94+
};
95+
10196
job::dispatch(move |editor, _| {
10297
let Some(doc) = editor.documents.get_mut(&doc_id) else {
10398
return;
10499
};
105100

106-
if code_lenses.is_empty() {
101+
if lenses.is_empty() {
107102
doc.code_lenses.clear();
108103
return;
109104
}
110105

111-
doc.code_lenses = code_lenses;
106+
doc.set_code_lenses(lenses);
112107
})
113108
.await;
114109
});
115110
}
116111

117112
pub(super) fn register_hooks(_handlers: &Handlers) {
118113
register_hook!(move |event: &mut DocumentDidOpen<'_>| {
119-
// when a document is initially opened, request colors for it
114+
// when a document is initially opened, request code lenses for it
120115
request_document_code_lenses(event.editor, event.doc);
121-
122116
Ok(())
123117
});
124118

125119
register_hook!(move |_event: &mut DocumentDidChange<'_>| {
126-
// TODO: update code lenses positions, same as with e.g. document colors
120+
// TODO(matoous): use to update code lenses positions on document changes
127121
Ok(())
128122
});
129123

@@ -138,7 +132,7 @@ pub(super) fn register_hooks(_handlers: &Handlers) {
138132
});
139133

140134
register_hook!(move |event: &mut LanguageServerExited<'_>| {
141-
// Clear and re-request all color swatches when a server exits.
135+
// Clear and re-request all code lenses when a server exits.
142136
for doc in event.editor.documents_mut() {
143137
if doc.supports_language_server(event.server_id) {
144138
doc.code_lenses.clear();

helix-view/src/document.rs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -208,19 +208,26 @@ pub struct Document {
208208

209209
/// Annotations for LSP document color swatches
210210
pub color_swatches: Option<DocumentColorSwatches>,
211-
pub code_lenses: Vec<lsp::CodeLens>,
211+
pub code_lenses: Vec<CodeLens>,
212212

213213
// NOTE: ideally this would live on the handler for color swatches. This is blocked on a
214214
// large refactor that would make `&mut Editor` available on the `DocumentDidChange` event.
215215
pub color_swatch_controller: TaskController,
216216
pub pull_diagnostic_controller: TaskController,
217+
pub code_lenses_controller: TaskController,
217218

218219
// NOTE: this field should eventually go away - we should use the Editor's syn_loader instead
219220
// of storing a copy on every doc. Then we can remove the surrounding `Arc` and use the
220221
// `ArcSwap` directly.
221222
syn_loader: Arc<ArcSwap<syntax::Loader>>,
222223
}
223224

225+
#[derive(Debug, Clone)]
226+
pub struct CodeLens {
227+
pub line: usize,
228+
pub lens: lsp::CodeLens,
229+
}
230+
224231
#[derive(Debug, Clone, Default)]
225232
pub struct DocumentColorSwatches {
226233
pub color_swatches: Vec<InlineAnnotation>,
@@ -734,9 +741,10 @@ impl Document {
734741
jump_labels: HashMap::new(),
735742
color_swatches: None,
736743
color_swatch_controller: TaskController::new(),
744+
pull_diagnostic_controller: TaskController::new(),
745+
code_lenses_controller: TaskController::new(),
737746
syn_loader,
738747
previous_diagnostic_id: None,
739-
pull_diagnostic_controller: TaskController::new(),
740748
}
741749
}
742750

@@ -2171,12 +2179,18 @@ impl Document {
21712179
}
21722180

21732181
#[inline]
2174-
pub fn code_lenses(&self) -> &[lsp::CodeLens] {
2182+
pub fn code_lenses(&self) -> &[CodeLens] {
21752183
&self.code_lenses
21762184
}
21772185

21782186
pub fn set_code_lenses(&mut self, lenses: Vec<lsp::CodeLens>) {
2179-
self.code_lenses = lenses;
2187+
self.code_lenses = lenses
2188+
.into_iter()
2189+
.map(|l| CodeLens {
2190+
line: l.range.start.line as usize,
2191+
lens: l,
2192+
})
2193+
.collect();
21802194
}
21812195

21822196
/// Get the document's auto pairs. If the document has a recognized

helix-view/src/editor.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1150,7 +1150,6 @@ pub struct Breakpoint {
11501150
use futures_util::stream::{Flatten, Once};
11511151

11521152
type Diagnostics = BTreeMap<Uri, Vec<(lsp::Diagnostic, DiagnosticProvider)>>;
1153-
type CodeLenses = BTreeMap<Uri, Vec<lsp::CodeLens>>;
11541153

11551154
pub struct Editor {
11561155
/// Current editing mode.
@@ -1172,7 +1171,6 @@ pub struct Editor {
11721171
pub macro_replaying: Vec<char>,
11731172
pub language_servers: helix_lsp::Registry,
11741173
pub diagnostics: Diagnostics,
1175-
pub code_lenses: CodeLenses,
11761174
pub diff_providers: DiffProviderRegistry,
11771175

11781176
pub debug_adapters: dap::registry::Registry,
@@ -1319,7 +1317,6 @@ impl Editor {
13191317
theme: theme_loader.default(),
13201318
language_servers,
13211319
diagnostics: Diagnostics::new(),
1322-
code_lenses: CodeLenses::new(),
13231320
diff_providers: DiffProviderRegistry::default(),
13241321
debug_adapters: dap::registry::Registry::new(),
13251322
breakpoints: HashMap::new(),

helix-view/src/gutter.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ pub fn lens<'doc>(
102102
if !first_visual_line {
103103
return None;
104104
}
105-
if lenses.iter().any(|l| l.range.start.line as usize == line) {
105+
if lenses.iter().any(|l| l.line == line) {
106106
write!(out, "▶").ok();
107107
Some(info)
108108
} else {

0 commit comments

Comments
 (0)