vize_l4 0.474.0

L4 - the Davinci emission level (codename Stesura): writer, expression rewriting, module assembly and targets
Documentation
//! Statically selected expression writers; the caller cannot supply a file policy.

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>;
}

// The previous bare-artifact contract remains distinct from the genuine file
// entry. It never supplies runtime access to a file-owned analysis.
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),
            })
    }
}