use crate::lower::ir;
mod assignment_statement;
mod expression_statement;
mod if_statement;
mod inner_doc_comment;
mod return_statement;
mod statement_list;
pub use assignment_statement::*;
pub use expression_statement::*;
pub use if_statement::*;
pub use inner_doc_comment::*;
use microcad_lang_base::{SrcRef, SrcReferrer};
pub use return_statement::*;
pub use statement_list::*;
use std::rc::Rc;
#[derive(Clone, Debug, strum::IntoStaticStr)]
pub enum Statement {
Workbench(Rc<ir::WorkbenchDefinition>),
Module(Rc<ir::ModuleDefinition>),
Function(Rc<ir::FunctionDefinition>),
Init(Rc<ir::InitDefinition>),
Use(ir::UseStatement),
Return(ir::ReturnStatement),
If(ir::IfStatement),
InnerAttribute(ir::Attribute),
InnerDocComment(ir::InnerDocComment),
Assignment(ir::AssignmentStatement),
Expression(ir::ExpressionStatement),
}
impl SrcReferrer for Statement {
fn src_ref(&self) -> SrcRef {
match self {
Self::Workbench(w) => w.src_ref(),
Self::Module(m) => m.src_ref(),
Self::Function(fd) => fd.src_ref(),
Self::Init(mid) => mid.src_ref(),
Self::Use(us) => us.src_ref(),
Self::Return(r) => r.src_ref(),
Self::If(i) => i.src_ref(),
Self::InnerAttribute(i) => i.src_ref(),
Self::InnerDocComment(i) => i.src_ref(),
Self::Assignment(a) => a.src_ref(),
Self::Expression(e) => e.src_ref(),
}
}
}
impl std::fmt::Display for Statement {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
use crate::lower::Identifiable;
match self {
Self::Workbench(w) => {
write!(f, "{w}")
}
Self::Module(m) => {
write!(f, "{}", m.id_ref())
}
Self::Function(f_) => {
write!(f, "{}", f_.id_ref())
}
Self::Init(mi) => {
write!(f, "{mi}")
}
Self::Use(u) => write!(f, "{u};"),
Self::Return(r) => write!(f, "{r};"),
Self::If(i) => write!(f, "{i}"),
Self::InnerAttribute(i) => write!(f, "{i}"),
Self::InnerDocComment(i) => write!(f, "{i}"),
Self::Assignment(a) => write!(f, "{a}"),
Self::Expression(e) => write!(f, "{e}"),
}
}
}