diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-08-18 01:57:02 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-08-18 01:57:02 +0900 |
| commit | 530d085d4f3e19f94ac3cf8f8ac3b17000214b2e (patch) | |
| tree | b4de2c2443e2bb2cfc692454ac284dc1d2313e59 /crates/shirabe-pcre/src | |
| parent | 0caac63bacefb9a1f62848636d47fca07f592bba (diff) | |
| download | php-shirabe-530d085d4f3e19f94ac3cf8f8ac3b17000214b2e.tar.gz php-shirabe-530d085d4f3e19f94ac3cf8f8ac3b17000214b2e.tar.zst php-shirabe-530d085d4f3e19f94ac3cf8f8ac3b17000214b2e.zip | |
refactor(pcre): inline Preg into its call sites and drop the crate
Preg had shed everything it owned: after the last few rounds its methods
were one-line forwards to the shim's preg_*(), differing only in a
default argument or a wrapper the caller unwrapped anyway. The 460 call
sites now name the shim function, and shirabe-pcre is gone from the
workspace along with its LICENSE entry.
The forwards expand as they read: isMatch becomes
preg_match2(.., 0).is_some() (is_none() where PHP negates it), isMatch3
and match3 drop the .is_some(), matchAll counts through
preg_match_all2(..).occurrence_count(), and replace4/replace5 spell out
the limit and count arguments preg_replace2 takes. Callbacks are the one
place the shapes differ: preg_replace_callback carries an error out of
the callback, so the fourteen infallible closures wrap their result in
Ok() and expect() it back.
Config::process() is the fifteenth, and it drops the `error` cell it
captured to smuggle a failure past a closure that could only return a
String. The `?` in the closure now carries it, which is what the PHP
does -- a throw from the callback leaves preg_replace_callback at the
failing match rather than running the remaining replacements and
reporting the last error.
The module doc that explained why composer/pcre's exceptions and
*StrictGroups() variants have no counterpart moves to the shim's preg
module, where the functions it describes live.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe-pcre/src')
| -rw-r--r-- | crates/shirabe-pcre/src/lib.rs | 3 | ||||
| -rw-r--r-- | crates/shirabe-pcre/src/preg.rs | 117 |
2 files changed, 0 insertions, 120 deletions
diff --git a/crates/shirabe-pcre/src/lib.rs b/crates/shirabe-pcre/src/lib.rs deleted file mode 100644 index 20c37d02..00000000 --- a/crates/shirabe-pcre/src/lib.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub mod preg; - -pub use preg::*; diff --git a/crates/shirabe-pcre/src/preg.rs b/crates/shirabe-pcre/src/preg.rs deleted file mode 100644 index 753a4678..00000000 --- a/crates/shirabe-pcre/src/preg.rs +++ /dev/null @@ -1,117 +0,0 @@ -//! ref: composer/vendor/composer/pcre/src/Preg.php -//! -//! The following two exception classes are intentionally not ported: -//! -//! - `PcreException`: thrown when a `preg_*()` call returns false. Composer never feeds a pattern -//! that fails to compile at runtime, so such a failure would be a programming error rather than -//! a recoverable condition; they panic instead. -//! - `UnexpectedNullMatchException`: thrown by the `Preg::*StrictGroups()` variants when a capture -//! group did not participate. Those variants were dropped because Rust's `Option` already -//! distinguishes participating from non-participating groups. -//! -//! See docs/dev/regex-porting.md for more detailed regex porting rules. - -pub use shirabe_php_shim::{CaptureKey, PregMatches, PregMatchesAll, PregMatchesAllWithOffsets}; -use shirabe_php_shim::{ - PregPattern, preg_grep, preg_match_all_offset_capture, preg_match_all2, preg_match2, - preg_replace_callback, preg_replace2, -}; - -#[derive(Debug)] -pub struct Preg; - -impl Preg { - pub fn match3<'h>(pattern: impl PregPattern, subject: &'h str) -> Option<PregMatches<'h>> { - Self::match4(pattern, subject, 0) - } - - pub fn match4<'h>( - pattern: impl PregPattern, - subject: &'h str, - offset: usize, - ) -> Option<PregMatches<'h>> { - preg_match2(pattern, subject, offset) - } - - pub fn match_all(pattern: impl PregPattern, subject: &str) -> usize { - Self::match_all2(pattern, subject).occurrence_count() - } - - pub fn match_all2(pattern: impl PregPattern, subject: &str) -> PregMatchesAll { - preg_match_all2(pattern, subject) - } - - fn match_all_with_offsets5( - pattern: impl PregPattern, - subject: &str, - ) -> PregMatchesAllWithOffsets { - preg_match_all_offset_capture(pattern, subject) - } - - pub fn replace(pattern: impl PregPattern, replacement: &str, subject: &str) -> String { - preg_replace2(pattern, replacement, subject, -1, None) - } - - pub fn replace4( - pattern: impl PregPattern, - replacement: &str, - subject: &str, - limit: i64, - ) -> String { - preg_replace2(pattern, replacement, subject, limit, None) - } - - pub fn replace5( - pattern: impl PregPattern, - replacement: &str, - subject: &str, - limit: i64, - count: &mut usize, - ) -> String { - preg_replace2(pattern, replacement, subject, limit, Some(count)) - } - - pub fn replace_callback<'h, F: FnMut(&PregMatches<'h>) -> String>( - pattern: impl PregPattern, - mut replacement: F, - subject: &'h str, - ) -> String { - let adapter = |matches: &PregMatches<'h>| Ok(replacement(matches)); - - preg_replace_callback(pattern, adapter, subject).expect("$replacement cannot fail") - } - - pub fn grep<T: AsRef<str>>( - pattern: impl PregPattern, - array: impl IntoIterator<Item = T>, - ) -> impl Iterator<Item = T> { - preg_grep(pattern, array) - } - - pub fn is_match(pattern: impl PregPattern, subject: &str) -> bool { - Self::match4(pattern, subject, 0).is_some() - } - - pub fn is_match3<'h>(pattern: impl PregPattern, subject: &'h str) -> Option<PregMatches<'h>> { - Self::match4(pattern, subject, 0) - } - - pub fn is_match4<'h>( - pattern: impl PregPattern, - subject: &'h str, - offset: usize, - ) -> Option<PregMatches<'h>> { - Self::match4(pattern, subject, offset) - } - - pub fn is_match_all(pattern: impl PregPattern, subject: &str) -> PregMatchesAll { - Self::match_all2(pattern, subject) - } - - pub fn is_match_all_with_offsets3( - pattern: impl PregPattern, - subject: &str, - ) -> PregMatchesAllWithOffsets { - Self::match_all_with_offsets5(pattern, subject) - } -} |
