|
| 1 | +pub use helix_lsp::lsp::Command; |
1 | 2 | use helix_lsp::{ |
2 | 3 | block_on, |
3 | 4 | lsp::{self, CodeAction, CodeActionOrCommand, DiagnosticSeverity, NumberOrString}, |
@@ -1256,3 +1257,77 @@ pub fn select_references_to_symbol_under_cursor(cx: &mut Context) { |
1256 | 1257 | }, |
1257 | 1258 | ); |
1258 | 1259 | } |
| 1260 | + |
| 1261 | +impl ui::menu::Item for lsp::CodeLens { |
| 1262 | + type Data = (); |
| 1263 | + |
| 1264 | + fn label(&self, _: &Self::Data) -> Spans { |
| 1265 | + match self.command.clone() { |
| 1266 | + Some(cmd) => cmd.title.into(), |
| 1267 | + None => "unresolved".into(), |
| 1268 | + } |
| 1269 | + } |
| 1270 | +} |
| 1271 | + |
| 1272 | +pub fn code_lenses_picker(cx: &mut Context) { |
| 1273 | + let doc = doc!(cx.editor); |
| 1274 | + |
| 1275 | + let language_server = match doc.language_server() { |
| 1276 | + Some(language_server) => language_server, |
| 1277 | + None => return, |
| 1278 | + }; |
| 1279 | + |
| 1280 | + let request = match language_server.code_lens(doc.identifier()) { |
| 1281 | + Some(future) => future, |
| 1282 | + None => { |
| 1283 | + cx.editor |
| 1284 | + .set_error("Language server does not support code lense"); |
| 1285 | + return; |
| 1286 | + } |
| 1287 | + }; |
| 1288 | + |
| 1289 | + let doc_id = doc.id(); |
| 1290 | + cx.callback( |
| 1291 | + request, |
| 1292 | + move |editor, compositor, lenses: Option<Vec<lsp::CodeLens>>| { |
| 1293 | + if let Some(lenses) = lenses { |
| 1294 | + log::error!("lenses got: {:?}", lenses); |
| 1295 | + let picker = FilePicker::new( |
| 1296 | + lenses, |
| 1297 | + (), |
| 1298 | + |cx, meta, _action| { |
| 1299 | + let doc = doc!(cx.editor); |
| 1300 | + let language_server = language_server!(cx.editor, doc); |
| 1301 | + |
| 1302 | + if let Some(cmd) = meta.command.clone() { |
| 1303 | + match language_server.command(cmd) { |
| 1304 | + Some(future) => tokio::spawn(async move { |
| 1305 | + let res = future.await; |
| 1306 | + |
| 1307 | + if let Err(e) = res { |
| 1308 | + log::error!("execute LSP command: {}", e); |
| 1309 | + } |
| 1310 | + }), |
| 1311 | + None => { |
| 1312 | + cx.editor.set_error( |
| 1313 | + "Language server does not support executing commands", |
| 1314 | + ); |
| 1315 | + return; |
| 1316 | + } |
| 1317 | + }; |
| 1318 | + } |
| 1319 | + }, |
| 1320 | + move |_editor, meta| { |
| 1321 | + Some(( |
| 1322 | + doc_id.into(), |
| 1323 | + Some((meta.range.start.line as usize, meta.range.end.line as usize)), |
| 1324 | + )) |
| 1325 | + }, |
| 1326 | + ); |
| 1327 | + compositor.push(Box::new(overlayed(picker))); |
| 1328 | + } else { |
| 1329 | + editor.set_status("no lense found"); |
| 1330 | + } |
| 1331 | + }, |
| 1332 | + ) |
| 1333 | +} |
0 commit comments