Resolver - Refactored declare()

This commit is contained in:
Emmanuel BENOîT 2023-01-07 10:53:05 +01:00
parent 8d65c288a3
commit c971df6f60

View file

@ -70,15 +70,17 @@ impl ResolverState {
/// Try to declare a symbol. If the scope already contains a declaration /// Try to declare a symbol. If the scope already contains a declaration
/// for the same name, return an error. /// for the same name, return an error.
fn declare(&mut self, name: &Token, kind: SymKind) -> ResolverResult { fn declare(&mut self, name: &Token, kind: SymKind) -> ResolverResult {
if !self.scopes.is_empty() { if self.scopes.is_empty() {
return Ok(());
}
let idx = self.scopes.len() - 1; let idx = self.scopes.len() - 1;
let scope = &mut self.scopes[idx]; let scope = &mut self.scopes[idx];
if scope.contains_key(&name.lexeme as &str) { if scope.contains_key(&name.lexeme as &str) {
return Err(SloxError::with_token( Err(SloxError::with_token(
ErrorKind::Parse, ErrorKind::Parse,
name, name,
"already a symbol with this name in this scope".to_owned(), "already a symbol with this name in this scope".to_owned(),
)); ))
} else { } else {
scope.insert( scope.insert(
name.lexeme.clone(), name.lexeme.clone(),
@ -87,10 +89,9 @@ impl ResolverState {
state: SymState::Declared, state: SymState::Declared,
}, },
); );
}
}
Ok(()) Ok(())
} }
}
/// Mark a symbol as defined. If the symbol has already been defined or /// Mark a symbol as defined. If the symbol has already been defined or
/// used, its state isn't affected. /// used, its state isn't affected.