diff --git a/crates/red_knot_server/src/server/api/requests/diagnostic.rs b/crates/red_knot_server/src/server/api/requests/diagnostic.rs index c13581559c..bae3ec50c6 100644 --- a/crates/red_knot_server/src/server/api/requests/diagnostic.rs +++ b/crates/red_knot_server/src/server/api/requests/diagnostic.rs @@ -2,8 +2,9 @@ use std::borrow::Cow; use lsp_types::request::DocumentDiagnosticRequest; use lsp_types::{ - Diagnostic, DocumentDiagnosticParams, DocumentDiagnosticReport, DocumentDiagnosticReportResult, - FullDocumentDiagnosticReport, Range, RelatedFullDocumentDiagnosticReport, Url, + Diagnostic, DiagnosticSeverity, DocumentDiagnosticParams, DocumentDiagnosticReport, + DocumentDiagnosticReportResult, FullDocumentDiagnosticReport, Position, Range, + RelatedFullDocumentDiagnosticReport, Url, }; use red_knot_workspace::db::RootDatabase; @@ -56,16 +57,37 @@ fn compute_diagnostics(snapshot: &DocumentSnapshot, db: &RootDatabase) -> Vec Diagnostic { + let words = message.split(':').collect::>(); + + let (range, message) = match words.as_slice() { + [_filename, line, column, message] => { + let line = line.parse::().unwrap_or_default(); + let column = column.parse::().unwrap_or_default(); + ( + Range::new( + Position::new(line.saturating_sub(1), column.saturating_sub(1)), + Position::new(line, column), + ), + message.trim(), + ) + } + _ => (Range::default(), message), + }; + + Diagnostic { + range, + severity: Some(DiagnosticSeverity::ERROR), + tags: None, + code: None, + code_description: None, + source: Some("red-knot".into()), + message: message.to_string(), + related_information: None, + data: None, + } +}