lean_ctx/core/semantic/
mod.rs1pub mod coverage;
18pub mod enrich;
19pub mod evidence;
20pub mod relations;
21pub mod resolve;
22
23#[cfg(test)]
24mod e2e_tests;
25
26pub use enrich::{Escalation, EscalationBudget, EscalationStats, SemanticVerdict, escalate_calls};
27pub use evidence::{EdgeEvidence, EvidenceGrade, EvidenceOrigin};
28
29use crate::core::config::SemanticMode;
30use crate::core::property_graph::{CodeGraph, EdgeKind};
31
32pub fn status_line(graph: &CodeGraph, mode: SemanticMode, project_root: &str) -> String {
37 let mode = match mode {
38 SemanticMode::Off => "off",
39 SemanticMode::Auto => "auto",
40 SemanticMode::Eager => "eager",
41 };
42 let coverage = coverage::coverage_by_language(graph);
43 let mut all = coverage::GradeCounts::default();
44 for c in coverage.values() {
45 all.verified += c.verified;
46 all.resolved += c.resolved;
47 all.heuristic += c.heuristic;
48 all.unannotated += c.unannotated;
49 }
50 let count = |kind: EdgeKind| graph.file_edges_of_kind(&kind).map_or(0, |e| e.len());
51 let (implements, extends, references) = (
52 count(EdgeKind::Implements),
53 count(EdgeKind::Extends),
54 count(EdgeKind::References),
55 );
56 let extra = if all.unannotated > 0 {
57 format!(" · {} unannotated", all.unannotated)
58 } else {
59 String::new()
60 };
61 let mut out = format!(
62 "Semantic: mode={mode} | calls {} verified · {} resolved · {} heuristic{extra} | implements {implements} · extends {extends} · references {references}",
63 all.verified, all.resolved, all.heuristic
64 );
65 for line in coverage::coverage_lines(&coverage, project_root) {
66 out.push('\n');
67 out.push_str(&line);
68 }
69 out
70}