diff --git a/src/Type/Regex/RegexGroupParser.php b/src/Type/Regex/RegexGroupParser.php index 69eb455eaf..52d5eb87fe 100644 --- a/src/Type/Regex/RegexGroupParser.php +++ b/src/Type/Regex/RegexGroupParser.php @@ -20,6 +20,7 @@ use PHPStan\Type\StringType; use PHPStan\Type\Type; use PHPStan\Type\TypeCombinator; +use function array_key_exists; use function array_values; use function count; use function in_array; @@ -42,6 +43,9 @@ final class RegexGroupParser private static ?Parser $parser = null; + /** @var array, list}|null> */ + private static array $resultCache = []; + public function __construct( private PhpVersion $phpVersion, private RegexExpressionHelper $regexExpressionHelper, @@ -53,6 +57,18 @@ public function __construct( * @return array{array, list}|null */ public function parseGroups(string $regex): ?array + { + if (array_key_exists($regex, self::$resultCache)) { + return self::$resultCache[$regex]; + } + + return self::$resultCache[$regex] = $this->parse($regex); + } + + /** + * @return array{array, list}|null + */ + private function parse(string $regex): ?array { if (self::$parser === null) { /** @throws void */ @@ -246,7 +262,7 @@ private function walkRegexAst( $astWalkResult = $astWalkResult->addCapturingGroup($group); if ($alternation !== null) { - $alternation->pushGroup($combinationIndex, $group); + $alternation = $alternation->pushGroup($combinationIndex, $group); } }