use oxc_allocator::{Box, CloneIn, GetAddress, Vec};
use oxc_ast_macros::ast;
use oxc_estree::ESTree;
use oxc_span::{Atom, ContentEq, GetSpan, Span};
#[ast]
#[derive(Debug)]
#[generate_derive(CloneIn, ContentEq, ESTree)]
pub struct Pattern<'a> {
pub span: Span,
pub body: Disjunction<'a>,
}
#[ast]
#[derive(Debug)]
#[generate_derive(CloneIn, ContentEq, ESTree)]
pub struct Disjunction<'a> {
pub span: Span,
pub body: Vec<'a, Alternative<'a>>,
}
#[ast]
#[derive(Debug)]
#[generate_derive(CloneIn, ContentEq, ESTree)]
pub struct Alternative<'a> {
pub span: Span,
pub body: Vec<'a, Term<'a>>,
}
#[ast]
#[derive(Debug)]
#[generate_derive(CloneIn, ContentEq, ESTree)]
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,
}
impl GetSpan for Term<'_> {
#[inline]
fn span(&self) -> Span {
match self {
Term::BoundaryAssertion(it) => it.span,
Term::LookAroundAssertion(it) => it.span,
Term::Quantifier(it) => it.span,
Term::Character(it) => it.span,
Term::Dot(it) => it.span,
Term::CharacterClassEscape(it) => it.span,
Term::UnicodePropertyEscape(it) => it.span,
Term::CharacterClass(it) => it.span,
Term::CapturingGroup(it) => it.span,
Term::IgnoreGroup(it) => it.span,
Term::IndexedReference(it) => it.span,
Term::NamedReference(it) => it.span,
}
}
}
#[ast]
#[derive(Debug)]
#[generate_derive(CloneIn, ContentEq, ESTree)]
pub struct BoundaryAssertion {
pub span: Span,
pub kind: BoundaryAssertionKind,
}
#[ast]
#[derive(Debug, Clone, PartialEq, Eq)]
#[generate_derive(CloneIn, ContentEq, ESTree)]
pub enum BoundaryAssertionKind {
Start = 0,
End = 1,
Boundary = 2,
NegativeBoundary = 3,
}
#[ast]
#[derive(Debug)]
#[generate_derive(CloneIn, ContentEq, ESTree)]
pub struct LookAroundAssertion<'a> {
pub span: Span,
pub kind: LookAroundAssertionKind,
pub body: Disjunction<'a>,
}
#[ast]
#[derive(Debug, Clone, PartialEq, Eq)]
#[generate_derive(CloneIn, ContentEq, ESTree)]
pub enum LookAroundAssertionKind {
Lookahead = 0,
NegativeLookahead = 1,
Lookbehind = 2,
NegativeLookbehind = 3,
}
#[ast]
#[derive(Debug)]
#[generate_derive(CloneIn, ContentEq, ESTree)]
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, ESTree)]
pub struct Character {
pub span: Span,
pub kind: CharacterKind,
pub value: u32,
}
#[ast]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[generate_derive(CloneIn, ContentEq, ESTree)]
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, ESTree)]
pub struct CharacterClassEscape {
pub span: Span,
pub kind: CharacterClassEscapeKind,
}
#[ast]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[generate_derive(CloneIn, ContentEq, ESTree)]
pub enum CharacterClassEscapeKind {
D = 0,
NegativeD = 1,
S = 2,
NegativeS = 3,
W = 4,
NegativeW = 5,
}
#[ast]
#[derive(Debug)]
#[generate_derive(CloneIn, ContentEq, ESTree)]
pub struct UnicodePropertyEscape<'a> {
pub span: Span,
pub negative: bool,
pub strings: bool,
pub name: Atom<'a>,
pub value: Option<Atom<'a>>,
}
#[ast]
#[derive(Debug, Clone, Copy)]
#[generate_derive(CloneIn, ContentEq, ESTree)]
pub struct Dot {
pub span: Span,
}
#[ast]
#[derive(Debug)]
#[generate_derive(CloneIn, ContentEq, ESTree)]
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, PartialEq, Eq)]
#[generate_derive(CloneIn, ContentEq, ESTree)]
pub enum CharacterClassContentsKind {
Union = 0,
Intersection = 1,
Subtraction = 2,
}
#[ast]
#[derive(Debug)]
#[generate_derive(CloneIn, ContentEq, GetAddress, ESTree)]
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,
}
impl GetSpan for CharacterClassContents<'_> {
#[inline]
fn span(&self) -> Span {
match self {
CharacterClassContents::CharacterClassRange(it) => it.span,
CharacterClassContents::CharacterClassEscape(it) => it.span,
CharacterClassContents::UnicodePropertyEscape(it) => it.span,
CharacterClassContents::Character(it) => it.span,
CharacterClassContents::NestedCharacterClass(it) => it.span,
CharacterClassContents::ClassStringDisjunction(it) => it.span,
}
}
}
#[ast]
#[derive(Debug)]
#[generate_derive(CloneIn, ContentEq, ESTree)]
pub struct CharacterClassRange {
pub span: Span,
pub min: Character,
pub max: Character,
}
#[ast]
#[derive(Debug)]
#[generate_derive(CloneIn, ContentEq, ESTree)]
pub struct ClassStringDisjunction<'a> {
pub span: Span,
pub strings: bool,
pub body: Vec<'a, ClassString<'a>>,
}
#[ast]
#[derive(Debug)]
#[generate_derive(CloneIn, ContentEq, ESTree)]
pub struct ClassString<'a> {
pub span: Span,
pub strings: bool,
pub body: Vec<'a, Character>,
}
#[ast]
#[derive(Debug)]
#[generate_derive(CloneIn, ContentEq, ESTree)]
pub struct CapturingGroup<'a> {
pub span: Span,
pub name: Option<Atom<'a>>,
pub body: Disjunction<'a>,
}
#[ast]
#[derive(Debug)]
#[generate_derive(CloneIn, ContentEq, ESTree)]
pub struct IgnoreGroup<'a> {
pub span: Span,
pub modifiers: Option<Modifiers>,
pub body: Disjunction<'a>,
}
#[ast]
#[derive(Debug)]
#[generate_derive(CloneIn, ContentEq, ESTree)]
pub struct Modifiers {
pub span: Span,
pub enabling: Option<Modifier>,
pub disabling: Option<Modifier>,
}
#[ast]
#[derive(Debug)]
#[generate_derive(CloneIn, ContentEq, ESTree)]
pub struct Modifier {
pub ignore_case: bool,
pub multiline: bool,
pub sticky: bool,
}
#[ast]
#[derive(Debug)]
#[generate_derive(CloneIn, ContentEq, ESTree)]
pub struct IndexedReference {
pub span: Span,
pub index: u32,
}
#[ast]
#[derive(Debug)]
#[generate_derive(CloneIn, ContentEq, ESTree)]
pub struct NamedReference<'a> {
pub span: Span,
pub name: Atom<'a>,
}
#[cfg(target_pointer_width = "64")]
#[test]
fn size_asserts() {
use std::mem::size_of;
assert!(size_of::<Term>() == 16);
assert!(size_of::<CharacterClassContents>() == 16);
}