ripex 0.2.0

Multi-language structural parsing and fact extraction.
Documentation
use std::collections::HashMap;

use crate::span::Span;

use super::bindings::BindingKind;

#[derive(Debug, Clone)]
pub struct Symbol {
    pub name: String,
    pub kind: BindingKind,
    pub span: Span,
    pub scope_id: usize,
}

#[derive(Debug, Clone, Default)]
pub struct SymbolTable {
    symbols: HashMap<String, Vec<Symbol>>,
}

impl SymbolTable {
    pub fn new() -> Self {
        SymbolTable {
            symbols: HashMap::new(),
        }
    }

    pub fn insert(&mut self, name: String, kind: BindingKind, span: Span, scope_id: usize) {
        self.symbols.entry(name.clone()).or_default().push(Symbol {
            name,
            kind,
            span,
            scope_id,
        });
    }

    pub fn lookup(&self, name: &str) -> Option<&Symbol> {
        self.symbols.get(name).and_then(|s| s.last())
    }

    pub fn lookup_all(&self, name: &str) -> Vec<&Symbol> {
        self.symbols
            .get(name)
            .map(|v| v.iter().collect())
            .unwrap_or_default()
    }

    pub fn symbols(&self) -> impl Iterator<Item = &Symbol> {
        self.symbols.values().flat_map(|v| v.iter())
    }

    pub fn clear(&mut self) {
        self.symbols.clear();
    }

    pub fn contains(&self, name: &str) -> bool {
        self.symbols.contains_key(name)
    }
}