1use std::sync::Arc;
2
3use crate::SourceMap;
4
5pub(crate) const INVALID_ID: u32 = u32::MAX;
8
9#[derive(Debug, PartialEq, Eq, Clone, Copy)]
11pub struct Token {
12 pub(crate) dst_line: u32,
13 pub(crate) dst_col: u32,
14 pub(crate) src_line: u32,
15 pub(crate) src_col: u32,
16 source_id: u32,
17 name_id: u32,
18}
19
20impl Token {
21 pub fn new(
22 dst_line: u32,
23 dst_col: u32,
24 src_line: u32,
25 src_col: u32,
26 source_id: Option<u32>,
27 name_id: Option<u32>,
28 ) -> Self {
29 Self {
30 dst_line,
31 dst_col,
32 src_line,
33 src_col,
34 source_id: source_id.unwrap_or(INVALID_ID),
35 name_id: name_id.unwrap_or(INVALID_ID),
36 }
37 }
38
39 pub fn get_dst_line(&self) -> u32 {
40 self.dst_line
41 }
42
43 pub fn get_dst_col(&self) -> u32 {
44 self.dst_col
45 }
46
47 pub fn get_src_line(&self) -> u32 {
48 self.src_line
49 }
50
51 pub fn get_src_col(&self) -> u32 {
52 self.src_col
53 }
54
55 pub fn get_name_id(&self) -> Option<u32> {
56 if self.name_id == INVALID_ID { None } else { Some(self.name_id) }
57 }
58
59 pub fn get_source_id(&self) -> Option<u32> {
60 if self.source_id == INVALID_ID { None } else { Some(self.source_id) }
61 }
62}
63
64#[derive(Debug, Clone, Default, PartialEq, Eq)]
65pub struct TokenChunk {
66 pub start: u32,
67 pub end: u32,
68 pub prev_dst_line: u32,
69 pub prev_dst_col: u32,
70 pub prev_src_line: u32,
71 pub prev_src_col: u32,
72 pub prev_name_id: u32,
73 pub prev_source_id: u32,
74}
75
76impl TokenChunk {
77 #[expect(clippy::too_many_arguments)]
78 pub fn new(
79 start: u32,
80 end: u32,
81 prev_dst_line: u32,
82 prev_dst_col: u32,
83 prev_src_line: u32,
84 prev_src_col: u32,
85 prev_name_id: u32,
86 prev_source_id: u32,
87 ) -> Self {
88 Self {
89 start,
90 end,
91 prev_dst_line,
92 prev_dst_col,
93 prev_src_line,
94 prev_src_col,
95 prev_name_id,
96 prev_source_id,
97 }
98 }
99}
100
101#[derive(Debug, Clone, Copy)]
103pub struct SourceViewToken<'a> {
104 pub(crate) token: Token,
105 pub(crate) sourcemap: &'a SourceMap,
106}
107
108impl<'a> SourceViewToken<'a> {
109 pub fn new(token: Token, sourcemap: &'a SourceMap) -> Self {
110 Self { token, sourcemap }
111 }
112
113 pub fn get_dst_line(&self) -> u32 {
114 self.token.dst_line
115 }
116
117 pub fn get_dst_col(&self) -> u32 {
118 self.token.dst_col
119 }
120
121 pub fn get_src_line(&self) -> u32 {
122 self.token.src_line
123 }
124
125 pub fn get_src_col(&self) -> u32 {
126 self.token.src_col
127 }
128
129 pub fn get_name_id(&self) -> Option<u32> {
130 if self.token.name_id == INVALID_ID { None } else { Some(self.token.name_id) }
131 }
132
133 pub fn get_source_id(&self) -> Option<u32> {
134 if self.token.source_id == INVALID_ID { None } else { Some(self.token.source_id) }
135 }
136
137 pub fn get_name(&self) -> Option<&Arc<str>> {
138 if self.token.name_id == INVALID_ID {
139 None
140 } else {
141 self.sourcemap.get_name(self.token.name_id)
142 }
143 }
144
145 pub fn get_source(&self) -> Option<&Arc<str>> {
146 if self.token.source_id == INVALID_ID {
147 None
148 } else {
149 self.sourcemap.get_source(self.token.source_id)
150 }
151 }
152
153 pub fn get_source_content(&self) -> Option<&Arc<str>> {
154 if self.token.source_id == INVALID_ID {
155 None
156 } else {
157 self.sourcemap.get_source_content(self.token.source_id)
158 }
159 }
160
161 pub fn get_source_and_content(&self) -> Option<(&Arc<str>, &Arc<str>)> {
162 if self.token.source_id == INVALID_ID {
163 None
164 } else {
165 self.sourcemap.get_source_and_content(self.token.source_id)
166 }
167 }
168
169 pub fn to_tuple(&self) -> (Option<&Arc<str>>, u32, u32, Option<&Arc<str>>) {
170 (self.get_source(), self.get_src_line(), self.get_src_col(), self.get_name())
171 }
172}