use crate::{lower::ir, ty::*};
use microcad_lang_base::{Identifier, SrcRef};
use microcad_lang_proc_macros::{Identifiable, SrcReferrer};
#[derive(Clone, Debug, SrcReferrer, Identifiable)]
pub struct Assignment {
pub doc: ir::DocBlock,
pub visibility: ir::Visibility,
pub qualifier: ir::Qualifier,
pub(crate) id: Identifier,
pub specified_type: Option<ir::TypeAnnotation>,
pub expression: ir::Expression,
pub src_ref: SrcRef,
}
impl Assignment {
pub fn qualifier(&self) -> ir::Qualifier {
match self.visibility {
ir::Visibility::Private | ir::Visibility::PrivateUse(_) => self.qualifier,
ir::Visibility::Public => ir::Qualifier::Const,
ir::Visibility::Deleted => unreachable!(),
}
}
}
impl std::fmt::Display for Assignment {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match &self.specified_type {
Some(t) => write!(
f,
"{vis}{qual}{id}: {ty} = {expr}",
vis = self.visibility,
qual = self.qualifier,
id = self.id,
ty = t.ty(),
expr = self.expression
),
None => write!(
f,
"{vis}{qual}{id} = {expr}",
vis = self.visibility,
qual = self.qualifier,
id = self.id,
expr = self.expression
),
}
}
}