use vize_l0::id::NodeId;
use vize_l2::{
expr::ExprRef,
op::{OnOp, OriginalForOp},
};
use vize_l3::decision::NativeAnalysis;
use super::{DomError, DomErrorKind};
use crate::expr::{AccessProvider, ResolvedExpressions};
use crate::write::{LinkSink, Writer};
pub(super) trait ExpressionWriter {
fn write_for_collection<L: LinkSink>(
&self,
_: &mut Writer<L>,
node: NodeId,
original: &OriginalForOp<'_>,
) -> Result<(), DomError> {
Err(DomError {
node: Some(node),
span: original.span,
kind: DomErrorKind::RuntimeAccessUnavailable,
})
}
fn write_handler<L: LinkSink>(
&self,
_: &mut Writer<L>,
node: NodeId,
on: &OnOp<'_>,
) -> Result<(), DomError> {
Err(DomError {
node: Some(node),
span: on.span,
kind: DomErrorKind::RuntimeAccessUnavailable,
})
}
fn write<L: LinkSink>(
&self,
writer: &mut Writer<L>,
node: NodeId,
expression: ExprRef<'_>,
) -> Result<(), DomError>;
}
pub(super) struct BareExpressions<'s, 'owner, 'arena, A: AccessProvider> {
pub analysis: &'s NativeAnalysis<'owner, 'arena>,
pub expressions: ResolvedExpressions<'s, 'arena>,
pub access: &'s A,
}
impl<A: AccessProvider> ExpressionWriter for BareExpressions<'_, '_, '_, A> {
fn write<L: LinkSink>(
&self,
writer: &mut Writer<L>,
node: NodeId,
expression: ExprRef<'_>,
) -> Result<(), DomError> {
let ExprRef::Js(retained) = expression else {
return Err(DomError {
node: Some(node),
span: expression.span(),
kind: DomErrorKind::UnsupportedExpression,
});
};
self.expressions
.write_retained(
writer,
self.analysis.artifact().source(),
retained,
self.access,
)
.map_err(|error| DomError {
node: Some(node),
span: error.span,
kind: DomErrorKind::Expression(error),
})
}
}