deimos-lang/dmc-lib/src/ast/parameter.rs
2026-03-02 19:45:46 -06:00

42 lines
1.4 KiB
Rust

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<Rc<RefCell<ParameterSymbol>>, Vec<Diagnostic>> {
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(),
)]),
},
}
}
}