use super::{DomFacts, LiteralExpressions, vue::policy::NoReads};
use crate::decision::{DecisionBuildError, DecisionTables, NativeAnalysis, TargetPolicy, build};
use vize_l2::{
artifact::Artifact,
file::{FileArtifact, FileResolution, ScopeId},
};
pub struct DomFileExpression<'owner, 'arena> {
pub(in crate::decision::dom) resolution: FileResolution<'owner, 'arena>,
}
impl core::fmt::Debug for DomFileExpression<'_, '_> {
fn fmt(&self, formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
formatter
.debug_struct("DomFileExpression")
.field("node", &self.resolution.node())
.field("scope", &self.resolution.scope())
.finish_non_exhaustive()
}
}
impl<'owner, 'arena> DomFileExpression<'owner, 'arena> {
#[must_use]
pub const fn resolution(&self) -> FileResolution<'owner, 'arena> {
self.resolution
}
#[must_use]
pub fn scope(&self) -> Option<ScopeId> {
self.resolution.scope()
}
}
pub struct NativeFileAnalysis<'owner, 'arena> {
file: &'owner FileArtifact<'arena>,
analysis: NativeAnalysis<'owner, 'arena>,
}
impl<'owner, 'arena> NativeFileAnalysis<'owner, 'arena> {
#[must_use]
pub const fn file(&self) -> &'owner FileArtifact<'arena> {
self.file
}
#[must_use]
pub fn original_attributes(
&self,
) -> Option<&crate::decision::OriginalAttributeFacts<'owner, 'arena>> {
self.analysis.original_attributes()
}
#[must_use]
pub fn artifact(&self) -> &'owner Artifact<'arena> {
self.file.artifact()
}
#[must_use]
pub fn policy(&self) -> TargetPolicy {
self.analysis.policy()
}
#[must_use]
pub fn tables(&self) -> &DecisionTables {
self.analysis.tables()
}
#[must_use]
pub fn dom(&self) -> Option<&DomFacts<'owner, 'arena>> {
self.analysis.dom()
}
}
pub fn build_dom_file_decisions<'owner, 'arena>(
file: &'owner FileArtifact<'arena>,
) -> Result<NativeFileAnalysis<'owner, 'arena>, DecisionBuildError> {
if !file.is_complete() {
return Err(DecisionBuildError::IncompleteFile);
}
let analysis = build::build_with(
file.artifact(),
TargetPolicy::Dom,
&LiteralExpressions,
Some(file),
&NoReads,
)?;
Ok(NativeFileAnalysis { file, analysis })
}
#[must_use]
pub(super) fn matches_expression(
resolution: FileResolution<'_, '_>,
expression: &vize_l2::expr::JsExpr<'_>,
) -> bool {
resolution.table().is_some_and(|table| {
let retained = table.expression();
core::ptr::eq(retained.ast, expression.ast)
&& core::ptr::eq(retained.source, expression.source)
&& retained.span == expression.span
&& match (retained.coordinates, expression.coordinates) {
(None, None) => true,
(Some(left), Some(right)) => core::ptr::eq(left, right),
_ => false,
}
})
}
pub(in crate::decision) fn build_original_file_decisions<'owner, 'arena>(
file: &'owner FileArtifact<'arena>,
) -> Result<NativeFileAnalysis<'owner, 'arena>, DecisionBuildError> {
let analysis = crate::decision::build::build_with_original(
file,
TargetPolicy::Dom,
&crate::decision::dom::LiteralExpressions,
&crate::decision::dom::vue::policy::NoReads,
)?;
Ok(NativeFileAnalysis { file, analysis })
}