diff --git a/schala-lang/language/src/symbol_table/mod.rs b/schala-lang/language/src/symbol_table/mod.rs index 31dac84..7a6a760 100644 --- a/schala-lang/language/src/symbol_table/mod.rs +++ b/schala-lang/language/src/symbol_table/mod.rs @@ -124,6 +124,9 @@ impl ScopeSegment { pub struct SymbolTable { decl_locations: DeclLocations, //TODO delete this symbol_path_to_symbol: HashMap, + + + /// Used for import resolution. symbol_trie: SymbolTrie, /// These tables are responsible for preventing duplicate names. @@ -131,6 +134,7 @@ pub struct SymbolTable { types: NameTable, /// A map of the `ItemId`s of instances of use of names to their fully-canonicalized FQSN form. + /// Updated by the item id resolver. id_to_fqsn: HashMap, /// A map of the FQSN of an AST definition to a Symbol data structure, which contains @@ -153,6 +157,16 @@ impl SymbolTable { } } + /// The main entry point into the symbol table. This will traverse the AST in several + /// different ways and populate subtables with information that will be used further in the + /// compilation process. + pub fn process_ast(&mut self, ast: &ast::AST) -> Result<(), String> { + + self.populate_name_tables(ast)?; + self.resolve_symbol_ids(ast)?; + Ok(()) + } + pub fn lookup_symbol(&self, id: &ItemId) -> Option<&Symbol> { let fqsn = self.id_to_fqsn.get(id); fqsn.and_then(|fqsn| self.fqsn_to_symbol.get(fqsn)) @@ -220,15 +234,6 @@ impl SymbolTable { * later */ - /// The main entry point into the symbol table. This will traverse the AST in several - /// different ways and populate subtables with information that will be used further in the - /// compilation process. - pub fn process_ast(&mut self, ast: &ast::AST) -> Result<(), String> { - - self.populate_name_tables(ast)?; - self.resolve_symbol_ids(ast)?; - Ok(()) - } /// Walks the AST, matching the ID of an identifier used in some expression to /// the corresponding Symbol. @@ -249,6 +254,12 @@ impl SymbolTable { Ok(()) } + fn add_symbol(&mut self, fqsn: FQSN, symbol: Symbol) { + self.symbol_trie.insert(&fqsn); + self.fqsn_to_symbol.insert(fqsn, symbol); + + } + //TODO this should probably return a vector of duplicate name errors fn add_from_scope<'a>(&'a mut self, statements: &[Statement], scope_stack: &mut Vec) -> Result<(), DuplicateName> { for statement in statements { @@ -262,7 +273,7 @@ impl SymbolTable { self.fq_names.register(fq_function.clone(), NameSpec { location, kind: NameKind::Function })?; self.types.register(fq_function.clone(), NameSpec { location, kind: TypeKind } )?; - self.fqsn_to_symbol.insert(fq_function, Symbol { + self.add_symbol(fq_function, Symbol { local_name: signature.name.clone(), spec: SymbolSpec::Func(vec![]), //TODO does this inner vec need to exist at all? }); @@ -274,7 +285,7 @@ impl SymbolTable { self.fq_names.register(fq_function.clone(), NameSpec { location, kind: NameKind::Function })?; self.types.register(fq_function.clone(), NameSpec { location, kind: TypeKind } )?; - self.fqsn_to_symbol.insert(fq_function, Symbol { + self.add_symbol(fq_function, Symbol { local_name: signature.name.clone(), spec: SymbolSpec::Func(vec![]), //TODO does this inner vec need to exist at all? }); @@ -294,7 +305,7 @@ impl SymbolTable { StatementKind::Declaration(Declaration::Binding { name, .. }) => { let fq_binding = FQSN::from_scope_stack(scope_stack.as_ref(), name.as_str().to_owned()); self.fq_names.register(fq_binding.clone(), NameSpec { location, kind: NameKind::Binding })?; - self.fqsn_to_symbol.insert(fq_binding, Symbol { + self.add_symbol(fq_binding, Symbol { local_name: name.clone(), spec: SymbolSpec::Binding, }); @@ -328,7 +339,7 @@ impl SymbolTable { _ => panic!("This should never happen"), }; let symbol = Symbol { local_name, spec }; - self.fqsn_to_symbol.insert(fqsn, symbol); + self.add_symbol(fqsn, symbol); }; };