Implement and archive Phase 5 integration acceptance

This commit is contained in:
2026-09-07 10:38:58 +02:00
parent cc82830889
commit 86c3ebeb6d
18 changed files with 1224 additions and 39 deletions

View File

@@ -720,14 +720,14 @@ impl App {
for f in &input.forms {
catalog.append(&f.catalog());
}
ensure!(
!catalog
.objects
.iter()
.any(|o| o.name.eq_ignore_ascii_case(new)),
"Name {new} bereits vorhanden"
);
let form_name = self.design_form()?.root.name.clone();
ensure!(
catalog.objects.iter().filter(|o| o.name.eq_ignore_ascii_case(new)).all(|o| {
node_key(&selected).1.is_some() && o.array && o.class == selected.class
&& o.parent_form.as_deref().is_some_and(|name| name.eq_ignore_ascii_case(&form_name))
}),
"Name {new} bereits vorhanden; nur indizierte Controls derselben Klasse und Form können ein Array bilden"
);
let target = if selected.class == Class::Form {
catalog.find(&old)
} else {
@@ -887,27 +887,52 @@ impl App {
.join("; ")
)
})?;
let mut candidate_catalog = forms::FormCatalog::default();
for form in &candidate.forms {
candidate_catalog.append(&form.catalog());
}
let bindings = |references: &[(tb_frontend::SourcePos, String, u16)],
files: &[tb_frontend::source::SourceFile],
objects: &forms::FormCatalog,
rename_old: bool| {
let mut result = Vec::new();
for (p, n, o) in references {
let mut n = n.clone();
let object = &objects.objects[*o as usize];
let mut name = object.name.clone();
let mut owner = object.parent_form.clone();
if rename_old && *o == target {
name = new.to_uppercase();
if n == old {
n = new.to_uppercase();
} else if let Some(r) = handlers.get(&n) {
n = r.to_uppercase();
}
}
result.push((files[p.source as usize].path.clone(), n, *o));
if rename_old && selected.class == Class::Form && owner.as_deref() == Some(&old) {
owner = Some(new.to_uppercase());
}
// Merging arrays changes catalog indices. Compare semantic object identities.
result.push((
files[p.source as usize].path.clone(),
n,
name,
owner,
object.class.name(),
object.array,
));
}
result.sort();
result
};
ensure!(
bindings(&bound.objects, &source_files, true)
== bindings(&candidate_bound.objects, &candidate_compiled.sources, false),
bindings(&bound.objects, &source_files, &catalog, true)
== bindings(
&candidate_bound.objects,
&candidate_compiled.sources,
&candidate_catalog,
false
),
"Unklare oder verdeckte Objektverweise; nichts geändert"
);
self.project