Skip to main content

smpl/analysis/metadata/
modules.rs

1use 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}