Skip to content

Commit

Permalink
Merge branch refs/heads/1.11.x into 1.12.x
Browse files Browse the repository at this point in the history
  • Loading branch information
phpstan-bot authored Jul 12, 2024
2 parents 7d34a37 + 3a32992 commit 5e6b5fd
Showing 1 changed file with 15 additions and 7 deletions.
22 changes: 15 additions & 7 deletions src/Type/Php/RegexArrayShapeMatcher.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@
final class RegexArrayShapeMatcher
{

/**
* Pass this into $flagsType as well if the library supports emulating PREG_UNMATCHED_AS_NULL on PHP 7.2 and 7.3
*/
public const PREG_UNMATCHED_AS_NULL_ON_72_73 = 2048;

private static ?Parser $parser = null;

public function __construct(
Expand All @@ -53,14 +58,17 @@ public function matchType(Type $patternType, ?Type $flagsType, TrinaryLogic $was

$flags = null;
if ($flagsType !== null) {
if (
!$flagsType instanceof ConstantIntegerType
|| !in_array($flagsType->getValue(), [PREG_OFFSET_CAPTURE, PREG_UNMATCHED_AS_NULL, PREG_OFFSET_CAPTURE | PREG_UNMATCHED_AS_NULL], true)
) {
if (!$flagsType instanceof ConstantIntegerType) {
return null;
}

$flags = $flagsType->getValue();
/** @var int-mask<PREG_OFFSET_CAPTURE | PREG_UNMATCHED_AS_NULL | self::PREG_UNMATCHED_AS_NULL_ON_72_73> $flags */
$flags = $flagsType->getValue() & (PREG_OFFSET_CAPTURE | PREG_UNMATCHED_AS_NULL | self::PREG_UNMATCHED_AS_NULL_ON_72_73);

// some other unsupported/unexpected flag was passed in
if ($flags !== $flagsType->getValue()) {
return null;
}
}

$matchedTypes = [];
Expand All @@ -81,7 +89,7 @@ public function matchType(Type $patternType, ?Type $flagsType, TrinaryLogic $was
}

/**
* @param int-mask<PREG_OFFSET_CAPTURE|PREG_UNMATCHED_AS_NULL>|null $flags
* @param int-mask<PREG_OFFSET_CAPTURE|PREG_UNMATCHED_AS_NULL|self::PREG_UNMATCHED_AS_NULL_ON_72_73>|null $flags
*/
private function matchRegex(string $regex, ?int $flags, TrinaryLogic $wasMatched): ?Type
{
Expand Down Expand Up @@ -295,7 +303,7 @@ private function buildArrayType(

private function containsUnmatchedAsNull(int $flags): bool
{
return ($flags & PREG_UNMATCHED_AS_NULL) !== 0 && $this->phpVersion->supportsPregUnmatchedAsNull();
return ($flags & PREG_UNMATCHED_AS_NULL) !== 0 && (($flags & self::PREG_UNMATCHED_AS_NULL_ON_72_73) !== 0 || $this->phpVersion->supportsPregUnmatchedAsNull());
}

private function getKeyType(int|string $key): Type
Expand Down

0 comments on commit 5e6b5fd

Please sign in to comment.