Clean up some symbol table code
This commit is contained in:
parent
acc99fa0ef
commit
0bf0b3e2e8
@ -337,7 +337,7 @@ impl<'a> SymbolTableRunner<'a> {
|
|||||||
let mut errors = vec![];
|
let mut errors = vec![];
|
||||||
|
|
||||||
for statement in statements {
|
for statement in statements {
|
||||||
let Statement { id, kind, location } = statement; //TODO I'm not sure if I need to do anything with this ID
|
let Statement { id, kind, location } = statement;
|
||||||
let location = *location;
|
let location = *location;
|
||||||
if let Err(err) = self.add_single_statement(id, kind, location, scope_stack, function_scope) {
|
if let Err(err) = self.add_single_statement(id, kind, location, scope_stack, function_scope) {
|
||||||
errors.push(err);
|
errors.push(err);
|
||||||
|
@ -43,13 +43,18 @@ impl<'a> ScopeResolver<'a> {
|
|||||||
/// mappings.
|
/// mappings.
|
||||||
fn lookup_name_in_scope(&mut self, name: &QualifiedName) {
|
fn lookup_name_in_scope(&mut self, name: &QualifiedName) {
|
||||||
let QualifiedName { id, components } = name;
|
let QualifiedName { id, components } = name;
|
||||||
|
|
||||||
|
let local_name = components.first().unwrap().clone();
|
||||||
|
let name_type = self.lexical_scopes.lookup(&local_name);
|
||||||
|
let fqsn = Fqsn { scopes: components.iter().map(|name| Scope::Name(name.clone())).collect() };
|
||||||
|
let symbol = self.symbol_table.fqsn_to_symbol.get(&fqsn);
|
||||||
|
//println!("\tFound lexical_scope entry: {:?} and {} symbol: {:?}", name_type, fqsn, symbol);
|
||||||
|
|
||||||
//TODO handle a "partial" qualified name, and also handle it down in the pattern-matching
|
//TODO handle a "partial" qualified name, and also handle it down in the pattern-matching
|
||||||
//section
|
//section
|
||||||
//TODO some of these if lets that look into the fqsn_to_symbol table should probaby fail
|
//TODO some of these if lets that look into the fqsn_to_symbol table should probaby fail
|
||||||
//with an error
|
//with an error
|
||||||
if components.len() == 1 {
|
if components.len() == 1 {
|
||||||
let local_name: Rc<String> = components[0].clone();
|
|
||||||
let name_type = self.lexical_scopes.lookup(&local_name);
|
|
||||||
match name_type {
|
match name_type {
|
||||||
Some(NameType::Import(fqsn)) => {
|
Some(NameType::Import(fqsn)) => {
|
||||||
let symbol = self.symbol_table.fqsn_to_symbol.get(fqsn);
|
let symbol = self.symbol_table.fqsn_to_symbol.get(fqsn);
|
||||||
@ -70,18 +75,12 @@ impl<'a> ScopeResolver<'a> {
|
|||||||
self.symbol_table.id_to_symbol.insert(*id, symbol);
|
self.symbol_table.id_to_symbol.insert(*id, symbol);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
None => {
|
None =>
|
||||||
//TODO see if I can reduce this duplicate code
|
|
||||||
let fqsn = Fqsn { scopes: vec![Scope::Name(local_name.clone())] };
|
|
||||||
let symbol = self.symbol_table.fqsn_to_symbol.get(&fqsn);
|
|
||||||
if let Some(symbol) = symbol {
|
if let Some(symbol) = symbol {
|
||||||
self.symbol_table.id_to_symbol.insert(*id, symbol.clone());
|
self.symbol_table.id_to_symbol.insert(*id, symbol.clone());
|
||||||
}
|
},
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
let fqsn = Fqsn { scopes: components.iter().map(|name| Scope::Name(name.clone())).collect() };
|
|
||||||
let symbol = self.symbol_table.fqsn_to_symbol.get(&fqsn);
|
|
||||||
if let Some(symbol) = symbol {
|
if let Some(symbol) = symbol {
|
||||||
self.symbol_table.id_to_symbol.insert(*id, symbol.clone());
|
self.symbol_table.id_to_symbol.insert(*id, symbol.clone());
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user