omena-scss-eval 0.3.0

Oracle-first SCSS and Less value evaluator rail for Omena CSS
Documentation
use omena_parser::StyleDialect;

mod analysis_model;
mod arguments;
mod blocks;
#[cfg(feature = "scanner-oracle")]
mod blocks_scanner;
mod call_resolution;
mod call_return_nodes;
#[cfg(feature = "scanner-oracle")]
mod call_return_nodes_scanner;
mod call_return_resolution;
mod cst_tokens;
mod edge_ir;
mod header_values;
mod lexical;
mod loop_values;
mod model;
mod oracle_corpus;
mod prune_reachability;
mod return_candidates;
#[cfg(feature = "scanner-oracle")]
mod return_candidates_scanner;
#[cfg(feature = "scanner-oracle")]
mod scanner_tokens;
mod summaries;
mod symbol_candidates;
#[cfg(feature = "scanner-oracle")]
mod symbol_candidates_scanner;
mod transfer;
mod typed_truthiness;
mod value_analysis;
mod variables;

use transfer::ScssControlFlowTransfer;
pub(crate) use value_analysis::analyze_scss_control_flow_values_with_initial_bindings;
pub(super) use value_analysis::summarize_scss_control_flow_widening_witness;
pub use value_analysis::{analyze_scss_control_flow_values, summarize_typed_value_lattice_witness};

pub use edge_ir::build_scss_control_flow_graph;
pub use model::{
    OmenaScssEvalCallArgumentValueV0, OmenaScssEvalCallLocalBindingV0,
    OmenaScssEvalCallParameterValueV0, OmenaScssEvalCallReturnEdgeV0,
    OmenaScssEvalCallReturnIrSummaryV0, OmenaScssEvalCallReturnNodeV0,
    OmenaScssEvalControlFlowBindingValueV0, OmenaScssEvalControlFlowBlockIdV0,
    OmenaScssEvalControlFlowBlockV0, OmenaScssEvalControlFlowEdgeV0,
    OmenaScssEvalControlFlowGraphBlockV0, OmenaScssEvalControlFlowGraphV0,
    OmenaScssEvalControlFlowIrSummaryV0, OmenaScssEvalControlFlowPruneReachabilityV0,
    OmenaScssEvalControlFlowValueAnalysisV0, OmenaScssEvalControlFlowValueBlockV0,
    OmenaScssEvalControlFlowWideningWitnessV0, OmenaScssEvalTypedValueKindCountV0,
    OmenaScssEvalTypedValueLatticeWitnessV0,
};
pub use oracle_corpus::{
    OmenaScssEvalControlFlowOracleCorpusFixtureReportV0,
    OmenaScssEvalControlFlowOracleCorpusReportV0, summarize_scss_control_flow_oracle_corpus,
};
pub use prune_reachability::summarize_scss_control_flow_prune_reachability;
pub(crate) use prune_reachability::summarize_scss_control_flow_prune_reachability_with_initial_bindings;
pub use summaries::{summarize_scss_call_return_ir, summarize_scss_control_flow_ir};
#[cfg(feature = "scanner-oracle")]
pub use summaries::{
    summarize_scss_call_return_ir_scanner_oracle, summarize_scss_control_flow_ir_scanner_oracle,
};

const SCSS_CALL_RETURN_RECURSION_LIMIT: usize = 32;

const fn dialect_label(dialect: StyleDialect) -> &'static str {
    match dialect {
        StyleDialect::Css => "css",
        StyleDialect::Scss => "scss",
        StyleDialect::Sass => "sass",
        StyleDialect::Less => "less",
    }
}

#[derive(Debug, Clone, PartialEq, Eq)]
struct ScssControlFlowAnalysisNode {
    block: OmenaScssEvalControlFlowBlockV0,
    predecessor_indices: Vec<usize>,
    transfer: ScssControlFlowTransfer,
}

#[cfg(test)]
mod tests;