From e4d7504193fedb97128f9359baaf2fed8afced24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Anne?= Date: Sun, 10 Aug 2025 09:38:53 +0200 Subject: [PATCH 1/2] Permit to define global types with `ExpressionTypeResolverExtension` --- src/Analyser/NodeScopeResolver.php | 2 +- .../ExpressionTypeResolverExtensionTest.php | 3 ++- .../GlobalExpressionTypeResolverExtension.php | 27 +++++++++++++++++++ ...pe-resolver-extension-global-statement.php | 10 +++++++ ...er-extension-method-call-returns-bool.php} | 0 .../expression-type-resolver-extension.neon | 4 +++ 6 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 tests/PHPStan/Analyser/data/GlobalExpressionTypeResolverExtension.php create mode 100644 tests/PHPStan/Analyser/data/expression-type-resolver-extension-global-statement.php rename tests/PHPStan/Analyser/data/{expression-type-resolver-extension.php => expression-type-resolver-extension-method-call-returns-bool.php} (100%) diff --git a/src/Analyser/NodeScopeResolver.php b/src/Analyser/NodeScopeResolver.php index 0c25c7271b..8c0a7b337a 100644 --- a/src/Analyser/NodeScopeResolver.php +++ b/src/Analyser/NodeScopeResolver.php @@ -1965,7 +1965,7 @@ static function (Node $node, Scope $scope) use ($nodeCallback): void { continue; } - $scope = $scope->assignVariable($var->name, new MixedType(), new MixedType(), TrinaryLogic::createYes()); + $scope = $scope->assignVariable($var->name, $scope->getType($var), new MixedType(), TrinaryLogic::createYes()); $vars[] = $var->name; } $scope = $this->processVarAnnotation($scope, $vars, $stmt); diff --git a/tests/PHPStan/Analyser/ExpressionTypeResolverExtensionTest.php b/tests/PHPStan/Analyser/ExpressionTypeResolverExtensionTest.php index 6c3d707942..da4662895b 100644 --- a/tests/PHPStan/Analyser/ExpressionTypeResolverExtensionTest.php +++ b/tests/PHPStan/Analyser/ExpressionTypeResolverExtensionTest.php @@ -10,7 +10,8 @@ class ExpressionTypeResolverExtensionTest extends TypeInferenceTestCase public static function dataFileAsserts(): iterable { - yield from self::gatherAssertTypes(__DIR__ . '/data/expression-type-resolver-extension.php'); + yield from self::gatherAssertTypes(__DIR__ . '/data/expression-type-resolver-extension-method-call-returns-bool.php'); + yield from self::gatherAssertTypes(__DIR__ . '/data/expression-type-resolver-extension-global-statement.php'); } /** diff --git a/tests/PHPStan/Analyser/data/GlobalExpressionTypeResolverExtension.php b/tests/PHPStan/Analyser/data/GlobalExpressionTypeResolverExtension.php new file mode 100644 index 0000000000..cf3fdb19df --- /dev/null +++ b/tests/PHPStan/Analyser/data/GlobalExpressionTypeResolverExtension.php @@ -0,0 +1,27 @@ +name === 'MY_FRAMEWORK_GLOBAL') { + return new BooleanType(); + } + + return null; + } + +} diff --git a/tests/PHPStan/Analyser/data/expression-type-resolver-extension-global-statement.php b/tests/PHPStan/Analyser/data/expression-type-resolver-extension-global-statement.php new file mode 100644 index 0000000000..f196ef355f --- /dev/null +++ b/tests/PHPStan/Analyser/data/expression-type-resolver-extension-global-statement.php @@ -0,0 +1,10 @@ + Date: Sun, 10 Aug 2025 21:36:13 +0200 Subject: [PATCH 2/2] revert useless change --- src/Analyser/NodeScopeResolver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Analyser/NodeScopeResolver.php b/src/Analyser/NodeScopeResolver.php index 8c0a7b337a..0c25c7271b 100644 --- a/src/Analyser/NodeScopeResolver.php +++ b/src/Analyser/NodeScopeResolver.php @@ -1965,7 +1965,7 @@ static function (Node $node, Scope $scope) use ($nodeCallback): void { continue; } - $scope = $scope->assignVariable($var->name, $scope->getType($var), new MixedType(), TrinaryLogic::createYes()); + $scope = $scope->assignVariable($var->name, new MixedType(), new MixedType(), TrinaryLogic::createYes()); $vars[] = $var->name; } $scope = $this->processVarAnnotation($scope, $vars, $stmt);