mod decls;
mod exprs;
mod patches;
mod scope;
mod stmts;
pub use scope::{Def, DefKind, Symbols};
use crate::ast;
use scope::Scope;
use yog_analysis::Report;
#[derive(Clone, Copy, Default)]
struct Context {
loops: u32,
it: bool,
before: bool,
member: bool,
}
pub(crate) struct Resolver<'r, 's> {
report: &'r mut Report<'s>,
scopes: Vec<Scope>,
symbols: Symbols,
cx: Context,
}
pub(crate) fn resolve(file: &ast::File, report: &mut Report<'_>) -> Symbols {
let mut r = Resolver {
report,
scopes: vec![Scope::default()],
symbols: Symbols::default(),
cx: Context::default(),
};
r.decls(&file.decls);
r.symbols
}
impl Resolver<'_, '_> {
fn within<R>(&mut self, cx: Context, f: impl FnOnce(&mut Self) -> R) -> R {
let outer = std::mem::replace(&mut self.cx, cx);
let out = f(self);
self.cx = outer;
out
}
fn body_cx(&self) -> Context {
Context {
member: self.cx.member,
..Context::default()
}
}
}