From 530d085d4f3e19f94ac3cf8f8ac3b17000214b2e Mon Sep 17 00:00:00 2001 From: nsfisis Date: Tue, 18 Aug 2026 01:57:02 +0900 Subject: 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) --- crates/shirabe-pcre/Cargo.toml | 16 ------ crates/shirabe-pcre/LICENSE | 19 ------- crates/shirabe-pcre/src/lib.rs | 3 -- crates/shirabe-pcre/src/preg.rs | 117 ---------------------------------------- 4 files changed, 155 deletions(-) delete mode 100644 crates/shirabe-pcre/Cargo.toml delete mode 100644 crates/shirabe-pcre/LICENSE delete mode 100644 crates/shirabe-pcre/src/lib.rs delete mode 100644 crates/shirabe-pcre/src/preg.rs (limited to 'crates/shirabe-pcre') diff --git a/crates/shirabe-pcre/Cargo.toml b/crates/shirabe-pcre/Cargo.toml deleted file mode 100644 index 4c884440..00000000 --- a/crates/shirabe-pcre/Cargo.toml +++ /dev/null @@ -1,16 +0,0 @@ -[package] -name = "shirabe-pcre" -version.workspace = true -edition.workspace = true -rust-version.workspace = true -description = "A Rust port of composer/pcre" -repository.workspace = true -license.workspace = true - -[dependencies] -shirabe-php-shim.workspace = true -indexmap.workspace = true -regex.workspace = true - -[lints] -workspace = true diff --git a/crates/shirabe-pcre/LICENSE b/crates/shirabe-pcre/LICENSE deleted file mode 100644 index c5a282ff..00000000 --- a/crates/shirabe-pcre/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (C) 2021 Composer - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. 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> { - Self::match4(pattern, subject, 0) - } - - pub fn match4<'h>( - pattern: impl PregPattern, - subject: &'h str, - offset: usize, - ) -> Option> { - 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>( - pattern: impl PregPattern, - array: impl IntoIterator, - ) -> impl Iterator { - 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> { - Self::match4(pattern, subject, 0) - } - - pub fn is_match4<'h>( - pattern: impl PregPattern, - subject: &'h str, - offset: usize, - ) -> Option> { - 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) - } -} -- cgit v1.3.1-4-g156e