Skip to main content

oxc_css_parser/tokenizer/
token.rs

1//! All supported tokens, and with comments.
2
3use crate::pos::Span;
4use oxc_css_parser_macro::{EnumAsIs, SpanIgnoredEq, Spanned};
5#[cfg(feature = "serialize")]
6use serde::Serialize;
7
8#[derive(Clone, Debug, Spanned, PartialEq, SpanIgnoredEq)]
9#[cfg_attr(feature = "serialize", derive(Serialize))]
10#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
11pub struct Comment<'s> {
12    pub content: &'s str,
13    pub kind: CommentKind,
14    pub span: Span,
15}
16
17#[derive(Clone, Debug, Spanned, PartialEq, SpanIgnoredEq, EnumAsIs)]
18#[cfg_attr(feature = "serialize", derive(Serialize))]
19pub enum CommentKind {
20    Block,
21    Line,
22}
23
24#[derive(Clone, Debug, PartialEq, EnumAsIs)]
25#[cfg_attr(feature = "serialize", derive(Serialize))]
26pub enum Token<'s> {
27    Eof(Eof),
28    Ampersand(Ampersand),
29    Asterisk(Asterisk),
30    AsteriskEqual(AsteriskEqual),
31    At(At),
32    AtKeyword(AtKeyword<'s>),
33    AtLBraceVar(AtLBraceVar<'s>),
34    BacktickCode(BacktickCode<'s>),
35    Bar(Bar),
36    BarBar(BarBar),
37    BarEqual(BarEqual),
38    CaretEqual(CaretEqual),
39    Cdc(Cdc),
40    Cdo(Cdo),
41    Colon(Colon),
42    ColonColon(ColonColon),
43    Comma(Comma),
44    Dedent(Dedent),
45    Dimension(Dimension<'s>),
46    DollarEqual(DollarEqual),
47    DollarLBraceVar(DollarLBraceVar<'s>),
48    DollarVar(DollarVar<'s>),
49    Dot(Dot),
50    DotDotDot(DotDotDot),
51    Equal(Equal),
52    EqualEqual(EqualEqual),
53    Exclamation(Exclamation),
54    ExclamationEqual(ExclamationEqual),
55    GreaterThan(GreaterThan),
56    GreaterThanEqual(GreaterThanEqual),
57    Hash(Hash<'s>),
58    HashLBrace(HashLBrace),
59    Ident(Ident<'s>),
60    Indent(Indent),
61    LBrace(LBrace),
62    LBracket(LBracket),
63    LessThan(LessThan),
64    LessThanEqual(LessThanEqual),
65    Linebreak(Linebreak),
66    LParen(LParen),
67    Minus(Minus),
68    Number(Number<'s>),
69    NumberSign(NumberSign),
70    Percent(Percent),
71    Percentage(Percentage<'s>),
72    Placeholder(Placeholder<'s>),
73    Plus(Plus),
74    PlusUnderscore(PlusUnderscore),
75    Question(Question),
76    RBrace(RBrace),
77    RBracket(RBracket),
78    RParen(RParen),
79    Semicolon(Semicolon),
80    Solidus(Solidus),
81    Str(Str<'s>),
82    StrTemplate(StrTemplate<'s>),
83    Tilde(Tilde),
84    TildeEqual(TildeEqual),
85    UrlRaw(UrlRaw<'s>),
86    UrlTemplate(UrlTemplate<'s>),
87}
88
89#[derive(Clone, Debug, Spanned, PartialEq)]
90#[cfg_attr(feature = "serialize", derive(Serialize))]
91#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
92pub struct TokenWithSpan<'s> {
93    pub token: Token<'s>,
94    pub span: Span,
95}
96
97#[derive(Clone, Debug, PartialEq)]
98#[cfg_attr(feature = "serialize", derive(Serialize))]
99#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
100pub struct Ampersand {}
101
102#[derive(Clone, Debug, PartialEq)]
103#[cfg_attr(feature = "serialize", derive(Serialize))]
104#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
105pub struct Asterisk {}
106
107#[derive(Clone, Debug, PartialEq)]
108#[cfg_attr(feature = "serialize", derive(Serialize))]
109#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
110pub struct AsteriskEqual {}
111
112#[derive(Clone, Debug, PartialEq)]
113#[cfg_attr(feature = "serialize", derive(Serialize))]
114#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
115pub struct At {}
116
117#[derive(Clone, Debug, PartialEq)]
118#[cfg_attr(feature = "serialize", derive(Serialize))]
119#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
120pub struct AtKeyword<'s> {
121    pub ident: Ident<'s>,
122}
123
124/// An atomic backtick-delimited template placeholder token (see
125/// [`ParserOptions::template_placeholder`](crate::config::ParserOptions)),
126/// carrying the parsed decimal index and any glued literal suffix.
127#[derive(Clone, Copy, Debug, PartialEq, Eq)]
128#[cfg_attr(feature = "serialize", derive(Serialize))]
129#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
130pub struct Placeholder<'s> {
131    pub index: u32,
132    /// An ident-continuation run glued directly after the placeholder
133    /// (`` `PLACEHOLDER-0`px `` -> index 0, suffix `"px"`), empty when none.
134    /// Mirrors `#{$x}px` being a single identifier rather than two tokens.
135    pub suffix: &'s str,
136}
137
138#[derive(Clone, Debug, PartialEq)]
139#[cfg_attr(feature = "serialize", derive(Serialize))]
140#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
141pub struct AtLBraceVar<'s> {
142    pub ident: Ident<'s>,
143}
144
145#[derive(Clone, Debug, PartialEq)]
146#[cfg_attr(feature = "serialize", derive(Serialize))]
147#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
148pub struct BacktickCode<'s> {
149    pub raw: &'s str,
150}
151
152#[derive(Clone, Debug, PartialEq)]
153#[cfg_attr(feature = "serialize", derive(Serialize))]
154#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
155pub struct Bar {}
156
157#[derive(Clone, Debug, PartialEq)]
158#[cfg_attr(feature = "serialize", derive(Serialize))]
159#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
160pub struct BarBar {}
161
162#[derive(Clone, Debug, PartialEq)]
163#[cfg_attr(feature = "serialize", derive(Serialize))]
164#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
165pub struct BarEqual {}
166
167#[derive(Clone, Debug, PartialEq)]
168#[cfg_attr(feature = "serialize", derive(Serialize))]
169#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
170pub struct CaretEqual {}
171
172/// `-->`
173#[derive(Clone, Debug, PartialEq)]
174#[cfg_attr(feature = "serialize", derive(Serialize))]
175#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
176pub struct Cdc {}
177
178/// `<!--`
179#[derive(Clone, Debug, PartialEq)]
180#[cfg_attr(feature = "serialize", derive(Serialize))]
181#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
182pub struct Cdo {}
183
184#[derive(Clone, Debug, PartialEq)]
185#[cfg_attr(feature = "serialize", derive(Serialize))]
186#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
187pub struct Colon {}
188
189#[derive(Clone, Debug, PartialEq)]
190#[cfg_attr(feature = "serialize", derive(Serialize))]
191#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
192pub struct ColonColon {}
193
194#[derive(Clone, Debug, PartialEq)]
195#[cfg_attr(feature = "serialize", derive(Serialize))]
196#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
197pub struct Comma {}
198
199#[derive(Clone, Debug, PartialEq)]
200#[cfg_attr(feature = "serialize", derive(Serialize))]
201#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
202pub struct Dedent {}
203
204#[derive(Clone, Debug, PartialEq)]
205#[cfg_attr(feature = "serialize", derive(Serialize))]
206#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
207pub struct Dimension<'s> {
208    pub value: Number<'s>,
209    pub unit: Ident<'s>,
210}
211
212#[derive(Clone, Debug, PartialEq)]
213#[cfg_attr(feature = "serialize", derive(Serialize))]
214#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
215pub struct DollarEqual {}
216
217#[derive(Clone, Debug, PartialEq)]
218#[cfg_attr(feature = "serialize", derive(Serialize))]
219#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
220pub struct DollarLBraceVar<'s> {
221    pub ident: Ident<'s>,
222}
223
224#[derive(Clone, Debug, PartialEq)]
225#[cfg_attr(feature = "serialize", derive(Serialize))]
226#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
227pub struct DollarVar<'s> {
228    pub ident: Ident<'s>,
229}
230
231#[derive(Clone, Debug, PartialEq)]
232#[cfg_attr(feature = "serialize", derive(Serialize))]
233#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
234pub struct Dot {}
235
236#[derive(Clone, Debug, PartialEq)]
237#[cfg_attr(feature = "serialize", derive(Serialize))]
238#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
239pub struct DotDotDot {}
240
241#[derive(Clone, Debug, PartialEq)]
242#[cfg_attr(feature = "serialize", derive(Serialize))]
243#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
244pub struct Eof {}
245
246#[derive(Clone, Debug, PartialEq)]
247#[cfg_attr(feature = "serialize", derive(Serialize))]
248#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
249pub struct Equal {}
250
251#[derive(Clone, Debug, PartialEq)]
252#[cfg_attr(feature = "serialize", derive(Serialize))]
253#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
254pub struct EqualEqual {}
255
256#[derive(Clone, Debug, PartialEq)]
257#[cfg_attr(feature = "serialize", derive(Serialize))]
258#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
259pub struct Exclamation {}
260
261#[derive(Clone, Debug, PartialEq)]
262#[cfg_attr(feature = "serialize", derive(Serialize))]
263#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
264pub struct ExclamationEqual {}
265
266#[derive(Clone, Debug, PartialEq)]
267#[cfg_attr(feature = "serialize", derive(Serialize))]
268#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
269pub struct GreaterThan {}
270
271#[derive(Clone, Debug, PartialEq)]
272#[cfg_attr(feature = "serialize", derive(Serialize))]
273#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
274pub struct GreaterThanEqual {}
275
276#[derive(Clone, Debug, PartialEq)]
277#[cfg_attr(feature = "serialize", derive(Serialize))]
278#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
279pub struct Hash<'s> {
280    /// raw string without beginning `#` char
281    pub raw: &'s str,
282    pub escaped: bool,
283}
284
285#[derive(Clone, Debug, PartialEq)]
286#[cfg_attr(feature = "serialize", derive(Serialize))]
287#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
288pub struct HashLBrace {}
289
290#[derive(Clone, Debug, PartialEq)]
291#[cfg_attr(feature = "serialize", derive(Serialize))]
292#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
293pub struct Ident<'s> {
294    pub escaped: bool,
295    pub raw: &'s str,
296}
297
298#[derive(Clone, Debug, PartialEq)]
299#[cfg_attr(feature = "serialize", derive(Serialize))]
300#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
301pub struct Indent {}
302
303#[derive(Clone, Debug, PartialEq)]
304#[cfg_attr(feature = "serialize", derive(Serialize))]
305#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
306pub struct LBrace {}
307
308#[derive(Clone, Debug, PartialEq)]
309#[cfg_attr(feature = "serialize", derive(Serialize))]
310#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
311pub struct LBracket {}
312
313#[derive(Clone, Debug, PartialEq)]
314#[cfg_attr(feature = "serialize", derive(Serialize))]
315#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
316pub struct LessThan {}
317
318#[derive(Clone, Debug, PartialEq)]
319#[cfg_attr(feature = "serialize", derive(Serialize))]
320#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
321pub struct LessThanEqual {}
322
323#[derive(Clone, Debug, PartialEq)]
324#[cfg_attr(feature = "serialize", derive(Serialize))]
325#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
326pub struct Linebreak {}
327
328#[derive(Clone, Debug, PartialEq)]
329#[cfg_attr(feature = "serialize", derive(Serialize))]
330#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
331pub struct LParen {}
332
333#[derive(Clone, Debug, PartialEq)]
334#[cfg_attr(feature = "serialize", derive(Serialize))]
335#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
336pub struct Minus {}
337
338#[derive(Clone, Debug, PartialEq)]
339#[cfg_attr(feature = "serialize", derive(Serialize))]
340#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
341pub struct Number<'s> {
342    pub raw: &'s str,
343}
344
345/// U+0023 `#`
346#[derive(Clone, Debug, PartialEq)]
347#[cfg_attr(feature = "serialize", derive(Serialize))]
348#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
349pub struct NumberSign {}
350
351#[derive(Clone, Debug, PartialEq)]
352#[cfg_attr(feature = "serialize", derive(Serialize))]
353#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
354pub struct Percent {}
355
356#[derive(Clone, Debug, PartialEq)]
357#[cfg_attr(feature = "serialize", derive(Serialize))]
358#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
359pub struct Percentage<'s> {
360    pub value: Number<'s>,
361}
362
363#[derive(Clone, Debug, PartialEq)]
364#[cfg_attr(feature = "serialize", derive(Serialize))]
365#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
366pub struct Plus {}
367
368#[derive(Clone, Debug, PartialEq)]
369#[cfg_attr(feature = "serialize", derive(Serialize))]
370#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
371pub struct PlusUnderscore {}
372
373#[derive(Clone, Debug, PartialEq)]
374#[cfg_attr(feature = "serialize", derive(Serialize))]
375#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
376pub struct Question {}
377
378#[derive(Clone, Debug, PartialEq)]
379#[cfg_attr(feature = "serialize", derive(Serialize))]
380#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
381pub struct RBrace {}
382
383#[derive(Clone, Debug, PartialEq)]
384#[cfg_attr(feature = "serialize", derive(Serialize))]
385#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
386pub struct RBracket {}
387
388#[derive(Clone, Debug, PartialEq)]
389#[cfg_attr(feature = "serialize", derive(Serialize))]
390#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
391pub struct RParen {}
392
393#[derive(Clone, Debug, PartialEq)]
394#[cfg_attr(feature = "serialize", derive(Serialize))]
395#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
396pub struct Semicolon {}
397
398#[derive(Clone, Debug, PartialEq)]
399#[cfg_attr(feature = "serialize", derive(Serialize))]
400#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
401pub struct Solidus {}
402
403#[derive(Clone, Debug, PartialEq)]
404#[cfg_attr(feature = "serialize", derive(Serialize))]
405#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
406pub struct Str<'s> {
407    pub raw: &'s str,
408    pub escaped: bool,
409}
410
411#[derive(Clone, Debug, PartialEq)]
412#[cfg_attr(feature = "serialize", derive(Serialize))]
413#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
414pub struct StrTemplate<'s> {
415    pub raw: &'s str,
416    pub escaped: bool,
417    pub head: bool,
418    pub tail: bool,
419}
420
421#[derive(Clone, Debug, PartialEq)]
422#[cfg_attr(feature = "serialize", derive(Serialize))]
423#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
424pub struct Tilde {}
425
426#[derive(Clone, Debug, PartialEq)]
427#[cfg_attr(feature = "serialize", derive(Serialize))]
428#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
429pub struct TildeEqual {}
430
431#[derive(Clone, Debug, PartialEq)]
432#[cfg_attr(feature = "serialize", derive(Serialize))]
433#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
434pub struct UrlRaw<'s> {
435    pub raw: &'s str,
436    pub escaped: bool,
437}
438
439#[derive(Clone, Debug, PartialEq)]
440#[cfg_attr(feature = "serialize", derive(Serialize))]
441#[cfg_attr(feature = "serialize", serde(tag = "kind", rename_all = "camelCase"))]
442pub struct UrlTemplate<'s> {
443    pub raw: &'s str,
444    pub escaped: bool,
445    pub tail: bool,
446}