Skip to main content

qanglang_core/frontend/
module_map.rs

1use std::{
2    path::{Path, PathBuf},
3    sync::Arc,
4};
5
6use rustc_hash::{FxBuildHasher, FxHashMap};
7
8use crate::{NodeId, SourceMap, frontend::symbol_resolver::SymbolTable};
9
10#[derive(Debug, Default, Clone)]
11pub struct ModuleMap {
12    modules: FxHashMap<PathBuf, ModuleSource>,
13    main_module: Option<PathBuf>,
14}
15
16#[derive(Debug, Clone)]
17pub struct ModuleSource {
18    pub node: NodeId,
19    pub source_map: Arc<SourceMap>,
20    pub symbol_table: SymbolTable,
21}
22
23impl Default for ModuleSource {
24    fn default() -> Self {
25        Self {
26            node: NodeId::default(),
27            source_map: Arc::new(SourceMap::default()),
28            symbol_table: SymbolTable::default(),
29        }
30    }
31}
32
33impl ModuleMap {
34    pub fn new() -> Self {
35        Self {
36            modules: FxHashMap::with_hasher(FxBuildHasher),
37            main_module: None,
38        }
39    }
40
41    pub fn insert(&mut self, path: &Path, node: NodeId, source_map: Arc<SourceMap>) {
42        let path_buf = path.to_path_buf();
43        self.modules
44            .insert(path_buf, ModuleSource { node, source_map, symbol_table: SymbolTable::default() });
45    }
46
47    pub fn insert_with_symbols(&mut self, path: &Path, node: NodeId, source_map: Arc<SourceMap>, symbol_table: SymbolTable) {
48        let path_buf = path.to_path_buf();
49        self.modules
50            .insert(path_buf, ModuleSource { node, source_map, symbol_table });
51    }
52
53    pub fn set_main_module(&mut self, path: PathBuf) {
54        self.main_module = Some(path);
55    }
56
57    pub fn get_main_path(&self) -> Option<&Path> {
58        self.main_module.as_deref()
59    }
60
61    pub fn get_main(&self) -> Option<&ModuleSource> {
62        self.main_module
63            .as_ref()
64            .and_then(|path| self.modules.get(path))
65    }
66
67    pub fn get(&self, path: &Path) -> Option<&ModuleSource> {
68        self.modules.get(path)
69    }
70
71    pub fn has(&self, path: &Path) -> bool {
72        self.modules.contains_key(path)
73    }
74
75    pub fn iter(&self) -> impl Iterator<Item = (&Path, &ModuleSource)> {
76        self.modules.iter().map(|(k, v)| (k.as_path(), v))
77    }
78}