@@ -6,10 +6,10 @@ use tower_lsp::LanguageServer;
66use tower_lsp:: jsonrpc:: { Error , ErrorCode , Result } ;
77use tower_lsp:: lsp_types:: {
88 CodeActionOrCommand , CodeActionParams , CodeActionProviderCapability , CodeActionResponse ,
9- Command , DidChangeConfigurationParams , DidChangeTextDocumentParams , DidOpenTextDocumentParams ,
10- ExecuteCommandOptions , ExecuteCommandParams , InitializeParams , InitializeResult ,
11- InitializedParams , MessageType , ServerCapabilities , TextDocumentSyncCapability ,
12- TextDocumentSyncKind ,
9+ CodeLens , CodeLensOptions , CodeLensParams , Command , DidChangeConfigurationParams ,
10+ DidChangeTextDocumentParams , DidOpenTextDocumentParams , ExecuteCommandOptions ,
11+ ExecuteCommandParams , InitializeParams , InitializeResult , InitializedParams , MessageType ,
12+ Position , Range , ServerCapabilities , TextDocumentSyncCapability , TextDocumentSyncKind ,
1313} ;
1414use tracing:: { debug, info} ;
1515
@@ -106,6 +106,9 @@ where
106106 TextDocumentSyncKind :: FULL ,
107107 ) ) ,
108108 code_action_provider : Some ( CodeActionProviderCapability :: Simple ( true ) ) ,
109+ code_lens_provider : Some ( CodeLensOptions {
110+ resolve_provider : Some ( false ) ,
111+ } ) ,
109112 execute_command_provider : Some ( ExecuteCommandOptions {
110113 commands : vec ! [ SupportedCommands :: ExecuteScan . to_string( ) ] ,
111114 ..Default :: default ( )
@@ -180,7 +183,7 @@ where
180183
181184 if last_line_starting_with_from_statement == line_selected_as_usize {
182185 let action = Command {
183- title : "Scan Image " . to_string ( ) ,
186+ title : "Scan base image " . to_string ( ) ,
184187 command : SupportedCommands :: ExecuteScan . to_string ( ) ,
185188 arguments : Some ( vec ! [
186189 json!( params. text_document. uri) ,
@@ -194,6 +197,58 @@ where
194197 return Ok ( None ) ;
195198 }
196199
200+ async fn code_lens ( & self , params : CodeLensParams ) -> Result < Option < Vec < CodeLens > > > {
201+ info ! ( "{}" , format!( "received code lens params: {params:?}" ) ) ;
202+
203+ let Some ( content) = self
204+ . query_executor
205+ . get_document_text ( params. text_document . uri . as_str ( ) )
206+ . await
207+ else {
208+ return Err ( lsp_error (
209+ ErrorCode :: InternalError ,
210+ format ! (
211+ "unable to extract document content for document: {}" ,
212+ & params. text_document. uri
213+ ) ,
214+ ) ) ;
215+ } ;
216+
217+ let Some ( last_line_starting_with_from_statement) = content
218+ . lines ( )
219+ . enumerate ( )
220+ . filter ( |( _, line) | line. trim_start ( ) . starts_with ( "FROM " ) )
221+ . map ( |( line_num, _) | line_num)
222+ . last ( )
223+ else {
224+ return Ok ( None ) ;
225+ } ;
226+
227+ let scan_base_image_lens = CodeLens {
228+ range : Range {
229+ start : Position {
230+ line : last_line_starting_with_from_statement as u32 ,
231+ character : 0 ,
232+ } ,
233+ end : Position {
234+ line : last_line_starting_with_from_statement as u32 ,
235+ character : 0 ,
236+ } ,
237+ } ,
238+ command : Some ( Command {
239+ title : "Scan base image" . to_string ( ) ,
240+ command : SupportedCommands :: ExecuteScan . to_string ( ) ,
241+ arguments : Some ( vec ! [
242+ json!( params. text_document. uri) ,
243+ json!( last_line_starting_with_from_statement) ,
244+ ] ) ,
245+ } ) ,
246+ data : None ,
247+ } ;
248+
249+ Ok ( Some ( vec ! [ scan_base_image_lens] ) )
250+ }
251+
197252 async fn execute_command ( & self , params : ExecuteCommandParams ) -> Result < Option < Value > > {
198253 let command: SupportedCommands = params. command . as_str ( ) . try_into ( ) . map_err ( |e| {
199254 lsp_error (
0 commit comments