oxc_sourcemap/
token.rs

1use std::sync::Arc;
2
3use crate::SourceMap;
4
5/// Sentinel value representing an invalid/missing ID for source or name.
6/// Used when a token doesn't have an associated source file or name.
7pub(crate) const INVALID_ID: u32 = u32::MAX;
8
9/// The `Token` is used to generate vlq `mappings`.
10#[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/// The `SourceViewToken` provider extra `source` and `source_content` value.
102#[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}