1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
use line_col::LineColLookup; use rowan::TextRange; pub fn pretty_error_desc(source: &str, span: TextRange, error_msg: &str) -> String { let line_col_lookup = LineColLookup::new(source); let start_zero_based: usize = usize::from(span.start()) - 1; let end_zero_based: usize = usize::from(span.end()) - 1; let (line_start, col_start) = line_col_lookup.get(start_zero_based); let (line_end, col_end) = line_col_lookup.get(end_zero_based); if line_end != line_start { return "Multiline error spans are not yet supported".to_string(); } let source_line = source.lines().nth(line_start - 1).unwrap(); let highlight = format!("{0:^>span$}", "^", span = col_end - col_start + 1); format!( "{0}\nline: {1}\n{2}\n{3:>ident$}", error_msg, line_start, source_line, highlight, ident = col_start + 1, ) }