use crate::patio::{ instructions::PatioInstruction, types::{PatioDataLayout, PatioType}, values::PatioDataValue, }; pub(crate) struct PatioCompilationUnit { pub(crate) elements: Vec, } pub(crate) enum PatioCompilationUnitElement { DataElementImmutableDefinition(PatioDataElementImmutableDefinition), DataElementMutableDefinition(PatioDataElementMutableDefinition), DataElementMutableDeclaration(PatioDataElementMutableDeclaration), FunctionDeclaration(PatioFunctionDeclaration), FunctionDefinition(PatioFunctionDefinition), } pub(crate) struct PatioDataElementImmutableDefinition { pub(crate) name: String, pub(crate) visibility: PatioVisibility, pub(crate) value: PatioDataValue, } pub(crate) struct PatioDataElementMutableDefinition { pub(crate) name: String, pub(crate) visibility: PatioVisibility, pub(crate) initial_value: PatioDataValue, } pub(crate) struct PatioDataElementMutableDeclaration { pub(crate) name: String, pub(crate) layout: PatioDataLayout, } pub(crate) struct PatioFunctionDeclaration { pub(crate) name: String, pub(crate) params: Vec, pub(crate) return_types: Vec, } pub(crate) struct PatioFunctionDefinition { pub(crate) name: String, pub(crate) visibility: PatioVisibility, pub(crate) locals: Vec, pub(crate) return_types: Vec, pub(crate) body: Vec, } pub(crate) struct PatioLocal { pub(crate) name: String, pub(crate) type_: PatioType, pub(crate) local_type: PatioLocalType, } #[derive(Eq, PartialEq)] pub(crate) enum PatioLocalType { Param, Val, Var, } #[derive(Clone, Copy)] pub(crate) enum PatioVisibility { Public, Private, }