Skip to content

Commit b151601

Browse files
committed
Fix overriding trait methods and properties with annotations a different way
1 parent 314a9cc commit b151601

File tree

2 files changed

+19
-7
lines changed

2 files changed

+19
-7
lines changed

src/Reflection/ClassReflection.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -300,8 +300,8 @@ public function getClassHierarchyDistances(): array
300300
}
301301

302302
/**
303-
* @param \ReflectionClass $class
304-
* @return \ReflectionClass[]
303+
* @param \ReflectionClass<object> $class
304+
* @return \ReflectionClass<object>[]
305305
*/
306306
private function collectTraits(\ReflectionClass $class): array
307307
{

src/Reflection/Php/PhpClassReflectionExtension.php

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -195,11 +195,17 @@ private function createProperty(
195195
if (!isset($hierarchyDistances[$annotationProperty->getDeclaringClass()->getName()])) {
196196
throw new \PHPStan\ShouldNotHappenException();
197197
}
198-
if (!isset($hierarchyDistances[$propertyReflection->getDeclaringClass()->getName()])) {
198+
199+
$distanceDeclaringClass = $propertyReflection->getDeclaringClass()->getName();
200+
$propertyTrait = $this->findPropertyTrait($propertyReflection);
201+
if ($propertyTrait !== null) {
202+
$distanceDeclaringClass = $propertyTrait;
203+
}
204+
if (!isset($hierarchyDistances[$distanceDeclaringClass])) {
199205
throw new \PHPStan\ShouldNotHappenException();
200206
}
201207

202-
if ($hierarchyDistances[$annotationProperty->getDeclaringClass()->getName()] <= $hierarchyDistances[$propertyReflection->getDeclaringClass()->getName()]) {
208+
if ($hierarchyDistances[$annotationProperty->getDeclaringClass()->getName()] < $hierarchyDistances[$distanceDeclaringClass]) {
203209
return $annotationProperty;
204210
}
205211
}
@@ -391,11 +397,17 @@ private function createMethod(
391397
if (!isset($hierarchyDistances[$annotationMethod->getDeclaringClass()->getName()])) {
392398
throw new \PHPStan\ShouldNotHappenException();
393399
}
394-
if (!isset($hierarchyDistances[$methodReflection->getDeclaringClass()->getName()])) {
400+
401+
$distanceDeclaringClass = $methodReflection->getDeclaringClass()->getName();
402+
$methodTrait = $this->findMethodTrait($methodReflection);
403+
if ($methodTrait !== null) {
404+
$distanceDeclaringClass = $methodTrait;
405+
}
406+
if (!isset($hierarchyDistances[$distanceDeclaringClass])) {
395407
throw new \PHPStan\ShouldNotHappenException();
396408
}
397409

398-
if ($hierarchyDistances[$annotationMethod->getDeclaringClass()->getName()] <= $hierarchyDistances[$methodReflection->getDeclaringClass()->getName()]) {
410+
if ($hierarchyDistances[$annotationMethod->getDeclaringClass()->getName()] < $hierarchyDistances[$distanceDeclaringClass]) {
399411
return $annotationMethod;
400412
}
401413
}
@@ -603,7 +615,7 @@ private function findPropertyTrait(\ReflectionProperty $propertyReflection): ?st
603615
}
604616

605617
/**
606-
* @param \ReflectionClass[] $traits
618+
* @param \ReflectionClass<object>[] $traits
607619
* @param \ReflectionProperty $propertyReflection
608620
* @return string|null
609621
*/

0 commit comments

Comments
 (0)