use crate::types; #[derive(Clone, PartialEq, Eq, Hash)] pub struct Span { pub left: usize, pub right: usize } #[derive(Clone, PartialEq, Eq, Hash)] pub struct Spanned { pub span: Span, pub value: T, } #[derive(Clone, PartialEq, Eq, Hash)] pub struct TypeUsage { pub name: Spanned, pub ty: types::SpecifiedType, //TODO: Generics go here // mut, weak here } #[derive(Clone, PartialEq, Eq, Hash)] pub enum Operator { Mul, Div, Plus, Minus, } #[derive(Clone, PartialEq, Eq, Hash)] pub struct LiteralInt { pub value: i64, } #[derive(Clone, PartialEq, Eq, Hash)] pub struct Identifier { pub name: String, } #[derive(Clone, PartialEq, Eq, Hash)] pub struct FunctionCall { pub name: Spanned, pub arguments: Vec>>, } #[derive(Clone, PartialEq, Eq, Hash)] pub struct Operation { pub left: Spanned>, pub op: Operator, pub right: Spanned>, } #[derive(Clone, PartialEq, Eq, Hash)] pub enum Expression { LiteralInt(Spanned), FunctionCall(Spanned), Identifier(Spanned), Op(Operation), } #[derive(Clone, PartialEq, Eq, Hash)] pub struct Assignment { pub name: Spanned, pub type_usage: Option>, // mut, weak here if type not used pub expression: Spanned>, } #[derive(Clone, PartialEq, Eq, Hash)] pub enum Statement { Assignment(Spanned), Expression(Spanned>), } #[derive(Clone, PartialEq, Eq, Hash)] pub struct Block { pub statements: Vec>, } #[derive(Clone, PartialEq, Eq, Hash)] pub struct VariableDeclaration { pub name: Spanned, pub type_usage: Spanned, } #[derive(Clone, PartialEq, Eq, Hash)] pub struct Function { pub name: Spanned, pub arguments: Vec, pub return_type: Spanned, pub block: Block, } #[derive(Clone, PartialEq, Eq, Hash)] pub struct Module { pub functions: Vec, }