use bitflags::bitflags;
use oxc_allocator::{Box, CloneIn, GetAddress, Vec};
use oxc_ast_macros::ast;
use oxc_span::{ContentEq, Span};
use oxc_str::Str;
#[ast]
#[derive(Debug)]
#[generate_derive(CloneIn, ContentEq)]
pub struct Pattern<'a> {
pub span: Span,
pub body: Disjunction<'a>,
}
#[ast]
#[derive(Debug)]
#[generate_derive(CloneIn, ContentEq)]
pub struct Disjunction<'a> {
pub span: Span,
pub body: Vec<'a, Alternative<'a>>,
}
#[ast]
#[derive(Debug)]
#[generate_derive(CloneIn, ContentEq)]
pub struct Alternative<'a> {
pub span: Span,
pub body: Vec<'a, Term<'a>>,
}
#[ast]
#[derive(Debug)]
#[generate_derive(CloneIn, ContentEq)]
pub enum Term<'a> {
BoundaryAssertion(Box<'a, BoundaryAssertion>) = 0,
LookAroundAssertion(Box<'a, LookAroundAssertion<'a>>) = 1,
Quantifier(Box<'a, Quantifier<'a>>) = 2,
Character(Box<'a, Character>) = 3,
Dot(Dot) = 4,
CharacterClassEscape(Box<'a, CharacterClassEscape>) = 5,
UnicodePropertyEscape(Box<'a, UnicodePropertyEscape<'a>>) = 6,
CharacterClass(Box<'a, CharacterClass<'a>>) = 7,
CapturingGroup(Box<'a, CapturingGroup<'a>>) = 8,
IgnoreGroup(Box<'a, IgnoreGroup<'a>>) = 9,
IndexedReference(Box<'a, IndexedReference>) = 10,
NamedReference(Box<'a, NamedReference<'a>>) = 11,
}
#[ast]
#[derive(Debug)]
#[generate_derive(CloneIn, ContentEq)]
pub struct BoundaryAssertion {
pub span: Span,
pub kind: BoundaryAssertionKind,
}
#[ast]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[generate_derive(CloneIn, ContentEq)]
pub enum BoundaryAssertionKind {
Start = 0,
End = 1,
Boundary = 2,
NegativeBoundary = 3,
}
#[ast]
#[derive(Debug)]
#[generate_derive(CloneIn, ContentEq)]
pub struct LookAroundAssertion<'a> {
pub span: Span,
pub kind: LookAroundAssertionKind,
pub body: Disjunction<'a>,
}
#[ast]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[generate_derive(CloneIn, ContentEq)]
pub enum LookAroundAssertionKind {
Lookahead = 0,
NegativeLookahead = 1,
Lookbehind = 2,
NegativeLookbehind = 3,
}
#[ast]
#[derive(Debug)]
#[generate_derive(CloneIn, ContentEq)]
pub struct Quantifier<'a> {
pub span: Span,
pub min: u64,
pub max: Option<u64>,
pub greedy: bool,
pub body: Term<'a>,
}
#[ast]
#[derive(Debug, Clone, Copy)]
#[generate_derive(CloneIn, ContentEq)]
pub struct Character {
pub span: Span,
pub kind: CharacterKind,
pub value: u32,
}
#[ast]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[generate_derive(CloneIn, ContentEq)]
pub enum CharacterKind {
ControlLetter = 0,
HexadecimalEscape = 1,
Identifier = 2,
Null = 3,
Octal1 = 4,
Octal2 = 5,
Octal3 = 6,
SingleEscape = 7,
Symbol = 8,
UnicodeEscape = 9,
}
#[ast]
#[derive(Debug)]
#[generate_derive(CloneIn, ContentEq)]
pub struct CharacterClassEscape {
pub span: Span,
pub kind: CharacterClassEscapeKind,
}
#[ast]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[generate_derive(CloneIn, ContentEq)]
pub enum CharacterClassEscapeKind {
D = 0,
NegativeD = 1,
S = 2,
NegativeS = 3,
W = 4,
NegativeW = 5,
}
#[ast]
#[derive(Debug)]
#[generate_derive(CloneIn, ContentEq)]
pub struct UnicodePropertyEscape<'a> {
pub span: Span,
pub negative: bool,
pub strings: bool,
pub name: Str<'a>,
pub value: Option<Str<'a>>,
}
#[ast]
#[derive(Debug, Clone, Copy)]
#[generate_derive(CloneIn, ContentEq)]
pub struct Dot {
pub span: Span,
}
#[ast]
#[derive(Debug)]
#[generate_derive(CloneIn, ContentEq)]
pub struct CharacterClass<'a> {
pub span: Span,
pub negative: bool,
pub strings: bool,
pub kind: CharacterClassContentsKind,
pub body: Vec<'a, CharacterClassContents<'a>>,
}
#[ast]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[generate_derive(CloneIn, ContentEq)]
pub enum CharacterClassContentsKind {
Union = 0,
Intersection = 1,
Subtraction = 2,
}
#[ast]
#[derive(Debug)]
#[generate_derive(CloneIn, ContentEq, GetAddress)]
pub enum CharacterClassContents<'a> {
CharacterClassRange(Box<'a, CharacterClassRange>) = 0,
CharacterClassEscape(Box<'a, CharacterClassEscape>) = 1,
UnicodePropertyEscape(Box<'a, UnicodePropertyEscape<'a>>) = 2,
Character(Box<'a, Character>) = 3,
NestedCharacterClass(Box<'a, CharacterClass<'a>>) = 4,
ClassStringDisjunction(Box<'a, ClassStringDisjunction<'a>>) = 5,
}
#[ast]
#[derive(Debug)]
#[generate_derive(CloneIn, ContentEq)]
pub struct CharacterClassRange {
pub span: Span,
pub min: Character,
pub max: Character,
}
#[ast]
#[derive(Debug)]
#[generate_derive(CloneIn, ContentEq)]
pub struct ClassStringDisjunction<'a> {
pub span: Span,
pub strings: bool,
pub body: Vec<'a, ClassString<'a>>,
}
#[ast]
#[derive(Debug)]
#[generate_derive(CloneIn, ContentEq)]
pub struct ClassString<'a> {
pub span: Span,
pub strings: bool,
pub body: Vec<'a, Character>,
}
#[ast]
#[derive(Debug)]
#[generate_derive(CloneIn, ContentEq)]
pub struct CapturingGroup<'a> {
pub span: Span,
pub name: Option<Str<'a>>,
pub body: Disjunction<'a>,
}
#[ast]
#[derive(Debug)]
#[generate_derive(CloneIn, ContentEq)]
pub struct IgnoreGroup<'a> {
pub span: Span,
pub modifiers: Option<Modifiers>,
pub body: Disjunction<'a>,
}
#[ast]
#[derive(Debug)]
#[generate_derive(CloneIn, ContentEq)]
pub struct Modifiers {
pub span: Span,
pub enabling: Modifier,
pub disabling: Modifier,
}
bitflags! {
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct Modifier: u8 {
const I = 1 << 0;
const M = 1 << 1;
const S = 1 << 2;
}
}
#[ast(foreign = Modifier)]
#[expect(dead_code)]
struct ModifierAlias(u8);
#[ast]
#[derive(Debug)]
#[generate_derive(CloneIn, ContentEq)]
pub struct IndexedReference {
pub span: Span,
pub index: u32,
}
#[ast]
#[derive(Debug)]
#[generate_derive(CloneIn, ContentEq)]
pub struct NamedReference<'a> {
pub span: Span,
pub name: Str<'a>,
}
#[cfg(target_pointer_width = "64")]
#[test]
fn size_asserts() {
assert!(size_of::<Term>() == 16);
assert!(size_of::<CharacterClassContents>() == 16);
}