use serde::{Deserialize, Serialize};
use crate::source::Span;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Script {
pub items: Vec<TopLevelItem>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum TopLevelItem {
Include(IncludeDirective),
Global(Declaration),
Function(FunctionDecl),
Struct(StructDecl),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct IncludeDirective {
pub span: Span,
pub path: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct FunctionDecl {
pub span: Span,
pub return_type: TypeSpec,
pub name: String,
pub parameters: Vec<Parameter>,
pub body: Option<BlockStmt>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct StructDecl {
pub span: Span,
pub name: String,
pub fields: Vec<StructFieldDecl>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct StructFieldDecl {
pub span: Span,
pub ty: TypeSpec,
pub names: Vec<NamedItem>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct NamedItem {
pub span: Span,
pub name: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Parameter {
pub span: Span,
pub ty: TypeSpec,
pub name: String,
pub default: Option<Expr>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct TypeSpec {
pub span: Span,
pub is_const: bool,
pub kind: TypeKind,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum TypeKind {
Void,
Int,
Float,
String,
Object,
Vector,
Struct(String),
EngineStructure(String),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Declaration {
pub span: Span,
pub ty: TypeSpec,
pub declarators: Vec<VarDeclarator>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct VarDeclarator {
pub span: Span,
pub name: String,
pub initializer: Option<Expr>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct BlockStmt {
pub span: Span,
pub statements: Vec<Stmt>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum Stmt {
Block(BlockStmt),
Declaration(Declaration),
Expression(ExpressionStmt),
If(IfStmt),
Switch(SwitchStmt),
Return(ReturnStmt),
While(WhileStmt),
DoWhile(DoWhileStmt),
For(ForStmt),
Case(CaseStmt),
Default(DefaultStmt),
Break(SimpleStmt),
Continue(SimpleStmt),
Empty(SimpleStmt),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SimpleStmt {
pub span: Span,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ExpressionStmt {
pub span: Span,
pub expr: Expr,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct IfStmt {
pub span: Span,
pub condition: Expr,
pub then_branch: Box<Stmt>,
pub else_branch: Option<Box<Stmt>>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SwitchStmt {
pub span: Span,
pub condition: Expr,
pub body: Box<Stmt>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ReturnStmt {
pub span: Span,
pub value: Option<Expr>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct WhileStmt {
pub span: Span,
pub condition: Expr,
pub body: Box<Stmt>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct DoWhileStmt {
pub span: Span,
pub body: Box<Stmt>,
pub condition: Expr,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ForStmt {
pub span: Span,
pub initializer: Option<Expr>,
pub condition: Option<Expr>,
pub update: Option<Expr>,
pub body: Box<Stmt>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CaseStmt {
pub span: Span,
pub value: Expr,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct DefaultStmt {
pub span: Span,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Expr {
pub span: Span,
pub kind: ExprKind,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum ExprKind {
Literal(Literal),
Identifier(String),
Call {
callee: Box<Expr>,
arguments: Vec<Expr>,
},
FieldAccess {
base: Box<Expr>,
field: String,
},
Unary {
op: UnaryOp,
expr: Box<Expr>,
},
Binary {
op: BinaryOp,
left: Box<Expr>,
right: Box<Expr>,
},
Conditional {
condition: Box<Expr>,
when_true: Box<Expr>,
when_false: Box<Expr>,
},
Assignment {
op: AssignmentOp,
left: Box<Expr>,
right: Box<Expr>,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum UnaryOp {
Negate,
OnesComplement,
BooleanNot,
PreIncrement,
PreDecrement,
PostIncrement,
PostDecrement,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum BinaryOp {
Multiply,
Divide,
Modulus,
Add,
Subtract,
ShiftLeft,
ShiftRight,
UnsignedShiftRight,
GreaterEqual,
GreaterThan,
LessThan,
LessEqual,
NotEqual,
EqualEqual,
BooleanAnd,
ExclusiveOr,
InclusiveOr,
LogicalAnd,
LogicalOr,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum AssignmentOp {
Assign,
AssignMinus,
AssignPlus,
AssignMultiply,
AssignDivide,
AssignModulus,
AssignAnd,
AssignXor,
AssignOr,
AssignShiftLeft,
AssignShiftRight,
AssignUnsignedShiftRight,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum Literal {
Integer(i32),
Float(f32),
String(String),
ObjectSelf,
ObjectInvalid,
LocationInvalid,
Json(String),
Vector([f32; 3]),
Magic(MagicLiteral),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum MagicLiteral {
Function,
File,
Line,
Date,
Time,
}