use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Mapping {
pub generated_line: u32,
pub generated_column: u32,
pub source_index: Option<u32>,
pub original_line: Option<u32>,
pub original_column: Option<u32>,
pub name_index: Option<u32>,
}
impl Mapping {
pub fn generated_only(line: u32, column: u32) -> Self {
Self { generated_line: line, generated_column: column, source_index: None, original_line: None, original_column: None, name_index: None }
}
pub fn full(generated_line: u32, generated_column: u32, source_index: u32, original_line: u32, original_column: u32, name_index: Option<u32>) -> Self {
Self { generated_line, generated_column, source_index: Some(source_index), original_line: Some(original_line), original_column: Some(original_column), name_index }
}
pub fn has_source(&self) -> bool {
self.source_index.is_some()
}
pub fn has_name(&self) -> bool {
self.name_index.is_some()
}
pub fn source_index_or_zero(&self) -> u32 {
self.source_index.unwrap_or(0)
}
pub fn original_line_or_zero(&self) -> u32 {
self.original_line.unwrap_or(0)
}
pub fn original_column_or_zero(&self) -> u32 {
self.original_column.unwrap_or(0)
}
pub fn name_index_or_zero(&self) -> u32 {
self.name_index.unwrap_or(0)
}
}
impl PartialOrd for Mapping {
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
Some(self.cmp(other))
}
}
impl Ord for Mapping {
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
self.generated_line.cmp(&other.generated_line).then_with(|| self.generated_column.cmp(&other.generated_column))
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Segment {
pub generated_column: i32,
pub source_index: Option<i32>,
pub original_line: Option<i32>,
pub original_column: Option<i32>,
pub name_index: Option<i32>,
}
impl Segment {
pub fn generated_only(column: i32) -> Self {
Self { generated_column: column, source_index: None, original_line: None, original_column: None, name_index: None }
}
pub fn full(generated_column: i32, source_index: i32, original_line: i32, original_column: i32, name_index: Option<i32>) -> Self {
Self { generated_column, source_index: Some(source_index), original_line: Some(original_line), original_column: Some(original_column), name_index }
}
pub fn has_source(&self) -> bool {
self.source_index.is_some()
}
pub fn has_name(&self) -> bool {
self.name_index.is_some()
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct BoundedMapping {
pub mapping: Mapping,
pub start_column: u32,
pub end_column: u32,
}
impl BoundedMapping {
pub fn new(mapping: Mapping, start_column: u32, end_column: u32) -> Self {
Self { mapping, start_column, end_column }
}
pub fn contains_column(&self, column: u32) -> bool {
column >= self.start_column && column < self.end_column
}
}