oak_source_map/
mapping.rs1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
10pub struct Mapping {
11 pub generated_line: u32,
13 pub generated_column: u32,
15 pub source_index: Option<u32>,
17 pub original_line: Option<u32>,
19 pub original_column: Option<u32>,
21 pub name_index: Option<u32>,
23}
24
25impl Mapping {
26 pub fn generated_only(line: u32, column: u32) -> Self {
28 Self { generated_line: line, generated_column: column, source_index: None, original_line: None, original_column: None, name_index: None }
29 }
30
31 pub fn full(generated_line: u32, generated_column: u32, source_index: u32, original_line: u32, original_column: u32, name_index: Option<u32>) -> Self {
33 Self { generated_line, generated_column, source_index: Some(source_index), original_line: Some(original_line), original_column: Some(original_column), name_index }
34 }
35
36 pub fn has_source(&self) -> bool {
38 self.source_index.is_some()
39 }
40
41 pub fn has_name(&self) -> bool {
43 self.name_index.is_some()
44 }
45
46 pub fn source_index_or_zero(&self) -> u32 {
48 self.source_index.unwrap_or(0)
49 }
50
51 pub fn original_line_or_zero(&self) -> u32 {
53 self.original_line.unwrap_or(0)
54 }
55
56 pub fn original_column_or_zero(&self) -> u32 {
58 self.original_column.unwrap_or(0)
59 }
60
61 pub fn name_index_or_zero(&self) -> u32 {
63 self.name_index.unwrap_or(0)
64 }
65}
66
67impl PartialOrd for Mapping {
68 fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
69 Some(self.cmp(other))
70 }
71}
72
73impl Ord for Mapping {
74 fn cmp(&self, other: &Self) -> std::cmp::Ordering {
75 self.generated_line.cmp(&other.generated_line).then_with(|| self.generated_column.cmp(&other.generated_column))
76 }
77}
78
79#[derive(Debug, Clone, Copy, PartialEq, Eq)]
83pub struct Segment {
84 pub generated_column: i32,
86 pub source_index: Option<i32>,
88 pub original_line: Option<i32>,
90 pub original_column: Option<i32>,
92 pub name_index: Option<i32>,
94}
95
96impl Segment {
97 pub fn generated_only(column: i32) -> Self {
99 Self { generated_column: column, source_index: None, original_line: None, original_column: None, name_index: None }
100 }
101
102 pub fn full(generated_column: i32, source_index: i32, original_line: i32, original_column: i32, name_index: Option<i32>) -> Self {
104 Self { generated_column, source_index: Some(source_index), original_line: Some(original_line), original_column: Some(original_column), name_index }
105 }
106
107 pub fn has_source(&self) -> bool {
109 self.source_index.is_some()
110 }
111
112 pub fn has_name(&self) -> bool {
114 self.name_index.is_some()
115 }
116}
117
118#[derive(Debug, Clone, PartialEq, Eq)]
120pub struct BoundedMapping {
121 pub mapping: Mapping,
123 pub start_column: u32,
125 pub end_column: u32,
127}
128
129impl BoundedMapping {
130 pub fn new(mapping: Mapping, start_column: u32, end_column: u32) -> Self {
132 Self { mapping, start_column, end_column }
133 }
134
135 pub fn contains_column(&self, column: u32) -> bool {
137 column >= self.start_column && column < self.end_column
138 }
139}