1#[cfg(feature = "serde")]
2use serde::Serialize;
3
4use crate::Span;
5
6use super::{ArenaVec, Expr, Name, Stmt};
7
8#[derive(Debug, Clone, Copy)]
10#[cfg_attr(feature = "serde", derive(Serialize))]
11pub struct Comment<'src> {
12 pub kind: CommentKind,
14 pub text: &'src str,
16 pub span: Span,
18}
19
20#[derive(Debug, Clone, Copy, PartialEq, Eq)]
22#[cfg_attr(feature = "serde", derive(Serialize))]
23#[non_exhaustive]
24pub enum CommentKind {
25 Line,
27 Hash,
29 Block,
31 Doc,
33}
34
35#[derive(Debug)]
37#[cfg_attr(feature = "serde", derive(Serialize))]
38pub struct Program<'arena, 'src> {
39 pub stmts: ArenaVec<'arena, Stmt<'arena, 'src>>,
41 pub span: Span,
43}
44
45#[derive(Debug)]
47#[cfg_attr(feature = "serde", derive(Serialize))]
48#[non_exhaustive]
49pub struct Arg<'arena, 'src> {
50 pub name: Option<Name<'arena, 'src>>,
52 pub kind: ArgKind<'arena, 'src>,
54 pub span: Span,
56}
57
58impl<'arena, 'src> Arg<'arena, 'src> {
59 pub fn new(name: Option<Name<'arena, 'src>>, kind: ArgKind<'arena, 'src>, span: Span) -> Self {
62 Self { name, kind, span }
63 }
64}
65
66#[derive(Debug)]
68#[cfg_attr(feature = "serde", derive(Serialize))]
69#[non_exhaustive]
70pub enum ArgKind<'arena, 'src> {
71 Value(Expr<'arena, 'src>),
73 Spread(Expr<'arena, 'src>),
75 ByRef(Expr<'arena, 'src>),
77 Placeholder,
79 SpreadPlaceholder,
81}
82
83impl<'arena, 'src> Arg<'arena, 'src> {
84 pub fn value(&self) -> Option<&Expr<'arena, 'src>> {
86 match &self.kind {
87 ArgKind::Value(e) | ArgKind::Spread(e) | ArgKind::ByRef(e) => Some(e),
88 ArgKind::Placeholder | ArgKind::SpreadPlaceholder => None,
89 }
90 }
91
92 pub fn value_mut(&mut self) -> Option<&mut Expr<'arena, 'src>> {
94 match &mut self.kind {
95 ArgKind::Value(e) | ArgKind::Spread(e) | ArgKind::ByRef(e) => Some(e),
96 ArgKind::Placeholder | ArgKind::SpreadPlaceholder => None,
97 }
98 }
99
100 pub fn is_spread(&self) -> bool {
102 matches!(self.kind, ArgKind::Spread(_))
103 }
104
105 pub fn is_placeholder(&self) -> bool {
107 matches!(self.kind, ArgKind::Placeholder | ArgKind::SpreadPlaceholder)
108 }
109}
110
111#[derive(Debug)]
113#[cfg_attr(feature = "serde", derive(Serialize))]
114#[non_exhaustive]
115pub struct Attribute<'arena, 'src> {
116 pub name: Name<'arena, 'src>,
118 pub args: ArenaVec<'arena, Arg<'arena, 'src>>,
120 pub span: Span,
122}
123
124impl<'arena, 'src> Attribute<'arena, 'src> {
125 pub fn new(arena: &'arena bumpalo::Bump, name: Name<'arena, 'src>, span: Span) -> Self {
128 Self {
129 name,
130 args: ArenaVec::new_in(arena),
131 span,
132 }
133 }
134}