use std::collections::HashMap; use std::fmt; use crate::ast::ItemId; pub type LineNumber = usize; #[derive(Debug, Clone, Copy, PartialEq)] pub struct Location { pub line_num: LineNumber, pub char_num: usize, } impl fmt::Display for Location { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "{}:{}", self.line_num, self.char_num) } } pub struct SourceMap { map: HashMap } impl SourceMap { pub fn new() -> SourceMap { SourceMap { map: HashMap::new() } } pub fn add_location(&mut self, id: &ItemId, loc: Location) { self.map.insert(id.clone(), loc); } pub fn lookup(&self, id: &ItemId) -> Option { match self.map.get(id) { Some(loc) => Some(loc.clone()), None => None } } }