diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-05-17 04:44:51 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-05-17 04:57:23 +0900 |
| commit | 90b3be462bd2f91ef366df06c2b5bbae2821a394 (patch) | |
| tree | 06fa0e79b4437619ab59718566c2e632c4c9df89 /crates/shirabe-class-map-generator/src/php_file_cleaner.rs | |
| parent | 8d6dbf51af859ad0017ed8d1358824d9386d48c8 (diff) | |
| download | php-shirabe-90b3be462bd2f91ef366df06c2b5bbae2821a394.tar.gz php-shirabe-90b3be462bd2f91ef366df06c2b5bbae2821a394.tar.zst php-shirabe-90b3be462bd2f91ef366df06c2b5bbae2821a394.zip | |
fix(class-map-generator): introduce CaptureKey enum and fix class-map-generator compile errors
- Add CaptureKey enum to Preg stub for typed capture access (by index or name)
- Expand Preg stub with complete method set matching the PHP Composer\Pcre\Preg API
- Update class-map-generator, php-file-cleaner, and php-file-parser to use new API
- Add Display impls for exception types in shirabe-php-shim
- Add follow_links/exclude stubs to Finder and new/get_pathname stubs to SplFileInfo
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe-class-map-generator/src/php_file_cleaner.rs')
| -rw-r--r-- | crates/shirabe-class-map-generator/src/php_file_cleaner.rs | 39 |
1 files changed, 25 insertions, 14 deletions
diff --git a/crates/shirabe-class-map-generator/src/php_file_cleaner.rs b/crates/shirabe-class-map-generator/src/php_file_cleaner.rs index 1a33533..ec59414 100644 --- a/crates/shirabe-class-map-generator/src/php_file_cleaner.rs +++ b/crates/shirabe-class-map-generator/src/php_file_cleaner.rs @@ -1,7 +1,7 @@ //! ref: composer/vendor/composer/class-map-generator/src/PhpFileCleaner.php use indexmap::IndexMap; -use shirabe_external_packages::composer::pcre::preg::Preg; +use shirabe_external_packages::composer::pcre::preg::{CaptureKey, Preg}; use shirabe_php_shim::preg_quote; use std::sync::Mutex; @@ -88,13 +88,13 @@ impl PhpFileCleaner { } if char == '<' && self.peek('<') { - let mut r#match: Vec<String> = vec![]; + let mut r#match: IndexMap<CaptureKey, String> = IndexMap::new(); if self.r#match( r#"{<<<[ \t]*+(['\"]?)([a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*+)\1(?:\r\n|\n|\r)}A"#, Some(&mut r#match), ) { - self.index += r#match[0].len(); - let delimiter = r#match[2].clone(); + self.index += r#match.get(&CaptureKey::ByIndex(0)).map(|s| s.len()).unwrap_or(0); + let delimiter = r#match.get(&CaptureKey::ByIndex(2)).cloned().unwrap_or_default(); self.skip_heredoc(&delimiter); clean.push_str("null"); continue; @@ -122,15 +122,21 @@ impl PhpFileCleaner { let end = self.index + entry.length; if end <= self.len && &self.contents[self.index..end] == entry.name { let offset = if self.index > 0 { self.index - 1 } else { 0 }; - let mut r#match: Vec<String> = vec![]; - if Preg::is_match_at( + let mut r#match: IndexMap<CaptureKey, String> = IndexMap::new(); + if Preg::is_match5( &entry.pattern, &self.contents, - &mut r#match, + Some(&mut r#match), 0, offset, - ) { - return clean + &r#match[0]; + ) + .unwrap_or(false) + { + return clean + + r#match + .get(&CaptureKey::ByIndex(0)) + .map(|s| s.as_str()) + .unwrap_or(""); } } } @@ -139,11 +145,15 @@ impl PhpFileCleaner { self.index += 1; let rest_pattern = REST_PATTERN.lock().unwrap().clone(); if let Some(rest_pattern) = rest_pattern { - let mut r#match: Vec<String> = vec![]; + let mut r#match: IndexMap<CaptureKey, String> = IndexMap::new(); if self.r#match(&rest_pattern, Some(&mut r#match)) { + let m0 = r#match + .get(&CaptureKey::ByIndex(0)) + .cloned() + .unwrap_or_default(); clean.push(char); - clean.push_str(&r#match[0]); - self.index += r#match[0].len(); + clean.push_str(&m0); + self.index += m0.len(); } else { clean.push(char); } @@ -257,7 +267,8 @@ impl PhpFileCleaner { self.index + 1 < self.len && self.contents.as_bytes()[self.index + 1] as char == char } - fn r#match(&self, regex: &str, r#match: Option<&mut Vec<String>>) -> bool { - Preg::is_match_strict_groups_at(regex, &self.contents, r#match, 0, self.index) + fn r#match(&self, regex: &str, r#match: Option<&mut IndexMap<CaptureKey, String>>) -> bool { + Preg::is_match_strict_groups5(regex, &self.contents, r#match, 0, self.index) + .unwrap_or(false) } } |
