qanglang_core/frontend/
module_map.rs1use 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}