From 8b7c80120c6a06947e5ef0812cc9a271837c6bdf Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Sat, 22 Jun 2024 17:09:11 +0200 Subject: [PATCH 1/3] TypeSpecifier - understand \Composer\Pcre\Preg::match() == 1 same way as === 1 --- src/Analyser/TypeSpecifier.php | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/Analyser/TypeSpecifier.php b/src/Analyser/TypeSpecifier.php index 4115a752e0..c3ae733ae3 100644 --- a/src/Analyser/TypeSpecifier.php +++ b/src/Analyser/TypeSpecifier.php @@ -2,6 +2,7 @@ namespace PHPStan\Analyser; +use Composer\Pcre\Preg; use Countable; use PhpParser\Node; use PhpParser\Node\Expr; @@ -1911,6 +1912,18 @@ public function resolveEqual(Expr\BinaryOp\Equal $expr, Scope $scope, TypeSpecif ) { return $this->specifyTypesInCondition($scope, new Expr\BinaryOp\Identical($expr->left, $expr->right), $context, $rootExpr); } + + if ( + $context->true() + && $exprNode instanceof StaticCall + && $exprNode->class instanceof Name + && $exprNode->class->toString() === Preg::class + && $exprNode->name instanceof Node\Identifier + && $exprNode->name->toLowerString() === 'match' + && (new ConstantIntegerType(1))->isSuperTypeOf($constantType)->yes() + ) { + return $this->specifyTypesInCondition($scope, new Expr\BinaryOp\Identical($expr->left, $expr->right), $context, $rootExpr); + } } $leftType = $scope->getType($expr->left); @@ -2015,6 +2028,23 @@ public function resolveIdentical(Expr\BinaryOp\Identical $expr, Scope $scope, Ty ); } + if ( + $context->true() + && $unwrappedLeftExpr instanceof StaticCall + && $unwrappedLeftExpr->class instanceof Name + && $unwrappedLeftExpr->class->toString() === Preg::class + && $unwrappedLeftExpr->name instanceof Node\Identifier + && $unwrappedLeftExpr->name->toLowerString() === 'match' + && (new ConstantIntegerType(1))->isSuperTypeOf($rightType)->yes() + ) { + return $this->specifyTypesInCondition( + $scope, + $leftExpr, + $context, + $rootExpr, + ); + } + if ( $context->true() && $unwrappedLeftExpr instanceof FuncCall From d8a9f0f28fe6c0556600a6b966a0173167bcf3d1 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Sat, 22 Jun 2024 17:14:28 +0200 Subject: [PATCH 2/3] Update composer-dependency-analyser.php --- build/composer-dependency-analyser.php | 1 + 1 file changed, 1 insertion(+) diff --git a/build/composer-dependency-analyser.php b/build/composer-dependency-analyser.php index 5797d95bcf..db4293af04 100644 --- a/build/composer-dependency-analyser.php +++ b/build/composer-dependency-analyser.php @@ -37,4 +37,5 @@ ->ignoreUnknownClasses([ 'JetBrains\PhpStorm\Pure', // not present on composer's classmap 'PHPStan\ExtensionInstaller\GeneratedConfig', // generated + 'Composer\Pcre\Preg', // reverse dependency on composer/pcre ]); From 0181cc7caceaa493fab264a41962874d530ad9f8 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Sat, 22 Jun 2024 17:19:55 +0200 Subject: [PATCH 3/3] Update composer-dependency-analyser.php --- build/composer-dependency-analyser.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/composer-dependency-analyser.php b/build/composer-dependency-analyser.php index db4293af04..e3d062ced1 100644 --- a/build/composer-dependency-analyser.php +++ b/build/composer-dependency-analyser.php @@ -33,9 +33,9 @@ ) ->ignoreErrorsOnPackage('phpunit/phpunit', [ErrorType::DEV_DEPENDENCY_IN_PROD]) // prepared test tooling ->ignoreErrorsOnPackage('jetbrains/phpstorm-stubs', [ErrorType::PROD_DEPENDENCY_ONLY_IN_DEV]) // there is no direct usage, but we need newer version then required by ondrejmirtes/BetterReflection + ->ignoreErrorsOnPackage('composer/pcre', [ErrorType::SHADOW_DEPENDENCY]) // reverse dependency on composer/pcre to support https://github.com/composer/pcre/pull/24 ->ignoreErrorsOnPath(__DIR__ . '/../tests', [ErrorType::UNKNOWN_CLASS, ErrorType::UNKNOWN_FUNCTION]) // to be able to test invalid symbols ->ignoreUnknownClasses([ 'JetBrains\PhpStorm\Pure', // not present on composer's classmap 'PHPStan\ExtensionInstaller\GeneratedConfig', // generated - 'Composer\Pcre\Preg', // reverse dependency on composer/pcre ]);