use oxc_allocator::{ArenaBox, ArenaVec};
use crate::pos::{Segment, Span};
#[derive(Debug)]
pub struct Root<'a> {
pub children: ArenaVec<'a, Block<'a>>,
pub span: Span,
}
#[expect(clippy::enum_variant_names)]
#[derive(Debug)]
pub enum Block<'a> {
Paragraph(ArenaBox<'a, Paragraph<'a>>),
Heading(ArenaBox<'a, Heading<'a>>),
ThematicBreak(ThematicBreak),
CodeBlock(ArenaBox<'a, CodeBlock<'a>>),
HtmlBlock(ArenaBox<'a, HtmlBlock<'a>>),
Blockquote(ArenaBox<'a, Blockquote<'a>>),
List(ArenaBox<'a, List<'a>>),
Definition(ArenaBox<'a, Definition<'a>>),
Table(ArenaBox<'a, Table<'a>>),
FootnoteDefinition(ArenaBox<'a, FootnoteDefinition<'a>>),
MathBlock(ArenaBox<'a, MathBlock<'a>>),
Liquid(ArenaBox<'a, Liquid<'a>>),
ContainerDirective(ArenaBox<'a, ContainerDirective<'a>>),
MdxEsm(MdxEsm),
MdxExpression(MdxExpression),
MdxJsx(ArenaBox<'a, MdxJsxFlow<'a>>),
}
impl Block<'_> {
pub fn span(&self) -> Span {
match self {
Block::Paragraph(n) => n.span,
Block::Heading(n) => n.span,
Block::ThematicBreak(n) => n.span,
Block::CodeBlock(n) => n.span,
Block::HtmlBlock(n) => n.span,
Block::Blockquote(n) => n.span,
Block::List(n) => n.span,
Block::Definition(n) => n.span,
Block::Table(n) => n.span,
Block::FootnoteDefinition(n) => n.span,
Block::MathBlock(n) => n.span,
Block::Liquid(n) => n.span,
Block::ContainerDirective(n) => n.span,
Block::MdxEsm(n) => n.span,
Block::MdxExpression(n) => n.span,
Block::MdxJsx(n) => n.span,
}
}
}
#[expect(clippy::enum_variant_names)]
#[derive(Debug)]
pub enum Inline<'a> {
Text(Text),
SoftBreak(SoftBreak),
Emphasis(ArenaBox<'a, Emphasis<'a>>),
Strong(ArenaBox<'a, Strong<'a>>),
Strikethrough(ArenaBox<'a, Strikethrough<'a>>),
CodeSpan(ArenaBox<'a, CodeSpan<'a>>),
Link(ArenaBox<'a, Link<'a>>),
Image(ArenaBox<'a, Image<'a>>),
Autolink(Autolink),
AutolinkLiteral(AutolinkLiteral),
HtmlInline(ArenaBox<'a, HtmlInline<'a>>),
HardBreak(HardBreak),
FootnoteReference(ArenaBox<'a, FootnoteReference>),
MathSpan(ArenaBox<'a, MathSpan<'a>>),
WikiLink(WikiLink),
Liquid(ArenaBox<'a, Liquid<'a>>),
MdxExpression(MdxExpression),
MdxJsx(ArenaBox<'a, MdxJsxText<'a>>),
}
impl Inline<'_> {
pub fn span(&self) -> Span {
match self {
Inline::Text(n) => n.span,
Inline::SoftBreak(n) => n.span,
Inline::Emphasis(n) => n.span,
Inline::Strong(n) => n.span,
Inline::Strikethrough(n) => n.span,
Inline::CodeSpan(n) => n.span,
Inline::Link(n) => n.span,
Inline::Image(n) => n.span,
Inline::Autolink(n) => n.span,
Inline::AutolinkLiteral(n) => n.span,
Inline::HtmlInline(n) => n.span,
Inline::HardBreak(n) => n.span,
Inline::FootnoteReference(n) => n.span,
Inline::MathSpan(n) => n.span,
Inline::WikiLink(n) => n.span,
Inline::Liquid(n) => n.span,
Inline::MdxExpression(n) => n.span,
Inline::MdxJsx(n) => n.span,
}
}
}
#[derive(Debug)]
pub struct Paragraph<'a> {
pub children: ArenaVec<'a, Inline<'a>>,
pub lazy_lines: ArenaVec<'a, Span>,
pub span: Span,
}
#[derive(Debug)]
pub struct Heading<'a> {
pub level: u8,
pub kind: HeadingKind<'a>,
pub children: ArenaVec<'a, Inline<'a>>,
pub span: Span,
}
#[derive(Debug)]
pub enum HeadingKind<'a> {
Atx,
Setext {
underline: Span,
lazy_lines: ArenaVec<'a, Span>,
},
}
#[derive(Clone, Copy, Debug)]
pub struct ThematicBreak {
pub span: Span,
}
#[derive(Debug)]
pub struct CodeBlock<'a> {
pub kind: CodeBlockKind,
pub lines: ArenaVec<'a, Segment>,
pub span: Span,
}
#[derive(Clone, Copy, Debug)]
pub enum CodeBlockKind {
Fenced {
fence: u8,
lang: Option<Span>,
meta: Option<Span>,
},
Indented,
}
#[derive(Debug)]
pub struct HtmlBlock<'a> {
pub kind: u8,
pub lines: ArenaVec<'a, Segment>,
pub trailing_newline: bool,
pub span: Span,
}
#[derive(Debug)]
pub struct Blockquote<'a> {
pub children: ArenaVec<'a, Block<'a>>,
pub span: Span,
}
#[derive(Debug)]
pub struct List<'a> {
pub marker: ListMarker,
pub tight: bool,
pub children: ArenaVec<'a, ListItem<'a>>,
pub span: Span,
}
#[derive(Clone, Copy, Debug)]
pub enum ListMarker {
Bullet { marker: u8 },
Ordered { delimiter: u8 },
}
#[derive(Debug)]
pub struct ListItem<'a> {
pub marker: Span,
pub padding: u8,
pub checkbox: Option<TaskCheckbox>,
pub spread: bool,
pub children: ArenaVec<'a, Block<'a>>,
pub span: Span,
}
#[derive(Clone, Copy, Debug)]
pub struct TaskCheckbox {
pub span: Span,
pub checked: bool,
}
#[derive(Debug)]
pub struct Definition<'a> {
pub label: ArenaVec<'a, Segment>,
pub destination: Destination,
pub title: Option<ArenaVec<'a, Segment>>,
pub span: Span,
}
#[derive(Debug)]
pub struct Table<'a> {
pub align: ArenaVec<'a, TableAlign>,
pub children: ArenaVec<'a, TableRow<'a>>,
pub span: Span,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum TableAlign {
None,
Left,
Center,
Right,
}
#[derive(Debug)]
pub struct TableRow<'a> {
pub children: ArenaVec<'a, TableCell<'a>>,
pub span: Span,
}
#[derive(Debug)]
pub struct TableCell<'a> {
pub children: ArenaVec<'a, Inline<'a>>,
pub span: Span,
}
#[derive(Debug)]
pub struct FootnoteDefinition<'a> {
pub label: Span,
pub children: ArenaVec<'a, Block<'a>>,
pub span: Span,
}
#[derive(Debug)]
pub struct MathBlock<'a> {
pub meta: Option<Span>,
pub lines: ArenaVec<'a, Segment>,
pub span: Span,
}
#[derive(Debug)]
pub struct ContainerDirective<'a> {
pub opening: Span,
pub closing: Option<Span>,
pub children: ArenaVec<'a, Block<'a>>,
pub span: Span,
}
#[derive(Clone, Copy, Debug)]
pub struct Text {
pub span: Span,
pub contains_cjk: bool,
}
#[derive(Debug)]
pub struct Emphasis<'a> {
pub marker: u8,
pub children: ArenaVec<'a, Inline<'a>>,
pub span: Span,
}
#[derive(Debug)]
pub struct Strong<'a> {
pub marker: u8,
pub children: ArenaVec<'a, Inline<'a>>,
pub span: Span,
}
#[derive(Debug)]
pub struct Strikethrough<'a> {
pub tildes: u8,
pub children: ArenaVec<'a, Inline<'a>>,
pub span: Span,
}
#[derive(Debug)]
pub struct CodeSpan<'a> {
pub pieces: ArenaVec<'a, Segment>,
pub span: Span,
}
#[derive(Debug)]
pub struct Link<'a> {
pub kind: LinkKind<'a>,
pub children: ArenaVec<'a, Inline<'a>>,
pub span: Span,
}
#[derive(Debug)]
pub struct Image<'a> {
pub kind: LinkKind<'a>,
pub alt: ArenaVec<'a, Segment>,
pub children: ArenaVec<'a, Inline<'a>>,
pub span: Span,
}
#[derive(Debug)]
pub enum LinkKind<'a> {
Inline {
destination: Destination,
title: Option<ArenaVec<'a, Segment>>,
},
Reference {
kind: ReferenceKind,
label: ArenaVec<'a, Segment>,
},
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum ReferenceKind {
Full,
Collapsed,
Shortcut,
}
#[derive(Clone, Copy, Debug)]
pub struct Destination {
pub span: Span,
pub angle_bracketed: bool,
}
#[derive(Clone, Copy, Debug)]
pub struct Autolink {
pub span: Span,
pub email: bool,
}
#[derive(Clone, Copy, Debug)]
pub struct AutolinkLiteral {
pub span: Span,
}
#[derive(Debug)]
pub struct HtmlInline<'a> {
pub pieces: ArenaVec<'a, Segment>,
pub span: Span,
}
#[derive(Clone, Copy, Debug)]
pub struct SoftBreak {
pub span: Span,
}
#[derive(Clone, Copy, Debug)]
pub struct HardBreak {
pub kind: HardBreakKind,
pub span: Span,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum HardBreakKind {
Spaces,
Backslash,
}
#[derive(Clone, Copy, Debug)]
pub struct FootnoteReference {
pub label: Span,
pub span: Span,
}
#[derive(Debug)]
pub struct MathSpan<'a> {
pub pieces: ArenaVec<'a, Segment>,
pub span: Span,
}
#[derive(Clone, Copy, Debug)]
pub struct WikiLink {
pub span: Span,
}
#[derive(Debug)]
pub struct Liquid<'a> {
pub pieces: ArenaVec<'a, Segment>,
pub span: Span,
}
#[derive(Clone, Copy, Debug)]
pub struct MdxEsm {
pub span: Span,
}
#[derive(Clone, Copy, Debug)]
pub struct MdxExpression {
pub span: Span,
}
#[derive(Debug)]
pub struct MdxJsxFlow<'a> {
pub opening: Span,
pub closing: Option<Span>,
pub children: ArenaVec<'a, Block<'a>>,
pub span: Span,
}
#[derive(Debug)]
pub struct MdxJsxText<'a> {
pub opening: Span,
pub closing: Option<Span>,
pub children: ArenaVec<'a, Inline<'a>>,
pub span: Span,
}