Skip to content

Commit 86d9fa1

Browse files
pepakrizondrejmirtes
authored andcommitted
GetRepositoryDynamicReturnTypeExtension: improved return type when argument is not recognized
1 parent 4d2c040 commit 86d9fa1

File tree

3 files changed

+21
-3
lines changed

3 files changed

+21
-3
lines changed

src/Type/Doctrine/GetRepositoryDynamicReturnTypeExtension.php

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
use PHPStan\Type\Constant\ConstantStringType;
1010
use PHPStan\Type\Generic\GenericClassStringType;
1111
use PHPStan\Type\Generic\GenericObjectType;
12-
use PHPStan\Type\MixedType;
1312
use PHPStan\Type\ObjectType;
1413
use PHPStan\Type\Type;
1514
use PHPStan\Type\TypeWithClassName;
@@ -60,12 +59,16 @@ public function getTypeFromMethodCall(
6059
} elseif ($argType instanceof GenericClassStringType) {
6160
$classType = $argType->getGenericType();
6261
if (!$classType instanceof TypeWithClassName) {
63-
return new MixedType();
62+
return ParametersAcceptorSelector::selectSingle(
63+
$methodReflection->getVariants()
64+
)->getReturnType();
6465
}
6566

6667
$objectName = $classType->getClassName();
6768
} else {
68-
return new MixedType();
69+
return ParametersAcceptorSelector::selectSingle(
70+
$methodReflection->getVariants()
71+
)->getReturnType();
6972
}
7073

7174
$repositoryClass = $this->metadataResolver->getRepositoryClass($objectName);

tests/DoctrineIntegration/ORM/data/entityManagerDynamicReturn-2.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,10 @@
1313
"message": "Call to an undefined method PHPStan\\DoctrineIntegration\\ORM\\EntityManagerDynamicReturn\\MyEntity::doSomethingElse().",
1414
"line": 54,
1515
"ignorable": true
16+
},
17+
{
18+
"message": "Call to an undefined method Doctrine\\Persistence\\ObjectRepository<T>::unknownMethod().",
19+
"line": 64,
20+
"ignorable": true
1621
}
1722
]

tests/DoctrineIntegration/ORM/data/entityManagerDynamicReturn.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,16 @@ public function getPartialReferenceDynamicType(): void
5353
$test->doSomething();
5454
$test->doSomethingElse();
5555
}
56+
57+
/**
58+
* @param class-string $entityName
59+
*/
60+
public function doSomethingWithRepository(string $entityName): void
61+
{
62+
$repository = $this->entityManager->getRepository($entityName);
63+
$repository->getClassName();
64+
$repository->unknownMethod();
65+
}
5666
}
5767

5868
/**

0 commit comments

Comments
 (0)