From 003c074456bbee5bf0928e519a0f6f5225e13ff3 Mon Sep 17 00:00:00 2001 From: bompus Date: Sat, 31 Oct 2026 12:56:53 -0600 Subject: [PATCH] fix(kernel): cache the Python unpacked-bases regex check:kernel-rules failed at member_fn_ref.rs:1082: python_unpacked_bases compiled a name-parameterized regex on every class header. The variable name is the only part that varies, so route the pattern through KernelResolver::cached_regex and compile each shape once. Rule scan: 3/3. python-self-call-not-import: 63/63. Golden dumps: 8/8. Full npm test: 957 files, 11,344 passed, 46 skipped, 0 failed. --- codegraph-kernel/src/resolve/member_fn_ref.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/codegraph-kernel/src/resolve/member_fn_ref.rs b/codegraph-kernel/src/resolve/member_fn_ref.rs index bb42b5c3d..cf151748e 100644 --- a/codegraph-kernel/src/resolve/member_fn_ref.rs +++ b/codegraph-kernel/src/resolve/member_fn_ref.rs @@ -1079,7 +1079,9 @@ mod tests { /// The class names a module-level tuple variable writes: `bases = (Left, Right)` /// for a `class Adapter(*bases)` header. Empty for any other shape. fn python_unpacked_bases(lines: &[String], variable: &str, before: usize) -> Vec { - let Ok(pattern) = regex::Regex::new(&format!(r"(?m)^{}\s*=\s*\(([^)]*)\)", regex::escape(variable.trim()))) else { + // Cached: the variable name is the only pattern component that varies, + // and this runs for every class header. + let Ok(pattern) = KernelResolver::cached_regex(&format!(r"(?m)^{}\s*=\s*\(([^)]*)\)", regex::escape(variable.trim()))) else { return Vec::new(); }; let text = lines.join("\n");