oveo 0.4.0

Javascript optimizer
Documentation
use std::sync::Arc;

use oxc_ast::ast::Expression;
use oxc_semantic::SymbolId;
use rustc_hash::FxHashMap;

use crate::{
    context::TraverseCtx,
    externs::{ExternMap, ExternModule, ExternValue},
};

pub struct Externs<'ctx> {
    map: &'ctx ExternMap,
    symbols: FxHashMap<SymbolId, ExternValue>,
}

impl<'ctx> Externs<'ctx> {
    pub fn new(map: &'ctx ExternMap) -> Self {
        Self { map, symbols: FxHashMap::default() }
    }

    pub fn resolve<'a>(&self, node: &Expression<'a>, ctx: &TraverseCtx<'a>) -> Option<ExternValue> {
        match node {
            Expression::Identifier(id) => {
                if let Some(symbold_id) = ctx.scoping().get_reference(id.reference_id()).symbol_id()
                {
                    return self.symbols.get(&symbold_id).cloned();
                }
            }
            Expression::StaticMemberExpression(expr) => {
                if let Some(ExternValue::Namespace(m)) = self.resolve(&expr.object, ctx) {
                    return m.exports.get(expr.property.name.as_str()).cloned();
                }
            }
            _ => {}
        }
        None
    }

    pub fn insert(&mut self, symbol_id: SymbolId, value: ExternValue) {
        self.symbols.insert(symbol_id, value);
    }

    pub fn modules(&self) -> &FxHashMap<String, Arc<ExternModule>> {
        &self.map.modules
    }
}