@@ -6,6 +6,7 @@ use tower_lsp::lsp_types::{
66 Diagnostic , DiagnosticSeverity , Location , MessageType , Position , Range ,
77} ;
88
9+ use crate :: app:: markdown:: { MarkdownData , MarkdownLayerData } ;
910use crate :: {
1011 app:: { ImageBuilder , ImageScanner , LSPClient , LspInteractor , lsp_server:: WithContext } ,
1112 domain:: scanresult:: { layer:: Layer , scan_result:: ScanResult , severity:: Severity } ,
@@ -108,7 +109,8 @@ where
108109 . await ;
109110
110111 let diagnostic = diagnostic_for_image ( line, & document_text, & scan_result) ;
111- let diagnostics_per_layer = diagnostics_for_layers ( & document_text, & scan_result) ?;
112+ let ( diagnostics_per_layer, docs_per_layer) =
113+ diagnostics_for_layers ( & document_text, & scan_result) ?;
112114
113115 self . interactor . remove_diagnostics ( uri) . await ;
114116 self . interactor
@@ -117,21 +119,34 @@ where
117119 self . interactor
118120 . append_document_diagnostics ( uri, & diagnostics_per_layer)
119121 . await ;
122+ self . interactor
123+ . append_documentation (
124+ uri,
125+ self . location . range ,
126+ MarkdownData :: from ( scan_result) . to_string ( ) ,
127+ )
128+ . await ;
129+ for ( range, docs) in docs_per_layer {
130+ self . interactor . append_documentation ( uri, range, docs) . await ;
131+ }
120132 self . interactor . publish_all_diagnostics ( ) . await
121133 }
122134}
123135
136+ pub type LayerScanResult = ( Vec < Diagnostic > , Vec < ( Range , String ) > ) ;
137+
124138pub fn diagnostics_for_layers (
125139 document_text : & str ,
126140 scan_result : & ScanResult ,
127- ) -> Result < Vec < Diagnostic > > {
141+ ) -> Result < LayerScanResult > {
128142 let instructions = parse_dockerfile ( document_text) ;
129143 let layers = & scan_result. layers ( ) ;
130144
131145 let mut instr_idx = instructions. len ( ) . checked_sub ( 1 ) ;
132146 let mut layer_idx = layers. len ( ) . checked_sub ( 1 ) ;
133147
134148 let mut diagnostics = Vec :: new ( ) ;
149+ let mut docs = Vec :: new ( ) ;
135150
136151 while let ( Some ( i) , Some ( l) ) = ( instr_idx, layer_idx) {
137152 let instr = & instructions[ i] ;
@@ -162,12 +177,16 @@ pub fn diagnostics_for_layers(
162177 } ;
163178
164179 diagnostics. push ( diagnostic) ;
180+ docs. push ( (
181+ instr. range ,
182+ MarkdownLayerData :: from ( layer. clone ( ) ) . to_string ( ) ,
183+ ) ) ;
165184
166185 fill_vulnerability_hints_for_layer ( layer, instr. range , & mut diagnostics)
167186 }
168187 }
169188
170- Ok ( diagnostics)
189+ Ok ( ( diagnostics, docs ) )
171190}
172191
173192fn fill_vulnerability_hints_for_layer (
0 commit comments