microcad_lang/resolve/
symbol_definition.rs1use crate::{builtin::*, rc::*, syntax::*, value::*};
5
6#[derive(Debug, Clone)]
8pub enum SymbolDefinition {
9 SourceFile(Rc<SourceFile>),
11 Module(Rc<ModuleDefinition>),
13 Workbench(Rc<WorkbenchDefinition>),
15 Function(Rc<FunctionDefinition>),
17 Builtin(Rc<Builtin>),
19 Constant(Visibility, Identifier, Value),
21 Argument(Identifier, Value),
23 Alias(Visibility, Identifier, QualifiedName),
25 UseAll(Visibility, QualifiedName),
27 #[cfg(test)]
29 Tester(Identifier),
30}
31
32impl SymbolDefinition {
33 pub fn id(&self) -> Identifier {
35 match &self {
36 Self::Workbench(w) => w.id.clone(),
37 Self::Module(m) => m.id.clone(),
38 Self::Function(f) => f.id.clone(),
39 Self::SourceFile(s) => s.id(),
40 Self::Builtin(m) => m.id(),
41 Self::Constant(_, id, _) | Self::Argument(id, _) | Self::Alias(_, id, _) => id.clone(),
42 Self::UseAll(..) => Identifier::none(),
43 #[cfg(test)]
44 Self::Tester(id) => id.clone(),
45 }
46 }
47
48 pub fn visibility(&self) -> Visibility {
50 match &self {
51 SymbolDefinition::SourceFile(..) => Visibility::Public,
52 SymbolDefinition::Builtin(..) => Visibility::Public,
53 SymbolDefinition::Argument(..) => Visibility::Private,
54
55 SymbolDefinition::Module(md) => md.visibility,
56 SymbolDefinition::Workbench(wd) => wd.visibility,
57 SymbolDefinition::Function(fd) => fd.visibility,
58
59 SymbolDefinition::Constant(visibility, ..)
60 | SymbolDefinition::Alias(visibility, ..)
61 | SymbolDefinition::UseAll(visibility, ..) => *visibility,
62
63 #[cfg(test)]
64 SymbolDefinition::Tester(..) => Visibility::Public,
65 }
66 }
67}
68
69impl std::fmt::Display for SymbolDefinition {
70 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
71 match self {
72 Self::Workbench(w) => write!(f, "({})", w.kind),
73 Self::Module(..) => write!(f, "(module)"),
74 Self::Function(..) => write!(f, "(function)"),
75 Self::SourceFile(..) => write!(f, "(file)"),
76 Self::Builtin(..) => write!(f, "(builtin)"),
77 Self::Constant(.., value) => write!(f, "(constant) = {value}"),
78 Self::Argument(.., value) => write!(f, "(call_argument) = {value}"),
79 Self::Alias(.., name) => write!(f, "(alias) => {name}"),
80 Self::UseAll(.., name) => write!(f, "(use all) => {name}"),
81 #[cfg(test)]
82 Self::Tester(id) => write!(f, "(tester) => {id}"),
83 }
84 }
85}