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}