microcad_lang/eval/statements/
use_statement.rs1use crate::eval::*;
5
6pub trait UseSymbol {
9 fn use_symbol(
18 &mut self,
19 visibility: Visibility,
20 name: &QualifiedName,
21 id: Option<Identifier>,
22 within: &QualifiedName,
23 ) -> EvalResult<Symbol>;
24
25 fn use_symbols_of(
33 &mut self,
34 visibility: Visibility,
35 name: &QualifiedName,
36 within: &QualifiedName,
37 ) -> EvalResult<Symbol>;
38}
39
40impl Eval<()> for UseStatement {
41 fn eval(&self, context: &mut Context) -> EvalResult<()> {
42 context.grant(self)?;
43 log::debug!("Evaluating use statement: {self}");
44 if matches!(self.decl, UseDeclaration::UseAll(..)) || self.visibility == Visibility::Private
45 {
46 self.decl.eval(context)
47 } else {
48 Ok(())
49 }
50 }
51}
52
53impl Eval<()> for UseDeclaration {
54 fn eval(&self, context: &mut Context) -> EvalResult<()> {
55 match &self {
56 UseDeclaration::Use(visibility, name) => {
57 if let Err(err) = context.use_symbol(*visibility, name, None) {
58 context.error(name, err)?;
59 }
60 }
61 UseDeclaration::UseAll(visibility, name) => {
62 if let Err(err) = context.use_symbols_of(*visibility, name) {
63 context.error(name, err)?
64 }
65 }
66 UseDeclaration::UseAlias(visibility, name, alias) => {
67 if let Err(err) = context.use_symbol(*visibility, name, Some(alias.clone())) {
68 context.error(name, err)?;
69 }
70 }
71 };
72 Ok(())
73 }
74}