use crate::diagnostic::Diagnostic; use crate::source_range::SourceRange; use crate::symbol::ParameterSymbol; use crate::symbol_table::{SymbolInsertError, SymbolTable}; use crate::type_info::TypeInfo; use std::cell::RefCell; use std::rc::Rc; pub struct Parameter { declared_name: String, declared_name_source_range: SourceRange, } impl Parameter { pub fn new(declared_name: &str, declared_name_source_range: SourceRange) -> Self { Self { declared_name: declared_name.into(), declared_name_source_range, } } pub fn gather_declared_names( &mut self, symbol_table: &mut SymbolTable, ) -> Result>, Vec> { let insert_result = symbol_table.insert_parameter_symbol(ParameterSymbol::new( &self.declared_name, TypeInfo::Any, // todo )); match insert_result { Ok(parameter_symbol) => Ok(parameter_symbol), Err(symbol_insert_error) => match symbol_insert_error { SymbolInsertError::AlreadyDeclared(already_declared) => Err(vec![Diagnostic::new( &format!("Parameter {} already declared.", already_declared.name()), self.declared_name_source_range.start(), self.declared_name_source_range.end(), )]), }, } } }