#![doc = include_str!("readme.md")]
use core::range::Range;
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SwiftRoot {
pub program: Program,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Program {
pub statements: Vec<Statement>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Statement {
FunctionDef {
name: String,
parameters: Vec<Parameter>,
return_type: Option<Type>,
body: Vec<Statement>,
},
VariableDecl {
is_mutable: bool,
name: String,
type_annotation: Option<Type>,
value: Option<Expression>,
},
Expression(Expression),
Return(Option<Expression>),
If {
test: Expression,
body: Vec<Statement>,
orelse: Option<Vec<Statement>>,
},
While {
test: Expression,
body: Vec<Statement>,
},
For {
variable: String,
iterable: Expression,
body: Vec<Statement>,
},
Block(Vec<Statement>),
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Expression {
Binary {
left: Box<Expression>,
operator: String,
right: Box<Expression>,
},
Unary {
operator: String,
operand: Box<Expression>,
},
Call {
callee: Box<Expression>,
arguments: Vec<Expression>,
},
Member {
object: Box<Expression>,
member: String,
},
Identifier(String),
Literal(Literal),
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Literal {
Number(String),
String(String),
Boolean(bool),
Nil,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Parameter {
pub name: String,
pub type_annotation: Type,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Type {
pub name: String,
}