diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-08-18 01:56:31 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-08-18 01:56:32 +0900 |
| commit | 5114a8199a87c9e5584d92848e95deba22b73e98 (patch) | |
| tree | 596b422e5a37ad72e522978b6d456c0ff686d1cc /crates/shirabe-symfony-console | |
| parent | 79b504e55cd4c4d1da102c3a076dc2a2e1edcd65 (diff) | |
| download | php-shirabe-5114a8199a87c9e5584d92848e95deba22b73e98.tar.gz php-shirabe-5114a8199a87c9e5584d92848e95deba22b73e98.tar.zst php-shirabe-5114a8199a87c9e5584d92848e95deba22b73e98.zip | |
refactor(preg): back PregMatches with regex::Captures
PregMatches was an IndexMap of owned Strings copied out of the match, so
every preg_match2/preg_replace_callback call allocated a String per
capture group (twice over for a named group) whether or not the caller
read it. It now wraps the regex::Captures itself, held alongside the
pattern it came from so groups stay reachable by both their named and
their numbered form, and hands out &str borrowed from the subject. The
subject's lifetime becomes a parameter of the type.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe-symfony-console')
3 files changed, 21 insertions, 17 deletions
diff --git a/crates/shirabe-symfony-console/src/formatter/output_formatter.rs b/crates/shirabe-symfony-console/src/formatter/output_formatter.rs index 1153bc9e..571d66c0 100644 --- a/crates/shirabe-symfony-console/src/formatter/output_formatter.rs +++ b/crates/shirabe-symfony-console/src/formatter/output_formatter.rs @@ -321,7 +321,9 @@ impl WrappableOutputFormatterInterface for OutputFormatter { // opening tag? let open = shirabe_php_shim::byte_at(&text, 1) != b'/'; let tag = if open { - matches[&CaptureKey::ByIndex(1)][i] + matches + .get(&CaptureKey::ByIndex(1)) + .expect("group 1 exists in the tag pattern")[i] .0 .clone() .expect("group 1 participates whenever the pattern matches") diff --git a/crates/shirabe-symfony-console/src/helper/progress_bar.rs b/crates/shirabe-symfony-console/src/helper/progress_bar.rs index 4764d617..7a7a3c53 100644 --- a/crates/shirabe-symfony-console/src/helper/progress_bar.rs +++ b/crates/shirabe-symfony-console/src/helper/progress_bar.rs @@ -799,7 +799,10 @@ impl ProgressBar { // $callback in PHP, expressed as a closure over $this and the matches. let callback = |matches: &PregMatches| -> anyhow::Result<String> { - let name = matches[&CaptureKey::ByIndex(1)].clone().unwrap_or_default(); + let name = matches + .get(&CaptureKey::ByIndex(1)) + .unwrap_or_default() + .to_string(); let text: shirabe_php_shim::PhpMixed = if Self::get_placeholder_formatter_definition(&name).is_some() { @@ -813,10 +816,13 @@ impl ProgressBar { } else if let Some(message) = self.messages.get(&name) { shirabe_php_shim::PhpMixed::String(message.clone()) } else { - return Ok(matches[&CaptureKey::ByIndex(0)].clone().unwrap_or_default()); + return Ok(matches + .get(&CaptureKey::ByIndex(0)) + .unwrap_or_default() + .to_string()); }; - if let Some(modifier) = matches.get(&CaptureKey::ByIndex(2)).and_then(|m| m.clone()) { + if let Some(modifier) = matches.get(&CaptureKey::ByIndex(2)) { return Ok(shirabe_php_shim::sprintf(&format!("%{modifier}"), &[text])); } diff --git a/crates/shirabe-symfony-console/src/input/string_input.rs b/crates/shirabe-symfony-console/src/input/string_input.rs index b0c3b159..0dcc1a9d 100644 --- a/crates/shirabe-symfony-console/src/input/string_input.rs +++ b/crates/shirabe-symfony-console/src/input/string_input.rs @@ -61,15 +61,14 @@ impl StringInput { if token.is_some() { tokens.push(token.take().unwrap()); } - cursor += - shirabe_php_shim::strlen(m[&CaptureKey::ByIndex(0)].as_deref().unwrap_or("")); + cursor += shirabe_php_shim::strlen(m.get(&CaptureKey::ByIndex(0)).unwrap_or("")); } else if let Some(m) = preg_match2( format!(r#"/([^="'\s]+?)(=?)({}+)/A"#, Self::REGEX_QUOTED_STRING), input, cursor as usize, ) { let inner = shirabe_php_shim::substr( - m[&CaptureKey::ByIndex(3)].as_deref().unwrap_or(""), + m.get(&CaptureKey::ByIndex(3)).unwrap_or(""), 1, Some(-1), ); @@ -78,12 +77,11 @@ impl StringInput { token = Some(format!( "{}{}{}{}", token.unwrap_or_default(), - m[&CaptureKey::ByIndex(1)].as_deref().unwrap_or(""), - m[&CaptureKey::ByIndex(2)].as_deref().unwrap_or(""), + m.get(&CaptureKey::ByIndex(1)).unwrap_or(""), + m.get(&CaptureKey::ByIndex(2)).unwrap_or(""), shirabe_php_shim::stripcslashes(&replaced) )); - cursor += - shirabe_php_shim::strlen(m[&CaptureKey::ByIndex(0)].as_deref().unwrap_or("")); + cursor += shirabe_php_shim::strlen(m.get(&CaptureKey::ByIndex(0)).unwrap_or("")); } else if let Some(m) = preg_match2( format!(r"/{}/A", Self::REGEX_QUOTED_STRING), input, @@ -93,13 +91,12 @@ impl StringInput { "{}{}", token.unwrap_or_default(), shirabe_php_shim::stripcslashes(&shirabe_php_shim::substr( - m[&CaptureKey::ByIndex(0)].as_deref().unwrap_or(""), + m.get(&CaptureKey::ByIndex(0)).unwrap_or(""), 1, Some(-1) )) )); - cursor += - shirabe_php_shim::strlen(m[&CaptureKey::ByIndex(0)].as_deref().unwrap_or("")); + cursor += shirabe_php_shim::strlen(m.get(&CaptureKey::ByIndex(0)).unwrap_or("")); } else if let Some(m) = preg_match2( format!(r"/{}/A", Self::REGEX_UNQUOTED_STRING), input, @@ -108,10 +105,9 @@ impl StringInput { token = Some(format!( "{}{}", token.unwrap_or_default(), - m[&CaptureKey::ByIndex(1)].as_deref().unwrap_or("") + m.get(&CaptureKey::ByIndex(1)).unwrap_or("") )); - cursor += - shirabe_php_shim::strlen(m[&CaptureKey::ByIndex(0)].as_deref().unwrap_or("")); + cursor += shirabe_php_shim::strlen(m.get(&CaptureKey::ByIndex(0)).unwrap_or("")); } else { // should never happen return Err(InvalidArgumentException::new(format!( |
