1use bitflags::bitflags;
2
3use oxc_allocator::{Box, CloneIn, GetAddress, Vec};
4use oxc_ast_macros::ast;
5use oxc_span::{Atom, ContentEq, Span};
6
7#[ast]
9#[derive(Debug)]
10#[generate_derive(CloneIn, ContentEq)]
11pub struct Pattern<'a> {
12 pub span: Span,
13 pub body: Disjunction<'a>,
14}
15
16#[ast]
18#[derive(Debug)]
19#[generate_derive(CloneIn, ContentEq)]
20pub struct Disjunction<'a> {
21 pub span: Span,
22 pub body: Vec<'a, Alternative<'a>>,
23}
24
25#[ast]
27#[derive(Debug)]
28#[generate_derive(CloneIn, ContentEq)]
29pub struct Alternative<'a> {
30 pub span: Span,
31 pub body: Vec<'a, Term<'a>>,
32}
33
34#[ast]
36#[derive(Debug)]
37#[generate_derive(CloneIn, ContentEq)]
38pub enum Term<'a> {
39 BoundaryAssertion(Box<'a, BoundaryAssertion>) = 0,
41 LookAroundAssertion(Box<'a, LookAroundAssertion<'a>>) = 1,
42 Quantifier(Box<'a, Quantifier<'a>>) = 2,
44 Character(Box<'a, Character>) = 3,
46 Dot(Dot) = 4,
47 CharacterClassEscape(Box<'a, CharacterClassEscape>) = 5,
48 UnicodePropertyEscape(Box<'a, UnicodePropertyEscape<'a>>) = 6,
49 CharacterClass(Box<'a, CharacterClass<'a>>) = 7,
50 CapturingGroup(Box<'a, CapturingGroup<'a>>) = 8,
51 IgnoreGroup(Box<'a, IgnoreGroup<'a>>) = 9,
52 IndexedReference(Box<'a, IndexedReference>) = 10,
53 NamedReference(Box<'a, NamedReference<'a>>) = 11,
54}
55
56#[ast]
59#[derive(Debug)]
60#[generate_derive(CloneIn, ContentEq)]
61pub struct BoundaryAssertion {
62 pub span: Span,
63 pub kind: BoundaryAssertionKind,
64}
65
66#[ast]
67#[derive(Debug, Clone, Copy, PartialEq, Eq)]
68#[generate_derive(CloneIn, ContentEq)]
69pub enum BoundaryAssertionKind {
70 Start = 0,
71 End = 1,
72 Boundary = 2,
73 NegativeBoundary = 3,
74}
75
76#[ast]
79#[derive(Debug)]
80#[generate_derive(CloneIn, ContentEq)]
81pub struct LookAroundAssertion<'a> {
82 pub span: Span,
83 pub kind: LookAroundAssertionKind,
84 pub body: Disjunction<'a>,
85}
86
87#[ast]
88#[derive(Debug, Clone, Copy, PartialEq, Eq)]
89#[generate_derive(CloneIn, ContentEq)]
90pub enum LookAroundAssertionKind {
91 Lookahead = 0,
92 NegativeLookahead = 1,
93 Lookbehind = 2,
94 NegativeLookbehind = 3,
95}
96
97#[ast]
100#[derive(Debug)]
101#[generate_derive(CloneIn, ContentEq)]
102pub struct Quantifier<'a> {
103 pub span: Span,
104 pub min: u64,
105 pub max: Option<u64>,
107 pub greedy: bool,
108 pub body: Term<'a>,
109}
110
111#[ast]
113#[derive(Debug, Clone, Copy)]
114#[generate_derive(CloneIn, ContentEq)]
115pub struct Character {
116 pub span: Span,
118 pub kind: CharacterKind,
119 pub value: u32,
121}
122
123#[ast]
124#[derive(Debug, Clone, Copy, PartialEq, Eq)]
125#[generate_derive(CloneIn, ContentEq)]
126pub enum CharacterKind {
127 ControlLetter = 0,
128 HexadecimalEscape = 1,
129 Identifier = 2,
130 Null = 3,
131 Octal1 = 4,
133 Octal2 = 5,
134 Octal3 = 6,
135 SingleEscape = 7,
136 Symbol = 8,
137 UnicodeEscape = 9,
138}
139
140#[ast]
143#[derive(Debug)]
144#[generate_derive(CloneIn, ContentEq)]
145pub struct CharacterClassEscape {
146 pub span: Span,
147 pub kind: CharacterClassEscapeKind,
148}
149
150#[ast]
151#[derive(Debug, Clone, Copy, PartialEq, Eq)]
152#[generate_derive(CloneIn, ContentEq)]
153pub enum CharacterClassEscapeKind {
154 D = 0,
155 NegativeD = 1,
156 S = 2,
157 NegativeS = 3,
158 W = 4,
159 NegativeW = 5,
160}
161
162#[ast]
165#[derive(Debug)]
166#[generate_derive(CloneIn, ContentEq)]
167pub struct UnicodePropertyEscape<'a> {
168 pub span: Span,
169 pub negative: bool,
170 pub strings: bool,
172 pub name: Atom<'a>,
173 pub value: Option<Atom<'a>>,
174}
175
176#[ast]
178#[derive(Debug, Clone, Copy)]
179#[generate_derive(CloneIn, ContentEq)]
180pub struct Dot {
181 pub span: Span,
182}
183
184#[ast]
187#[derive(Debug)]
188#[generate_derive(CloneIn, ContentEq)]
189pub struct CharacterClass<'a> {
190 pub span: Span,
191 pub negative: bool,
192 pub strings: bool,
196 pub kind: CharacterClassContentsKind,
197 pub body: Vec<'a, CharacterClassContents<'a>>,
198}
199
200#[ast]
201#[derive(Debug, Clone, Copy, PartialEq, Eq)]
202#[generate_derive(CloneIn, ContentEq)]
203pub enum CharacterClassContentsKind {
204 Union = 0,
205 Intersection = 1,
207 Subtraction = 2,
209}
210
211#[ast]
212#[derive(Debug)]
213#[generate_derive(CloneIn, ContentEq, GetAddress)]
214pub enum CharacterClassContents<'a> {
215 CharacterClassRange(Box<'a, CharacterClassRange>) = 0,
216 CharacterClassEscape(Box<'a, CharacterClassEscape>) = 1,
217 UnicodePropertyEscape(Box<'a, UnicodePropertyEscape<'a>>) = 2,
218 Character(Box<'a, Character>) = 3,
219 NestedCharacterClass(Box<'a, CharacterClass<'a>>) = 4,
221 ClassStringDisjunction(Box<'a, ClassStringDisjunction<'a>>) = 5,
223}
224
225#[ast]
228#[derive(Debug)]
229#[generate_derive(CloneIn, ContentEq)]
230pub struct CharacterClassRange {
231 pub span: Span,
232 pub min: Character,
233 pub max: Character,
234}
235
236#[ast]
238#[derive(Debug)]
239#[generate_derive(CloneIn, ContentEq)]
240pub struct ClassStringDisjunction<'a> {
241 pub span: Span,
242 pub strings: bool,
244 pub body: Vec<'a, ClassString<'a>>,
245}
246
247#[ast]
249#[derive(Debug)]
250#[generate_derive(CloneIn, ContentEq)]
251pub struct ClassString<'a> {
252 pub span: Span,
253 pub strings: bool,
255 pub body: Vec<'a, Character>,
256}
257
258#[ast]
261#[derive(Debug)]
262#[generate_derive(CloneIn, ContentEq)]
263pub struct CapturingGroup<'a> {
264 pub span: Span,
265 pub name: Option<Atom<'a>>,
267 pub body: Disjunction<'a>,
268}
269
270#[ast]
273#[derive(Debug)]
274#[generate_derive(CloneIn, ContentEq)]
275pub struct IgnoreGroup<'a> {
276 pub span: Span,
277 pub modifiers: Option<Modifiers>,
278 pub body: Disjunction<'a>,
279}
280
281#[ast]
284#[derive(Debug)]
285#[generate_derive(CloneIn, ContentEq)]
286pub struct Modifiers {
287 pub span: Span,
288 pub enabling: Modifier,
289 pub disabling: Modifier,
290}
291
292bitflags! {
293 #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
295 pub struct Modifier: u8 {
296 const I = 1 << 0;
298 const M = 1 << 1;
300 const S = 1 << 2;
302 }
303}
304#[ast(foreign = Modifier)]
306#[expect(dead_code)]
307struct ModifierAlias(u8);
308
309#[ast]
312#[derive(Debug)]
313#[generate_derive(CloneIn, ContentEq)]
314pub struct IndexedReference {
315 pub span: Span,
316 pub index: u32,
317}
318
319#[ast]
322#[derive(Debug)]
323#[generate_derive(CloneIn, ContentEq)]
324pub struct NamedReference<'a> {
325 pub span: Span,
326 pub name: Atom<'a>,
327}
328
329#[cfg(target_pointer_width = "64")]
331#[test]
332fn size_asserts() {
333 use std::mem::size_of;
334
335 assert!(size_of::<Term>() == 16);
336 assert!(size_of::<CharacterClassContents>() == 16);
337}