Fix last test
This commit is contained in:
parent
3060afd752
commit
d1d3a70339
@ -124,6 +124,9 @@ impl ScopeSegment {
|
||||
pub struct SymbolTable {
|
||||
decl_locations: DeclLocations, //TODO delete this
|
||||
symbol_path_to_symbol: HashMap<FullyQualifiedSymbolName, Symbol>,
|
||||
|
||||
|
||||
/// Used for import resolution.
|
||||
symbol_trie: SymbolTrie,
|
||||
|
||||
/// These tables are responsible for preventing duplicate names.
|
||||
@ -131,6 +134,7 @@ pub struct SymbolTable {
|
||||
types: NameTable<TypeKind>,
|
||||
|
||||
/// 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<ItemId, FQSN>,
|
||||
|
||||
/// 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<Scope>) -> 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);
|
||||
};
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user