pr 04.d
This commit is contained in:
parent
783a675abc
commit
5fff614708
@ -1,5 +1,6 @@
|
|||||||
use crate::common::diagnostics::{Diagnostic, DiagnosticLevel};
|
use crate::common::diagnostics::{Diagnostic, DiagnosticLevel};
|
||||||
use crate::common::spans::Span;
|
use crate::common::spans::Span;
|
||||||
|
use crate::frontends::pbs::ast::{AstArena, NodeId};
|
||||||
use prometeu_analysis::NameId;
|
use prometeu_analysis::NameId;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
@ -52,11 +53,16 @@ pub struct DefIndex {
|
|||||||
symbols: HashMap<DefKey, SymbolId>,
|
symbols: HashMap<DefKey, SymbolId>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Default, Clone)]
|
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
|
||||||
pub struct RefIndex {
|
pub struct RefIndex {
|
||||||
refs: Vec<Vec<Span>>,
|
refs: Vec<Vec<Span>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
|
||||||
|
pub struct NodeToSymbol {
|
||||||
|
map: Vec<Option<SymbolId>>,
|
||||||
|
}
|
||||||
|
|
||||||
impl SymbolArena {
|
impl SymbolArena {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
Self { symbols: Vec::new() }
|
Self { symbols: Vec::new() }
|
||||||
@ -125,6 +131,32 @@ impl RefIndex {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl NodeToSymbol {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
Self { map: Vec::new() }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn bind_node(&mut self, node_id: NodeId, symbol_id: SymbolId) {
|
||||||
|
self.ensure(node_id);
|
||||||
|
self.map[node_id.0 as usize] = Some(symbol_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get(&self, node_id: NodeId) -> Option<SymbolId> {
|
||||||
|
self.map.get(node_id.0 as usize).and_then(|opt| *opt)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn ensure(&mut self, node_id: NodeId) {
|
||||||
|
let index = node_id.0 as usize;
|
||||||
|
if index >= self.map.len() {
|
||||||
|
self.map.resize(index + 1, None);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn resize_to_fit(&mut self, arena: &AstArena) {
|
||||||
|
self.map.resize(arena.nodes.len(), None);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
@ -212,4 +244,26 @@ mod tests {
|
|||||||
assert_eq!(index.refs_of(SymbolId(5)), &[span_b1]);
|
assert_eq!(index.refs_of(SymbolId(5)), &[span_b1]);
|
||||||
assert!(index.refs_of(SymbolId(9)).is_empty());
|
assert!(index.refs_of(SymbolId(9)).is_empty());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn node_to_symbol_bind_and_get() {
|
||||||
|
let mut map = NodeToSymbol::new();
|
||||||
|
let nid = NodeId(10);
|
||||||
|
let sid = SymbolId(5);
|
||||||
|
|
||||||
|
map.bind_node(nid, sid);
|
||||||
|
assert_eq!(map.get(nid), Some(sid));
|
||||||
|
assert_eq!(map.get(NodeId(0)), None);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn node_to_symbol_expands_automatically() {
|
||||||
|
let mut map = NodeToSymbol::new();
|
||||||
|
let nid_high = NodeId(100);
|
||||||
|
let sid = SymbolId(1);
|
||||||
|
|
||||||
|
map.bind_node(nid_high, sid);
|
||||||
|
assert_eq!(map.get(nid_high), Some(sid));
|
||||||
|
assert!(map.map.len() > 100);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user