aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe-symfony-console/src/input/string_input.rs
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-08-18 01:56:31 +0900
committernsfisis <nsfisis@gmail.com>2026-08-18 01:56:32 +0900
commit5114a8199a87c9e5584d92848e95deba22b73e98 (patch)
tree596b422e5a37ad72e522978b6d456c0ff686d1cc /crates/shirabe-symfony-console/src/input/string_input.rs
parent79b504e55cd4c4d1da102c3a076dc2a2e1edcd65 (diff)
downloadphp-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/src/input/string_input.rs')
-rw-r--r--crates/shirabe-symfony-console/src/input/string_input.rs22
1 files changed, 9 insertions, 13 deletions
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!(