From b19ffabdafd9a2b567b95d0484201c09a4ce75bc Mon Sep 17 00:00:00 2001 From: MarekSpodBiedry <73122968+MarekSpodBiedry@users.noreply.github.com> Date: Sat, 10 Oct 2026 19:04:13 +0200 Subject: [PATCH] Rename sheet-qualified defined names with their sheet (#134) --- crates/formula/src/adjust.rs | 7 +++++++ crates/formula/src/tests.rs | 8 ++++++++ 2 files changed, 15 insertions(+) diff --git a/crates/formula/src/adjust.rs b/crates/formula/src/adjust.rs index ae082a6..7feb904 100644 --- a/crates/formula/src/adjust.rs +++ b/crates/formula/src/adjust.rs @@ -218,6 +218,13 @@ pub fn rename_sheet(e: Expr, old: &str, new: &str) -> Expr { } Expr::Ref(r) } + // Sheet-qualified defined name `Old!MyName` is stored as one string. + Expr::Name(n) => match n.split_at_checked(old.len()) { + Some((head, rest)) if head.eq_ignore_ascii_case(old) && rest.starts_with('!') => { + Expr::Name(format!("{}{rest}", crate::printer::quote_sheet(new))) + } + _ => Expr::Name(n), + }, other => other, }) } diff --git a/crates/formula/src/tests.rs b/crates/formula/src/tests.rs index ee89070..3aca4a5 100644 --- a/crates/formula/src/tests.rs +++ b/crates/formula/src/tests.rs @@ -163,6 +163,14 @@ fn moves_and_renames() { assert_eq!(print(&rename_sheet(e, "Old", "New Name")), "'New Name'!A1+'New Name'!B2"); } +#[test] +fn rename_sheet_updates_qualified_names() { + let e = parse("Data!MyName+MyName+Other!MyName").unwrap(); + assert_eq!(print(&rename_sheet(e, "data", "Numbers")), "Numbers!MyName+MyName+Other!MyName"); + let e = parse("Data!MyName").unwrap(); + assert_eq!(print(&rename_sheet(e, "Data", "New Name")), "'New Name'!MyName"); +} + #[test] fn r1c1() { let e = parse("A1+$B$2+SUM(C:C)").unwrap();