Skip to content

Commit 7a61c1a

Browse files
committed
feat: resolve codelenses when needed
1 parent 0096f95 commit 7a61c1a

2 files changed

Lines changed: 41 additions & 22 deletions

File tree

helix-lsp/src/client.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1594,10 +1594,9 @@ impl Client {
15941594
&self,
15951595
text_document: lsp::TextDocumentIdentifier,
15961596
) -> Option<impl Future<Output = Result<Option<Vec<lsp::CodeLens>>>>> {
1597-
let capabilities = self.capabilities.get().unwrap();
1598-
1599-
// Return early if the server does not support code lens.
1600-
capabilities.code_lens_provider.as_ref()?;
1597+
if !self.supports_feature(LanguageServerFeature::CodeLens) {
1598+
return None;
1599+
}
16011600

16021601
let params = lsp::CodeLensParams {
16031602
text_document,
@@ -1607,4 +1606,15 @@ impl Client {
16071606

16081607
Some(self.call::<lsp::request::CodeLensRequest>(params))
16091608
}
1609+
1610+
pub fn resolve_code_lens(
1611+
&self,
1612+
params: lsp::CodeLens,
1613+
) -> Option<impl Future<Output = Result<lsp::CodeLens>>> {
1614+
if !self.supports_feature(LanguageServerFeature::CodeLens) {
1615+
return None;
1616+
}
1617+
1618+
Some(self.call::<lsp::request::CodeLensResolve>(params))
1619+
}
16101620
}

helix-term/src/commands/lsp.rs

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
use futures_util::{stream::FuturesOrdered, FutureExt};
1+
use futures_util::{
2+
future::{ready, Either},
3+
stream::FuturesOrdered,
4+
FutureExt,
5+
};
26
use helix_lsp::{
37
block_on,
48
lsp::{
@@ -1460,10 +1464,8 @@ fn compute_inlay_hints_for_view(
14601464
impl ui::menu::Item for lsp::CodeLens {
14611465
type Data = ();
14621466
fn format(&self, _data: &Self::Data) -> Row<'_> {
1463-
match &self.command {
1464-
Some(cmd) => cmd.title.as_str().into(),
1465-
None => "needs resolve".into(),
1466-
}
1467+
// Safety: assumes that only resolved code lenses are passed to the menu
1468+
self.command.as_ref().unwrap().title.as_str().into()
14671469
}
14681470
}
14691471

@@ -1475,7 +1477,7 @@ pub fn show_code_lenses_under_cursor(cx: &mut Context) {
14751477
let language_server_id = language_server.id();
14761478

14771479
if doc
1478-
.language_servers_with_feature(LanguageServerFeature::Hover)
1480+
.language_servers_with_feature(LanguageServerFeature::CodeLens)
14791481
.count()
14801482
== 0
14811483
{
@@ -1484,21 +1486,28 @@ pub fn show_code_lenses_under_cursor(cx: &mut Context) {
14841486
return;
14851487
}
14861488

1487-
let request = match language_server.code_lens(doc.identifier()) {
1488-
Some(future) => future,
1489-
None => {
1490-
// TODO: error log?
1491-
return;
1492-
}
1493-
};
1489+
let mut futures: FuturesOrdered<_> = doc
1490+
.code_lenses()
1491+
.iter()
1492+
.filter_map(|c| {
1493+
if c.command.is_some() {
1494+
let cloned = c.clone();
1495+
Some(Either::Left(ready(Ok(cloned))))
1496+
} else {
1497+
language_server
1498+
.resolve_code_lens(c.clone())
1499+
.map(Either::Right)
1500+
}
1501+
})
1502+
.collect();
14941503

14951504
cx.jobs.callback(async move {
14961505
let mut lenses = Vec::new();
1497-
1498-
match request.await {
1499-
Ok(Some(resp)) => lenses = resp,
1500-
Ok(None) => {}
1501-
Err(err) => log::error!("while fetching code lenses: {err}"),
1506+
while let Some(response) = futures.next().await {
1507+
match response {
1508+
Ok(item) => lenses.push(item),
1509+
Err(err) => log::error!("Error requesting document symbols: {err}"),
1510+
}
15021511
}
15031512

15041513
let call = move |editor: &mut Editor, compositor: &mut Compositor| {

0 commit comments

Comments
 (0)