diff --git a/crates/engine/src/assets/library.rs b/crates/engine/src/assets/library.rs index 7e7e9b80d..01e8d3244 100644 --- a/crates/engine/src/assets/library.rs +++ b/crates/engine/src/assets/library.rs @@ -277,8 +277,16 @@ pub fn default_selection(doc: &Document, prev: Option<&LibraryManifest>) -> Sele fn alias_closure(vars: &Variables, seeds: impl IntoIterator) -> BTreeSet { let mut out = BTreeSet::new(); let mut stack: Vec = seeds.into_iter().collect(); + if stack.is_empty() { + return out; + } + // Indexed once (the first of equal ids, as `get_by_id` finds it): a scan per step is quadratic on a long alias chain. + let mut by_id = std::collections::HashMap::new(); + for v in &vars.variables { + by_id.entry(v.id.as_str()).or_insert(v); + } while let Some(cur) = stack.pop() { - let Some(v) = vars.get_by_id(&cur) else { continue }; + let Some(v) = by_id.get(cur.as_str()).copied() else { continue }; if out.len() >= MAX_ASSETS || !out.insert(v.id.clone()) { continue; }