Skip to content

Commit 83ff754

Browse files
committed
feat: add scan result hover also for layers
1 parent 98692cb commit 83ff754

File tree

2 files changed

+23
-3
lines changed

2 files changed

+23
-3
lines changed

src/app/lsp_server/commands/build_and_scan.rs

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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};
910
use 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+
124138
pub 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

173192
fn fill_vulnerability_hints_for_layer(

src/app/markdown/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ mod markdown_summary_table;
77
mod markdown_vulnerability_evaluated_table;
88

99
pub use markdown_data::MarkdownData;
10+
pub use markdown_layer_data::MarkdownLayerData;

0 commit comments

Comments
 (0)