@@ -1269,6 +1269,82 @@ impl ui::menu::Item for lsp::CodeLens {
12691269 }
12701270}
12711271
1272+ pub fn code_lens_under_cursor ( cx : & mut Context ) {
1273+ let ( view, doc) = current ! ( cx. editor) ;
1274+
1275+ let language_server = match doc. language_server ( ) {
1276+ Some ( language_server) => language_server,
1277+ None => return ,
1278+ } ;
1279+
1280+ let offset_encoding = language_server. offset_encoding ( ) ;
1281+ let pos = doc. position ( view. id , offset_encoding) ;
1282+ let url = doc. url ( ) ;
1283+
1284+ if url. is_none ( ) {
1285+ return ;
1286+ } ;
1287+
1288+ if let Some ( lenses) = cx. editor . code_lenses . get ( & url. unwrap ( ) ) {
1289+ let lenses: Vec < lsp:: CodeLens > = lenses
1290+ . iter ( )
1291+ . filter ( |cl| {
1292+ // TODO: fix the check
1293+ cl. range . start . line == pos. line
1294+ } )
1295+ . map ( |cl| {
1296+ if cl. command . is_none ( ) {
1297+ if let Some ( req) = language_server. code_lens_resolve ( cl. clone ( ) ) {
1298+ if let Some ( code_lens) = block_on ( req) . ok ( ) . unwrap ( ) {
1299+ log:: info!( "code_lense: resolved {:?} into {:?}" , cl, code_lens) ;
1300+ return code_lens;
1301+ }
1302+ }
1303+ }
1304+ cl. clone ( )
1305+ } )
1306+ . collect ( ) ;
1307+
1308+ if lenses. is_empty ( ) {
1309+ cx. editor . set_status ( "No code lens available" ) ;
1310+ return ;
1311+ }
1312+
1313+ let mut picker = ui:: Menu :: new ( lenses, ( ) , move |editor, code_lens, event| {
1314+ let doc = doc ! ( editor) ;
1315+
1316+ if event != PromptEvent :: Validate {
1317+ return ;
1318+ }
1319+
1320+ if let Some ( language_server) = doc. language_server ( ) {
1321+ let lens = code_lens. unwrap ( ) . clone ( ) ;
1322+ if let Some ( cmd) = lens. command {
1323+ let future = match language_server. command ( cmd) {
1324+ Some ( future) => future,
1325+ None => {
1326+ editor. set_error ( "Language server does not support executing commands" ) ;
1327+ return ;
1328+ }
1329+ } ;
1330+
1331+ tokio:: spawn ( async move {
1332+ let res = future. await ;
1333+
1334+ if let Err ( e) = res {
1335+ log:: error!( "execute LSP command: {}" , e) ;
1336+ }
1337+ } ) ;
1338+ }
1339+ }
1340+ } ) ;
1341+ picker. move_down ( ) ; // pre-select the first item
1342+
1343+ let popup = Popup :: new ( "code-lens" , picker) . with_scrollbar ( false ) ;
1344+ cx. push_layer ( Box :: new ( popup) ) ;
1345+ } ;
1346+ }
1347+
12721348pub fn code_lenses_picker ( cx : & mut Context ) {
12731349 let doc = doc ! ( cx. editor) ;
12741350
@@ -1281,7 +1357,7 @@ pub fn code_lenses_picker(cx: &mut Context) {
12811357 Some ( future) => future,
12821358 None => {
12831359 cx. editor
1284- . set_error ( "Language server does not support code lense " ) ;
1360+ . set_error ( "Language server does not support code lens " ) ;
12851361 return ;
12861362 }
12871363 } ;
@@ -1291,6 +1367,11 @@ pub fn code_lenses_picker(cx: &mut Context) {
12911367 request,
12921368 move |editor, compositor, lenses : Option < Vec < lsp:: CodeLens > > | {
12931369 if let Some ( lenses) = lenses {
1370+ let doc = doc_mut ! ( editor, & doc_id) ;
1371+ if let Some ( current_url) = doc. url ( ) {
1372+ editor. code_lenses . insert ( current_url, lenses. clone ( ) ) ;
1373+ doc. set_code_lens ( lenses. clone ( ) ) ;
1374+ } ;
12941375 log:: error!( "lenses got: {:?}" , lenses) ;
12951376 let picker = FilePicker :: new (
12961377 lenses,
@@ -1327,7 +1408,7 @@ pub fn code_lenses_picker(cx: &mut Context) {
13271408 ) ;
13281409 compositor. push ( Box :: new ( overlayed ( picker) ) ) ;
13291410 } else {
1330- editor. set_status ( "no lense found" ) ;
1411+ editor. set_status ( "no lens found" ) ;
13311412 }
13321413 } ,
13331414 )
0 commit comments