From 185c1650df6fef9cdc33da9d5b8791c3abf2c32b Mon Sep 17 00:00:00 2001 From: Julia Date: Tue, 2 May 2023 09:08:07 -0400 Subject: [PATCH] Show diagnostic source in inline diagnostic --- crates/diagnostics/src/diagnostics.rs | 2 +- crates/editor/src/editor.rs | 19 +++++++++++++++---- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/crates/diagnostics/src/diagnostics.rs b/crates/diagnostics/src/diagnostics.rs index 22f67265ec..17d142ba4b 100644 --- a/crates/diagnostics/src/diagnostics.rs +++ b/crates/diagnostics/src/diagnostics.rs @@ -677,7 +677,7 @@ impl Item for ProjectDiagnosticsEditor { } fn diagnostic_header_renderer(diagnostic: Diagnostic) -> RenderBlock { - let (message, highlights) = highlight_diagnostic_message(&diagnostic.message); + let (message, highlights) = highlight_diagnostic_message(Vec::new(), &diagnostic.message); Arc::new(move |cx| { let settings = cx.global::(); let theme = &settings.theme.editor; diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 0849c0ef93..df2ca6f43d 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -7509,8 +7509,16 @@ impl Deref for EditorStyle { pub fn diagnostic_block_renderer(diagnostic: Diagnostic, is_valid: bool) -> RenderBlock { let mut highlighted_lines = Vec::new(); - for line in diagnostic.message.lines() { - highlighted_lines.push(highlight_diagnostic_message(line)); + for (index, line) in diagnostic.message.lines().enumerate() { + let line = match &diagnostic.source { + Some(source) if index == 0 => { + let source_highlight = Vec::from_iter(0..source.len()); + highlight_diagnostic_message(source_highlight, &format!("{source}: {line}")) + } + + _ => highlight_diagnostic_message(Vec::new(), line), + }; + highlighted_lines.push(line); } Arc::new(move |cx: &mut BlockContext| { @@ -7534,11 +7542,14 @@ pub fn diagnostic_block_renderer(diagnostic: Diagnostic, is_valid: bool) -> Rend }) } -pub fn highlight_diagnostic_message(message: &str) -> (String, Vec) { +pub fn highlight_diagnostic_message( + inital_highlights: Vec, + message: &str, +) -> (String, Vec) { let mut message_without_backticks = String::new(); let mut prev_offset = 0; let mut inside_block = false; - let mut highlights = Vec::new(); + let mut highlights = inital_highlights; for (match_ix, (offset, _)) in message .match_indices('`') .chain([(message.len(), "")])