Skip to content

Commit f66c9a4

Browse files
committed
extension : phpstan 2 compatibility
1 parent 176ee6e commit f66c9a4

6 files changed

Lines changed: 75 additions & 45 deletions

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
- [BREAKING] Drop support for PHP < 8.4
66
- [BREAKING] Drop support for Symfony < 6.0
77
- Allow Symfony 7 and 8
8+
- [BREAKING] phpstan-extension: Drop support PHPStan < 2.0
89

910
## 2.1.1
1011

phpstan-extension/Reflection/RepositoryMagicFindExtension.php

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,42 +4,57 @@
44

55
namespace Mapado\RestClientSdk\PHPStan\Reflection;
66

7-
use PHPStan\Broker\Broker;
8-
use PHPStan\Reflection\BrokerAwareExtension;
97
use PHPStan\Reflection\ClassReflection;
108
use PHPStan\Reflection\Dummy\DummyMethodReflection;
119
use PHPStan\Reflection\MethodReflection;
1210
use PHPStan\Reflection\MethodsClassReflectionExtension;
11+
use PHPStan\Reflection\ReflectionProvider;
1312

14-
class RepositoryMagicFindExtension implements MethodsClassReflectionExtension, BrokerAwareExtension
13+
class RepositoryMagicFindExtension implements MethodsClassReflectionExtension
1514
{
16-
/** @var Broker */
17-
private $broker;
15+
private ReflectionProvider $reflectionProvider;
1816

19-
public function setBroker(Broker $broker): void
17+
public function __construct(ReflectionProvider $reflectionProvider)
2018
{
21-
$this->broker = $broker;
19+
$this->reflectionProvider = $reflectionProvider;
2220
}
2321

24-
public function hasMethod(ClassReflection $classReflection, string $methodName): bool
25-
{
26-
if (0 !== mb_strpos($methodName, 'findBy')
27-
&& 0 !== mb_strpos($methodName, 'findOneBy')
22+
public function hasMethod(
23+
ClassReflection $classReflection,
24+
string $methodName,
25+
): bool {
26+
if (
27+
0 !== mb_strpos($methodName, 'findBy') &&
28+
0 !== mb_strpos($methodName, 'findOneBy')
2829
) {
2930
return false;
3031
}
31-
if ('Mapado\RestClientSdk\EntityRepository' === $classReflection->getName()) {
32+
if (
33+
'Mapado\RestClientSdk\EntityRepository' ===
34+
$classReflection->getName()
35+
) {
3236
return true;
3337
}
34-
if (!$this->broker->hasClass('Mapado\RestClientSdk\EntityRepository')) {
38+
if (
39+
!$this->reflectionProvider->hasClass(
40+
'Mapado\RestClientSdk\EntityRepository',
41+
)
42+
) {
3543
return false;
3644
}
3745

38-
return $classReflection->isSubclassOf('Mapado\RestClientSdk\EntityRepository');
46+
return $classReflection->isSubclassOfClass(
47+
$this->reflectionProvider->getClass(
48+
'Mapado\RestClientSdk\EntityRepository',
49+
),
50+
);
3951
}
4052

41-
public function getMethod(ClassReflection $classReflection, string $methodName): MethodReflection
42-
{
53+
public function getMethod(
54+
ClassReflection $classReflection,
55+
string $methodName,
56+
): MethodReflection {
57+
/** @phpstan-ignore-next-line phpstanApi.constructor */
4358
return new DummyMethodReflection($methodName);
4459
}
4560
}

phpstan-extension/Type/GetRepositoryDynamicReturnTypeExtension.php

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,29 +8,29 @@
88
use PHPStan\Analyser\Scope;
99
use PHPStan\Reflection\MethodReflection;
1010
use PHPStan\Reflection\ParametersAcceptorSelector;
11-
use PHPStan\Type\Constant\ConstantStringType;
1211
use PHPStan\Type\DynamicMethodReturnTypeExtension;
1312
use PHPStan\Type\MixedType;
1413
use PHPStan\Type\Type;
1514

16-
class GetRepositoryDynamicReturnTypeExtension implements DynamicMethodReturnTypeExtension
15+
class GetRepositoryDynamicReturnTypeExtension implements
16+
DynamicMethodReturnTypeExtension
1717
{
18-
/** @var string */
19-
private $sdkClientClass;
18+
private string $sdkClientClass;
2019

21-
/** @var ObjectMetadataResolver */
22-
private $metadataResolver;
20+
private ObjectMetadataResolver $metadataResolver;
2321

2422
public function __construct(
2523
string $sdkClientClass,
26-
ObjectMetadataResolver $metadataResolver
24+
ObjectMetadataResolver $metadataResolver,
2725
) {
26+
/** @var class-string $sdkClientClass */
2827
$this->sdkClientClass = $sdkClientClass;
2928
$this->metadataResolver = $metadataResolver;
3029
}
3130

3231
public function getClass(): string
3332
{
33+
/** @var class-string */
3434
return $this->sdkClientClass;
3535
}
3636

@@ -42,20 +42,28 @@ public function isMethodSupported(MethodReflection $methodReflection): bool
4242
public function getTypeFromMethodCall(
4343
MethodReflection $methodReflection,
4444
MethodCall $methodCall,
45-
Scope $scope
45+
Scope $scope,
4646
): Type {
47-
if (0 === count($methodCall->args)) {
48-
return ParametersAcceptorSelector::selectSingle(
49-
$methodReflection->getVariants()
47+
$args = $methodCall->getArgs();
48+
if (0 === count($args)) {
49+
return ParametersAcceptorSelector::selectFromArgs(
50+
$scope,
51+
$args,
52+
$methodReflection->getVariants(),
5053
)->getReturnType();
5154
}
52-
$argType = $scope->getType($methodCall->args[0]->value);
53-
if (!$argType instanceof ConstantStringType) {
55+
$argType = $scope->getType($args[0]->value);
56+
$constantStrings = $argType->getConstantStrings();
57+
if (count($constantStrings) === 0) {
5458
return new MixedType();
5559
}
56-
$objectName = $argType->getValue();
57-
$className = $this->metadataResolver->resolveClassnameForKey($objectName);
58-
$repositoryClass = $this->metadataResolver->getRepositoryClass($className);
60+
$objectName = $constantStrings[0]->getValue();
61+
$className = $this->metadataResolver->resolveClassnameForKey(
62+
$objectName,
63+
);
64+
$repositoryClass = $this->metadataResolver->getRepositoryClass(
65+
$className,
66+
);
5967

6068
return new ObjectRepositoryType($className, $repositoryClass);
6169
}

phpstan-extension/Type/ObjectMetadataResolver.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ public function getRepositoryClass(string $className): string
5252

5353
private function getMetadataForKeyOrClassname(string $value): ClassMetadata
5454
{
55+
assert($this->registry !== null);
56+
5557
foreach ($this->registry->getSdkClientList() as $sdkClient) {
5658
$mapping = $sdkClient->getMapping();
5759

@@ -78,6 +80,9 @@ private function loadRegistry(string $registryFile): ?SdkClientRegistry
7880
throw new \PHPStan\ShouldNotHappenException('Object manager could not be loaded');
7981
}
8082

81-
return require $registryFile;
83+
/** @var SdkClientRegistry|null */
84+
$registry = require $registryFile;
85+
86+
return $registry;
8287
}
8388
}

phpstan-extension/Type/ObjectRepositoryDynamicReturnTypeExtension.php

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,24 +6,22 @@
66

77
use PhpParser\Node\Expr\MethodCall;
88
use PHPStan\Analyser\Scope;
9-
use PHPStan\Broker\Broker;
10-
use PHPStan\Reflection\BrokerAwareExtension;
119
use PHPStan\Reflection\MethodReflection;
1210
use PHPStan\Reflection\ParametersAcceptorSelector;
11+
use PHPStan\Reflection\ReflectionProvider;
12+
use PHPStan\Type\DynamicMethodReturnTypeExtension;
1313
use PHPStan\Type\MixedType;
1414
use PHPStan\Type\ObjectType;
1515
use PHPStan\Type\Type;
1616
use PHPStan\Type\TypeCombinator;
17-
use PHPStan\Type\TypeWithClassName;
1817

19-
class ObjectRepositoryDynamicReturnTypeExtension implements \PHPStan\Type\DynamicMethodReturnTypeExtension, BrokerAwareExtension
18+
class ObjectRepositoryDynamicReturnTypeExtension implements DynamicMethodReturnTypeExtension
2019
{
21-
/** @var Broker */
22-
private $broker;
20+
private ReflectionProvider $reflectionProvider;
2321

24-
public function setBroker(Broker $broker): void
22+
public function __construct(ReflectionProvider $reflectionProvider)
2523
{
26-
$this->broker = $broker;
24+
$this->reflectionProvider = $reflectionProvider;
2725
}
2826

2927
public function getClass(): string
@@ -50,13 +48,15 @@ public function getTypeFromMethodCall(
5048
Scope $scope
5149
): Type {
5250
$calledOnType = $scope->getType($methodCall->var);
53-
if (!$calledOnType instanceof TypeWithClassName) {
51+
$classNames = $calledOnType->getObjectClassNames();
52+
if (count($classNames) === 0) {
5453
return new MixedType();
5554
}
5655

56+
$className = $classNames[0];
5757
$methodName = $methodReflection->getName();
58-
if ($this->broker->hasClass($calledOnType->getClassName())) {
59-
$repositoryClassReflection = $this->broker->getClass($calledOnType->getClassName());
58+
if ($this->reflectionProvider->hasClass($className)) {
59+
$repositoryClassReflection = $this->reflectionProvider->getClass($className);
6060
if (
6161
(
6262
(
@@ -71,7 +71,7 @@ public function getTypeFromMethodCall(
7171
) {
7272
return ParametersAcceptorSelector::selectFromArgs(
7373
$scope,
74-
$methodCall->args,
74+
$methodCall->getArgs(),
7575
$repositoryClassReflection->getNativeMethod($methodName)->getVariants()
7676
)->getReturnType();
7777
}

phpstan.neon

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,5 @@ parameters:
1010

1111
paths:
1212
- src
13+
- phpstan-extension
1314
# - Tests/Units

0 commit comments

Comments
 (0)