use crate::name_analysis::symbol::source_definition::SourceDefinition; use crate::name_analysis::symbol::Symbol; use std::fmt::{Debug, Formatter}; use std::rc::Rc; #[derive(Clone)] pub struct VariableSymbol { declared_name: Rc, is_mutable: bool, source_definition: Option, } impl VariableSymbol { pub fn new( declared_name: &str, is_mutable: bool, source_definition: Option, ) -> Self { VariableSymbol { declared_name: Rc::from(declared_name), is_mutable, source_definition, } } pub fn declared_name(&self) -> &str { &self.declared_name } pub fn declared_name_owned(&self) -> Rc { self.declared_name.clone() } pub fn is_mutable(&self) -> bool { self.is_mutable } } impl Symbol for VariableSymbol { fn source_definition(&self) -> Option<&SourceDefinition> { self.source_definition.as_ref() } } impl Debug for VariableSymbol { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { f.debug_struct("VariableSymbol") .field("declared_name", &self.declared_name) .field("is_mutable", &self.is_mutable) .field("source_definition", &self.source_definition) .finish() } }