From 537deabc72f80bfc38e3f1c70d8cbf2fc7fffb50 Mon Sep 17 00:00:00 2001 From: Micha Reiser Date: Thu, 18 Dec 2025 09:01:08 +0100 Subject: [PATCH] Defer insertion --- .../ty_python_semantic/src/types/builder.rs | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/crates/ty_python_semantic/src/types/builder.rs b/crates/ty_python_semantic/src/types/builder.rs index aea7aab325..65396d04e9 100644 --- a/crates/ty_python_semantic/src/types/builder.rs +++ b/crates/ty_python_semantic/src/types/builder.rs @@ -552,16 +552,14 @@ impl<'db> UnionBuilder<'db> { let mut ty_negated: Option = None; let mut i = 0; - let mut inserted = false; + let mut insertion_point: Option = None; - let mut remove_element = |i: &mut usize, elements: &mut Vec>| { - if inserted { - elements.swap_remove(*i); + let mut remove_or_replace = |i: usize, elements: &mut Vec>| { + if insertion_point.is_none() { + insertion_point = Some(i); } else { - elements[*i] = UnionElement::Type(ty); - *i += 1; + elements.swap_remove(i); } - inserted = true; }; while i < self.elements.len() { @@ -570,10 +568,9 @@ impl<'db> UnionBuilder<'db> { let element_type = match element.try_reduce(self.db, ty) { ReduceResult::KeepIf(keep) => { if !keep { - remove_element(&mut i, &mut self.elements); - } else { - i += 1; + remove_or_replace(i, &mut self.elements); } + i += 1; continue; } ReduceResult::Type(ty) => ty, @@ -610,7 +607,8 @@ impl<'db> UnionBuilder<'db> { } if element_type.is_redundant_with(self.db, ty) { - remove_element(&mut i, &mut self.elements); + remove_or_replace(i, &mut self.elements); + i += 1; continue; } @@ -633,7 +631,9 @@ impl<'db> UnionBuilder<'db> { i += 1; } - if !inserted { + if let Some(insertion_point) = insertion_point { + self.elements[insertion_point] = UnionElement::Type(ty); + } else { self.elements.push(UnionElement::Type(ty)); } }