31 lines
972 B
Rust
31 lines
972 B
Rust
use crate::diagnostic::Diagnostic;
|
|
use crate::diagnostic_factories::symbol_already_declared;
|
|
use crate::diagnostics_result;
|
|
use crate::symbol::Symbol;
|
|
use crate::symbol_table::SymbolTable;
|
|
|
|
pub fn try_insert_symbol_into(
|
|
symbol: Symbol,
|
|
symbol_table: &mut SymbolTable,
|
|
) -> Result<(), Diagnostic> {
|
|
let maybe_already_inserted = symbol_table.get_symbol(symbol.scope_id(), symbol.declared_name());
|
|
if let Some(already_inserted) = maybe_already_inserted {
|
|
Err(symbol_already_declared(&already_inserted, &symbol))
|
|
} else {
|
|
symbol_table.insert_symbol(symbol);
|
|
Ok(())
|
|
}
|
|
}
|
|
|
|
pub fn try_insert_symbols_into(
|
|
symbols: Vec<Symbol>,
|
|
symbol_table: &mut SymbolTable,
|
|
) -> Result<(), Vec<Diagnostic>> {
|
|
let diagnostics: Vec<Diagnostic> = symbols
|
|
.into_iter()
|
|
.map(|symbol| try_insert_symbol_into(symbol, symbol_table))
|
|
.filter_map(Result::err)
|
|
.collect();
|
|
diagnostics_result!(diagnostics)
|
|
}
|