smpl/analysis/metadata/
modules.rs1use crate::analysis::semantic_data::{FnId, ModuleId};
2use crate::ast::Ident;
3use crate::module::ModuleSource;
4use std::collections::HashMap;
5
6#[derive(Clone, Debug)]
7pub struct ModuleMetadata {
8 module_map: HashMap<Ident, ModuleId>,
9 module_reverse_map: HashMap<ModuleId, String>,
10 module_sources: HashMap<ModuleId, ModuleSource>,
11 module_scopes: HashMap<ModuleId, ModuleScope>,
12}
13
14impl ModuleMetadata {
15 pub fn new() -> ModuleMetadata {
16 ModuleMetadata {
17 module_map: HashMap::new(),
18 module_reverse_map: HashMap::new(),
19 module_sources: HashMap::new(),
20 module_scopes: HashMap::new(),
21 }
22 }
23
24 pub(crate) fn insert_mod_source(
25 &mut self,
26 id: ModuleId,
27 source: ModuleSource,
28 ) {
29 map_unique_set!(
30 self.module_sources,
31 id,
32 source,
33 format!("Modules should only have one source")
34 );
35 }
36
37 pub fn mod_source(&self, id: ModuleId) -> &ModuleSource {
38 self.module_sources
39 .get(&id)
40 .expect("module should have a source")
41 }
42
43 pub(crate) fn map_module(&mut self, name: Ident, mod_id: ModuleId) {
44 map_unique_set!(
45 self.module_map,
46 name.clone(),
47 mod_id,
48 format!("Overriding {:?}", mod_id)
49 );
50
51 map_unique_set!(
52 self.module_reverse_map,
53 mod_id,
54 name.to_string(),
55 format!("Overriding {:?}", mod_id)
56 );
57 }
58
59 pub fn get_module<T: Into<Ident>>(&self, name: T) -> Option<ModuleId> {
60 self.module_map.get(&name.into()).map(|id| id.clone())
61 }
62
63 pub fn get_module_by_id(&self, id: ModuleId) -> Option<String> {
64 self.module_reverse_map
65 .get(&id)
66 .clone()
67 .map(|name| name.to_string())
68 }
69
70 pub(crate) fn insert_module_scope(
71 &mut self,
72 id: ModuleId,
73 scope: ModuleScope,
74 ) {
75 map_unique_set!(
76 self.module_scopes,
77 id,
78 scope,
79 format!("Overriding module scope for {:?}", id)
80 );
81 }
82
83 pub fn module_scope(&self, id: ModuleId) -> &ModuleScope {
84 self.module_scopes
85 .get(&id)
86 .expect(&format!("No module scope for {:?}", id))
87 }
88}
89
90#[derive(Clone, Debug)]
91pub struct ModuleScope {
92 pub funcs: Vec<FnId>,
93}