use crate::compiling::CompileVisitor;
use crate::parsing::{Resolve, ResolveError};
use crate::query::Query;
use crate::shared::Consts;
use crate::{Diagnostics, Options, Storage, UnitBuilder};
use runestick::{Context, Location, Source, Span};
use std::rc::Rc;
use std::sync::Arc;
pub(crate) mod assemble;
pub(crate) mod branches;
pub(crate) mod scope;
pub(crate) use self::assemble::{Assemble, AssembleFn};
pub(crate) use self::branches::Branches;
#[allow(unused)]
pub(crate) struct Compiler<'a> {
pub(crate) program: &'a mut rune_ssa::Program,
pub(crate) location: Location,
pub(crate) source: &'a Arc<Source>,
pub(crate) scope: scope::Stack,
pub(crate) storage: &'a Storage,
pub(crate) context: &'a Context,
pub(crate) consts: &'a Consts,
pub(crate) query: &'a Query,
pub(crate) unit: UnitBuilder,
pub(crate) contexts: Vec<Span>,
pub(crate) options: &'a Options,
pub(crate) diagnostics: &'a mut Diagnostics,
pub(crate) visitor: Rc<dyn CompileVisitor>,
}
impl<'a> Compiler<'a> {
pub(crate) fn resolve<T>(&self, value: &T) -> Result<T::Output, ResolveError>
where
T: Resolve<'a>,
{
value.resolve(&*self.storage, self.source)
}
}