From 05c35b69755cf66b63cb3d77dd89932749e5571b Mon Sep 17 00:00:00 2001 From: Dhruv Manilawala Date: Wed, 14 Aug 2024 15:11:31 +0530 Subject: [PATCH] [red-knot] Use line/column for server diagnostics if available (#12881) ## Summary This PR adds very basic support for using the line / column information from the diagnostic message. This makes it easier to validate diagnostics in an editor as oppose to going through the diff one diagnostic at a time and confirming it at the location. --- .../src/server/api/requests/diagnostic.rs | 48 ++++++++++++++----- 1 file changed, 35 insertions(+), 13 deletions(-) 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, + } +}