use ruff_text_size::{Ranged, TextSize};
use crate::Edit;
#[derive(Debug, PartialEq, Eq)]
pub struct SourceMarker {
source: TextSize,
dest: TextSize,
}
impl SourceMarker {
pub fn new(source: TextSize, dest: TextSize) -> Self {
Self { source, dest }
}
pub const fn source(&self) -> TextSize {
self.source
}
pub const fn dest(&self) -> TextSize {
self.dest
}
}
#[derive(Default, PartialEq, Eq)]
pub struct SourceMap(Vec<SourceMarker>);
impl SourceMap {
pub fn markers(&self) -> &[SourceMarker] {
&self.0
}
pub fn push_start_marker(&mut self, edit: &Edit, output_length: TextSize) {
self.push_marker(edit.start(), output_length);
}
pub fn push_end_marker(&mut self, edit: &Edit, output_length: TextSize) {
if edit.is_insertion() {
self.push_marker(edit.start(), output_length);
} else {
self.push_marker(edit.end(), output_length);
}
}
pub fn push_marker(&mut self, offset: TextSize, output_length: TextSize) {
assert!(
self.0.last().is_none_or(|last| offset >= last.source),
"Markers must be pushed in source order",
);
self.0.push(SourceMarker {
source: offset,
dest: output_length,
});
}
}