1use crate::errors::ParseError;
2
3#[cfg(feature = "serde")]
4use serde::{Deserialize, Serialize};
5
6#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
10#[derive(Debug, Clone, PartialEq)]
11pub enum StmtStatus {
12 Some(Stmt, Vec<Comment>),
13 None,
14 PreAllocated,
15 Error(ParseError),
16}
17
18#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
21#[derive(Debug, Clone, PartialEq)]
22pub enum Comment {
23 Trailing(String),
27 Leading(String),
34}
35
36#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
40#[derive(Debug, Default, Clone, PartialEq)]
41pub struct Chunk {
42 pub(crate) block: Block,
43 pub(crate) stmts: Vec<StmtStatus>, }
50
51impl Iterator for Chunk {
52 type Item = StmtStatus;
53
54 fn next(&mut self) -> Option<Self::Item> {
55 self.stmts.pop()
56 }
57}
58
59pub trait ChunkInfo {
60 fn len(&self) -> usize;
62
63 #[must_use]
65 fn is_empty(&self) -> bool {
66 self.len() == 0
67 }
68}
69
70pub trait ChunkRetrievable {
71 fn get_stmt(&self, index: usize) -> &StmtStatus;
76
77 fn block(&self) -> &Block;
79
80 fn slice_from_block(&self, block: Block) -> ChunkSlice<'_>;
82}
83
84pub trait ChunkRef: ChunkInfo + ChunkRetrievable {}
85
86impl ChunkInfo for &Chunk {
87 fn len(&self) -> usize {
88 self.stmts.len()
89 }
90}
91
92impl ChunkRetrievable for &Chunk {
93 fn get_stmt(&self, index: usize) -> &StmtStatus {
94 &self.stmts[index]
95 }
96
97 fn block(&self) -> &Block {
98 &self.block
99 }
100
101 fn slice_from_block(&self, block: Block) -> ChunkSlice<'_> {
102 ChunkSlice { chunk: self, block }
103 }
104}
105
106impl ChunkRef for &Chunk {}
107
108impl Chunk {
109 pub fn add_stmt(&mut self, stmt_status: StmtStatus) -> usize {
111 let i = self.alloc();
112 self.set_stmt(i, stmt_status);
113 i
114 }
115
116 pub fn remove_stmt(&mut self, index: usize) {
122 self.set_stmt(index, StmtStatus::None);
123 }
124
125 pub fn add_comment(&mut self, index: usize, comment: Comment) {
131 match &mut self.stmts[index] {
132 StmtStatus::Some(_, comments) => {
133 comments.push(comment);
134 }
135 StmtStatus::Error(_) => {}
137 StmtStatus::None => panic!(
138 "Cannot add comment to statement that is None (ptr: {})",
139 index
140 ),
141 StmtStatus::PreAllocated => panic!(
142 "Cannot add comment to statement that is PreAllocated (ptr: {})",
143 index
144 ),
145 }
146 }
147
148 pub fn alloc(&mut self) -> usize {
151 let mut index = None;
153 for (i, stmt) in self.stmts.iter().enumerate() {
154 if let StmtStatus::None = stmt {
155 index = Some(i);
156 break;
157 }
158 }
159
160 match index {
163 Some(i) => i,
164 None => {
165 self.stmts.push(StmtStatus::PreAllocated);
166 self.stmts.len() - 1
167 }
168 }
169 }
170
171 pub fn set_stmt(&mut self, index: usize, stmt_status: StmtStatus) {
176 self.stmts[index] = stmt_status;
177 }
178}
179
180#[derive(Debug, Clone, PartialEq)]
183pub struct ChunkSlice<'a> {
184 chunk: &'a Chunk,
185 block: Block,
186}
187
188impl<'a> ChunkRetrievable for ChunkSlice<'a> {
189 fn get_stmt(&self, index: usize) -> &StmtStatus {
190 self.chunk.get_stmt(index)
191 }
192
193 fn block(&self) -> &Block {
194 &self.block
195 }
196
197 fn slice_from_block(&self, block: Block) -> ChunkSlice<'_> {
198 ChunkSlice {
199 chunk: self.chunk,
200 block,
201 }
202 }
203}
204
205impl ChunkInfo for ChunkSlice<'_> {
206 fn len(&self) -> usize {
207 self.block.stmt_ptrs.len()
208 }
209}
210
211impl<'a> ChunkRef for ChunkSlice<'a> {}
212
213#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
216#[derive(Debug, Default, Clone, PartialEq)]
217pub struct Block {
218 pub stmt_ptrs: Vec<usize>,
219}
220
221#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
224#[derive(Debug, Clone, PartialEq)]
225pub struct Binding {
226 pub name: String,
227 pub ty: Option<Type>,
228}
229
230#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
232#[derive(Debug, Clone, PartialEq)]
233pub struct Local {
234 pub bindings: Vec<Binding>,
235 pub init: Vec<Expr>,
236}
237
238#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
240#[derive(Debug, Clone, PartialEq)]
241pub struct Assign {
242 pub vars: Vec<Var>,
243 pub exprs: Vec<Expr>,
244}
245
246#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
248#[derive(Debug, Clone, PartialEq)]
249pub struct FunctionBody {
250 pub params: Vec<Binding>,
251 pub generics: Vec<GenericParam>,
252 pub vararg: Option<Option<Type>>,
257 pub ret_ty: Option<TypeOrPack>,
258 pub block: Block,
259}
260
261#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
263#[derive(Debug, Clone, PartialEq)]
264pub struct FunctionDef {
265 pub table: Vec<String>,
268 pub is_method: bool,
270 pub name: String,
272 pub body: FunctionBody,
274}
275
276#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
278#[derive(Debug, Clone, PartialEq)]
279pub struct LocalFunctionDef {
280 pub name: String,
281 pub body: FunctionBody,
282}
283
284#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
286#[derive(Debug, Clone, PartialEq)]
287pub enum CallArgs {
288 Exprs(Vec<Expr>),
289 Table(TableConstructor),
290 String(String),
291}
292
293#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
295#[derive(Debug, Clone, PartialEq)]
296pub struct Call {
297 pub func: Expr,
298 pub args: CallArgs,
299 pub method: Option<String>,
300}
301
302#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
304#[derive(Debug, Clone, PartialEq)]
305pub struct BinOp {
306 pub lhs: Expr,
307 pub op: BinOpKind,
308 pub rhs: Expr,
309}
310
311#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
313#[derive(Debug, Clone, PartialEq)]
314pub struct UnOp {
315 pub op: UnOpKind,
316 pub expr: Expr,
317}
318
319#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
321#[derive(Debug, Clone, PartialEq)]
322pub struct CompOp {
323 pub lhs: Var,
324 pub op: CompOpKind,
325 pub rhs: Box<Expr>,
326}
327
328#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
330#[derive(Debug, Clone, PartialEq)]
331pub struct Return {
332 pub exprs: Vec<Expr>,
333}
334
335#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
337#[derive(Debug, Clone, PartialEq)]
338pub struct Break;
339
340#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
342#[derive(Debug, Clone, PartialEq)]
343pub struct Continue;
344
345#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
347#[derive(Debug, Clone, PartialEq)]
348pub struct NamedType {
349 pub table: Option<String>,
350 pub name: String,
351 pub params: Vec<TypeOrPack>,
352}
353
354#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
356#[derive(Debug, Clone, PartialEq)]
357pub struct BoundType {
358 pub name: String,
359 pub ty: Box<Type>,
360}
361
362#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
364#[derive(Debug, Clone, PartialEq)]
365pub struct FunctionType {
366 pub generics: Vec<GenericParam>,
367 pub params: TypeList,
368 pub ret_ty: TypeOrPack,
369}
370
371#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
373#[derive(Debug, Clone, PartialEq)]
374pub struct TableType {
375 pub props: Vec<TableProp>,
376}
377
378#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
380#[derive(Debug, Clone, PartialEq)]
381pub struct Do {
382 pub block: Block,
383}
384
385#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
387#[derive(Debug, Clone, PartialEq)]
388pub struct While {
389 pub cond: Expr,
390 pub block: Block,
391}
392
393#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
395#[derive(Debug, Clone, PartialEq)]
396pub struct Repeat {
397 pub block: Block,
398 pub cond: Expr,
399}
400
401#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
403#[derive(Debug, Clone, PartialEq)]
404pub struct If {
405 pub cond: Expr,
406 pub block: Block,
407 pub else_if_blocks: Vec<(Expr, Block)>,
408 pub else_block: Option<Block>,
409}
410
411#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
413#[derive(Debug, Clone, PartialEq)]
414pub struct For {
415 pub var: Binding,
416 pub start: Expr,
417 pub end: Expr,
418 pub step: Option<Expr>,
419 pub block: Block,
420}
421
422#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
424#[derive(Debug, Clone, PartialEq)]
425pub struct ForIn {
426 pub vars: Vec<Binding>,
427 pub exprs: Vec<Expr>,
428 pub block: Block,
429}
430
431#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
433#[derive(Debug, Clone, PartialEq)]
434pub struct TableConstructor {
435 pub fields: Vec<TableField>,
436}
437
438#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
440#[derive(Debug, Clone, PartialEq)]
441pub struct IfElseExpr {
442 pub cond: Expr,
443 pub if_expr: Expr,
444 pub else_expr: Expr,
445 pub else_if_exprs: Vec<(Expr, Expr)>,
446}
447
448#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
450#[derive(Debug, Clone, PartialEq)]
451pub struct TableAccess {
452 pub expr: Expr,
453 pub index: Expr,
454}
455
456#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
458#[derive(Debug, Clone, PartialEq)]
459pub struct FieldAccess {
460 pub expr: Expr,
461 pub field: String,
462}
463
464#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
466#[derive(Debug, Clone, PartialEq)]
467pub struct StringInterp {
468 pub parts: Vec<StringInterpPart>,
469}
470
471#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
473#[derive(Debug, Clone, PartialEq)]
474pub struct TypeAssertion {
475 pub expr: Expr,
476 pub ty: Type,
477}
478
479#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
481#[derive(Debug, Clone, PartialEq, Default)]
482pub struct TypeList {
483 pub types: Vec<Type>,
484 pub vararg: Option<Type>,
485}
486
487#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
489#[derive(Debug, Clone, PartialEq)]
490pub struct TypeDef {
491 pub name: String,
492 pub ty: Type,
493 pub generics: Vec<GenericDef>,
494 pub is_exported: bool,
495}
496
497#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
499#[derive(Debug, Clone, PartialEq)]
500pub struct UnionType {
501 pub left: Type,
502 pub right: Type,
503}
504
505#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
507#[derive(Debug, Clone, PartialEq)]
508pub struct IntersectionType {
509 pub left: Type,
510 pub right: Type,
511}
512
513#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
515#[derive(Debug, Clone, PartialEq)]
516pub struct GenericDef {
517 pub param: GenericParam,
518 pub default: Option<TypeOrPack>,
519}
520
521#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
523#[derive(Debug, Clone, PartialEq)]
524pub enum Stmt {
525 CompOp(CompOp),
526 Call(Call),
527 Do(Do),
528 While(While),
529 Repeat(Repeat),
530 If(If),
531 For(For),
532 ForIn(ForIn),
533 FunctionDef(FunctionDef),
534 LocalFunctionDef(LocalFunctionDef),
535 Local(Local),
536 Assign(Assign),
537 TypeDef(TypeDef),
538 Return(Return),
540 Break(Break),
541 Continue(Continue),
542}
543
544#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
546#[derive(Debug, Clone, PartialEq)]
547pub enum Expr {
548 Number(f64),
550 String(String),
551 Nil,
552 Bool(bool),
553 VarArg,
554 Var(Var),
555 Call(Box<Call>),
557 TableConstructor(TableConstructor),
558 Function(Box<FunctionBody>),
560 IfElseExpr(Box<IfElseExpr>),
561 StringInterp(StringInterp),
562 TypeAssertion(Box<TypeAssertion>),
563 BinOp(Box<BinOp>),
564 UnOp(Box<UnOp>),
565}
566
567#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
570#[derive(Debug, Clone, PartialEq)]
571pub enum BinOpKind {
572 Add,
573 Sub,
574 Mul,
575 Div,
576 Pow,
577 Mod,
578 Concat,
579 Lt,
580 Le,
581 Gt,
582 Ge,
583 Eq,
584 Ne,
585 And,
586 Or,
587}
588
589#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
592#[derive(Debug, Clone, PartialEq)]
593pub enum UnOpKind {
594 Neg,
595 Not,
596 Len,
597}
598
599#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
602#[derive(Debug, Clone, PartialEq)]
603pub enum CompOpKind {
604 Add,
605 Sub,
606 Mul,
607 Div,
608 Mod,
609 Pow,
610 Concat,
611}
612
613#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
615#[derive(Debug, Clone, PartialEq)]
616pub enum Type {
617 Pack(Box<Type>),
621 TypeOf(Expr),
624 Named(NamedType),
626 Bound(BoundType),
629 Table(TableType),
631 Function(Box<FunctionType>),
633 Optional(Box<Type>),
635 Union(Box<UnionType>),
637 Intersection(Box<IntersectionType>),
639 Nil,
642 String(String),
644 Bool(bool),
646}
647
648#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
650#[derive(Debug, Clone, PartialEq)]
651pub enum TypeOrPack {
652 Type(Type),
653 Pack(TypePack),
654}
655
656#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
658#[derive(Debug, Clone, PartialEq)]
659pub enum TypePack {
660 Listed(TypeList),
662 Variadic(Type),
664 Generic(Type),
666}
667
668#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
670#[derive(Debug, Clone, PartialEq)]
671pub enum TableProp {
672 Indexer { key: Type, value: Type },
674 Prop { key: String, value: Type },
676 Array(Type),
679}
680
681#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
683#[derive(Debug, Clone, PartialEq)]
684pub enum GenericParam {
685 Name(String),
687 Pack(String),
689}
690
691#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
693#[derive(Debug, Clone, PartialEq)]
694pub enum Var {
695 Name(String),
696 TableAccess(Box<TableAccess>),
697 FieldAccess(Box<FieldAccess>),
698}
699
700#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
702#[derive(Debug, Clone, PartialEq)]
703pub enum TableField {
704 ExplicitKey { key: String, value: Expr },
706 ImplicitKey(Expr),
708 ArrayKey { key: Expr, value: Expr },
710}
711
712#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
714#[derive(Debug, Clone, PartialEq)]
715pub enum StringInterpPart {
716 String(String),
718 Expr(Expr),
720}