@@ -87,7 +87,7 @@ pub fn request_document_code_lenses(editor: &mut Editor, doc_id: DocumentId) {
8787 . collect ( ) ,
8888 Some ( Ok ( None ) ) => Vec :: new ( ) ,
8989 Some ( Err ( err) ) => {
90- log:: error!( "document color request failed: {err}" ) ;
90+ log:: error!( "code lenses request failed: {err}" ) ;
9191 return ;
9292 }
9393 None => return ,
@@ -109,15 +109,32 @@ pub fn request_document_code_lenses(editor: &mut Editor, doc_id: DocumentId) {
109109 } ) ;
110110}
111111
112- pub ( super ) fn register_hooks ( _handlers : & Handlers ) {
112+ pub ( super ) fn register_hooks ( handlers : & Handlers ) {
113113 register_hook ! ( move |event: & mut DocumentDidOpen <' _>| {
114114 // when a document is initially opened, request code lenses for it
115115 request_document_code_lenses( event. editor, event. doc) ;
116116 Ok ( ( ) )
117117 } ) ;
118118
119- register_hook ! ( move |_event: & mut DocumentDidChange <' _>| {
120- // TODO(matoous): use to update code lenses positions on document changes
119+ let tx = handlers. code_lenses . clone ( ) ;
120+ register_hook ! ( move |event: & mut DocumentDidChange <' _>| {
121+ event. changes. update_positions(
122+ event
123+ . doc
124+ . code_lenses
125+ . iter_mut( )
126+ . map( |lens| ( & mut lens. char_idx, helix_core:: Assoc :: After ) ) ,
127+ ) ;
128+
129+ // Avoid re-requesting code lenses if the change is a ghost transaction (completion)
130+ // because the language server will not know about the updates to the document and will
131+ // give out-of-date locations.
132+ if !event. ghost_transaction {
133+ // Cancel the ongoing request, if present.
134+ event. doc. code_lenses_controller. cancel( ) ;
135+ helix_event:: send_blocking( & tx, CodeLensesEvent ( event. doc. id( ) ) ) ;
136+ }
137+
121138 Ok ( ( ) )
122139 } ) ;
123140
0 commit comments