Skip to content

Commit e5c4bcb

Browse files
committed
Fix internal error in NewExprDynamicReturnTypeExtension
1 parent 3c68697 commit e5c4bcb

File tree

2 files changed

+22
-2
lines changed

2 files changed

+22
-2
lines changed

src/Type/Doctrine/QueryBuilder/Expr/NewExprDynamicReturnTypeExtension.php

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@
55
use PhpParser\Node\Expr\StaticCall;
66
use PhpParser\Node\Name;
77
use PHPStan\Analyser\Scope;
8+
use PHPStan\Broker\Broker;
9+
use PHPStan\Reflection\BrokerAwareExtension;
810
use PHPStan\Reflection\MethodReflection;
911
use PHPStan\Reflection\ParametersAcceptorSelector;
1012
use PHPStan\Rules\Doctrine\ORM\DynamicQueryBuilderArgumentException;
1113
use PHPStan\Type\Doctrine\ArgumentsProcessor;
1214
use PHPStan\Type\DynamicStaticMethodReturnTypeExtension;
1315
use PHPStan\Type\Type;
1416

15-
class NewExprDynamicReturnTypeExtension implements DynamicStaticMethodReturnTypeExtension
17+
class NewExprDynamicReturnTypeExtension implements DynamicStaticMethodReturnTypeExtension, BrokerAwareExtension
1618
{
1719

1820
/** @var \PHPStan\Type\Doctrine\ArgumentsProcessor */
@@ -21,6 +23,9 @@ class NewExprDynamicReturnTypeExtension implements DynamicStaticMethodReturnType
2123
/** @var string */
2224
private $class;
2325

26+
/** @var \PHPStan\Broker\Broker */
27+
private $broker;
28+
2429
public function __construct(
2530
ArgumentsProcessor $argumentsProcessor,
2631
string $class
@@ -30,6 +35,11 @@ public function __construct(
3035
$this->class = $class;
3136
}
3237

38+
public function setBroker(Broker $broker): void
39+
{
40+
$this->broker = $broker;
41+
}
42+
3343
public function getClass(): string
3444
{
3545
return $this->class;
@@ -46,7 +56,12 @@ public function getTypeFromStaticMethodCall(MethodReflection $methodReflection,
4656
throw new \PHPStan\ShouldNotHappenException();
4757
}
4858

49-
$className = $methodCall->class->toString();
59+
$className = $scope->resolveName($methodCall->class);
60+
if (!$this->broker->hasClass($className)) {
61+
return ParametersAcceptorSelector::selectSingle(
62+
$methodReflection->getVariants()
63+
)->getReturnType();
64+
}
5065

5166
try {
5267
$exprObject = new $className(

tests/Rules/Doctrine/ORM/data/query-builder-dql.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,4 +301,9 @@ public function correct(): string
301301
return 'e.id = 1';
302302
}
303303

304+
public function newParent(): void
305+
{
306+
$test = new parent();
307+
}
308+
304309
}

0 commit comments

Comments
 (0)