Skip to main content

omena_query/boundary/
evaluator.rs

1use omena_query_transform_runner::{
2    NATIVE_CSS_STATIC_EVAL_DIALECT_RESTRICTION_V0, NATIVE_CSS_STATIC_EVAL_OPT_IN_POLICY_V0,
3    NATIVE_CSS_STATIC_EVAL_SPEC_SNAPSHOT_V0,
4};
5#[allow(deprecated)]
6use omena_scss_eval::OmenaScssEvalControlFlowWideningWitnessV0;
7use omena_scss_eval::{
8    OmenaScssEvalControlFlowAscendingChainWitnessV0, OmenaScssEvalControlFlowOracleCorpusReportV0,
9    OmenaScssEvalControlFlowPropagationDepthWitnessV0, OmenaScssEvalStaticStylesheetEvaluationV0,
10    OmenaScssEvalStaticStylesheetOracleCorpusReportV0, OmenaScssEvalStaticValueResolutionReportV0,
11    analyze_scss_control_flow_values, derive_static_stylesheet_module_evaluation,
12    summarize_native_css_function_call_evaluations, summarize_native_css_function_surface,
13    summarize_native_css_if_function_decisions, summarize_native_css_static_edit_plan,
14    summarize_scss_call_return_ir, summarize_scss_control_flow_ir,
15    summarize_scss_control_flow_oracle_corpus, summarize_scss_control_flow_prune_reachability,
16    summarize_static_stylesheet_oracle_corpus, summarize_static_stylesheet_value_resolution,
17};
18use serde::Serialize;
19
20use crate::{
21    EngineInputV2, OMENA_QUERY_CURRENT_SCHEMA_VERSION, OmenaParserStyleDialect,
22    OmenaQueryScssEvalCallReturnIrSummaryV0, OmenaQueryScssEvalControlFlowIrSummaryV0,
23    OmenaQueryScssEvalControlFlowPruneReachabilityV0, OmenaQueryScssEvalControlFlowValueAnalysisV0,
24    OmenaQueryScssEvalNativeCssFunctionCallEvaluationSurfaceV0,
25    OmenaQueryScssEvalNativeCssFunctionSurfaceV0,
26    OmenaQueryScssEvalNativeCssIfFunctionDecisionSurfaceV0,
27    OmenaQueryScssEvalNativeCssStaticEditPlanV0,
28};
29
30#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
31#[serde(rename_all = "camelCase")]
32pub struct OmenaQueryScssEvaluatorControlFlowSummaryV0 {
33    pub schema_version: &'static str,
34    pub product: &'static str,
35    pub mode: &'static str,
36    pub dialect: &'static str,
37    pub value_type: &'static str,
38    pub supported_dialect: bool,
39    pub flat_css_cfg_built: bool,
40    pub merged_cross_file_graph: bool,
41    pub control_flow_block_count: usize,
42    pub control_flow_branch_block_count: usize,
43    pub control_flow_loop_block_count: usize,
44    pub control_flow_back_edge_count: usize,
45    pub call_return_node_count: usize,
46    pub call_return_edge_count: usize,
47    pub call_resolved_return_value_count: usize,
48    pub exact_call_resolved_return_value_count: usize,
49    pub value_analysis_converged: bool,
50    pub value_analysis_iteration_count: usize,
51    pub value_analysis_widened_to_top_count: usize,
52    pub prune_reachability_available: bool,
53    pub prune_reachability_converged: bool,
54    pub prune_reachability_flat_css_cfg_built: bool,
55    pub prune_reachability_have_terminals_changed: bool,
56    pub prune_reachability_reachable_block_count: usize,
57    pub prune_reachability_unreachable_block_count: usize,
58    pub ready_surfaces: Vec<&'static str>,
59    pub control_flow_ir: Option<OmenaQueryScssEvalControlFlowIrSummaryV0>,
60    pub value_analysis: Option<OmenaQueryScssEvalControlFlowValueAnalysisV0>,
61    pub prune_reachability: Option<OmenaQueryScssEvalControlFlowPruneReachabilityV0>,
62    pub call_return_ir: Option<OmenaQueryScssEvalCallReturnIrSummaryV0>,
63}
64
65#[allow(deprecated)]
66#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
67#[serde(rename_all = "camelCase")]
68pub struct OmenaQueryScssEvaluatorControlFlowOracleCorpusSummaryV0 {
69    pub schema_version: &'static str,
70    pub product: &'static str,
71    pub mode: &'static str,
72    pub value_type: &'static str,
73    pub node_key_type: &'static str,
74    pub recursion_cap: usize,
75    pub fixture_count: usize,
76    pub scss_fixture_count: usize,
77    pub sass_fixture_count: usize,
78    pub supported_fixture_count: usize,
79    pub rejected_flat_css_fixture_count: usize,
80    pub control_flow_fixture_count: usize,
81    pub branch_fixture_count: usize,
82    pub loop_fixture_count: usize,
83    pub back_edge_fixture_count: usize,
84    pub call_return_fixture_count: usize,
85    pub resolved_call_return_fixture_count: usize,
86    pub top_call_return_fixture_count: usize,
87    pub recursive_call_fixture_count: usize,
88    pub converged_value_analysis_fixture_count: usize,
89    pub widened_to_top_fixture_count: usize,
90    pub propagation_depth_witness_widened_to_top_count: usize,
91    pub propagation_depth_witness_converged: bool,
92    pub ascending_chain_witness_converged: bool,
93    pub ascending_chain_witness_result_kind: &'static str,
94    #[deprecated(
95        since = "0.4.0",
96        note = "use propagation_depth_witness_widened_to_top_count"
97    )]
98    pub widening_witness_widened_to_top_count: usize,
99    #[deprecated(since = "0.4.0", note = "use propagation_depth_witness_converged")]
100    pub widening_witness_converged: bool,
101    pub prune_reachability_fixture_count: usize,
102    pub prune_reachability_changed_fixture_count: usize,
103    pub prune_reachability_flat_css_cfg_built_count: usize,
104    pub flat_css_cfg_built_count: usize,
105    pub merged_cross_file_graph_count: usize,
106    pub all_supported_fixtures_converged: bool,
107    pub no_flat_css_cfg_built: bool,
108    pub no_merged_cross_file_graph: bool,
109    pub propagation_depth_witness: OmenaScssEvalControlFlowPropagationDepthWitnessV0,
110    pub ascending_chain_witness: OmenaScssEvalControlFlowAscendingChainWitnessV0,
111    #[allow(deprecated)]
112    #[deprecated(since = "0.4.0", note = "use propagation_depth_witness")]
113    pub widening_witness: OmenaScssEvalControlFlowWideningWitnessV0,
114    pub corpus: OmenaScssEvalControlFlowOracleCorpusReportV0,
115}
116
117#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
118#[serde(rename_all = "camelCase")]
119pub struct OmenaQueryNativeCssEvaluatorSummaryV0 {
120    pub schema_version: &'static str,
121    pub product: &'static str,
122    pub mode: &'static str,
123    pub dialect: &'static str,
124    pub supported_dialect: bool,
125    pub native_static_eval_spec_snapshot: &'static str,
126    pub native_static_eval_opt_in_policy: &'static str,
127    pub native_static_eval_dialect_restriction: &'static str,
128    pub native_static_eval_explicit_opt_in_required: bool,
129    pub native_function_surface_available: bool,
130    pub native_function_call_evaluation_available: bool,
131    pub native_static_edit_plan_available: bool,
132    pub if_function_decision_available: bool,
133    pub native_function_count: usize,
134    pub native_function_parameter_count: usize,
135    pub native_function_typed_parameter_count: usize,
136    pub native_function_result_count: usize,
137    pub native_function_call_count: usize,
138    pub native_function_call_foldable_count: usize,
139    pub native_function_call_preserved_count: usize,
140    pub native_function_call_structural_error_count: usize,
141    pub native_function_call_runtime_dependent_count: usize,
142    pub native_function_call_missing_result_count: usize,
143    pub native_static_edit_count: usize,
144    pub native_static_edit_output_changed: bool,
145    pub if_function_count: usize,
146    pub if_function_foldable_count: usize,
147    pub if_function_preserved_count: usize,
148    pub if_function_static_supports_branch_count: usize,
149    pub if_function_runtime_branch_count: usize,
150    pub ready_surfaces: Vec<&'static str>,
151    pub native_function_surface: Option<OmenaQueryScssEvalNativeCssFunctionSurfaceV0>,
152    pub native_function_call_evaluations:
153        Option<OmenaQueryScssEvalNativeCssFunctionCallEvaluationSurfaceV0>,
154    pub native_static_edit_plan: Option<OmenaQueryScssEvalNativeCssStaticEditPlanV0>,
155    pub if_function_decisions: Option<OmenaQueryScssEvalNativeCssIfFunctionDecisionSurfaceV0>,
156}
157
158#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
159#[serde(rename_all = "camelCase")]
160pub struct OmenaQueryStaticStylesheetEvaluatorSummaryV0 {
161    pub schema_version: &'static str,
162    pub product: &'static str,
163    pub mode: &'static str,
164    pub dialect: &'static str,
165    pub value_type: &'static str,
166    pub supported_dialect: bool,
167    pub product_output_source: &'static str,
168    pub legacy_output_retained_as_oracle: bool,
169    pub legacy_output_consumed_until_cutover: bool,
170    pub evaluation_available: bool,
171    pub value_resolution_available: bool,
172    pub native_edit_output: Option<String>,
173    pub divergence_count: usize,
174    pub all_legacy_declaration_values_preserved: bool,
175    pub native_replacement_count: usize,
176    pub native_replacement_legacy_reflection_count: usize,
177    pub native_replacement_legacy_unreflected_count: usize,
178    pub native_edit_count: usize,
179    pub native_value_edit_count: usize,
180    pub native_structural_edit_count: usize,
181    pub native_edit_output_matches_evaluated_css: bool,
182    pub native_value_reference_count: usize,
183    pub native_resolved_value_count: usize,
184    pub native_raw_value_count: usize,
185    pub native_top_value_count: usize,
186    pub native_cycle_value_count: usize,
187    pub native_fuel_exhausted_value_count: usize,
188    pub native_unresolved_reference_value_count: usize,
189    pub native_unsupported_dynamic_value_count: usize,
190    pub evaluation: Option<OmenaScssEvalStaticStylesheetEvaluationV0>,
191    pub value_resolution: Option<OmenaScssEvalStaticValueResolutionReportV0>,
192}
193
194#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
195#[serde(rename_all = "camelCase")]
196pub struct OmenaQueryStaticStylesheetEvaluatorOracleCorpusSummaryV0 {
197    pub schema_version: &'static str,
198    pub product: &'static str,
199    pub mode: &'static str,
200    pub value_type: &'static str,
201    pub product_output_source: &'static str,
202    pub legacy_output_retained_as_oracle_count: usize,
203    pub legacy_output_consumed_until_cutover_count: usize,
204    pub all_legacy_outputs_retained_as_oracle: bool,
205    pub fixture_count: usize,
206    pub scss_fixture_count: usize,
207    pub sass_fixture_count: usize,
208    pub less_fixture_count: usize,
209    pub evaluated_fixture_count: usize,
210    pub missing_evaluation_count: usize,
211    pub divergence_count: usize,
212    pub native_replacement_count: usize,
213    pub native_replacement_legacy_reflection_count: usize,
214    pub native_replacement_legacy_unreflected_count: usize,
215    pub native_edit_count: usize,
216    pub native_value_edit_count: usize,
217    pub native_structural_edit_count: usize,
218    pub scss_control_flow_value_truthiness_count: usize,
219    pub scss_control_flow_contextual_truthiness_fallback_count: usize,
220    pub scss_control_flow_contextual_truthiness_conflict_count: usize,
221    pub scss_control_flow_prune_reachability_fixture_count: usize,
222    pub scss_control_flow_prune_reachability_changed_fixture_count: usize,
223    pub scss_control_flow_prune_reachability_flat_css_cfg_built_count: usize,
224    pub native_edit_output_match_count: usize,
225    pub native_value_reference_count: usize,
226    pub native_resolved_value_count: usize,
227    pub native_raw_value_count: usize,
228    pub native_top_value_count: usize,
229    pub native_cycle_value_count: usize,
230    pub native_fuel_exhausted_value_count: usize,
231    pub native_unresolved_reference_value_count: usize,
232    pub native_unsupported_dynamic_value_count: usize,
233    pub all_legacy_declaration_values_preserved: bool,
234    pub all_native_edit_outputs_match_evaluated_css: bool,
235    pub native_product_output_corpus_ready: bool,
236    pub corpus: OmenaScssEvalStaticStylesheetOracleCorpusReportV0,
237}
238
239#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
240#[serde(rename_all = "camelCase")]
241pub struct OmenaQueryStaticLifExportsSummaryV0 {
242    pub schema_version: &'static str,
243    pub product: &'static str,
244    pub mode: &'static str,
245    pub dialect: &'static str,
246    pub source_syntax: &'static str,
247    pub sif_superset: bool,
248    pub less_specific_export_count: usize,
249    pub less_variable_count: usize,
250    pub less_mixin_count: usize,
251    pub less_detached_ruleset_count: usize,
252    pub less_variable_names: Vec<String>,
253    pub less_mixin_names: Vec<String>,
254    pub less_detached_ruleset_names: Vec<String>,
255    pub sif_variable_count: usize,
256    pub sif_mixin_count: usize,
257    pub sif_function_count: usize,
258    pub sif_placeholder_count: usize,
259    pub sif_forward_count: usize,
260    pub exports: omena_sif::OmenaLifExportsV1,
261}
262
263pub fn summarize_omena_query_static_stylesheet_evaluator_from_source(
264    source: &str,
265    dialect: OmenaParserStyleDialect,
266) -> OmenaQueryStaticStylesheetEvaluatorSummaryV0 {
267    let evaluation = derive_static_stylesheet_module_evaluation(source, dialect);
268    let value_resolution = evaluation
269        .as_ref()
270        .map(|evaluation| evaluation.value_resolution.clone())
271        .or_else(|| summarize_static_stylesheet_value_resolution(source, dialect));
272    let oracle = evaluation.as_ref().map(|evaluation| &evaluation.oracle);
273    let supported_dialect = matches!(
274        dialect,
275        OmenaParserStyleDialect::Scss
276            | OmenaParserStyleDialect::Sass
277            | OmenaParserStyleDialect::Less
278    );
279
280    OmenaQueryStaticStylesheetEvaluatorSummaryV0 {
281        schema_version: OMENA_QUERY_CURRENT_SCHEMA_VERSION,
282        product: "omena-query.static-stylesheet-evaluator",
283        mode: "oracleOnly",
284        dialect: omena_query_boundary_style_dialect_label(dialect),
285        value_type: "AbstractCssValueV0",
286        supported_dialect,
287        product_output_source: evaluation
288            .as_ref()
289            .map_or("none", |evaluation| evaluation.product_output_source),
290        legacy_output_retained_as_oracle: evaluation
291            .as_ref()
292            .is_some_and(|evaluation| evaluation.legacy_output_retained_as_oracle),
293        legacy_output_consumed_until_cutover: evaluation
294            .as_ref()
295            .is_some_and(|evaluation| evaluation.legacy_output_consumed_until_cutover),
296        evaluation_available: evaluation.is_some(),
297        value_resolution_available: value_resolution.is_some(),
298        native_edit_output: evaluation
299            .as_ref()
300            .map(|evaluation| evaluation.native_edit_output.clone()),
301        divergence_count: oracle.map_or(0, |oracle| oracle.divergence_count),
302        all_legacy_declaration_values_preserved: oracle
303            .is_some_and(|oracle| oracle.all_legacy_declaration_values_preserved),
304        native_replacement_count: evaluation
305            .as_ref()
306            .map_or(0, |evaluation| evaluation.replacement_count),
307        native_replacement_legacy_reflection_count: evaluation.as_ref().map_or(0, |evaluation| {
308            evaluation.native_replacement_legacy_reflection_count
309        }),
310        native_replacement_legacy_unreflected_count: evaluation.as_ref().map_or(0, |evaluation| {
311            evaluation.native_replacement_legacy_unreflected_count
312        }),
313        native_edit_count: evaluation
314            .as_ref()
315            .map_or(0, |evaluation| evaluation.native_edit_count),
316        native_value_edit_count: evaluation
317            .as_ref()
318            .map_or(0, |evaluation| evaluation.native_value_edit_count),
319        native_structural_edit_count: evaluation
320            .as_ref()
321            .map_or(0, |evaluation| evaluation.native_structural_edit_count),
322        native_edit_output_matches_evaluated_css: evaluation
323            .as_ref()
324            .is_some_and(|evaluation| evaluation.native_edit_output_matches_evaluated_css),
325        native_value_reference_count: value_resolution
326            .as_ref()
327            .map_or(0, |resolution| resolution.reference_count),
328        native_resolved_value_count: value_resolution
329            .as_ref()
330            .map_or(0, |resolution| resolution.resolved_count),
331        native_raw_value_count: value_resolution
332            .as_ref()
333            .map_or(0, |resolution| resolution.raw_count),
334        native_top_value_count: value_resolution
335            .as_ref()
336            .map_or(0, |resolution| resolution.top_count),
337        native_cycle_value_count: value_resolution
338            .as_ref()
339            .map_or(0, |resolution| resolution.cycle_count),
340        native_fuel_exhausted_value_count: value_resolution
341            .as_ref()
342            .map_or(0, |resolution| resolution.fuel_exhausted_count),
343        native_unresolved_reference_value_count: value_resolution
344            .as_ref()
345            .map_or(0, |resolution| resolution.unresolved_reference_count),
346        native_unsupported_dynamic_value_count: value_resolution
347            .as_ref()
348            .map_or(0, |resolution| resolution.unsupported_dynamic_count),
349        evaluation,
350        value_resolution,
351    }
352}
353
354pub fn summarize_omena_query_static_stylesheet_evaluator_from_engine_input(
355    input: &EngineInputV2,
356    target_style_path: &str,
357) -> Option<OmenaQueryStaticStylesheetEvaluatorSummaryV0> {
358    let target = input
359        .styles
360        .iter()
361        .find(|style| style.file_path == target_style_path)?;
362    let source = target.source.as_deref()?;
363    Some(
364        summarize_omena_query_static_stylesheet_evaluator_from_source(
365            source,
366            omena_query_style_dialect_for_path(target_style_path),
367        ),
368    )
369}
370
371pub fn summarize_omena_query_static_lif_exports_from_source(
372    source: &str,
373    dialect: OmenaParserStyleDialect,
374) -> OmenaQueryStaticLifExportsSummaryV0 {
375    let source_syntax = omena_query_boundary_sif_source_syntax(dialect);
376    let exports = omena_sif::generate_static_omena_lif_exports_v1(
377        omena_sif::OmenaSifStaticGeneratorInputV1 {
378            canonical_url: "memory:omena-query-static-lif",
379            source,
380            syntax: source_syntax.clone(),
381        },
382    );
383    let less_variable_names = exports
384        .less_variables
385        .iter()
386        .map(|variable| variable.name.clone())
387        .collect::<Vec<_>>();
388    let less_mixin_names = exports
389        .less_mixins
390        .iter()
391        .map(|mixin| mixin.name.clone())
392        .collect::<Vec<_>>();
393    let less_detached_ruleset_names = exports
394        .less_detached_rulesets
395        .iter()
396        .map(|ruleset| ruleset.name.clone())
397        .collect::<Vec<_>>();
398
399    OmenaQueryStaticLifExportsSummaryV0 {
400        schema_version: OMENA_QUERY_CURRENT_SCHEMA_VERSION,
401        product: "omena-query.static-lif-exports",
402        mode: "staticInterfaceOnly",
403        dialect: omena_query_boundary_style_dialect_label(dialect),
404        source_syntax: omena_query_boundary_sif_source_syntax_label(source_syntax),
405        sif_superset: true,
406        less_specific_export_count: exports.less_variables.len()
407            + exports.less_mixins.len()
408            + exports.less_detached_rulesets.len(),
409        less_variable_count: exports.less_variables.len(),
410        less_mixin_count: exports.less_mixins.len(),
411        less_detached_ruleset_count: exports.less_detached_rulesets.len(),
412        less_variable_names,
413        less_mixin_names,
414        less_detached_ruleset_names,
415        sif_variable_count: exports.sif_exports.variables.len(),
416        sif_mixin_count: exports.sif_exports.mixins.len(),
417        sif_function_count: exports.sif_exports.functions.len(),
418        sif_placeholder_count: exports.sif_exports.placeholders.len(),
419        sif_forward_count: exports.sif_exports.forwards.len(),
420        exports,
421    }
422}
423
424pub fn summarize_omena_query_static_lif_exports_from_engine_input(
425    input: &EngineInputV2,
426    target_style_path: &str,
427) -> Option<OmenaQueryStaticLifExportsSummaryV0> {
428    let target = input
429        .styles
430        .iter()
431        .find(|style| style.file_path == target_style_path)?;
432    let source = target.source.as_deref()?;
433    Some(summarize_omena_query_static_lif_exports_from_source(
434        source,
435        omena_query_style_dialect_for_path(target_style_path),
436    ))
437}
438
439pub fn summarize_omena_query_static_stylesheet_evaluator_oracle_corpus()
440-> OmenaQueryStaticStylesheetEvaluatorOracleCorpusSummaryV0 {
441    let corpus = summarize_static_stylesheet_oracle_corpus();
442    OmenaQueryStaticStylesheetEvaluatorOracleCorpusSummaryV0 {
443        schema_version: OMENA_QUERY_CURRENT_SCHEMA_VERSION,
444        product: "omena-query.static-stylesheet-evaluator-oracle-corpus",
445        mode: corpus.mode,
446        value_type: corpus.value_type,
447        product_output_source: corpus.product_output_source,
448        legacy_output_retained_as_oracle_count: corpus.legacy_output_retained_as_oracle_count,
449        legacy_output_consumed_until_cutover_count: corpus
450            .legacy_output_consumed_until_cutover_count,
451        all_legacy_outputs_retained_as_oracle: corpus.all_legacy_outputs_retained_as_oracle,
452        fixture_count: corpus.fixture_count,
453        scss_fixture_count: corpus.scss_fixture_count,
454        sass_fixture_count: corpus.sass_fixture_count,
455        less_fixture_count: corpus.less_fixture_count,
456        evaluated_fixture_count: corpus.evaluated_fixture_count,
457        missing_evaluation_count: corpus.missing_evaluation_count,
458        divergence_count: corpus.divergence_count,
459        native_replacement_count: corpus.native_replacement_count,
460        native_replacement_legacy_reflection_count: corpus
461            .native_replacement_legacy_reflection_count,
462        native_replacement_legacy_unreflected_count: corpus
463            .native_replacement_legacy_unreflected_count,
464        native_edit_count: corpus.native_edit_count,
465        native_value_edit_count: corpus.native_value_edit_count,
466        native_structural_edit_count: corpus.native_structural_edit_count,
467        scss_control_flow_value_truthiness_count: corpus.scss_control_flow_value_truthiness_count,
468        scss_control_flow_contextual_truthiness_fallback_count: corpus
469            .scss_control_flow_contextual_truthiness_fallback_count,
470        scss_control_flow_contextual_truthiness_conflict_count: corpus
471            .scss_control_flow_contextual_truthiness_conflict_count,
472        scss_control_flow_prune_reachability_fixture_count: corpus
473            .scss_control_flow_prune_reachability_fixture_count,
474        scss_control_flow_prune_reachability_changed_fixture_count: corpus
475            .scss_control_flow_prune_reachability_changed_fixture_count,
476        scss_control_flow_prune_reachability_flat_css_cfg_built_count: corpus
477            .scss_control_flow_prune_reachability_flat_css_cfg_built_count,
478        native_edit_output_match_count: corpus.native_edit_output_match_count,
479        native_value_reference_count: corpus.native_value_reference_count,
480        native_resolved_value_count: corpus.native_resolved_value_count,
481        native_raw_value_count: corpus.native_raw_value_count,
482        native_top_value_count: corpus.native_top_value_count,
483        native_cycle_value_count: corpus.native_cycle_value_count,
484        native_fuel_exhausted_value_count: corpus.native_fuel_exhausted_value_count,
485        native_unresolved_reference_value_count: corpus.native_unresolved_reference_value_count,
486        native_unsupported_dynamic_value_count: corpus.native_unsupported_dynamic_value_count,
487        all_legacy_declaration_values_preserved: corpus.all_legacy_declaration_values_preserved,
488        all_native_edit_outputs_match_evaluated_css: corpus
489            .all_native_edit_outputs_match_evaluated_css,
490        native_product_output_corpus_ready: corpus.native_product_output_corpus_ready,
491        corpus,
492    }
493}
494
495pub fn summarize_omena_query_scss_evaluator_control_flow_from_source(
496    source: &str,
497    dialect: OmenaParserStyleDialect,
498) -> OmenaQueryScssEvaluatorControlFlowSummaryV0 {
499    let control_flow_ir = summarize_scss_control_flow_ir(source, dialect);
500    let value_analysis = analyze_scss_control_flow_values(source, dialect);
501    let prune_reachability = summarize_scss_control_flow_prune_reachability(source, dialect);
502    let call_return_ir = summarize_scss_call_return_ir(source, dialect);
503    let supported_dialect = matches!(
504        dialect,
505        OmenaParserStyleDialect::Scss | OmenaParserStyleDialect::Sass
506    );
507
508    OmenaQueryScssEvaluatorControlFlowSummaryV0 {
509        schema_version: OMENA_QUERY_CURRENT_SCHEMA_VERSION,
510        product: "omena-query.scss-evaluator-control-flow",
511        mode: "oracleOnly",
512        dialect: omena_query_boundary_style_dialect_label(dialect),
513        value_type: "AbstractCssValueV0",
514        supported_dialect,
515        flat_css_cfg_built: control_flow_ir
516            .as_ref()
517            .is_some_and(|summary| summary.flat_css_cfg_built),
518        merged_cross_file_graph: control_flow_ir
519            .as_ref()
520            .is_some_and(|summary| summary.merged_cross_file_graph),
521        control_flow_block_count: control_flow_ir
522            .as_ref()
523            .map_or(0, |summary| summary.block_count),
524        control_flow_branch_block_count: control_flow_ir
525            .as_ref()
526            .map_or(0, |summary| summary.branch_block_count),
527        control_flow_loop_block_count: control_flow_ir
528            .as_ref()
529            .map_or(0, |summary| summary.loop_block_count),
530        control_flow_back_edge_count: control_flow_ir
531            .as_ref()
532            .map_or(0, |summary| summary.back_edge_count),
533        call_return_node_count: call_return_ir
534            .as_ref()
535            .map_or(0, |summary| summary.node_count),
536        call_return_edge_count: call_return_ir
537            .as_ref()
538            .map_or(0, |summary| summary.edge_count),
539        call_resolved_return_value_count: call_return_ir
540            .as_ref()
541            .map_or(0, |summary| summary.call_resolved_return_value_count),
542        exact_call_resolved_return_value_count: call_return_ir
543            .as_ref()
544            .map_or(0, |summary| summary.exact_call_resolved_return_value_count),
545        value_analysis_converged: value_analysis
546            .as_ref()
547            .is_some_and(|summary| summary.converged),
548        value_analysis_iteration_count: value_analysis
549            .as_ref()
550            .map_or(0, |summary| summary.iteration_count),
551        value_analysis_widened_to_top_count: value_analysis
552            .as_ref()
553            .map_or(0, |summary| summary.widened_to_top_count),
554        prune_reachability_available: prune_reachability.is_some(),
555        prune_reachability_converged: prune_reachability
556            .as_ref()
557            .is_some_and(|summary| summary.converged),
558        prune_reachability_flat_css_cfg_built: prune_reachability
559            .as_ref()
560            .is_some_and(|summary| summary.flat_css_cfg_built),
561        prune_reachability_have_terminals_changed: prune_reachability
562            .as_ref()
563            .is_some_and(|summary| summary.have_terminals_changed),
564        prune_reachability_reachable_block_count: prune_reachability
565            .as_ref()
566            .map_or(0, |summary| summary.reachable_block_count),
567        prune_reachability_unreachable_block_count: prune_reachability
568            .as_ref()
569            .map_or(0, |summary| summary.unreachable_block_count),
570        ready_surfaces: vec![
571            "scssEvaluatorControlFlowIr",
572            "scssEvaluatorControlFlowValueAnalysis",
573            "scssEvaluatorControlFlowPruneReachability",
574            "scssEvaluatorCallReturnIr",
575        ],
576        control_flow_ir,
577        value_analysis,
578        prune_reachability,
579        call_return_ir,
580    }
581}
582
583pub fn summarize_omena_query_scss_evaluator_control_flow_from_engine_input(
584    input: &EngineInputV2,
585    target_style_path: &str,
586) -> Option<OmenaQueryScssEvaluatorControlFlowSummaryV0> {
587    let target = input
588        .styles
589        .iter()
590        .find(|style| style.file_path == target_style_path)?;
591    let source = target.source.as_deref()?;
592    Some(
593        summarize_omena_query_scss_evaluator_control_flow_from_source(
594            source,
595            omena_query_style_dialect_for_path(target_style_path),
596        ),
597    )
598}
599
600pub fn summarize_omena_query_native_css_evaluator_from_source(
601    source: &str,
602    dialect: OmenaParserStyleDialect,
603) -> OmenaQueryNativeCssEvaluatorSummaryV0 {
604    let native_function_surface = summarize_native_css_function_surface(source, dialect);
605    let native_function_call_evaluations =
606        summarize_native_css_function_call_evaluations(source, dialect);
607    let native_static_edit_plan = summarize_native_css_static_edit_plan(source, dialect);
608    let if_function_decisions = summarize_native_css_if_function_decisions(source, dialect);
609    let supported_dialect = dialect == OmenaParserStyleDialect::Css;
610
611    OmenaQueryNativeCssEvaluatorSummaryV0 {
612        schema_version: OMENA_QUERY_CURRENT_SCHEMA_VERSION,
613        product: "omena-query.native-css-evaluator",
614        mode: "oracleOnlyPruneButKeep",
615        dialect: omena_query_boundary_style_dialect_label(dialect),
616        supported_dialect,
617        native_static_eval_spec_snapshot: NATIVE_CSS_STATIC_EVAL_SPEC_SNAPSHOT_V0,
618        native_static_eval_opt_in_policy: NATIVE_CSS_STATIC_EVAL_OPT_IN_POLICY_V0,
619        native_static_eval_dialect_restriction: NATIVE_CSS_STATIC_EVAL_DIALECT_RESTRICTION_V0,
620        native_static_eval_explicit_opt_in_required: true,
621        native_function_surface_available: native_function_surface.is_some(),
622        native_function_call_evaluation_available: native_function_call_evaluations.is_some(),
623        native_static_edit_plan_available: native_static_edit_plan.is_some(),
624        if_function_decision_available: if_function_decisions.is_some(),
625        native_function_count: native_function_surface
626            .as_ref()
627            .map_or(0, |summary| summary.function_count),
628        native_function_parameter_count: native_function_surface
629            .as_ref()
630            .map_or(0, |summary| summary.parameter_count),
631        native_function_typed_parameter_count: native_function_surface
632            .as_ref()
633            .map_or(0, |summary| summary.typed_parameter_count),
634        native_function_result_count: native_function_surface
635            .as_ref()
636            .map_or(0, |summary| summary.result_count),
637        native_function_call_count: native_function_call_evaluations
638            .as_ref()
639            .map_or(0, |summary| summary.call_count),
640        native_function_call_foldable_count: native_function_call_evaluations
641            .as_ref()
642            .map_or(0, |summary| summary.foldable_call_count),
643        native_function_call_preserved_count: native_function_call_evaluations
644            .as_ref()
645            .map_or(0, |summary| summary.preserved_call_count),
646        native_function_call_structural_error_count: native_function_call_evaluations
647            .as_ref()
648            .map_or(0, |summary| summary.structural_error_count),
649        native_function_call_runtime_dependent_count: native_function_call_evaluations
650            .as_ref()
651            .map_or(0, |summary| summary.runtime_dependent_call_count),
652        native_function_call_missing_result_count: native_function_call_evaluations
653            .as_ref()
654            .map_or(0, |summary| summary.missing_result_count),
655        native_static_edit_count: native_static_edit_plan
656            .as_ref()
657            .map_or(0, |summary| summary.edit_count),
658        native_static_edit_output_changed: native_static_edit_plan
659            .as_ref()
660            .is_some_and(|summary| summary.output_changed),
661        if_function_count: if_function_decisions
662            .as_ref()
663            .map_or(0, |summary| summary.function_count),
664        if_function_foldable_count: if_function_decisions
665            .as_ref()
666            .map_or(0, |summary| summary.foldable_function_count),
667        if_function_preserved_count: if_function_decisions
668            .as_ref()
669            .map_or(0, |summary| summary.preserved_function_count),
670        if_function_static_supports_branch_count: if_function_decisions
671            .as_ref()
672            .map_or(0, |summary| summary.static_supports_branch_count),
673        if_function_runtime_branch_count: if_function_decisions
674            .as_ref()
675            .map_or(0, |summary| summary.runtime_branch_count),
676        ready_surfaces: vec![
677            "nativeCssFunctionSurface",
678            "nativeCssFunctionCallEvaluationSurface",
679            "nativeCssStaticEditPlanSurface",
680            "nativeCssIfFunctionDecisionSurface",
681        ],
682        native_function_surface,
683        native_function_call_evaluations,
684        native_static_edit_plan,
685        if_function_decisions,
686    }
687}
688
689pub fn summarize_omena_query_native_css_evaluator_from_engine_input(
690    input: &EngineInputV2,
691    target_style_path: &str,
692) -> Option<OmenaQueryNativeCssEvaluatorSummaryV0> {
693    let target = input
694        .styles
695        .iter()
696        .find(|style| style.file_path == target_style_path)?;
697    let source = target.source.as_deref()?;
698    Some(summarize_omena_query_native_css_evaluator_from_source(
699        source,
700        omena_query_style_dialect_for_path(target_style_path),
701    ))
702}
703
704#[allow(deprecated)]
705pub fn summarize_omena_query_scss_evaluator_control_flow_oracle_corpus()
706-> OmenaQueryScssEvaluatorControlFlowOracleCorpusSummaryV0 {
707    let corpus = summarize_scss_control_flow_oracle_corpus();
708    OmenaQueryScssEvaluatorControlFlowOracleCorpusSummaryV0 {
709        schema_version: OMENA_QUERY_CURRENT_SCHEMA_VERSION,
710        product: "omena-query.scss-evaluator-control-flow-oracle-corpus",
711        mode: corpus.mode,
712        value_type: corpus.value_type,
713        node_key_type: corpus.node_key_type,
714        recursion_cap: corpus.recursion_cap,
715        fixture_count: corpus.fixture_count,
716        scss_fixture_count: corpus.scss_fixture_count,
717        sass_fixture_count: corpus.sass_fixture_count,
718        supported_fixture_count: corpus.supported_fixture_count,
719        rejected_flat_css_fixture_count: corpus.rejected_flat_css_fixture_count,
720        control_flow_fixture_count: corpus.control_flow_fixture_count,
721        branch_fixture_count: corpus.branch_fixture_count,
722        loop_fixture_count: corpus.loop_fixture_count,
723        back_edge_fixture_count: corpus.back_edge_fixture_count,
724        call_return_fixture_count: corpus.call_return_fixture_count,
725        resolved_call_return_fixture_count: corpus.resolved_call_return_fixture_count,
726        top_call_return_fixture_count: corpus.top_call_return_fixture_count,
727        recursive_call_fixture_count: corpus.recursive_call_fixture_count,
728        converged_value_analysis_fixture_count: corpus.converged_value_analysis_fixture_count,
729        widened_to_top_fixture_count: corpus.widened_to_top_fixture_count,
730        propagation_depth_witness_widened_to_top_count: corpus
731            .propagation_depth_witness_widened_to_top_count,
732        propagation_depth_witness_converged: corpus.propagation_depth_witness_converged,
733        ascending_chain_witness_converged: corpus.ascending_chain_witness_converged,
734        ascending_chain_witness_result_kind: corpus.ascending_chain_witness_result_kind,
735        widening_witness_widened_to_top_count: corpus.widening_witness_widened_to_top_count,
736        widening_witness_converged: corpus.widening_witness_converged,
737        prune_reachability_fixture_count: corpus.prune_reachability_fixture_count,
738        prune_reachability_changed_fixture_count: corpus.prune_reachability_changed_fixture_count,
739        prune_reachability_flat_css_cfg_built_count: corpus
740            .prune_reachability_flat_css_cfg_built_count,
741        flat_css_cfg_built_count: corpus.flat_css_cfg_built_count,
742        merged_cross_file_graph_count: corpus.merged_cross_file_graph_count,
743        all_supported_fixtures_converged: corpus.all_supported_fixtures_converged,
744        no_flat_css_cfg_built: corpus.no_flat_css_cfg_built,
745        no_merged_cross_file_graph: corpus.no_merged_cross_file_graph,
746        propagation_depth_witness: corpus.propagation_depth_witness.clone(),
747        ascending_chain_witness: corpus.ascending_chain_witness.clone(),
748        widening_witness: corpus.widening_witness.clone(),
749        corpus,
750    }
751}
752
753fn omena_query_style_dialect_for_path(style_path: &str) -> OmenaParserStyleDialect {
754    if style_path.ends_with(".sass") {
755        OmenaParserStyleDialect::Sass
756    } else if style_path.ends_with(".scss") {
757        OmenaParserStyleDialect::Scss
758    } else if style_path.ends_with(".less") {
759        OmenaParserStyleDialect::Less
760    } else {
761        OmenaParserStyleDialect::Css
762    }
763}
764
765fn omena_query_boundary_style_dialect_label(dialect: OmenaParserStyleDialect) -> &'static str {
766    match dialect {
767        OmenaParserStyleDialect::Css => "css",
768        OmenaParserStyleDialect::Scss => "scss",
769        OmenaParserStyleDialect::Sass => "sass",
770        OmenaParserStyleDialect::Less => "less",
771    }
772}
773
774fn omena_query_boundary_sif_source_syntax(
775    dialect: OmenaParserStyleDialect,
776) -> omena_sif::OmenaSifSourceSyntaxV1 {
777    match dialect {
778        OmenaParserStyleDialect::Css => omena_sif::OmenaSifSourceSyntaxV1::Css,
779        OmenaParserStyleDialect::Scss => omena_sif::OmenaSifSourceSyntaxV1::Scss,
780        OmenaParserStyleDialect::Sass => omena_sif::OmenaSifSourceSyntaxV1::Sass,
781        OmenaParserStyleDialect::Less => omena_sif::OmenaSifSourceSyntaxV1::Less,
782    }
783}
784
785fn omena_query_boundary_sif_source_syntax_label(
786    syntax: omena_sif::OmenaSifSourceSyntaxV1,
787) -> &'static str {
788    match syntax {
789        omena_sif::OmenaSifSourceSyntaxV1::Css => "css",
790        omena_sif::OmenaSifSourceSyntaxV1::Scss => "scss",
791        omena_sif::OmenaSifSourceSyntaxV1::Sass => "sass",
792        omena_sif::OmenaSifSourceSyntaxV1::Less => "less",
793    }
794}