From 3a0d9340810a8808d963135a884f50d08442ac67 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Thu, 25 Jun 2026 16:27:53 +0900 Subject: test: port 59 autoload/vcs/installer/util/command tests; fix output capture Port autoload_generator (24), bitbucket (14), suggested_packages (11), git_driver (6), archive_manager (3), and a bump command test. Fix the ApplicationTester output-capture root cause (php://memory streams must be readable regardless of fopen mode). Implement posix_getuid/geteuid, the PCRE 'A' anchored modifier, php_strip_whitespace, stream_get_wrappers, is_callable scalars; fix preg_quote angle-bracket escaping and class-map parser regexes. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../shirabe-class-map-generator/src/php_file_parser.rs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) (limited to 'crates/shirabe-class-map-generator/src/php_file_parser.rs') diff --git a/crates/shirabe-class-map-generator/src/php_file_parser.rs b/crates/shirabe-class-map-generator/src/php_file_parser.rs index ae98a5c..7d7c722 100644 --- a/crates/shirabe-class-map-generator/src/php_file_parser.rs +++ b/crates/shirabe-class-map-generator/src/php_file_parser.rs @@ -77,12 +77,21 @@ impl PhpFileParser { let contents = p.clean(); drop(p); + // Regex pattern compatibility: + // PHP uses `\b(?])` to require the keyword to start at a word boundary and + // not be preceded by `\`, `$`, `:` or `>` (so `MyClass::class`, `$class`, `\class`, + // `Foo->class` are skipped). The `regex` crate has no look-behind, so `\b` + the negative + // look-behind are fused into a single consuming class `(?:^|[^...])` that excludes both the + // identifier characters (reproducing `\b`) and the four operator characters. The consumed + // separator lands in match group 0 only; the named groups are unaffected. The PCRE + // possessive quantifiers (`++`, `*+`) are performance-only and become plain `+`/`*`. let pattern2 = format!( - r"(?ix) + r"{{ (?: - \b(?])(?Pclass|interface|trait{et}) \s++ (?P[a-zA-Z_\x7f-\xff:][a-zA-Z0-9_\x7f-\xff:\-]*+) - | \b(?])(?Pnamespace) (?P\s++[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+(?:\s*+\\\\\s*+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+)*+)? \s*+ [\{{;] - )", + (?:^|[^\\$:>a-zA-Z0-9_\x7f-\xff])(?Pclass|interface|trait{et}) \s+ (?P[a-zA-Z_\x7f-\xff:][a-zA-Z0-9_\x7f-\xff:\-]*) + | (?:^|[^\\$:>a-zA-Z0-9_\x7f-\xff])(?Pnamespace) (?P\s+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(?:\s*\\\s*[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)*)? \s* [\{{;] + ) + }}ix", et = extra_types ); let mut matches: IndexMap<_, _> = IndexMap::new(); -- cgit v1.3.1