11use std:: path:: PathBuf ;
22
3- use emmylua_code_analysis:: { DbIndex , FileId } ;
3+ use emmylua_code_analysis:: { DbIndex , FileId , LuaDocument } ;
44use lsp_types:: { Diagnostic , DiagnosticSeverity } ;
55
66#[ derive( Debug ) ]
@@ -32,6 +32,7 @@ impl TerminalDisplay {
3232 let file_path = self . get_relative_path ( db, file_id) ;
3333 let document = db. get_vfs ( ) . get_document ( & file_id) . unwrap ( ) ;
3434 let text = document. get_text ( ) ;
35+ let text_lines = text. lines ( ) . collect :: < Vec < & str > > ( ) ;
3536
3637 // Group statistics by severity level
3738 let mut error_count = 0 ;
@@ -60,7 +61,7 @@ impl TerminalDisplay {
6061
6162 // Display each diagnostic individually
6263 for diagnostic in diagnostics {
63- self . display_single_diagnostic ( & file_path, text , diagnostic , db , file_id ) ;
64+ self . display_single_diagnostic ( & file_path, & document , & text_lines , diagnostic ) ;
6465 }
6566
6667 println ! ( ) ; // Add blank line separator
@@ -162,18 +163,11 @@ impl TerminalDisplay {
162163 fn display_single_diagnostic (
163164 & mut self ,
164165 file_path : & str ,
165- text : & str ,
166+ document : & LuaDocument ,
167+ lines : & [ & str ] ,
166168 diagnostic : Diagnostic ,
167- document : & emmylua_code_analysis:: DbIndex ,
168- file_id : FileId ,
169169 ) {
170170 let range = diagnostic. range ;
171- let doc = document. get_vfs ( ) . get_document ( & file_id) . unwrap ( ) ;
172- let _span = match doc. get_range_span ( range) {
173- Some ( span) => span,
174- None => return ,
175- } ;
176-
177171 // Get severity level colors and symbols
178172 let ( level_color, level_symbol, _level_name) = match diagnostic. severity {
179173 Some ( DiagnosticSeverity :: ERROR ) => ( "\x1b [1;31m" , "error" , "error" ) ,
@@ -194,12 +188,17 @@ impl TerminalDisplay {
194188
195189 // Calculate line and column numbers
196190 let start_line = range. start . line as usize ;
197- let start_col = range. start . character as usize ;
191+ let start_character = range. start . character as usize ;
192+ let Some ( start_col) = document. get_col_offset_at_line ( start_line, start_character) else {
193+ return ;
194+ } ;
195+ let start_col = u32:: from ( start_col) as usize ;
198196 let end_line = range. end . line as usize ;
199- let end_col = range. end . character as usize ;
200-
201- // Split text into lines
202- let lines: Vec < & str > = text. lines ( ) . collect ( ) ;
197+ let end_character = range. end . character as usize ;
198+ let Some ( end_col) = document. get_col_offset_at_line ( end_line, end_character) else {
199+ return ;
200+ } ;
201+ let end_col = u32:: from ( end_col) as usize ;
203202
204203 if start_line >= lines. len ( ) {
205204 return ;
@@ -226,10 +225,15 @@ impl TerminalDisplay {
226225 " \x1b [90m-->\x1b [0m {}:{}:{}" ,
227226 file_path,
228227 start_line + 1 ,
229- start_col + 1
228+ start_character + 1
230229 ) ;
231230 } else {
232- println ! ( " --> {}:{}:{}" , file_path, start_line + 1 , start_col + 1 ) ;
231+ println ! (
232+ " --> {}:{}:{}" ,
233+ file_path,
234+ start_line + 1 ,
235+ start_character + 1
236+ ) ;
233237 }
234238
235239 // Calculate context range to display (one line before and after for context)
0 commit comments