WIP checkpoint schema8 analysis core before user reboot

This commit is contained in:
Codex
2026-09-11 06:46:52 -07:00
parent 7d14bd0dd1
commit b96ff3935a
21 changed files with 3329 additions and 113 deletions
+17 -2
View File
@@ -1,8 +1,14 @@
use crate::*;
use std::collections::BTreeSet;
/// Every live reference in a typed element, including structural ownership.
/// Architectural/project references, including analysis subjects/properties.
/// Layer-neutral definition references and scoped parameters have separate domains.
pub fn element_references(e: &Element) -> Vec<Id> {
if e.kind().is_analysis() {
let mut references: Vec<_> = crate::analysis::references::element_model_references(e).into_iter().collect();
references.extend(e.parent);
return references;
}
let mut copy = e.clone();
let mut refs = Vec::new();
visit_element_refs(&mut copy, |id| refs.push(*id));
@@ -14,6 +20,8 @@ pub fn relation_references(r: &Relation) -> Vec<Id> {
visit_relation_refs(&mut copy, |id| refs.push(*id));
refs
}
/// Architectural mutable slots only. Analysis map keys require the fallible
/// whole-project remap; use analysis::references for its typed domains.
pub fn visit_element_refs(e: &mut Element, mut visit: impl FnMut(&mut Id)) {
if let Some(parent) = &mut e.parent {
visit(parent);
@@ -203,7 +211,10 @@ pub fn visit_relation_refs(r: &mut Relation, mut visit: impl FnMut(&mut Id)) {
_ => {}
}
}
pub fn remap_references(p: &mut Project, old: Id, new: Id) {
pub fn remap_references(p: &mut Project, old: Id, new: Id) -> Result<(), ModelError> {
crate::analysis::references::check_remap(p, old, new)
.map_err(|error| ModelError(error.to_string()))?;
crate::analysis::references::remap_project(p, old, new);
for e in p.elements.values_mut() {
visit_element_refs(e, |id| {
if *id == old {
@@ -265,6 +276,7 @@ pub fn remap_references(p: &mut Project, old: Id, new: Id) {
});
}
}
Ok(())
}
/// IDs removed by a cascade. Cross-layer traced counterparts are never included.
pub fn deletion_impact(p: &Project, id: Id) -> BTreeSet<Id> {
@@ -405,6 +417,9 @@ fn remove_objects(p: &mut Project, removed: BTreeSet<Id>) {
.iter()
.map(|id| (*id, p.named(*id).to_string()))
.collect();
// Analysis dependencies remain live: deleting their target rejects the
// transaction unless that transaction also explicitly repairs/removes them.
p.definitions.retain(|id, _| !removed.contains(id));
p.elements.retain(|id, _| !removed.contains(id));
p.relations.retain(|id, _| !removed.contains(id));
p.diagrams.retain(|id, _| !removed.contains(id));