use alloc::vec::Vec;
use vize_l0::Span;
use crate::expr::JsExpr;
mod for_head;
pub(crate) use for_head::resolve_for_facts;
mod handler;
pub(crate) use handler::resolve_handler_facts;
pub(crate) mod sink;
mod syntax;
pub use syntax::{SyntaxEdge, SyntaxKind};
pub(crate) mod source;
mod walk;
pub use for_head::{
ForAlias, ForAliasDeclaration, ForAliasId, ForAliasRole, ForResolution, ForResolutionError,
ForResolutionErrorKind, ForResolvedBinding, RejectedForResolution, resolve_for_head,
};
pub use handler::{
HandlerBinding, HandlerBindingRef, HandlerDeclaration, HandlerDeclarationKind, HandlerLocalId,
HandlerReference, HandlerResolution, HandlerScope, HandlerScopeId, HandlerSyntax,
RejectedHandlerResolution, resolve_handler,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct BindingId(u32);
impl BindingId {
#[must_use]
pub const fn new(index: u32) -> Self {
Self(index)
}
#[must_use]
pub const fn index(self) -> u32 {
self.0
}
}
pub trait BindingLookup {
fn lookup(&self, name: &str) -> Option<BindingId>;
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Usage {
Read,
Write,
ReadWrite,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Occurrence<'a> {
pub span: Span,
pub name: &'a str,
pub binding: BindingId,
pub usage: Usage,
pub shorthand: bool,
pub constructor: bool,
}
#[derive(Debug)]
pub struct ResolutionTable<'a> {
expression: JsExpr<'a>,
occurrences: Vec<Occurrence<'a>>,
}
impl<'a> ResolutionTable<'a> {
#[must_use]
pub fn expression(&self) -> &JsExpr<'a> {
&self.expression
}
#[must_use]
pub fn occurrences(&self) -> &[Occurrence<'a>] {
&self.occurrences
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ResolutionError {
pub span: Span,
pub kind: ResolutionErrorKind,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ResolutionErrorKind {
MissingBinding,
InvalidSpan,
UnsupportedSyntax,
TraversalLimit,
}
pub fn resolve_expression<'a>(
expression: &JsExpr<'a>,
bindings: &impl BindingLookup,
) -> Result<ResolutionTable<'a>, ResolutionError> {
let occurrences = sink::resolve(expression, bindings)?;
Ok(ResolutionTable {
expression: *expression,
occurrences,
})
}