Skip to content

Commit a11b86d

Browse files
committed
Use ExprHandler to resolve expr type
1 parent fdd2dfa commit a11b86d

File tree

7 files changed

+44
-2
lines changed

7 files changed

+44
-2
lines changed

src/Analyser/DirectInternalScopeFactory.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use PhpParser\Node;
66
use PHPStan\Analyser\Fiber\FiberScope;
7+
use PHPStan\DependencyInjection\Container;
78
use PHPStan\DependencyInjection\Type\DynamicReturnTypeExtensionRegistryProvider;
89
use PHPStan\DependencyInjection\Type\ExpressionTypeResolverExtensionRegistryProvider;
910
use PHPStan\Node\Printer\ExprPrinter;
@@ -24,6 +25,7 @@ final class DirectInternalScopeFactory implements InternalScopeFactory
2425
* @param callable(Node $node, Scope $scope): void|null $nodeCallback
2526
*/
2627
public function __construct(
28+
private Container $container,
2729
private ReflectionProvider $reflectionProvider,
2830
private InitializerExprTypeResolver $initializerExprTypeResolver,
2931
private DynamicReturnTypeExtensionRegistryProvider $dynamicReturnTypeExtensionRegistryProvider,
@@ -69,6 +71,7 @@ public function create(
6971
}
7072

7173
return new $className(
74+
$this->container,
7275
$this,
7376
$this->reflectionProvider,
7477
$this->initializerExprTypeResolver,
@@ -107,6 +110,7 @@ public function create(
107110
public function toFiberFactory(): InternalScopeFactory
108111
{
109112
return new self(
113+
$this->container,
110114
$this->reflectionProvider,
111115
$this->initializerExprTypeResolver,
112116
$this->dynamicReturnTypeExtensionRegistryProvider,
@@ -129,6 +133,7 @@ public function toFiberFactory(): InternalScopeFactory
129133
public function toMutatingFactory(): InternalScopeFactory
130134
{
131135
return new self(
136+
$this->container,
132137
$this->reflectionProvider,
133138
$this->initializerExprTypeResolver,
134139
$this->dynamicReturnTypeExtensionRegistryProvider,

src/Analyser/DirectInternalScopeFactoryFactory.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace PHPStan\Analyser;
44

55
use PhpParser\Node;
6+
use PHPStan\DependencyInjection\Container;
67
use PHPStan\DependencyInjection\Type\DynamicReturnTypeExtensionRegistryProvider;
78
use PHPStan\DependencyInjection\Type\ExpressionTypeResolverExtensionRegistryProvider;
89
use PHPStan\Node\Printer\ExprPrinter;
@@ -20,6 +21,7 @@ final class DirectInternalScopeFactoryFactory implements InternalScopeFactoryFac
2021
* @param int|array{min: int, max: int}|null $configPhpVersion
2122
*/
2223
public function __construct(
24+
private Container $container,
2325
private ReflectionProvider $reflectionProvider,
2426
private InitializerExprTypeResolver $initializerExprTypeResolver,
2527
private DynamicReturnTypeExtensionRegistryProvider $dynamicReturnTypeExtensionRegistryProvider,
@@ -44,6 +46,7 @@ public function __construct(
4446
public function create(?callable $nodeCallback): DirectInternalScopeFactory
4547
{
4648
return new DirectInternalScopeFactory(
49+
$this->container,
4750
$this->reflectionProvider,
4851
$this->initializerExprTypeResolver,
4952
$this->dynamicReturnTypeExtensionRegistryProvider,

src/Analyser/ExprHandler/ExitHandler.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
use PHPStan\Analyser\MutatingScope;
1414
use PHPStan\Analyser\NodeScopeResolver;
1515
use PHPStan\DependencyInjection\AutowiredService;
16+
use PHPStan\Type\NonAcceptingNeverType;
17+
use PHPStan\Type\Type;
1618
use function array_merge;
1719

1820
/**
@@ -56,4 +58,12 @@ public function processExpr(NodeScopeResolver $nodeScopeResolver, Stmt $stmt, Ex
5658
);
5759
}
5860

61+
/**
62+
* @param Exit_ $expr
63+
*/
64+
public function resolveType(MutatingScope $scope, Expr $expr): Type
65+
{
66+
return new NonAcceptingNeverType();
67+
}
68+
5969
}

src/Analyser/ExprHandler/ThrowHandler.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
use PHPStan\Analyser\MutatingScope;
1414
use PHPStan\Analyser\NodeScopeResolver;
1515
use PHPStan\DependencyInjection\AutowiredService;
16+
use PHPStan\Type\NonAcceptingNeverType;
17+
use PHPStan\Type\Type;
1618

1719
/**
1820
* @implements ExprHandler<Throw_>
@@ -43,4 +45,12 @@ public function processExpr(NodeScopeResolver $nodeScopeResolver, Stmt $stmt, Ex
4345
);
4446
}
4547

48+
/**
49+
* @param Throw_ $expr
50+
*/
51+
public function resolveType(MutatingScope $scope, Expr $expr): Type
52+
{
53+
return new NonAcceptingNeverType();
54+
}
55+
4656
}

src/Analyser/LazyInternalScopeFactory.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ public function create(
106106
$this->attributeReflectionFactory ??= $this->container->getByType(AttributeReflectionFactory::class);
107107

108108
return new $className(
109+
$this->container,
109110
$this,
110111
$this->reflectionProvider,
111112
$this->initializerExprTypeResolver,

src/Analyser/MutatingScope.php

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
use PHPStan\Analyser\Traverser\InstanceOfClassTypeTraverser;
3636
use PHPStan\Analyser\Traverser\TransformStaticTypeTraverser;
3737
use PHPStan\Analyser\Traverser\VoidToNullTraverser;
38+
use PHPStan\DependencyInjection\Container;
3839
use PHPStan\Node\ExecutionEndNode;
3940
use PHPStan\Node\Expr\AlwaysRememberedExpr;
4041
use PHPStan\Node\Expr\ExistingArrayDimFetch;
@@ -168,6 +169,7 @@
168169
use function is_string;
169170
use function ltrim;
170171
use function md5;
172+
use function method_exists;
171173
use function sprintf;
172174
use function str_decrement;
173175
use function str_increment;
@@ -221,6 +223,7 @@ class MutatingScope implements Scope, NodeCallbackInvoker
221223
* @param list<array{MethodReflection|FunctionReflection|null, ParameterReflection|null}> $inFunctionCallsStack
222224
*/
223225
public function __construct(
226+
private Container $container,
224227
protected InternalScopeFactory $scopeFactory,
225228
private ReflectionProvider $reflectionProvider,
226229
private InitializerExprTypeResolver $initializerExprTypeResolver,
@@ -1083,8 +1086,17 @@ private function resolveType(string $exprString, Expr $node): Type
10831086
}
10841087
}
10851088

1086-
if ($node instanceof Expr\Exit_ || $node instanceof Expr\Throw_) {
1087-
return new NonAcceptingNeverType();
1089+
/** @var ExprHandler<Expr> $exprHandler */
1090+
foreach ($this->container->getServicesByTag(ExprHandler::EXTENSION_TAG) as $exprHandler) {
1091+
if (!$exprHandler->supports($node)) {
1092+
continue;
1093+
}
1094+
1095+
if (!method_exists($exprHandler, 'resolveType')) {
1096+
continue;
1097+
}
1098+
1099+
return $exprHandler->resolveType($this, $node);
10881100
}
10891101

10901102
if (

src/Testing/PHPStanTestCase.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ public static function createScopeFactory(ReflectionProvider $reflectionProvider
155155

156156
return new ScopeFactory(
157157
new DirectInternalScopeFactoryFactory(
158+
$container,
158159
$reflectionProvider,
159160
$initializerExprTypeResolver,
160161
$container->getByType(DynamicReturnTypeExtensionRegistryProvider::class),

0 commit comments

Comments
 (0)