@@ -63,10 +63,6 @@ pub fn request_document_code_lenses(editor: &mut Editor, doc_id: DocumentId) {
6363 let language_server = match language_server {
6464 Some ( language_server) => language_server,
6565 None => {
66- editor. set_error ( format ! (
67- "No configured language server supports {}" ,
68- LanguageServerFeature :: CodeLens
69- ) ) ;
7066 return ;
7167 }
7268 } ;
@@ -87,7 +83,7 @@ pub fn request_document_code_lenses(editor: &mut Editor, doc_id: DocumentId) {
8783 . collect ( ) ,
8884 Some ( Ok ( None ) ) => Vec :: new ( ) ,
8985 Some ( Err ( err) ) => {
90- log:: error!( "document color request failed: {err}" ) ;
86+ log:: error!( "code lenses request failed: {err}" ) ;
9187 return ;
9288 }
9389 None => return ,
@@ -109,15 +105,32 @@ pub fn request_document_code_lenses(editor: &mut Editor, doc_id: DocumentId) {
109105 } ) ;
110106}
111107
112- pub ( super ) fn register_hooks ( _handlers : & Handlers ) {
108+ pub ( super ) fn register_hooks ( handlers : & Handlers ) {
113109 register_hook ! ( move |event: & mut DocumentDidOpen <' _>| {
114110 // when a document is initially opened, request code lenses for it
115111 request_document_code_lenses( event. editor, event. doc) ;
116112 Ok ( ( ) )
117113 } ) ;
118114
119- register_hook ! ( move |_event: & mut DocumentDidChange <' _>| {
120- // TODO(matoous): use to update code lenses positions on document changes
115+ let tx = handlers. code_lenses . clone ( ) ;
116+ register_hook ! ( move |event: & mut DocumentDidChange <' _>| {
117+ event. changes. update_positions(
118+ event
119+ . doc
120+ . code_lenses
121+ . iter_mut( )
122+ . map( |lens| ( & mut lens. char_idx, helix_core:: Assoc :: After ) ) ,
123+ ) ;
124+
125+ // Avoid re-requesting code lenses if the change is a ghost transaction (completion)
126+ // because the language server will not know about the updates to the document and will
127+ // give out-of-date locations.
128+ if !event. ghost_transaction {
129+ // Cancel the ongoing request, if present.
130+ event. doc. code_lenses_controller. cancel( ) ;
131+ helix_event:: send_blocking( & tx, CodeLensesEvent ( event. doc. id( ) ) ) ;
132+ }
133+
121134 Ok ( ( ) )
122135 } ) ;
123136
0 commit comments