Skip to content

Commit 4d7203d

Browse files
committed
render lens symbol in gutter
1 parent 89336f5 commit 4d7203d

9 files changed

Lines changed: 25 additions & 70 deletions

File tree

helix-core/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,5 +68,5 @@ pub use syntax::Syntax;
6868

6969
pub use diagnostic::Diagnostic;
7070

71-
pub use line_ending::{LineEnding, NATIVE_LINE_ENDING};
71+
pub use line_ending::{line_end_char_index, LineEnding, NATIVE_LINE_ENDING};
7272
pub use transaction::{Assoc, Change, ChangeSet, Deletion, Operation, Transaction};

helix-lsp/src/client.rs

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1562,27 +1562,4 @@ impl Client {
15621562

15631563
Some(self.call::<lsp::request::CodeLensRequest>(params))
15641564
}
1565-
1566-
pub fn code_lens_resolve(
1567-
&self,
1568-
code_lens: lsp::CodeLens,
1569-
) -> Option<impl Future<Output = Result<Option<lsp::CodeLens>>>> {
1570-
let capabilities = self.capabilities.get().unwrap();
1571-
1572-
// Return early if the server does not support resolving code lens.
1573-
match capabilities.code_lens_provider {
1574-
Some(lsp::CodeLensOptions {
1575-
resolve_provider: Some(true),
1576-
..
1577-
}) => (),
1578-
_ => return None,
1579-
}
1580-
1581-
let request = self.call::<lsp::request::CodeLensResolve>(code_lens);
1582-
Some(async move {
1583-
let json = request.await?;
1584-
let response: Option<lsp::CodeLens> = serde_json::from_value(json)?;
1585-
Ok(response)
1586-
})
1587-
}
15881565
}

helix-term/src/commands.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -398,7 +398,7 @@ impl MappableCommand {
398398
paste_before, "Paste before selection",
399399
paste_clipboard_after, "Paste clipboard after selections",
400400
code_lens_under_cursor, "Show code lenses under cursor",
401-
code_lenses_picker, "Show code lense picker",
401+
request_code_lenses, "Show code lense picker",
402402
paste_clipboard_before, "Paste clipboard before selections",
403403
paste_primary_clipboard_after, "Paste primary clipboard after selections",
404404
paste_primary_clipboard_before, "Paste primary clipboard before selections",

helix-term/src/commands/lsp.rs

Lines changed: 7 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1708,17 +1708,7 @@ pub fn code_lens_under_cursor(cx: &mut Context) {
17081708
// TODO: fix the check
17091709
cl.range.start.line == pos.line
17101710
})
1711-
.map(|cl| {
1712-
// if cl.command.is_none() {
1713-
// if let Some(req) = language_server.code_lens_resolve(cl.clone()) {
1714-
// if let Some(code_lens) = block_on(req).ok().unwrap() {
1715-
// log::info!("code_lense: resolved {:?} into {:?}", cl, code_lens);
1716-
// return map_code_lens(doc, &code_lens);
1717-
// }
1718-
// }
1719-
// }
1720-
map_code_lens(doc_text, cl, offset_encoding, language_server.id())
1721-
})
1711+
.map(|cl| map_code_lens(doc_text, cl, offset_encoding, language_server.id()))
17221712
.collect();
17231713

17241714
if lenses.is_empty() {
@@ -1764,7 +1754,9 @@ pub fn code_lens_under_cursor(cx: &mut Context) {
17641754
};
17651755
}
17661756

1767-
pub fn code_lenses_picker(cx: &mut Context) {
1757+
// TODO: should be run the same way as diagnostic - shouldn't require manual
1758+
// trigger to set lenses.
1759+
pub fn request_code_lenses(cx: &mut Context) {
17681760
let doc = doc!(cx.editor);
17691761

17701762
let language_server =
@@ -1787,6 +1779,8 @@ pub fn code_lenses_picker(cx: &mut Context) {
17871779
request,
17881780
move |editor, compositor, lenses: Option<Vec<lsp::CodeLens>>| {
17891781
if let Some(lenses) = lenses {
1782+
log::error!("lenses got: {:?}", lenses);
1783+
17901784
let doc = doc_mut!(editor, &doc_id);
17911785
let doc_text = doc.text();
17921786
if let Some(current_url) = doc.url() {
@@ -1797,36 +1791,8 @@ pub fn code_lenses_picker(cx: &mut Context) {
17971791
.iter()
17981792
.map(|l| map_code_lens(doc_text, l, offset_enc, language_server_id))
17991793
.collect();
1800-
log::error!("lenses got: {:?}", lenses);
1801-
doc.set_code_lens(lenses.clone());
1802-
let picker = Picker::new(lenses, (), |cx, meta, _action| {
1803-
let doc = doc!(cx.editor);
1804-
let language_server = language_server_with_feature!(
1805-
cx.editor,
1806-
doc,
1807-
LanguageServerFeature::CodeLens
1808-
);
18091794

1810-
if let Some(cmd) = meta.command.clone() {
1811-
let future = match language_server.command(cmd) {
1812-
Some(future) => future,
1813-
None => {
1814-
cx.editor.set_error(
1815-
"Language server does not support executing commands",
1816-
);
1817-
return;
1818-
}
1819-
};
1820-
tokio::spawn(async move {
1821-
let res = future.await;
1822-
1823-
if let Err(e) = res {
1824-
log::error!("execute LSP command: {}", e);
1825-
}
1826-
});
1827-
}
1828-
});
1829-
compositor.push(Box::new(picker));
1795+
doc.set_code_lens(lenses.clone());
18301796
} else {
18311797
editor.set_status("no lens found");
18321798
}

helix-term/src/keymap/default.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ pub fn default() -> HashMap<Mode, KeyTrie> {
225225
"a" => code_action,
226226
"'" => last_picker,
227227
"l" => code_lens_under_cursor,
228-
"L" => code_lenses_picker,
228+
"L" => request_code_lenses,
229229
"g" => { "Debug (experimental)" sticky=true
230230
"l" => dap_launch,
231231
"r" => dap_restart,

helix-view/src/gutter.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ pub fn diagnostic<'doc>(
5757
let info = theme.get("info");
5858
let hint = theme.get("hint");
5959
let diagnostics = &doc.diagnostics;
60+
let lenses = &doc.code_lens;
6061

6162
Box::new(
6263
move |line: usize, _selected: bool, first_visual_line: bool, out: &mut String| {
@@ -73,15 +74,22 @@ pub fn diagnostic<'doc>(
7374
.language_servers_with_feature(LanguageServerFeature::Diagnostics)
7475
.any(|ls| ls.id() == d.language_server_id)
7576
});
76-
diagnostics_on_line.max_by_key(|d| d.severity).map(|d| {
77+
if let Some(style) = diagnostics_on_line.max_by_key(|d| d.severity).map(|d| {
7778
write!(out, "●").ok();
7879
match d.severity {
7980
Some(Severity::Error) => error,
8081
Some(Severity::Warning) | None => warning,
8182
Some(Severity::Info) => info,
8283
Some(Severity::Hint) => hint,
8384
}
84-
})
85+
}) {
86+
return Some(style);
87+
};
88+
if let Some(_) = lenses.iter().find(|l| l.line == line) {
89+
write!(out, "▶").ok();
90+
return Some(info);
91+
}
92+
None
8593
},
8694
)
8795
}

helix-view/src/view.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,8 @@ impl View {
451451
add_annotations(other_inlay_hints, other_style);
452452
add_annotations(padding_after_inlay_hints, None);
453453

454+
// TODO: lens line annotation
455+
454456
text_annotations
455457
}
456458

runtime/themes/dracula_at_night.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@
5858
"markup.quote" = { fg = "yellow", modifiers = ["italic"] }
5959
"markup.raw" = { fg = "foreground" }
6060

61+
"code_lens" = { underline = { color = "purple", style = "curl" } }
62+
6163
[palette]
6264
background = "#0e1419"
6365
background_dark = "#21222c"

theme.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ label = "honey"
8181
"diagnostic.warning" = { underline = { color = "lightning", style = "curl" } }
8282
"diagnostic.error" = { underline = { color = "apricot", style = "curl" } }
8383

84-
"code_lens" = { modifiers = ["underline"] }
84+
"code_lens" = { underline = { color = "delta", style = "curl" } }
8585

8686
warning = "lightning"
8787
error = "apricot"

0 commit comments

Comments
 (0)