Skip to content

Commit e4d7504

Browse files
committed
Permit to define global types with ExpressionTypeResolverExtension
1 parent 745ae5a commit e4d7504

6 files changed

+44
-2
lines changed

src/Analyser/NodeScopeResolver.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1965,7 +1965,7 @@ static function (Node $node, Scope $scope) use ($nodeCallback): void {
19651965
continue;
19661966
}
19671967

1968-
$scope = $scope->assignVariable($var->name, new MixedType(), new MixedType(), TrinaryLogic::createYes());
1968+
$scope = $scope->assignVariable($var->name, $scope->getType($var), new MixedType(), TrinaryLogic::createYes());
19691969
$vars[] = $var->name;
19701970
}
19711971
$scope = $this->processVarAnnotation($scope, $vars, $stmt);

tests/PHPStan/Analyser/ExpressionTypeResolverExtensionTest.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ class ExpressionTypeResolverExtensionTest extends TypeInferenceTestCase
1010

1111
public static function dataFileAsserts(): iterable
1212
{
13-
yield from self::gatherAssertTypes(__DIR__ . '/data/expression-type-resolver-extension.php');
13+
yield from self::gatherAssertTypes(__DIR__ . '/data/expression-type-resolver-extension-method-call-returns-bool.php');
14+
yield from self::gatherAssertTypes(__DIR__ . '/data/expression-type-resolver-extension-global-statement.php');
1415
}
1516

1617
/**
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
namespace ExpressionTypeResolverExtension;
4+
5+
use PhpParser\Node\Expr;
6+
use PhpParser\Node\Expr\Variable;
7+
use PHPStan\Analyser\Scope;
8+
use PHPStan\Type\BooleanType;
9+
use PHPStan\Type\ExpressionTypeResolverExtension;
10+
use PHPStan\Type\Type;
11+
12+
class GlobalExpressionTypeResolverExtension implements ExpressionTypeResolverExtension {
13+
14+
public function getType(Expr $expr, Scope $scope): ?Type
15+
{
16+
if (!$expr instanceof Variable) {
17+
return null;
18+
}
19+
20+
if ($expr->name === 'MY_FRAMEWORK_GLOBAL') {
21+
return new BooleanType();
22+
}
23+
24+
return null;
25+
}
26+
27+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
// test file for ExpressionTypeResolverExtensionTest
4+
5+
use function PHPStan\Testing\assertType;
6+
7+
global $MY_FRAMEWORK_GLOBAL, $ANOTHER_GLOBAL;
8+
9+
assertType('bool', $MY_FRAMEWORK_GLOBAL);
10+
assertType('mixed', $ANOTHER_GLOBAL);

tests/PHPStan/Analyser/expression-type-resolver-extension.neon

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# config for ExpressionTypeResolverExtensionTest
22
services:
3+
-
4+
class: ExpressionTypeResolverExtension\GlobalExpressionTypeResolverExtension
5+
tags:
6+
- phpstan.broker.expressionTypeResolverExtension
37
-
48
class: ExpressionTypeResolverExtension\MethodCallReturnsBoolExpressionTypeResolverExtension
59
tags:

0 commit comments

Comments
 (0)