use std::fmt::Display;
use annotate_snippets::display_list::DisplayList;
use annotate_snippets::display_list::FormatOptions;
use annotate_snippets::snippet::Annotation;
use annotate_snippets::snippet::AnnotationType;
use annotate_snippets::snippet::Slice;
use annotate_snippets::snippet::Snippet;
use annotate_snippets::snippet::SourceAnnotation;
use crate::codemap::FileSpanRef;
use crate::fast_string;
pub fn span_display<'a>(
span: Option<FileSpanRef<'a>>,
annotation_label: &'a str,
color: bool,
) -> impl Display + 'a {
fn convert_span_to_slice<'a>(span: FileSpanRef<'a>) -> Slice<'a> {
let region = span.resolve_span();
let first_line_span = span.file.line_span(region.begin.line);
let last_line_span = span.file.line_span(region.end.line);
let source_span = span.span.merge(first_line_span).merge(last_line_span);
let source = span.file.source_span(source_span);
let range_start_chars = region.begin.column;
let range_len_chars = fast_string::len(span.source_span()).0;
Slice {
source,
line_start: 1 + region.begin.line,
origin: Some(span.file.filename()),
fold: false,
annotations: vec![SourceAnnotation {
label: "",
annotation_type: AnnotationType::Error,
range: (range_start_chars, range_start_chars + range_len_chars),
}],
}
}
let slice = span.map(convert_span_to_slice);
let snippet = Snippet {
title: Some(Annotation {
label: Some(annotation_label),
id: None,
annotation_type: AnnotationType::Error,
}),
footer: Vec::new(),
slices: slice.map(|s| vec![s]).unwrap_or_default(),
opt: FormatOptions {
color,
..Default::default()
},
};
DisplayList::from(snippet)
}